From 5294b4c2231bc1c27d4699e72d2ce13d9dc2ac7f Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Sun, 28 Feb 2016 11:21:30 -0800 Subject: [PATCH 001/328] 510: Remove BYGEX completely, remove autoconvert notes notes (never used + uses bygex specific things) --- bin/bygex.dll | Bin 799232 -> 0 bytes code/__HELPERS/bygex/bygex.dm | 144 ------------------ code/__HELPERS/bygex/demo.dm | 54 ------- code/__HELPERS/text.dm | 7 - code/_compile_options.dm | 4 +- code/controllers/configuration.dm | 5 - code/modules/admin/sql_notes.dm | 66 -------- code/modules/client/client procs.dm | 3 - .../scripting/Implementations/Telecomms.dm | 4 +- .../scripting/Implementations/_Logic.dm | 8 +- config/example/config.txt | 3 - paradise.dme | 1 - 12 files changed, 10 insertions(+), 289 deletions(-) delete mode 100644 bin/bygex.dll delete mode 100644 code/__HELPERS/bygex/bygex.dm delete mode 100644 code/__HELPERS/bygex/demo.dm diff --git a/bin/bygex.dll b/bin/bygex.dll deleted file mode 100644 index b19c0f14b1e72a337886b2ee645c526be59df371..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 799232 zcmd?Sdwdkt`9Hp!EMbAgi4rkrkf>1;MI;tAkw_z90l8=d0w^N&hBwp{b^+z$(%FSf z$I(

jlM2t*zFo)d)dDLNH4dHQ&Hv8 zGv_?#InQ~{^E~G{&$-OlE6QETE|<%L|65yKt`+#@ze4f%=l_I|eN?~7qg=0cd-tRj z?lJG4G~vdZW@VPny#0omSKpd>?bWy4c6%W6n(H%X25-x}>9)*amyXZ8_4ezoAJDUB z_beNAvEStyTyHvhT_PHkIUN1f8cophWl#p`kn@VQ+0?>DK)<^P#Tb5)m$=OjtD z8!4n;{96uSzAW~McAM2eK64}fuy3l{uR1@ zQ$1j&1YBQ%jB@0&BLj!P6%M%m#%a^hJIzmkdBxpauI2dckKcrUg|2~x1Fo4hi%H9S z;7=3(9QrTBdasxD3SP3KfX=nPJ-onolY|qz2G3pH0r%b^aMc5f#tCiB56C`G@>Z=bT_rl3aRnq&nbjZICc(%#;7=?3k98WvYI+E82wx2^RGTg*JmoRoA9Z zsVz5NJ&hS9+SijNqLK`Ks!tDk^#!Tw0e2u@8KdQRn9YhpKx?LZ8>b@yglFi(vNBPVm({aI(xiE^%ta^`sa77SR@Y`I71jG1YeE0d zz+VPBQJrt2nv{U58w#*&>&AN0-=3b+h-6E*cJz$4 zksQ+jiKL^xee=p!W`Rm;aqq4!DR1Bpd1;{A*oKjRSjRTZ!H=0=x=%zK)%KFEngkI>?FZbjZ zc>*4-VM?v;R-3y7PFa|yHXl_UI9Y90R?s>r!x~~+%GKti7020c8!LO`DfUk2j=ruH zeVFKPh`nhmf?eOFNcF_=T5X_DZnd@{G}skL^ZJt2YWIaMh+=SesD}qqSF2R)(!RK< z&W(S2Yu%M1FKb_vvK%~J+fZXAsb41Vem>9uEIZ45U4bCKVdkD#by>18&po}e)fL+? zUF)iDOH!jrvG)?%TN0_Bq-~lwK5&};TTiTexfVrh!Kvf)$!Yn!mHXD@?+zRj-Wd2s zFZ4yKgVq$S8M;@i--v0Zg^7uWdM7YX)4l)vsL%J=A4ejdsf zx0Qb~6Y_-iq(e}M{*4E_!b~v{yrX*UwmaJH589?QJ&=`Yu7P0aDSF`^Fq0);LCHw9 zR{Jyy2Tnv*@g5B#sbyqo6SBPKD}`>CfUol;196(xIOVF^avczQv3JF1_pK{cwq1C@H5wU+N2Vr^+ykBB zlR5Sj)LAa-9E4n$6=Z4=K0o;Yk~Oyjc?u!JNCJ%B_m85;1b~4GyOyY+$~Vve7t>UP1ZZnl4JD7OJNA)`xp?8fu!8ZmNF%uYdh3^jKN!h9?|a znC(&`>3G73rPjK&Woan7imDguJH6bPd(ar&n*YAC_;z4HzJxcCpWmn~o`qk-GsW=y zE;QHc3U*TuBq@=rkf`UKxzJ}sP6RFrks(-2OD9GkPge4qtfo!?3^aRR2zzMsLrNTE z3?$E!RTp96h35AKU0qs1mR4iFbI=2`?=g(b&Y+n%*o*>N(s>$5>7Co!zVZ3B3yzI! zUU+mH<$*5xT+f+#M&u+Q=#=0(ku}h~1-Ol+Cnr`u!6uc77n-Buq?UH=B1m0&N@vha z9BgI)`p~{{D@#<2%6f#|h%q&MEZAl&%f_1#>5IRxCEzM#blm>8`aN0`os`;SN(I=Q;eG4XQ>#RrcWB%@Pw@a&)w#fWG zl;R?W3qOL(Y%|$&V(X*LS+esIPYyeq_ zF1jAAHH0uw2Bz5n$B|{Wzq)cHMjqjGJz2~rfX!`Aajh)G3)on1wPbgpBWjNy81IBV z&wx1S3w-JVuUon2h7`0-SVKys-qkQt$rhmcTV@xR{uto#VNi#R*AzAlY_8aE8^s<-IK+f9@j~;J^Boh~m?Q+rc+JP+ zXsSdMFGsV>tik3&l#y~oBlJG#2+d`ic95b}nAO6>hX15l?VM=0P4v>9i9|cbl!+Ib zKc43heTq%=(xW=`X15Z)AKe0_ zEQBOTwwUz>XsAUW=k7hTYc%3QRg{w`!$>X;s0|!YqeZ9=sYN0N5!t9jPUDy=z}CLP?2A2#$VyOAFt2!Xz5DD6<)2>Q#RSFuJNhWzWfcr zf9V29U&^X=QB1A#zt(^b16}NWCU3R^Vv61JdU}|76x?CG3W(C>7(g_0b+Z8J@d0zeWjf z0hXK^b^j^KJy+u~yiqUB&_@?2k@rx4Xl|xU2~R@$;L>y@d5bTVl*1pjCH%h(1PPwL|6k9jI@GDN@PC zaHA5&CA%$Sdd5em-|j*8!;Ytc55i2R!twALwHCo(&ENk4L-xm&esq_tTYz%# zW%sh~FOx;DTBlO$Yqd=hPeLc>2HJJ<$#~TowHCF-9lVVQYIJl_=Tj|V#N|K-z&uHf z%_JmrwQ1r&m&gxIj&CC+Wo9u9o%IZyD%Lh0wb|Yy2g4dTIi4)e^6Ww%q{o~5+)mkK z;byVPVn79s@1)H(_d)Tk(L@Y!??{AMZ$oVWl~Szz60rq z^Ur!)$Q=iMtxo$usE0WdoNLlPl^nKK*$lVJ@xTr*g_z;j3AVgX7kYgz%G7C_=xXgY z7cT)RVsy2pppco8Cx!sw;v_QA?Ab=wF@i2VBD8pufO5M28`v!9kfi{ZjrKG_lvI94 z7DO4x2>in?vstjsE@hIKPhh~zwL4@ty`X_Ia3wGiiGRPBWLmG-xDV-%X%eS-1Nzqb zgMf%HAyRZMu`x;KHC%Zzrl>CzgqsRR%@l z*2^Cee_&{$)38IGf2%v{e^r96;E(w{h@jg!_ElgLK4+8gIiJpxKBxaxF}nDl!FZDf zwu9I_GHU&w<~uqMw-Y=z^6}L5!oE*wF2_p+N9JJNhjq;k@Hz6Id3w@{{|ci zFB$h{7&gQILOe31L`(p*O{B`TM(ZQ=zA^O;!~arygSs;`$hrWO>%#>#4-EhhOt@RhJ$Il|z2pUb+@AafWq5;DvfTZF zbsZCvwNF}M<(vk4>6Jxth(zT0tiJK*j!=wbJ5c|`Gv`rnKOpB(UX&u~Vvcwof(XUd z_kxBuv^qqPy^QhSt3vIkJ`aYWBhXZH0O2?kor{pWRu}tH-R2HXVe%#x4&YJN{5S$aAVI)jTV3;7V7crv zoB8M2h+Y+lUScgO5REepBKi`ltB+j~w}*|lN_%Jx0S}P6-|Riw?Xr#)Z@NDL$q*nZ zHb(+U>=UhyVgK09HcYF`dw?nSDy(>-By?jTN^WW$nWXy@nz!QzBHRaN#maziwkx)) zeSEl`y+H8<`|>aN8HZzEUhWLunXiiYqcdM^rl0ZJ47ML*8|SNxIFO4!BD$(CZ zjI%4@hw-TSAE43Mslh-&MVBv*!Z znvcKkc9lg=Kmpy~psmq_XR7Nr;acOFqKrPMYh-U=lVhNU(;^4g=_%UI1hX}qW-IuLO!dY70yFz>Xyx>BRPNwE z3HYIXddW*jNz#(^Wn?XEx}tqz21Y<y0#f{F6P$>#IRlgIb`HF;jGY;un1I)?Fv5X$D{*`O@i*vM_-X=_=n7GW`q8%| zI(>v3XR_m#y)UiLQlUbQabHSD2=+aRS<)eTB1&l(f>`)}n&1rm=bK6UqR>y9>}7*cg{%%E1RY)!Xc8e) zF{60v-;yB$ERnxHNspQKI~d;I+7?`pZ61yK?1-P7D$sj2AC*Ykdgx{wbsi}oYSzK( zU*0F0YOY)a)V&2mbdlMvgLNC~en8oxkO%L`suKlb-yoi7vMUckKh7?A1q#OA0@(MI ze{&VQaPvXB;$zpt&HmUtV-0-qL@^Z>K-)(WPsBKqAda`+0HMW{#S%fwo%GVp6INl! zz*099OWWj#{%P|m`f*J-PP`^)f~;aUt5`J(&Zv-32ftyfR+sUadGo-$iAWeiny;1)b8oj80D}NaH%sEvUcTmvIu%Arl z3nm>Cs<9uMuL_Dh#)8ib|A*Rs)MEr2;p2)Wq=$&zzaG5R$EI-^a7-5W7cfNPbFUEr zQs^)Jq6-m8)%~AAA{XuFih&Z@1uAs^hY2ZkvpuA)9w%@#b4}1>m1jc<0Ho^He!94`PXVM}4lK^RkePo+@+aTRpk7!dw25=n$}iEMvjj zTFF{)(_GAKaGi;GorBkLddXUS>{bjDJpg2WcrAruEj)I3uqC8w=DeRahrvcpzc4Zb zZkxA@Yuq??VD-OPJ?oaB+ZxVR!^Lc{Tk{tJK^*PZNBBy7Pp+cQQ=9ak(6A1t1 zQ+S+4Ns}>lA8Z{5e{F-gQ-ooGV=HoGMOVp+41W`fzYHrW5k&=}txn}zNf;~N8s!c= zETm^ad_{k#>HGNFZkkP1-Ake^_?h_lbqy< zGP&yt3|y{Q7eN+d;}7FiHZ42{ab|y$QL+!i1&u-V%LpCTn2#X>i=oW$n{lRI-e2^d zWYCq}9j49{7)(;J1l2hl91MV1D&I_?TY$1{{QNbFXpOO>oZM;1mHZ99F8M2Y^PnJa*%oMJD zoRwEyYOZa>q{WlpuSJ9$zVXT=w^(?R&r?w4_Wddl*Y08?CEcnd?ed6d(iP z>Cd&A-G5Rl#8RM0%U?4qRjH6Ge_^ql37J?9&MsO@Tw=QfkOQaMeC)!mE0lk%D~)x> ztL}+}D%X`xrAmk;{byv=(=`!sFqTdhb)ST~PfMuV5U~ffI!W_4#XPFN35;)2UUy9& zEQ-zCq2AhrUPwrq(+968kO0)qa4cHOnjJ!g5%QCCS8OWnwtpx0-;f1;|TaX0Ar)u>La+U?_t8O zM@T-_p9YJKSqNZhu-3jpt(JA&7*Bl>sq8xLE=0F+FEeBXt*_w!)#T3LKJAQJ`^?kY zXHM5p>~%R*^!n*6S6ddftjzxd>cjulN<}C$Yh9^L%OQDN+VZ?B3#c^r#C}?71i-Sd zgwo8s5K8lh4}M8$+WP~(GJg|$4ufwhe(MT7uF!%eR{+A!@iPnEUhgQe?LjCNg&v5K z4RIwQ+Kr~nSDV}bxhSSUr~u$HbHNT_b@u4AX2O4>Ripi85A+fFjB+ilhFGnWw73t& z47B}7u&{|l&C*|`6FV%BXn@#0jGl&8T&InF74vYlI#pDP+E}SmtUs2eA-_;r%sRxh zaVFLg_*i3RZ%pDKel%zCV)JV|_2amWZQ}5Ri5>uyWTT`(n%KMF=X$jlf}$?i<5ILR zAPxT}V14R#j_~V^l1(fC=4^pAL3$-ZzC!v5^fv+2NOag%W0b77)x?}I0TBlOTBD>< z*5j$Moq$G^ngpFiCfPAz9~-n5i9-Q_`tX!Tl_oW1yFpEzf4AFOC&>B|nLSV=#8bo$ z{tVC2DEZ77`(>L~cY-8OsTjMP&BbWuuQsNBhN*2TfP7Ae>SHHqhuL+a>(#!sd9O=1>ywm6er^NlI1y+ueXe(WMPZuEGB8 z%0rZpwKDB$AP%81p#{4KD~mbDl>MQX?2%{(3Nk#gi|hO`ckDv6GDa5FATFW#x5i)# zwkB2?lT~hYs|&UYEnqIHYYd@yXhCf7>^JNDUtI(=UkMtAC8Z*FI^UJ522r=i?poo( z*O*W2Ph!_XZjZ7{)uB-D*g2h*5$aH5-V!h4ODJ<3pN(R7S;9-2U?gGA3K+Xd|>_om%GO|}YE+OBJ=UWo1KG=pjE!DiTJ z=|ZwAw((8Cvrm7RA!<5-u*_Z0Wv<3pk61UY);#+*Oe{|&&(EDfuZY?b@16VBi=7?j z8Fa8vnwocyEG-m!*9+}kQ119PZv}vD7`!VBX(Dfd+u)drj(&vzxbt&iB9{(@iM;K- zUow$u%jh}dN-(}_wXIo8GvC3Xi2A^V*u0TjJ$P37f|K=IQjLPyYMon~m1fL;(}hUP zQ95?PXvb-ndNc%^n#I73LS80gi+pWvbu5-!Z7=%*Gj`Gso}9km1icifrf>`KY5XC>$OJ5JTqv5?MNwsi;Yr`j@>yG zu7a7$18WKzCpBz|(D6eMQ!j>ROLH9aCE#X$}6m zV0dtF{CAl(_XlmRV@@v|fd>sAYwVo-p z)63Dc?*W-q*^gL1Ea%||tq#KncIkr^-L(%w`v(NB#-HGMq+h8ha;xURf^Kt8S1Lv) z8AVCP-EXrnpm>>l^gQaE4(?Vh_)T0ZYv74xRnQS zoMdxls1a`2Y}W>Y^ar?G#bxq~NX&I+rA*>1fsL-+jAp&@s3>}!2yT4XO*9hC4A(5jD2ezZv+8;|vMfyyienqN# z^1yscF_Ji@6hliLBx#k{s2Gl+AEQYENrQ$xh*x;6Pmx3#MyAD9Vq2nqg*UbeEmgu_ zB15)OSp%6*v*Sr~Q!$Woh2Ba(YSX+UzNg+UsRL zq+pEz19^xAxc`pmm8jt*4r3%Q3JY8U1N9pY)f0S@6$-@6ve-W7OB`heKjHu zy_Kqw?pPJ<-4<=H-9EiIZE$h=g0paLD%Hps2NYUynvwA^cztX%xe$b6&!)*ZAvb(B zPJy-L|MByI;~_vA1T?8&THu6&+XAUZkB(u%uT$>52k(1}ydJ}IK8OompdReDP(%ReEVD<8*TYvtl>K`2K3vlr zgqmB>h8O9|6!llvrizgPVin5E3f9Or##TaKu?f{%Fd*Os`#c3%!D#5NZkGgWuvv5E zu|QpUIq<60y>ptdITiS>0>0Rb=)k|_R!jRHTi#w?CPp@bqru*Sr>>ynDFgtlSE_JU z?#94bYRl}PY0UD$z&*|d%p!1qTJU3=@lB?N#F*lsMR(36)OcTRH8>l52^@Wi=wi=O zP4u!IRm5w|F>oMZ)*j*dwZsUh2Ar@2{ z4Plxfx(^X5+uJXooEU_c;>u#9-2-hMyT+E50!{xkeIL(VojxFRr z#uG6dW{3_S6HpMua>jOH#zwleOE6FtyF)G0lm}`lR@B#R{pxL_kdayKFg%-(+#l!G{rj@6Xo{V&ixs7*8wR`X5|l!9w- z4hD_13AY6(>}ov+=Tro9D%iMU;*Az z@g^&>N&qeT8{^dUHw#>XxS?+C?bs6#AANEv?A2mC!(1ee5LxZ|ip^#$kPK zf29J>!NmpcId>VC36-e0$X(!9!aPU|HKw=YG6Go{u?r;FZ=rLQB(w$+KHB!kD$fQK zGJcEwf5I_42g+fTdf8xq;HrW#fl&*q3nokb3=W{(YlOa-8!#dXtLP7Oql9MCCNQ^# z+Vr@D2j0uk;aW}15cK1{56qHQW8Dclggw(is5Y-Z3OP7xk|a&=q8fAS9mjD4X3w!d zc0Au{%S(UZVkD{Nn1Z8}C74=sYS)?-dFfpk9MA-Z)|b1{?Aa4EPlQSJ!^nqu=Rode zb!~s1mBg_n=vU}YcR&eWf$|WKCbK7|w>XkI+@~D~{Z3T!92lRw1B0m#6)6?z5ZHO41H+W? zQWP`BH-uWcDT}e~2hUH0TKXu9PselUK#>wYQ9P8$^Jk$0W2ToYVdyS0$1C9{#lyu) zc&>PupoEu;2grwthKCM}4W>nQV1$D;orroTyR`;rQY6|H#DXu@S8QpM*$wRxJi8b? z6FYRcL1-;9_2HR=hi56q3O-NF&@z5UqdPnkg(kqpYM&%nB3M2N@O{Z@B~R=0u6&~8VYP0 ztjmxvo%(z+YC$`%muR7h781kUa{U(g6vzhCLwWwd#gQFK*ae|&PPsdDVSfGpA zJUlo<{jpVR3FPR*({eWs9-h9SpFT0w@D+-_ft&Gr3Zi! zd%4NHk^9j-S+UTsX+3|_@R zAn!YnQ)hL1e;7oi%3UxsFs)!>U`oO0z$Bv>nloySU#ZxL5q1yjZZtE}K*vQO#i?S9}>Z3EXv_--*$z)R}Ui7D0Lo|2ieMR@zSv zWsM-jJO%8p%|sBKJ~7)=mW;t@t!*f0{i7j&auPb5Gs{Nv&!`rSt;4A-;T0?4H7E!-4))xk z_gV;j<*6O$J<6un8Vv%4{1_L}J;ucGawYsXAd&jeXnJ6Tz|BTe2bWQcRzr6UoiPtU zq}}3%;e`5j!{Ah&)}g+~zm*NOI2CGNpGyg6Bhk1hi6?|GZmQ<+f`Q7CUPzQfN9OzR z$(;5W5K1wBmZrQ#dkeIE2lV8Fv>Qmc4MZRzMG1cgH2DVu=j*A)sDG*Z-O6H|$8f1F zIe{!G6pGj(BLzb-ssY|nI5eyBOtc4@0?Z#`hquMmCWj!CoAoNQIyCri+z3wYY(p;9 zBo6)o^rrIU4&VzN@Kpd8{E5RqP54tfz+d9P>kd3QClsyQYz01l57oS=ppUX-2dp~A zwnlS3dYs({nnD*`tVAk+7Rl$rHc;r}14N^_Yr9SQ*}x5uS74zNOQs{4ay}Cn966uP zXGhMp@tLt_;`HyPfv;n|!1XbN*`|D`(*T z7o4Kw5Bmd)n?PgzJpsoYR&*#19#6D!43jwc6RUEn=CuN<4#gN$v@#nNrF*+kiTjz)tLR?F{uM zB-?xmN!0wYW>E3$&iodrJ0WUWTgePrl0VitD7lj2QMp|XEq@>-A7e(V7p3Ly9bA;Y zKoRqMG4K{4rfv<|Np7LNdtj+XD^>l5xSBY>ogqEJhc{b*5kY2si zLvGJU3PTZZz~o?ti@;Z&D{z#Y2=iqYLXiZYt`&E;E)zr`jue;56_m;^$T}gF*ezgX zL!b0xrF>i0<0W@*yaS(Y79Ds73djyDvCy^%_)m~^aMi83e5pyILX2d0WBwq$S`eXx z-vt6SFI|b;3{tEbqH7fP#e5VyZiLN@R3i%)7@dvMV*D%iXt?VpMW}3V{TS&tx1;S;dtP|>6MxBR#;C`zJ$VBWAG@)PsU@gZ3eSRXFjAT{F?ZVC%$8e zFE!M1X<$XDWn6G2kp=(3Zb1yCC)Tpy3mm1c&0<(+ZI%cRVPk}P!Rf(munX#)soijv zc$_C^{6JU?RO*Utl=P>G+3=`9cJAKD#$Yz6$bw=5=|FbR&dMBiRHONK?9;~0FNsm7 z&!pE@7ko$Z1B3KG<&z=e5sv@F`L+pB00`=^!3d!@$|% zwfEm7T`=vKAaGp8pGggGy>cdIR!J_Lv0%#!XkF5AiqdUDd7 zXH4SD?A_2Lttr-5$eTWTpmAB6Hhv&z4z)}OTpDT_5$H#6PSz$U3*4mU{c6s2dMf$<^*rhDg9f;TM)EaZXH(S02>Ulo*J|LtO z5K|nir1Hq`B`6CCsvN?eXf$sJD7qOnDdA6G-Xc5hDu-(NDlZiIwhovh0VYmuqCZjU z4h#vEm?Oq@gad3AVIGopd$JfakT?y^MZfb_Drr^@ZUq!~)qdOd8q&3@5-!32-N8teoB?VmOrmf0O{1bLLw|OV%n( zhf=lx8KSq*y}!kC-0lt_t{%XJC892luks1@Wm{taR(T_GKoXWjMI+8bnrOuNY=qK* zgr`{SSO?@)QHJpWmy`6QjpjR)7HFF2B^})X%@m?}4LY^#TI?4FGD5 zLeo6Zyb;!-l2px}C^-5!hOo*J9qRAK`scGA4lJ<; zS2F$joH-l)!7yuP80FLp{=frLDXsDDh4j4l-l0+z{&|Nkx ztB2NHFk6XmonEQHt6WCBoKtPB+57-wg+3{5@FaM#PZJ}O<${TRX{t6U&G0=;3sHtF zDohB!O4S4)y~wMri@MLjySiJb=! z0sh{#3Ly~U2)@x~wL|l>ddv>qg9ct3EVCQ5i;DUykkHoG&E~Q#Z3BxO5712b^OvR# zzBGNoOZp@%5{dPfOA#1(1jF;PXi_e4XbsxUhn{enjW~ zgfhmcCqnxXowLOAn;}m6=sSj5#wg)ouv4Ly5+yPf4>Ei`LkWKl&`?W2iHs0t&5bA^ z$C{Du(EdR1T5jSKOGh^dyR4M47F#ZJ^w9}&+5cq(xO!`Ttfw>35cRu;15~*?1=YjQ zy&nPDFSA0VvEsM*)wt)#JXfjn+`@ ztw19d#D$mw-{mkU7&YDsbW`(kmGJLnoviUm+)sv8y|zZp2;LKK)HU!-BpE0iRl>i; zh!)!K$4ypvh+D)NFr<*bvh$GW_~~cxxnuK{a4#fl3p^V3-#J_uMlKjUmZ6V#0(nK5 z)>J^+{+@nIe}?EDC(#SAyF!T^!$)jIrON<+2vJt-7lS`EOo?>GgX}xB^Lf79GlO|8 z=P2O{@o+AOX}WGo1P3}?*vA2t#6}Kwt8orfKzDpUN5M))F|n%^;X}~RZ0NOiyI1=$ z+SN?IfjuEXe>AH%qUOOY_((3|#xiI{H|dsdIxxUN)$ zS+NY4Jk+b7qgHpt`rGbjmB@G$K>0e9M`xcK@9gXU>2!|vmbD2TthT0W8?=M)1d_-QlrXQ4{K+yQFQfZpTlkWguA$R>9;gli39z1D=_a9{2-_aCXB4=#|S_ zfc}oZ+=xPaq4#NBYv+g;dKqo{&FvUT1yJ43fujI!@mBsK2+MWtg6T@Q1_+Fi)c-j- z;2}p2TFT!8405g2G2Rj8fnw^HyccbHdBN?7#}iQiyIqvX=?Ds8$pNO|SR?|A4R5*EoU_@T%yP7Xx@u_PSm_X zFLQGG5R#)Q2pGCBX|;L+vj|wvRKh!uQ-D)vCnJr4VPRVS2tFS&kKg^NAgcj+`T|_S zg!M?Deiv{0@*0;OTzx5I*gbln5Mv1LLp9oa%6&E3uDrLE@C)P=!6*4}m{bYtXn}Ii zO!BHFNeTZ2G^j1fN~8${LczSNr#K1$Oktg+hh=#~d2lD+1qg%t1y?H(97%9hPGh4Q z&81{Y9Ukt+L>NmE3>jiRfjQ3x6c4qOD&ali;U*=bp$LZL8A{|XS@=1~BD-LJ$!#f0gbE8p7cmNfbFNtJ zfnuJ9L@~FKdZOWAMJY+KD$k2^beg2C02HWelHuBbUpx6y?G}9?M`vt$a#>-UeqJob z)3uHhVpR?zI@oK8i#|5q{P4c4>)EnKGoPLq4Ti-KBogKlhQf9`AEJ1ejt4Q{kkvMt zUD%{LYp_r?xP8m8v1&FvyqN{KKg|x8{R@+7;f}76Xlr=BuWjM7(F|=uf+tJZRaD{@ z)mq{lq}a5A;EW$#imb&fn%Luh7OfMLKy(&_{sH!Vby5ObuA#(qK{8a+i?~H=pr=xC zT&U&NKriSE;vlqR!`ZNN@kat(Fv%VK2E3SF<#us%#%A~d({uNN@3Dr0o1kp4j@HNc z6W?zmE)QmiCo>_$!-!5^YVeHMxbj27H~PoIz@`L_li?d}f1Wqc2W?COTFlYki!Wsh ze^HLNun$H#!?FfyDxY+f8(?642Wm6220`^{lvr(nKGwr3z^V~Y5vW;SWN)yiNV1SPj)`$J z>e~6jqm=0B<~$4ETx*G?=*Pg#zE>aR#XgeVJoeMg`0Y39!6aqL97uEiy5Q%iNNXfs z^K*D4u~+pwy!uTZ2+&`3!L;1HVB<)^#(kRLY*|{e&Bi6#x(mrCrDDRluHYyC86U-( z4*ETTk54)Np{TKH`3H!hpN8>L*1PE7%Sh-@w-Vln4HxnHdj~&=*Pi-wy?99NsjRZTIil?bYVs$3AH?3oP2Xt2V-w}*EqWzoHuD!iFt8?D}Nqe`$ zA84n)?#}A|8atYfXnQxa+PMD4@OFsJxax@2nb^PUI=1)I&gy>uNcV4LyY@yqtMj5G zR%c>+AM4oOS39fw?A}MXfA4SC-bXvD^GU=@kBm$uws%R#_TJZ7-NziUx~096BWt(^ z;-d^c-cJvP<21fFuuyBPQ|ZVoob*<-xmYyx8KbtU`#rd% zmgtnle?&+a3qkq}u0+0%MNCWsgY)%E@fi-a8B@03Vq1l3W^iQ*o2Y8Gc#?r!J?K%w z>BxcWlL2ouEr#2DWoi;qamxy;7DQ|KBmvGd7dJ->n^`085-9#boBIPUGBAppK;6Y2 z{b;%NHMoc3 zsYO2<+1O&Xymc7 z)pZo696RhR{HjFNZ(%xznRUj3U*a1ktMKG`1T58;Pd&2&E9p~?ER(gr?{pW!&`GXy-KH4%FfkR z@z!-S2aOp#KMQg7R;3r}>1_OYAMo+kmAHZ%|7!>GQCV$O zJ*$lmKwouM>8DuzidXtSIjx+(@5M~rqeOc4L(6Tq9h;%BtR)G8>)!7tTz9NH11wGn z-S>~;?f=;>qb{|UtdyNwuP9&D*I6cwEjW>~b$Z&k+5fgD+pM-op`@WQ~7ctmV zy224W=>HHiEi7_k)8GAk7Nl;23~D0FdL0X3(pn0(CYVfMh0O}2>gQk%)?K~Ri!Em> zPeH*A!~uzZ23SI?XpnKq_bVqkt+y?BUvy7L3tr%u4NUaB=5_J%LzHk!$MVnNOkBJ? ztp5;c`-foumnvM>02r=iOv_yGyq|hGU*Q6<}t+o zBGz-O#-sb&gke%=!f-wc#sxA_H4axCo%!6bc6DCTS)B(HZ9rn3hdqaM_=!2ZCrD$8 z(193A5pv|lxK#7~Pr$$4YMsaUUF*Sv2ls6}so~TR{sp$-CXX3esWsbD{}KveNFBDu zn3$vt+vTcOKTpp2Rtfjzu1sOD-QP-$e#@Qz{UO@47i)5H2Ew3y{9h~d6OO$WmFkyy zY)SqR5&?tKp=N6VDwgd}82idkMRPF{^CVLk&()eYD7IoG)bFdg4 zZ_fYJH)sIH8EpLN&)ZIB!q0HeJV`y6qAdOxF$DEsSA2QyGOvCCjq9utN{AGe~M;wm#NlE{C7iuE=_Xed0v`o+E*C)CIH>mq4l2gI?S=fWxqD z9?KQLVx5JRf5FcLo$bRk{UWcLm#;(yB9@5_PU;00;D`X93q2ytj=+tG*;C%Q!j*-;-C}3o_a_DU_ zSHSSW45V|c4s(YpJGclXtl8W;b}@1gd@ovH{@Y315oSBlNKLWF|M53<0bvK4VvkKPpRV4~ z9gBrL34tzKbcbg-H=l+d;Jc*wQ+B*?wHLLB$X578b|cOO2-@pBy)tDtW=_X>be9so z3glI7OYk=+&rO{T{gb#0)`^!T%JY9=-xxcD!#;>qCqxYgc8n}?LV#c*ddSU&A-)Kw zsx6A>lZkdP(s~X1brK?!H54P;2|tM8Asx$Ij8sPLsAY$UCHnXz)PaqZ@b~-hlUhqg zB0+1CeTDe}C{BxEXC99FsoVNso-pS!u}v>HOg)$kiQq7ut?h#ASM#OE7?XyeXxc#i zMvr!rN59dl-Q?A8^l3NwwE0NIoWZ?G6X8_*dl@={zrm+C50N7j2i6{>2;whWA={62 zC+x+64Zu<#`qr5azyhNz4h_j^fk%vw3Qm(Xs^6uWUqT&3kzwd>Ob=pP9ses+iF^R3 zPQAn93iP1oP>7X7`mkd5VvO|)$>PG3`sEX5ch1YkqJC*Fg-}&JOLLeQ?|ij0d-zm0 zF!Kn>4|S~S5mp;_SD)&v&NI9JM4dmYcZax$h_NQNcR|PYKHOQ|Pk4`1-O}z5WQ z`JL7IrRPZ1nb_V}XdV*#cU@=pVH(!qJMG`Y=C$2kPrLT^?5w@`p576vGqJs*;>7lL zTKCW+RyT&dssmuDY&Qm+j`Qo}&f0!9b^~>KOL3e z3kZX-6CS}l$AOqnHgg*KL&WJKS&N*pmNs@`p(Twjp;>!m04|)s|DRs{v*szXYRWH$12<*y)!{ z(y)_HhIA4}4t(DT%UB)9Ee={rqNLCcHhj0Ba-N+4Un83069{BjR4k(@IytH?Z+@$ zi3K3bU|nK-h_9VJ#q=Pnj3?d8q-#VH;!#zPP(U$Un{$vZd&!xdFFN?dp#}kWtUDdl zJGd$C${(&VSl&hu7jvu)*iO)v6k}2qlH~lkEn_1y{?rb3HIwdZm-GUY?qcy*5jR7# z;*GzLIoG!XzKcoY+9l0k(yu#|uX@c1REz z(P(Sc8%(+vNr$xeDdq&*0pH7{YuY8vXVRsemFJ|}I=3D0rA#_mBsnA%AgP^QIUn0? z6J>X*l-;S;HtZpoUfwpZ;DsjbO5XlcC0|0xwidq)PsUn?Bq{Gf?2t=Q&8u@Z3-5je+{AKE63FM!%m7F5d#MxD5V}{zcVJ434qW zIo>+GUPLMl3YLFeEzEcJ9!nJ5B6+nb&lE4Fjr)}@QJtn zD@nbrouv?4cRGm{{vVl$>uEAOGZ9y8hTMqRy7rd!19oIeD#acs+gx*sY~Bn%*gA{A z@TuWg4kRl=3%Nt_2ACf;9|7u_s04Yd}SI87IA&4V=LC0%LN1853Kb zMze%tj|_MnqkWvPueB*}of0laF&RAjSYSqeLsed;d+jbVbht6Szrw|sgf_QTVi@Q1u7Eahq4|=RRu1mwhtUd}|B6!Xdh1p0-)xJen^3&v-0G-k8y#>v)@ePB2$P&LbleMvlJH4nNwF(9 zz7x+X=gN)P3V9fXazr5!Pr3nPZrhY5@PFu|kLYxaucLs{a$aAJIo>WESK4`uMPjXG z!%6F$wU(M1%UNfsF-BpXWrM3){WSSZM2Z8qLF8>O%jka&_B|GheUIPDZY=X9m+4~r z=oqcR4oDvr+-y(HAWI$DmbiPgJ+CQwv1eqUx#|w`?G!P-jbeR^4$g1mou^ls*y({S zt8d#O>53FA?Fe~bYdcm7xrlFBl|J1@XR9TkapTop9_y_Crl%hg>&pMhPT50UNvmFj zCWH)k*kb!L0y!;SW5-4&7HYpQ*ZL<}EBw*Wjcd zj@DtHfx9OEM;I-5X-Y*2)(m({=oiM&)dgLYCF7EjO4##b8{>UlreM5`iB`f``6D)z$Wcm+`w7t{D99nPC4}KQ z>66PM+t6E3#ypHY0}+Z6;VC8Z0uVY2V0kZK1V0;|@Gmpb*0Z{HOMTKf!+2xisRyD# zqWy^rN@vMA`&rfw#zqder*38;j$?8U_wi_twPOR)u%Ou;Yjlxw0iZTx#qp1fd^tN7 zcHxC9pi621+nV*-o{!d*R-Q&Tx6ypI0WJOu(koAq2}_yqMg)1{SBW}tp`z<@y(%6P`UDuD3oiGCGM;FMIK6%;n+nhlR>%!(;z?8p4dl@ z_hRLI4$wqb;%-EdL9YwS*)m7RgC0f+0N~v^f`SZBNH@SdZwGj(=f- zm7oC!-sgA2#e!vI`Hv*=mozFj-g;gH0P(li$gG!uN~suP%vq*26}V^jH0IpH2W3eJ zH;%}aV5|Z&-i2l40`#`o`!C4AmxEdm;6-0Q#JGB6Wferlobp~gi|+G$WI3MkmggWL zMX2nTY3*P##{EamO^0FOCK@NS(lYok)3bU3#@LnU8W%mpb1-)lwxf|f_7S*V8Ri(= zXg>Td$h?o)7(J!0A0mcAkMQ*acor9h0rV)e2$luMS*@u^hJ1nzQ^=t`e@0H?JOW?d za8*u47K&{`ruAnOP$EA_%sgB=24=h5iZOwU{yBl}ZQb1#4u6L+uj2{SW&*l0Z8+0@ zQ3yKl=+bx(3v?~!44}dVeq7;ynb9$^0{|}*nBG`<9J_e#dQp42fEvuYZv)GIx$X{~ z+6C7#9(JLJN$@YWvdzOSI869PauE|1EPMCIfRT;KdbTEx>{t(dge)=3M3BRH@j%_y*;YTI z`sGH(^?BFV-SHE0??FY0?%cS|o6*1q& zhl==Q!dikFyYpj62!zp-rtBN%2ahlI-QYV7wZya?oPNoxi)^^LVt03EnPK})#fvlCFOv} z0k#PrJ4>up!|@n9t=zbg^A)XS(ZOOQXwQ>P@zY^S7@xv+X{J3>8WP+fIrk>3=Wg?k zPJQBZ30rpnVKXxJh!el(?jqdOn#2*6&EPiTO&lX-Jlwf;QS!Sgl~me6%0&nJki-rL z*xpNsl(em}rT-jdhfHqLW6SOOvRGd{I&;RM^~rl96Y6X`w05|4J|@;5+c_2&zuk3al&vqoP-=ET1Q|{$KS7)6eG0=3_O=<7*r2j-S zs?Kc3-m^NRi8l=$8Jc9gF41i(BL7O=GI9?7IX)rwSkceE1yv_lZQe9gj&=HUEYkD7 zH_2MNE8gnR6=%q7jtnnsu{ggS|1avS z&Ur_yPSIYur#d@uYCGd*unsuT!AoCk`iHio-`^Sit1vDd8J@}h zlJ-hm(sI9`Xk*~QML)`og;k);@W+?a&Wy+V&I1wldi(@fdFR4x>+xDh1XAFD-Oop1 zZeuUmNg*VOuc!X<_|(Dm+Qz~77l+vuG}~>nh6m$?a(8qzmxn}WY&&kH#se5~PvGGU z0+tHdI&3m4KxTqg?&_eVLdQ5&`Y-62FLd>n=2;zh-3^W4#5LhQ<#*KWV-R|nfW5ji zvVIeofm;*A_Y829-50w`Uo6MD-~@dhR^Wmo^wFNk4&5E}8pYxQzVmQ`Uv18b;u1fK zdX+fl@F4#Naxi)a{Md;ZxEex|hRdK&fM1~r5d8#vRp2Rg?HGA*JXx*bGDn(*5NeZo z9j9;tED?YQ(rtiR=vW7U7sZ~`rs!h+@*kn$hnh87XCti%{#8adn)^9qo$+zZX-3+D_@?npwuQA0!8y;dyZ;Ufi)i z3yT{V&w=kjVy^R~45(X7)B|E3Tyvd{&vamIQ+%ArAM}FZx8l=%_KCIGyF`rIbA=THdz*rx*7BBvuAliGK-( zE!PHRb=G*$PTvGy0=+Wp^!VyxMwY!UZVveiIuRd1O?gf_Qd_}OccU)Y#O=OX6cO;D zZhUef|9~bsu*}!H>>fef2yKlMjqZUR2JNVWRl z&xza+;qUg`z$YLQ-Hl$@2i~sE!{EqclKrtV+%Jav8t_RdacgM?T_Yzt$oXgDX!K{^bEw;0-Ph737&zoh5R*0TcTq&MGp6f4)NP3yvMJ_yjo06 zDWSHH;Af!(q)wCw7sd#c75*P*muDzp4Y2kg=h`HEx3>KuTu(?sVn^4vO}rAfmmLz4 zPISs0-AcH*VR=X9@O#;b{#@Xa#Fod$INp--%f{SMAX%aH=zmnm5i?mRrXF@R8mh6! z-@_dh`L&IX9664&QsJmuF$@{@Nww9qU?mCC7l4rQqEPrOZy`&+&5I?@NF^Teu>kb1 zE7q?(^z~6#cV=gcna?u9jTGMJec}<G`>a4zsSt}u z1(`~CDvP(9H{{Tt8tN8u=WOnYA9GM57YgAz%yF&<3Ss}*^I}lI<*03^>Du(@AO@rM zl$?uFiQ>X5{UMRGIN6M5-uW-I!g}~WD%3&$?uff@zv%I`If{RR%*XG?5g*`tPuSc3 zkkx!oAVYsiI5-gd_t0DM$!G;$T=?=sy8awxC>n~p6(Ql_$RnJ+G5n=tILyHI4@L%V z0jMJ)xDE~|>|>cSYA3%n(_ZGjV?7D8<^tI(1$u9BYYvtq5^x4Cw5@ZPrJR06e-4on zCd&?ST4BasM+DCPl!b@~!_sd;niM=q+mPV%Hqx&;AkEYoB*M&CnV3%q!F`D38Oc8B zKkAMSeK_hrD%9SFT3=9#vHvQ;ljiqY$`jrn;Cq5T!R{xp$C)czi~k$B<0ttJTRTp={vz#13-?YFXD|GynC(@iRWRqTgy;4!W&zC(*fKt6k8K z-m5hT(#nQ9^Cj_dcCB{N_PfzF+EU)Y$?MUL5FQx34L^ePl~@CHX`ip=XZ5hS^H7a) zUv=)@yqX~H7%j5Dm#0L214z7gE4UbULk3cCz4x%7lDjuFuRGA3!XXjsH<-yToe$jR zmyZGEGJfMP8sUwKIJl1Y$HeU?F@G#fO6CC)}4LXv$fO18G>1@M&)@ zM-eUZ0{-H=E&x`3Hx#WChwAe25SrIxnlZ13_9p2Kb`Q<-U7>`xAVVw2GDM@yB(|?b zoc=st1F{+zaNH8M6d#3A*9>*Wr8ml;h@#cxOhj;I-J>AL;G?@%azv@<6+2hhE8g+U zCR+F75BQ1O>#h*ephPAirCfM)x%HywszG;dHNNdSALIO7UEHo}EL#gOc}uo`EdcO+ z>vi}_?1y~R{Ok1yJ3i`f8`tlV-nATmBJ6Rq%R}Ud9wGZ6Zf)O_)84E3cfXp0{nWZ- zs{!MjQZe3b6uC74i7(_SkuxB`YHgA*!je0Z;n2bFp1?sKAx!v)Td-dn`n{+|>W}s| z;6{l4&|j0a_r_Nbuy`&g8IF&^Jb`bN&EA9ywLcIyPS0MC8|^F#m#`1DJ#jO(=&*RT zb5Sim2$um65%1^MoQ7o;V&~H^{mQH{j5@%`oQhb)NZf(aH?mm?zYZQolhHnWLBbi$ zME@FCb*wBLU0n)Q#u-RJVTN!2Vu4t^XYkh?ins@Z^-tmjbG{6*2oMoVV#=@?ypJZ} zN42*>BF)(k17SAej8XMA=;TM_?b8HB!rtt%j>U5*On&#a^@d-E3u`5VBJ>d`EE^KoKQ* z4WDsXDcT!NMlL_2A-ZTbKL70_EQrOopac9)<*`7SZce}?2-dq#wYue?y4F{_g1n1; zU#@QFEHewR$6{|$AXN;r7=+gNTmnB3Wm6;plqtj$L}X))Iswj}KFIhHKR=nKUU(%w zm7PSySS0QuUdR%JeU1SUfuZW!G=X5sRj8*bEpvV8qHp=P=3r7}@4|oOZq_}^_ztp? zS{pds-yPiEt`Kl%qigAhbN?Yfex0d-Hg0~vH$>y{EPmQG@t>%cjkEs=dY_zd%z6rp z7i-1*USgJm8CK?*FV~eClM4|R@|j;eBswaSm(tSQpnmgy^oY3_8Ilbp7!TUMk3Gil zuP0tg9HCLj{3{BemneFVAX)cs!9_&DbjTDhyA>ecJP35Q+N;fl7*PFvT~R@ufy0Ou&*Z zC`)x}Mw7*WNaDeWH^2zsxeyiHfQtA2!ab&+_O!)Rt6ZvCCCms;}f5Sl&S`-(wXY`B7`V#_t4b%xkMllgBp$ONRIkTsQDUmYBK0 zu|<;PUietcKM>7hUl&l{o-J2i2lqhQ>mO?$Ey8R7XQIG^kssx}y%GbwYtc65x?AGN zUjSW}4`uE3L>POeVwd(k$|4b8Um5wmwo8@*3bHz(@a-)8KFO;g+MM@AQXL1?F!w>F3r?4iOw0_|Al!hy43Qg(~) z$D@za^}d-k(Ngt5Yak2uP-#tDCf;Li@H4m*)s)v%mzv`)$8{}tpKXPykl)%RI%~P(zM?qgb4Yj%2{Jn{}d-;vs zC$A%6xVr#wyxtp-kRJ$?2YbY+FeK8P{{XAgY6FFcdfF9e$-3W%&rh3wN9L2HRTC6z z5b^Eo2GNqgB2#NZf=x#i`nxrDU&rsCYG2dh3S#uB{K!mC_^eZZsJHde!8Q!o^kW^q zY{YHrN%@Vz?y+IIH~*7BKiu~+l!e(lqW1oPN8L6q9yJ){B_lH+{tk>+!o)sB*{4M_ z8e*FdrH>Nf$AW-6;GfAsCfLnk-L=9R*Vj7lSBM8d2LEl>5$!@QlmF&Z_X~<*@7U0R zG?_^@+jt;f4sG*o=*=d-;}Uz&na`N-@b#g%d^_?(-fa#ZUDX@d+By{aU&3!DoBFRH zFFkViwq-$dz>dDM8gTB|SYOfq@;g!H3*Zy@rzb;mVwkbjwU+pz$wF?I+Xhs`+bF#J zDtszDoiy`fmTGRreZ(oSzG=|PRFz+Tw$4R8Vmy|wivbrOZv=lu=R6@RMU~#%YDfU& zvEI6Zu<`NGX|Gv?WUT98lN_2cKo-PDKjDsC&78(I!E0ylQC{|^95+PiJW(3r6M($b z*VbF#`~g);wE;Zk6YQ0q3iN~OK|S$uQbBzY?>67|peR&>->{|-Q@>^VXl_91XUGR> zXk17999!>^x#*6rw&W5&6^E*h;(rnVB=rlzKaN)+JE%-xEr-A3S-}Fi^-apl-R&=| zgOP3eZ?}i#uR?iDOJHfL=bp+Y*-aB}iCyJT8-^qP18cMf(XROY)rat>NV22ILG`oT zs>41Q+(qqh3*8KS!XAR*W&?BKrqr3U@g%4W^vj>+4GeALijQ2mS7cNFkB$~emui;R zHal$Q9OMf&0Y^geZ;%Z48ztJ(r95AWBM;-4Td&m#Zi1IRz@y%%T_6gku-HKO?)~dW**$h~*-?Br-z|H%AyqyhrRK@l1casflboH*fYSbuE*OrvjCW@7XP=h2u zHE5I%siM->Qrgm%$}XVgV{vzZ+v~-&mD&&6YPJ8rZEb5?1pELK0$EU7fvA88BBI{Q zB8Cr1_>jE6Gjlftzy9z0yzle!JmlV;J9FmDnKNh3oH=u5ax|DYE0&vf9oOmY>ez3t zgO9v@l$bMpoUyz!)zK$0ft5)h#-eq;EFsPJ&Ht2dJ1493MD#^!ksZ)(;}QLz*+)-oIO{kZ96|# zGtQ-+P;rE#R&Be?Lv8Pvnw7QhS4-%?A63Z^A)qXUwt%qUPUzbJXie$jeAaK1iI(*N2`qy zs_G9Z`a;hNp)2P>S#vq&^NCAi?)33&R=;q()q9a+((3(S-^pJZ%$<1pe(%_x=@%Kx zx25*?Nql)wC@Py7L<~h~^u_iV_sr(W(&{CmkHVU|kl9K9?3Lcpzn?236ZgBn!G6X& zwCFu)S@8#=R9evJklEU{hotR%+GTDu_Z4SB;sf(lGuv?oefjF070{dvZ^u?o2B33j|*^uY?9I$Ool}R})Jjw$2>$vN>{HR=LyBDxZ;> z%U|n;3D$Fu^3uGkPvH&qv5ixIkga=BzH@)rlCaH1;pc)q-Hy^KYO*7VFPo& z^y<&nt_$#uigOum(@5`Om6$vfHqvkN;;b>{i#rKIfse6dsVq9oy~#se@wZZMPDvgr zTQKqkBVEq2cUrTtWY!DjA==JO>m(!(HE@r-0#}Lga@IO)&Ny?{Dk;r}Eqs98cNodT zq3I9kivzqR*)K7}@z zoz`=W@@3YGkkiaQRnCw7f28+KH5TB8o25iuP<;_DO{)B@lIcb4eC9Isdy{*ahi!g5 zelos5VlI4w1vZ>UB#^d2RD*QnI+su^U3rPa1JJ_ z&j4qS*@@}#sBB%+9S^9n9_lduK4xcjh#v2!xqtj@5MU%wyl!xw@L-MEY5ZNmJ5D_F z0Y#TFz|-}nKbqIeartN0NY8!xp!=xMlEDS9Zl|jMiT^cH?;rX^VkkJLxxe(_d{R*?rLf941cPrsA>cD z*$Aerk^OF$>K0~#(ei6A zzm_$DkMjg>_3WP1Mh&)2T5rPH+!l-cVYF7@qyJ1@v+sTM1C8YUjwf-^98Zuh0G1qxzr zJNV}lL?y|+G_i4+jMTgfr25_`d4yT*yHFTSY5SDwvIVu#G90j|#+Y{%$#VH;SvC5~ zJd&!>N=86rPTgd_%ts-+RWptb?`seDCyzAn7B$j?$SUBB>X0%2R0X7o^A@$DyU6(k6mB9=6UfE28%3GXl;@F6j9^_2cBOzzZSP&pZETlP%$Ro>f2#`x z|Fi_Xs}4L9CaaNogunha_B@v>%{+eIr>ZmlZN`%2LU=9#rG~$PW4`qfBYlaglE7fC&|K1gD9Wup3c%S!>lhd1FNvs1Ns`UU#x<{7kCy5}sQSBF*qrBCABSv1G9 z$5=NJD7Hwp>bQ9fB62fn8S)4s`qwFWcoSJP0AqiIJt$F#p;l)tJUc>{K&Jay8wvv zmuhdZdom@Ieg@0;m2B!RNUP8u6=0*b3485XP$CjG*BEu$H`Z;tfY3m)}eOY8+AUnMnYFOZ=juVH(^L*8qp zy+AZjNgZG>5T+~=F;c#cl)4&hM86dV&eloX8Xg`GD_^W^U4NZetsfQgFh};yb96V0 zd-B))7oEp|TSr@k00U|CBt;2-r;$;dLtcss~0bsq>IeS|JLr5)X6C4E~> zdT-K=rDQ7LhmaFYU!!B9bWbbB+%iwUSqYoojLOqvamM=9+{-X1qmQEQ3d$PKd4T@G zk7s1Cy6=E0q9`*LR+WGbKKEr(%uZMKaOk>`MniP- z_opaO-S#wf0p8r*(gU$}Cj5|ff3$%g7`?*$ti;5?s!(mVD|w1NVT#|r=0ju2;pCw` z)8`mV)^xdxgzC8tM>7VxvQkEynV;Z zU!40--hT2#s`IoteMRmVOBzMlIym&3HCA;hesXeV;bfXI5_adh7(Hb=&)fyB?byon zco&^e5GZu-h6%8LpgZc{-_^fY=-&nI&HDF}{BLn29VxK8a?Q~cNYoqB6Z@<tG2@*Iyi`>%Zc?lQS=$>`Sm43%7^|kad-ra|iJPehi(y z>}tI~#kq{AP^m7!h;uWXPxm~azzm~%LMsH!SGvJ`OY#)cn!aYv|B@?Ho`>K2m1YiN zy)G%TKK{^eEWA?csyk+n0ljpkReyh_IiCOZ=}L0SrNvyzEVsPcBe`!-gs@=;C{o^R z=B%0bR+{Tvn@oDV2)uXsWzBq?x+#ArKP1%C2A-++xU|Qe?4>m6Y!xcowfxZStzc5C z+s#-7I5Joa22fbkQ^EIRmH@TFfM6$)Z(?KB7ABXE>98%L!)j7GyK>-h1Ue3p>J=S- z-c85q-w7Qr=%(ZOlIN;IMMrgGz42TF9$Vo;_rDp;;43ZblyUu@Up~S3*7(OO#pPxm zss45D9Qi0j5yM1k*SS{x;}!O;$C8I5RxJ!Z{~3}sD?JD+HKsl+FcvDs9Vp1pC`dK+5<8CEs>>W% zk~|VN_Zzi1y!auVv0x$TknaT~U)6ga@rEI%yA6h~q?-`9?f&=O{}$;e08h&O)f?~0 z!@c6S;lN~M_VE$_v-al0eX2H=Z*=eGcX~^_nEH&&EBs*cEI|$vkyR+sRD@XAe$*O} zY6`g531Bt!Mk~ydHyPo(8x>`5Ldy91-zIq z8GmP!**%CvHebS`-0tRhwX22w-sBB)vn0yZsF>R2^#ytDRIg3EnlDvJ>XW?2*5Fl! zeyhGcs=i$)-+smGuR0E?WSjT$HR|;qUNNTcHQUXNZh{|_|7~~qJ9NVDyAwv~gx_^1 zT&)ux>`tiC35&WD%1B_|iNMem&UvmPU4>i1h(!9*I{{Y|U?i`4_wg>dWdyN{QfjUy z(2=pEu4fl-R9)<_TTrUJ;0P9yxrkbfB|_0BSdsH+;bAP5gx~Y#_5YZs%IH!ivDQ&@ zcZ-UMmt*DrKQeQvtH_wl8cFO}$sgqI-*_aSjXuN!RZt#+*}g~! zt@*< zDd9b2P8q>#seN0(o-!HTBaEeSP|@^}Rv~M*c7`MN_;|ENoNh+Tcv(t`ziE2xvt!8!9d9*{Z zMdaXcXxm$s4y}G48A4`nS7zdFxN52XzX5O*0KEnp^Uec;>*tT)mwYxL-QY{q0w1ZC zu9QlN9UzRSDB*MW@~-t0l_e_V(z(-L9&Al(cE(IqK}wDL1sfLiDUsQLgeW45ei9LB~pPFMA+fjKIx0?uYY65c2Ee1Y0k)ec>-oDXlo z&ff9*RA(?TAjABbXh5ozp{x&ulHO|&&BMBOf;DOc>U{b0Rcm8o!+2bqFEzhgKt=b? zT_u$-V}uIVws=3WDXE{%uYL$+59a*=x)I*ZcNLX3>{atHbAGC`$XrR-TE3}x^mrEe ztX|ew+5au+ZVOwUqA4?>1c4XTR=%VK~CymQ@(SCg??`Z zewTM7>QZx9IQJ(y zEDC_K*cvq+<7XR7l==g00%k}BrF0(nKICuli-|LFJa)mX=LiiZ52#x#FcGbzu_Ya zhfVUze9Yd8e`r?Dch21{J@A;{N(9VBat!_HB)?5N!YgsvVCKB-b&sTfw(ZrNT5m7v zOG!M;hfW}WjdRg1@o!F)JuL3G((S8Bwgx{c9(!H!Z+o<5RIZ&&dPXpi!E0usyg}rl z5LvyOL&M#$>(2jlO$-vrKa+cE|fk;|>jdNch0oZ~vMa&oZn3M;n(^5y@t0o|4J zbN|09%@zrHg!FDL)yqKg@BthkM-XYz?DR4H*46c%=c29r zHgYcffqXzAb%InST z&cg)B6;oo07kDw(fm7P0r*Y|AP86 z#uLOf{c@7uCfRhB#8zq)I~RVUyp`}a(HuICSFw8WdNasR!X1nhF^S+tH+Pl7d6S;T z`Sod?j(PDmI_ ztX8Jd#4nX)+`9FEmFTo)iGQFn(Dq2M7U5Q?@v<`Q-8g55hN$1CvEKhjcA(1FDY+&M zLOaM%BNJ!hQG1c3=;k_KVqIW8c|fv=hf|A&Xu?q9h+%HF>rV-o@$-q!u-h8b-i?Lz zeV_TF$Hm&;M(8O$C-nTSBNdDx_@KR9ltpu!^RCoW7xJjd2By78eHk9I>cZymu-WO{ zuMv!&(p`(W8;@h15Bx<0Cl-5X);%FOioW+h;3)A1^8KC1Zw#HSQ2edn;9RS43o6{q zH_X@UC*>n<5FcXdaesEA=Fqg52j@cT2p88rv9}~#Ow=KNiMPQ&*G%By!BL1Rrko*dY zz`0iK@0gakD5~bD&}GmaN>_>9#&Cz8c0Xrym}Lizk>c=;C$Bk^G& zmk?J`)03XkJ0Cy|ret-{+8%zPeG}72G$6F+t2t(;6C#5(W+(optz3FVWoGzcp@NbO z0JxX$nWh_WWOq@zXD~n2W}Y25J(jhvFEfU%u>-aO2+4qLj^S9*PUpdIN;v_#T-q~o zr$u_Oe0}qq1$J#?KvoKZiQp@E4*mw6I4|D}<$*29pHsDu9c!d_!S?y4mykNj-K0~V z5N)wl)pldT$o2JD%DIK4n>U}t9`kx5C4*8qclQ$ zbFjRdGlK41$+_w4!pvH}jIy9IBQ}H*qI~dU;i<(YehiAgVvzrW_#T5$Rf&X}as%R&Q>dKHKbN z*PiFcU$=Jl7`Cfg>>vAMGx_nXRlD40hor9ocgj(pKC!MC>1lDo|qP*5^_=R%l)EFJfaUfuBmXeMR&L z;%G2p`Od02;2fe4$(Yzl#!~FmY(bP{-kW`?&L8<3duhXi=1oD`6Zo4nSW4yD=vgWJ zo%and0JQGFaq?Gvan{B`&|j@i=r`AIJaM^rBOUkAg@l&nx2(yowd~ z6>NJ!mqUtr|N1n0NPtD{8Rll?x*9g>KJf4JJfrGi7wXpyKb}9B`;YM)dD(5}a+XZ{~)VRCly-SLxzC{YYV(6`y2 zysOJMqr*dVCQ~vc{FprAGEJZ=v!N^BZ#(IP-^P+*Bt%Q9Z%mw#i{WeY7v<_!NC7-_ z`c^k2a%_GRfS=>Z{i9+n*gnUZ4Yy#wSyD);t*Slb(WvC@mn;3b`;#%wj7WE6#=sNF zyZpRe%Ui0sz#YW1$NZ)F7q?eMt?6wGL$Hnbo7PNb2h{vpfPNvXWEcvsdyG`somAq>6}(i z_mdfCb=3yDMy7)ZH1Y9N>l~h?@|#gF5zfRS@eh95Qv>C#v3*8*vwUlJBp{KF`$IV$ zFvVDcJ=Go~>%|Xq)k7~4y~rJ?>U(}+TKmQ?}s`S=DtieZeZmu^$)7^F%#6u zB_4(L_(FBC%gFQx1{qmXRx2qd{_)83iI?>5Y~E2=yl$dd7gmx`HNpK6*~z+0s#f_~ zhpzG%DQ{0SSJR~?5%{W&r8Q#ajBsJEh(oVe?K+X0B^)Q|bp8&lAgh|HNMx~v(sH>g z22*QlkP~ZXgIq+N-jq9z<#q`o8;@@cdTlsaPT2lha!Y^2-Gg=EK)gct2xmLu7t$ZM zKp_Y(S}oz%5I9bZT2Uv&`WQydTErJtD8`cZ9#n33hO$Vc_-=Mxo|g9Zq_T=VfcO3` ze}*j|BQuuoJy6PgpWpfMlvE4Zb z5+Thh7=Xy0X61tB1W1H@e`WRc8RVmT`({=eX+=Qrrh*EEd#YAQz6viD#b>;E{#4#E zYy^hvZq(qr+HYvUo*qbLgU%GGlfyd36329$8)*(`l?a}QhLt4!P}YLuqa&zx1lw|y zbgH|{Y+^Zbfsh~`9ifDCBx+w5q}(RwN-4)M`7~*gR}r*4Q8Pk4`}4y6;m7>(A3uhH zbtog#SbAG{Vn+)@J=0W3U(5~>DPXwLBZSdoEmN$k6j58RNapb$mT2|`-ak3h#YS$_$gBm8$Jnq< z^R#XYS#retT=&tUJU^vca0d2gMHW_&NEf~ag;?|?-d@(p7D9HI7KXz@kE1b6#Dopz z;aIQf873$iYh(<1PHI@g{)1Nop$27yAO#!gpLVAMz7oq)gLJY~2omqOHT>dup=^Zj zk)|8>e1M7}r*%kjw;(l{HmqSXZlicLDW1m@MBGedQWg<8Ou~;yO!)yk%Xs!@@RUFu zk=muXOC~lJ@=au`anD!*PGk`g=R$m*MoQExI3!YtPDW~Uea?#iG6?v7!vaoN7U%UG z;*voRk8w6F^{(N#l8mk)+~P4>FIjxoN6Q!wnD7}A&H>i&0PL^oPEC`hQcW&njpcrH zXBrF!jlm^qq$S1;v|^gOq^qlsFUB>Xt#HfSiQz6ffIZ=;I5}h_7y0edjOb-1E5e2` zYKs{A-yoj4`I?mIha5=lIO<<#jSF(Oy#UMS+`&8Uo3buoB7iR2x?EB0t37#fioZnzh z>A`Az?d!~!G?+~wPJ0wO{KGt=Na|iHj5j%2A_oN7ub0i=$rw_`GkGup<%~u%p5kbi zA2l`R5_%clpJ%F04RcX!;fT>AXg&~2$;Q`njVRMJ{ zLc6)kX%&A^I$nwhMe@U!Ui-b!|0b5~^T9yYXR_QWHDAropP=Ul1u4XUvL-JG>aZBV zJw`ay(=q>GLg5=W^Irwyaq|uPc4;DX`knBP;3Y~Uk5XAV&iN1h+JRCDwA5sYp1a21 z&iTv9^Mi?>scJw2{QSeEWVOPU%7Nf)zX4R~DB*^%IV_aCF6?(dlnJDR6Y_r(0qYKx zo^E%i$#A(Yq=wQ;hR@sZgS%4tb6D6s+`QxDOJpo_mULLy{emPTR?J;wd~h!ov|pQR z-2MWAR!L9E7;zUd;OD+6#mwu%?mVehl4nucX$3Q_4`5$nJrWUv&8?^f@m>~Ngo$Ex zXj_e+F<~t1T9gmfqFhDbG4ZGz6Tt`{R{L${C=61FB0A^c#h4`I$HV+!87fOh=j|II z#hGHkQk!Ci@=SfWiQkzG=K1n8heqONKKntk>x>Iz^Y&p`ZDtvAKotEt0G}wc%d0A1 z$Q?;0rwUSJi==k>oZkk_+$8{14f%R>;}(BTK?_8ei3O%MUt{95+>`mm^G3)78eWUy zPVUc*c~rVhJVRAMF~=Es><4IAy1njM)PH>a;>91L5lV~AH_BtYGGUwV&~YiToeKTw zoDv31naI+(7>8tba(;2WqQi+Gvxb-a_M`8jQQRaUyghO&lbk+*_;0*IX~K)x8<|<)nr6QUYjT1$9gg( zASEb42$Sfy-~WW3Ow9d+UTmZe)qm**k7MY+=ST!0pL4cOJl=ncKi+>SmFI;1o1u$& z{TKZ|?LYDF?CwAM8*Egky*cs|I!y~4)$ccW<@CVpULSe!4H5`eBmExDvUq^-g+}8gr9UTHN{I}Q$mT5E3xTfQ$z8uae3Le2&UzI z*7?uMsN52-SSByIGg&UgE;G`Hfol(qShtWX9zHlU>`%N+$wbZ?6~X2zLz~6eS>ieA zm%0cNgD!q+OR6c7dp(cP1$l&KZ2VMCC{TGqxhEC>0;g(=hNON2N%i;r*X8>=;wE*I z`Rj9{I^8-`(PKmW-EMA{D;(S%&^TXn_Yh91GD?7L<$E64A8AnTTGCV_t)VJpLUFxk zLpEEM3D3KS$>978@0a7!C%3@)2H7SyYCm8I@Aao1|7A+b282sw#GefSBtRLz-M?I` zJL-7T~BQu4pf@KE}M) zcv^EJM6=&(4ORmeTm3~8vxY~^*B(*gveQwwKc1oh;M8xV8>Lk5L0n1ZW_T5Tiuvz6 z$-aRo^AU8teS|5vK4K1x|HV2*F$9-#{FIEW%&$XRVum3U5Vp#p0b}X#uq^No4i9rD z5~}@Q$!09sWM41)gf|78RroB)amC|{svY?KT6H@G$WVfH9FQ19#5j0bp{MKRa21`L zy9Y~Xr}GDN2yMYXm&9&_(m&)^o@NW_BX6D=M{=GsJ|>-hpz?*>%gI!A(7k|%r{h=9 z?XLJ*fyW;O!S11ZGroTq-yId8{{SSZ*0<&LG@gdhp$2-I0FuOV=fp#CmIN?7AfCJuAFtU-cX-8v-F_m@q1u zgwP}0AYt?l#?Qp4MgJO0L!%~|p$0U$*uKPGY?3Ed0CNIBEcy|ElmMWNiK-MJC9yS3 zd((kqEbV{8M6*HU-@Uy4|Rbv|uvwgs( z#OJ;7VJxjOmYzE?wk>gqfLvLCDJ-$;mZ~N}lJ=(#s~Ca>x8PYJXcpmzc20j|W{oH$v^=ZuN5VEiPaAAoLRKURtErYQ*6bx`{HGWx?jD|m*WXRYW3 z&!U%jdO?jy3IC}mJz{6avu^tJM4YI`3jQ=E<2mN~xocsvUJ zS_ej3W@22`vsQy(^}SQNvFbHF23DiN%2-M@_D{c3BYqkj9s-LBdFkK0D=g11lTaxy z1H6QRj|JmcHCY|_l3R!&!;(qsFHeD{?`dBWUp@?9)m3Yy)WE6@@~gl8^<{YKOD^ zYjFlWh7o+v4)7QJ>-ITi0F}>|k|13W9*&>O2C6wloN-8au1@;It~)?SmD+WCd4%n{ zeUwqQ4W8osATZQvGCp@#XGWqnDD@&z992Q}6od>XbQqy^hu z0KhbU5Jefh6#Yh6W5PHUWazWHor%*YVqc$rE8Ex${K~dZOEhWFf`Oi=i9T89VNK<- zD53(7@*10+LM!KoRH+Hn+ZuC#5&u^wR7EUXm zuQlK!G;)Rslpe(SGPF2>IByS?o;8*pWGxqB0W9G&;me>Sb4GrfLOXVJ-*2PB_f_Ys zLP|GyUE*v6TF>gTRNsS*W=LhN8dYTw6G>p}F6e{cx$tAd&M-QoTDazXhSmE5 zyvMM5V+h>4wg;y#Bm?24G4p2*KK&v(y;1infFqh!#e`PN#3A;1u_gzcgYZsjRi!8@ zAKgz^16~f>kN<=b2cn}{1K@aP|-WZj5JR9ltyuQlN76M!bq&G;b-kXRG?NUTSSG*p| zjpM?jOBu^zBs|qJ{Hv)DSzsE|E>(4)Ys#2ZRSQo`eM&5ZoL^(0Vq8A2m%+!Y=>F~P z?C9TPtC|>&{U?IurCL(SeobYb_IXM7-d9fKfUOYn1P-{D42lD4Gh3csrTV4~3?r)B zp#T`xeD2q0%r88};QG;#na;w)(bW`TtX23dXUr z&+?TY!wFQ>Qhs9flqtEwSom9pd#dXS_Os=M&i2Pg$fF>BvAH+p`V(J3y&J87nz{*5`@@%C(Ni^4xFKkMD@CGF%C7e2aRfD=9*^4WcWYhy7>>Rp4 zC5L6YQ*+&zU~J_qJd~p2S%p;{1f`0s?-2kyzZfJ^^CDjPTH#fi`>Bv0l)fMb-)ufY zR3%B=?MPcDY-#D*_iD?NZ08WRtWoopgV!8I<`sQ(hR=; z0MzryX-;zo3yS1bFx)TkOXkpT^Q0d=bw@;2#Q70H%xGyT4T1p#3Hnr(0Q8Cppy2!f zS>nN!Q)VLn7$^4C5$i?Y8@Cm}TO-S*e*}&p(AI%!@wEd9!^(u6b91J^tqb7TPC0RR;L-y=~t+no_F)6V~{E4J;wh`8;!v$Uw>4gBZPY zcZ>SvTuA3zl?-+#8-tAL=%b{{KVBE>H<=%zRyykNbMv094@Q^qqGpW>Qn&Mi&Bk=} z30{m9rzH=6(U^Y=>~AbtiIY|RF3vN1*{arh@I|+w$Etbwypq=9=uUpolrXskmX~7o zvc|J{wnw|zl6RfG&E1<2Pf0BGr;&y!yxEI*H)r+!LP=B|=vsv(fNS2Zq}TavHa z9^&st{02X9!P7TFT(dcOSnlxZOSS+UN}X>UGt{#{5OdBXH`= zx!U*O$TG}~$Kcc4MRxsPefH#Q)^)>|)ti~+n|;l?Nt;x_IrC$b>5%hJ~h7b_`9P(7k;GX8rZ4KJY=lsMSx1qaG=N)K^u(z zRpQH0Ded4nLY@-j@QqYwoslV_Hqb9C?mU^c8tFo$l1F|J-%ef`bY6ex1Y<>mKY6$x z(T>i*SU_i|_dy&$*9&OKlInymCj}{bSlqO9;p1S86=8nxExyOT<|SMQ4h4<*KclFZ z6Y|K#H;YxvX~}3B*MQxS$OFcTb?S1A=>wVbUd0-sbOd4Rh{@U5`mx>AULtiEEB2*! zRVEJ?PkV!m4Wcrsh%ODw`dsJp^+Tyi9ShDWo_k1s8rL;L!Fsc~V>1G;t~po04j8+2 zi1&=#3ka146cgX%JpDdGCW}{uK8LT1mlz9IsMqgchl47q!#^OLh*0A})e49c_$uQ- z#^R8utd6ukpXaE>(cRMi`*mhL1Ot+y{J|6pLWnYCOwTu*E63a55-qSO7p$=_7G?y<_mV0u=@hz?J1_^U?xH>ZO% z@=bSjkJ0K?;<18z9hIck)Oh6`u1(6%AQ~C>i)82r+d=ed4~#H2&5)xvdK_^NPNCUa zevA{{^zo$lxeOhSNp}{iUzq8<6Zf3Yp>buIEi1wT;_+yb2g~17XV|!|9dC#GqiIr7 z$BN(3-?rYbMAYmrz8?BuMsCfNstuH{@v?!ll=rf3Yxd+>u3+mX)Q>V_&dEF~t}qr7 zI!bzd9Kyb=e4ih__8AMmZh!&iGb4WH*0ieS_0TI#)Zu|4MxBwl7`@i}N<@%!^fBtA z>TGf_v51!o}(f)WUrZ-dEZFQ+^C(NlUfamp~Lf-(L){LtX*%Sq(g2 z#txiDMUz3hqFkOHspGuXh|DC;f=5Z! z9!j?}OWeV-Fk-YKc+UhSV__Y*NWxjheK8UMKTfVafb3u>15GME`!vp%8PBd+1~Z~- z$Z+?s^SU9`d4=)2CRGONRKX$Ke+k0@G%H^$a6@AFtlDPyA>t$@yfgxPibnmBhDSD-%ut zCmg7+<{B9x?jjQKYEl92enFE44#B-i_T}}$_Y|4N2S!Ny9l1ryEs69p3D1|<+TuDNT+~z;sjvdxsFjH(|}ZE%$GQlwDJjol*Qq}NY6i&E+%+Gs!M!1%eeZ3zVT-v zP8l|Bpp9TQuF0KhPyVaV|6Z)qNZ(5a(6Af2xGH4!y9~-Xj$Qg2|CZdFjGW3UaXBiZ z%1SEfo`KxEsJXc_km@vyg#&5j)}rmZ5s=MQ%Iz1K^{n9JhRs*!a#+Vm&VAnJYrksl zJN%u)K$fq~dm^brhS$ONvsd~NIh)pcT{!1ihVyoV#z|K5c`;Q3Wrvg(Gk5z{&ATG@ z;RaZ6nVQIww=1nJs?_>dADt%f9+0PW2h{UxIOf`UFtvFi2mi9Biquj3kjH zea&X~I+Ot;Ef=->_u@&S<%qHHfQ%14IJJ%p-#Q^AjoUz085F6mT{xcJdkO2#j!j;J zU+=$K#sds4^8q!8y?&BMODbjvtK^`&9Vm_Y5v#K|@Xfj5OVq1Jxn4`SU%>msYp+Km zk3bBWKR_317y;-3LPTm5p%q1;ACH)utcIj4=*##b%jUi&&B%yaH$FO!Qi_}Sc1Nm7 zM(-4|cxv66lcAT$@P^%|>Qfj-b8)mwjs7Wtlndv79xBp9I9G|K-kzq805z31- zu9SImvr~0&D-7%jstdt#E38l5(q7@@@nt+|nuvF1<&ufn)* zZf~m9@gcT?I5ma%`5?J@RTIIib9i43BuPZDEJ#s={V5`zLwaZ7ndQ_*Ea@?<)eQdNbT*D+Sezxes&q{ zAAz&uWFxZ!7^%lq6J+6~I%8rZH9O0~)XFUN1WyJsOF<*kCF&srz?gI$=t_$Vb^B@R zgv3B;-|MF|%5=ztyXlfNZ=0JpZ-2uz=8b@+TQ^Di8}8Ok(@u5Akl^vh)=fYaJGSap z5$3bOi?lM6ZogD8@L1p?{T`L{vv@bFqt2<47LVS6g+r3RBqLy~SWl+d5oO|Ftt*pX zU*Q$KY9!mT3bJ{#n7$?BAhM4j_|)p9+oM9(2sFu%iH9XUVTbIXbQ|jr=PoJE(6lu1 zFcAqKmw#CJtRjoER*|VT& z@ORqPg?=$OtTV35#x@z(w`7`T_bShpuPhfUNUDqr zo>Zv6_swjWEhay41XuKb109lbeKT8BdQ^>QU}klCROQtTP~B@V?WbmhSsWP)e+~`# z9<^={Wrv6OAsq~`fb%Obf{qJ^Ab(_t#OVnm-B7Ia=W~rJVc-@eVLMpvo+8M-Rb)Zt zd$3cMAubSA9InEXWQ40b4Amg_MzuG>$3r`xdm&YM@}fo=hrYpT3)Q*|43(<=1y)$z zFzD9CW$4Tj?Mf&@tAC{5qw@YO{eFkMe~ovrc5aZgwAP5V42g{k8usVKnbJ$H5k*YRKo02;!c{1NGMZFtss zpD29{`*+&keSk>d0*$|jP^~al07HI>R_8P7M2HV?CsV>mPesqNU`S$u^Rm}c^b(`$)WW2*c73`67Z1NX) zy69M;DW?qWBGuVvj!TcuKG%-?0xtpU<_Nm%3vD?WKgKwdXXEd%W3-scn2X^^PBx=JDap&BFLwix$Yh z*=5WtMV4)THu@79vbot!NQ}w66C7hv?swIY>2?i7Jdp-ZU^hkh>T~jbi>~mB8o+HUdO&l)PSl=7+Ak5WRu^ zl=);08sw%g&IDrtwt210D#pCUqR~=Vh*a#YZsoWVzlku21og&>Xc>%`%Mps@df2h9 z6u!&T?iy<95Varxvp6p>1-o}ke>uaM}8v#Cuhb_AY)Jdg6h$kgMqM1k%6 z0H&G1Ba?fas+b5KZ2aB-7>T)5gLgX+f3-`eYHY zItf@&=232w3oy z)j)aHTPC|ZLD5(^P0MN#Z}~ZWKhvl;Vm{K5<(o*Co^{{UY+J^=bh8X|d8#F-`y>4E zs${WW7M^pe1+I1=X$OYUteO*zvu+KIvX9%-YCL<|-mqT%e-*hWL>Q{m5%0plerLV< z&do8Jqy3;MOzsUFTGY*Y%!x8i9))|6lp;Xn-dEJW(>$hk1GI!s`D9kxlhtKaW!nEC}<;Sc9;%<3wNel)MfJPuh!*;z~1_n2cS zp$EU1cQkdWSxGHm(K6LFjM)d@Jw6FsFLi5vX9R?`i3AygiNxKsN8!lP7$fs%<~H{q zWIo<3Bi%%MQZtSc zl&g_)v6a)`7Y!nudY)^QPL|j_MrOJOUV%gyksTK17YDtxw}Nh!q}a73GM@=2DFcW{ zjtlwi{zDWAgb(PaC9}jX+&~QH_vs#h6KY@O_yVK2ry&jW-nF5H!Sz*rWaDrpu8?YTL|WK`=`5Rdbj%gop_0U0zmUMuI=6X!j$I2ERyFQ zmhfQHe{Ba^9+CXHhuMLC7W#FcSK*KrkqUntD4tVM)#Q92Bc5wAbwjWqOXJK^{Wv3j zj_PNn-*bzm`|VQj(fVAzsr9m{p6{j;=(kq+LsT#%YAjaqvPt-1^M`#H8M1b+VJnwM zEkDD}ost@{0v5t2V*I_m;|_wt?(=t^wu>#qfF+#0F~(uTIj@_$q-^ow`1vewN(VIr zXUT!`8WQn@yC=eIWnLX-GtY}n!TB+%K$4+(Uvw`;^MUpVQ4wkcr%=?6sFRzLAZ8J5 zJ_|U17So!fQE~+(MS|vj208yA^w8%|WJo#dp&=%SQ$eK66D$a<6lV~6@~8F=ff5Z! z)zQ{;?j;S!w$0+ysksdkODA_SuC@ag48n~cam|htHhB*4N$pcq1teD(=`Ly%8-`t@ z+ym^;0`qycH&Jb-o(2Mav%)hh99gJN-*0p1pq8VlfhU9tb{$?bzl@34l#ptrQ>UOz zM*_4lVof@Vi^dILCnpMJ9u5i^o{9%^g^ldfwgxQ2bUG#;t=i&mKCP_~o6i~e09Hvf z2j#-WZ56-`n#T0?01cYzGVcmV>_AMkBO+SHT7ubV4_TjX0B`AUQph` zrFucDzVRpr9*UGxH@#5?Aejxz%yHd*8+5?|FW#7(`oLjOVqReo&>H~FM+lt>lV4{I z-j2VKcx=5wTMoAP6KAYH62HQ_GIMZZWBe;-2TAew)WR8K7BP>;Y5r)9&mr=Wi3@BN zVY&W@xi9g8xh_8rJ^oiSuN0E2AFL}SRMNrt4c<6PJmSd~4mgsfuW-_soruxgy;dOe zAc`c=^F*dQ0?xmw3D#U`WCqLJgVUfM^$I&|BFi-kw3@x+J9HNVFxS|P#TNw&)n37* zEB<*86C)!Ita)s};w42fJU~KhlwO`|JLg9(6p3@<8 zz7OoF9Y)k)p)yGGC3K!tYBClV%dFg)moMfKU|J)NiX%#kdCk%3?YS3W&+QW% zM=?l)Fn7or61Hv*mv3TLj5fbjkZO+DfphH9=SFfk$V@Fs?FyuvfOT%HB;Jk|y~gjI zFO&lfC(K8lG>y}CVlJ4tqOo9i7SRQw>xousEVzolRUBG^U0hM z;@E4dHDZ4+V&5$;+G>=Op~Mc%;}OOeDL>}z+KeovSkS5Udunw+1i(llnjPgVz!olK zeXSn=&ZCK`Y#?7sF7)){ktqIs2!Ny0vmzX(T?@_<8B4TI<)GLozyy-Op}hGD(d6Ft zD@o!?xi{#EAmmrEv^rj~M-S!}(E@uWu02hO3n6TYmKs@eowDbMfoSr4kzyZ6d+075 zX`}(Mp~FHj2!xlMi&(NCu0MBN2bAP|F0)-vvB+fiU&sS`bA^cUd^~sMri39A)GA~O zBXmeb${KUjP8>CsuS6B&8sE;7Ok>Vhp2A}0GdGqux4l32C0S_8Sgz`d?e`FwT4c@Y zY zTKH`P393)oB1Qpu3pSji%mD-#Zq7wyKQS!(Ms@2s3O5wH-Scg`SVc7ur>jgwZSkld zzXd`Lu= z1aVv1c5$M}Y$!Qr180q-rf}kq0($PA%K{7yc6`FkJBrLJ1vI-p<bG4Tlm%hHAwY=d~7__)n5+Y zt?Ag+e5lX*!{yI|qp?s{;Yx5V%@ZDn;FKZj_=&65I0R)=~%DYXDTdf|awI{H@LxwvEsKwTP;&m>RQXQe#Or1@`d0xvqna|*#Qkp2jB*KJakL{9`eY`PX z--IUhlh|uhFE^X>@^NLr`tH$GGY-k-cbEstkJzJ>Ga^9^W3AI<>wt{|Xz7c!PT!|0 z^u)V9Pa@Tc03MITZ4j}-ycydxtDjwZ5A|GN4?Sw#auls5oU8NXUBC*WDP0*`d8eFy z!()DSAD9-zel2E&=dD3nIXKp~r|q5CvBcKgQaEU~e`YI>y^glg+hiPsUJS4_L zUvY?@6j6@Ev2}+16L6PF0q9;xzyMsU?`x)5zzQgpri^U#Q_#9Vf^jrsuHR_P6I%sW zma~a1VqLn;DllE<04C11?Z%Q&w0M&_?5K6~QOQ4jM?XX*IYajFBh3zhAu~iyG)v-z zP_f);?kvb%D@Za#fa}w*5qV81r|(-ipBKxTyQaN%e0I*N*_o_?j&=S{0UF347<>Se zHZxHU3&)?#mp7fnrOdIwM4LQcY#Cw(0G+ zv>>t8`q$h-AU-*onAeXaUXti9*M?*4MoSd_8s$h^!<;Ou6;zD5+E!V^&dFE93?o)G z5p%>*e9jr_asso4nWWUNUWP8gTUhafmB7g+z$|Tj?I^7_mLB61r-F_Y@@U=@Zq9}M z8<8W2#o@!xTpISbA-L6#iRQRt>b&5Lqv+}3>HmW9YpmPDJi`50DA?7%k7YSvPz7Kr zF_vySUY2q|_rE&PoN|n?Z|1n8q{On*H{kFqH@8cWn36#wf^lJ~5+K4*vK$+ZqH&+H zzDTC-**B|KY$0#OHVu<8!S(Zg`8R#sFFznV)F{ZMLNtQUF@7LfN$#f}U*{j1{?$$` zMxx~4b*yrIR$n7M10Dc@@t#i2zJkU5QP&jMcNZiN;iU2;26Xo9Fa~TqF8%oue?R%u zLjpwK$zUu=_{{y>8kAnn7QV6M>;Y{?rXR4`+B#MB&%n^xM&@i%6qx!meP&yFZNl{* zF_xTREP38oVhT99Q~Vt=iMQ<=i8Iw5Bxj3j)Caf@6E0oyR5g+7ex)tT+L2p2b!5HV zMbr!3sty`UZk45*8WG1~FW?w)daZdRewK_sTyJ&FUON(d1|m7}qr`lI>I+io$3dig zo8A9O8CmGrC0zQ2KP@Js1VlQn5^)q8zN_2~iu&AVW(A3GVX$lr+|@ z?D3_={E3_vGXOpmR!xXI@~Bqr=UxQ;)P8PIyUyE&e`vZ?7+|L(Zkz~B>+eYFrqc02v?U(dzk}#0zt~f zDGwxpX1?074YO*gw!r$^n9sJMzhiHfwLTnZC|dv<7II>v^v zWHWlLtjK;Nn5W({+TJRD&DYW6+GCao^YT2{mGtC^76| zWHz(FDv2F2?pwq!V2>uc5T;Ii25Cp?Fdhb@)e9Wi(-TMbMx1Y>BdHlV&SNaU+}S9;%pdr;9)V}rR##(5+odhhrL;aGCiwxd z8Y9#FHp#+Yw1eNH3hb%eLZ=x|bKAV1VJ=W(vrOQr0%~+UMiCiZnXghm1eqY#5wSRU zD+#BF%_s28+p#bPNF|DVH36tHoJt7KG(9}CB=uIG z_+Yjvo;dn+8P%1)rnV{Y{h&NO)xEi&l2s2lh?&qYG#E66F)H@1=Psn2yOEZo6;F^| zp??V}+QpwCP68w150dZ(3EjMK4}A|fiGay)Q{Fl5TGEUqW7KJuE5LE!D7I`~pr~4j z=CuEC=nNyXlr+R1OJ?ThSJnK??a*g&E#Q*p^YeXL!VD5W_+#^@yN(aaeaf8*&MSn- zt{jH$Xq8tZeUh{U)K0F%$%Mx6)0G3S2<8bA=kZU1I_%(W{P7yi_5xj>o07FtJ-OD# zx4F_nL|jJh5oGIi_KQMMiD^Av^TI#bnU>DFS-|Pe%{>ON(G#D$i0JfKR%5RjnIsjP z+Y|wsj}@7l+jd+Wc|wA6aA#;LdyzYV?+~?&>V0lA6xJ=<4bn=b^7JWBl_GK|<3iOY z^C#y4g!Q)fv8#VU&>5q4Bb`xUUwu@#j9d-OM}4zbtL2b|2;=HV5nO$y%X!@6Kd0?Q z^)b@ovnGkKR!P;C%m&a>dOuHPon~-H%n#YsG}2FltzK3cOMW8L3aXO2o;-E9%$R>W z{Qx1tSeZh`LOGC?I?{X2cLuR+ochhD#TKS43+1ob{TE5Q2?V#ld@q`{SQHspqHRZs zMF?3)37Y@rlBQPc>HsU5mE7vl_LjN1crWV=^AL9@7Q|TjDl?YoIb|RprJ`}hd`u%m zR#aE-s;18Hiyvvd3@z|7-&Yd^GURTM!_OZq<-EO-k{wGRjT1c@{>uien?%!(9Won^ zPHi`zm-m(48guGCa*F#Q5%i8?Fe~S036tG8BfVXNkudAyavXp(($5PautBn%jK9AO zg|}Pnfyo(`Awp~f=iF)4`I@%}Qg0f?#L;Bs?0!X17JEbDXtqxErTGEMhPtk$Y71>E zFgufn%ch5wzNtHw-_s6AuV#FdmOQB)ZzKXud6@6o40^^%6N~UI5O^(S6btOMy+r9 zMNMqxXh!0_r-G7&{RQ8$uk+`Va`?M*4Ef|7-6plJOJ=G#N?n&s@}9r+p0(a{fcLEN zo{xIZhrH)w-t%$qxygHu_ntewr{g_$d(U?7InH}N=snkX&t={-bcT-qRQ%V(;1HJ&$_N3Ep#+_q^YGzId9Z!#eMI)O&97p4+`=#LFM{o=skQ z(EGi{`@P$HKI=VS_MSVvr_akD@SdGsddT~|%=^9AdzN_VuY11_c+XYdv()?E?)`Su z)6H=kXb<}$gF`}z1l^&MK8=M>-g2e~$p7vA9p3!~#*%RnxuknZOZ?WHHSZ|scrCYH zt?!(EjAj1@emAS%7$%nGZ6or;KR|BOAZE7NCbw$%&Gp3iu?o5xf*j)~j^$2fb^i2{ z;BkAIdV`2uA2W;?dArzU*&QNZ5!;65+4;@O6XCzoeFH@)CV?&SAO)Sw&yZNXP|kez zEY{PkM&<+7Sh9;ybB@!SI>d@7%X&7l9Ou7Ckl^vX?c4p;T?>Xq;@?vjVB;Sm`q(Jq zR&(7#+xAp*?_v&s&2as1n6pEy4G1tT85fK_^Z0rdT6b}Ve8(Ij$dg~)m(97Z+3XnU zjR$V)=}}c;QFfT#4gb5M*DLD&McILlb1DG2-|=eU6n4YC`?%$r#V#O* z-l>RNn<9kdP4NolviVARDs%3wC-N8da39Ep`o4#&rPWr%Xy>IKi{7EPLn@z zo;BoU`)g(JeZbt@wGIulEVZiS7WekCz0eT|g=!6X-DDx~K7H1+vxPq0y$zb5df!O( zGyjk88%Zz&T9}sp@9!Hqg3kM?_l-0X&#km;bhONQnQTIW(2c!(xxL4Uz7 zQlufj8H#58BhFtt#WAiI`Voot_&@#Sc#68Zp(N{{B>8X86^RF#v++8Q?v0K5i(AJR z1tbsuG0FdTmG2|)<;%z6uTl9?3IzW2p77<1EBng|ejcCT1;C%<caoWsR=*J)fdojgy4Jqe*!Ag10#FTPrkTU@Z|*h zP3lMfAF6yGp`Uy?PQN_8RsO5~=luCVt|w=U%4P`-APO*OhP*n1C!ykYfB6V+2!dnG zfA^5jrHyIbW=5NWp#dvqxSlg!t1mdp(42wd!BQ}NO6!PRf zF)vU{m>Uf~Nt0s^g zTB>pkEmMz_3fUkVt8<0i_hspD@S0ESMd&OGUgu?U*iTjqCH9(`N}kT#c}00r zHfv%!KOo6cbhQ`NNZ$3*(gBjHXbN$K5pSAbB+jDp`rw5$8z+^_cmcWM++IWj!t6*l zvX>(168zCQh`Hak6~xRPlCWCpw#CkbilKTRM5|@sAK~H&Tsf1=Wu=TYMJH!!a%w2gc`Lt4|6R+?ZMynA>p2&$ zox*X_DKLMS%Z?}ahlT#1bNw*t&U1b9C-c3t?{b!d=cCODnLoIg=|$#q_rFD@SYAt$ z?2IDlA)yD2YWfS*J7sgBIKrCMQJZ7w5PIfs1HJ}Z-TWccIt4dQuOqTfO(x&3&K11E z7{{CnN$V!=bsSxlOM*1V*YHbZ@Bn#&RJ#Ro0PTdgB)t)<_Wxq;?E|BzuEzf?S#Z_W zSu|qMRMHwX2)0CN%aVu*VG|UCi7_H7zO>Y8i*1ly0U?sOyOQa+nzmZCwJq&KTi;r# zr75iz6Tl=WYE&vHsHkXXU9CYWua^8i=iZskZj7z{J>NebTC+2A-_Jew-1BzNwGYAMs0Qu#`O->l1}Q)>F{vtLP1+N#*_oaBwFWNM?S$hq#o_#(q@XWDqvG%OvrtxN#7mD6TjPi*&n{f!8 zv)KxmbG90>uaF1rVC;+hD&GEOflOgLa~~oP7<6_y6@&{~4ya!h#_P}WsOI~R(xT64 zWTw}eijmtJE|3K}kH%z4@Az>~BS`t)Pv~KJALMGLFF4&7*>2tFm&oax%~^%f?f_8~ z;s;sN=F9fiU(0p7J=KRRHo=dkLTlm8_0|KNTzNx~UHFRt+p%ascd;a#Z{5SClk#8p zZ~=jS6421EobKVZ>8H!nPZ#kdIl6~m;yl^y)J%Tw| z*&_BGv!#%~iI(x|S+-EKMYhyLi)^CZEs|4>pd~;3RFr;_QaW`)`YF9Ns~U7_dK+%J z$jN86$cAjT)biKvtM{b$<(1RG_ofwtspE9nm=~#ynURa-*$mxdFC=qx-#)GnYg)mr znO4(1Do-`8FiL}Kc9L19!oGeraH+Wmc-Y5$iQ(0(vOXvC1n3e?9rm-!G}!i=q16u9 zLTdzUp~n-URf2mDOODWLb51WP4R}Kvtk4<(FCK289xL>?8QNqoSD7}b^OOOZ~aQr{9xwjW@zJn`xt)cuYCl+ zDyMa}({uap4+!=Aiy%?7LpTuJ9)2MRW`YJdYunK^ut<7O|(!9{uDvt^mzLbo!OdEh?AI2#iw z%iOBYcZU||^kKhMT@bADGuGts@^-T?xF|pJ7T=M~QUs}`U$6+XTeYxZe(YI_DLfwRwa#%8p{T0LZ3^=%y7eY zxt2!TV$6me_Q}6iL~+Qexch$`T#|~Pl8QqsAN$70Em zo{l9l9TE^{@N_&yV0-)-4%1j2y3gWXaPYcR%pykYXH3GL@=?C7_?6U?6E=)?_2h2wgo8F4+PdS7k}AUu#pK6K%;N)b z$h$+W`hAgl_nV2OI>D@IwrUE@n%l6+OGC?LwnKNy-Vu5@5qj7Rts|0dA?H1xuF1apddwhd1hTOpOo@!c zP7~zuDjtp4M-(E~?4sh-309?2Fv}EuP{zKwep2wKlAqWnTgR#F*2KfG3vO}cLnZk} zdOjf*iq!b1BL=1(aQ!htn_QOl`_#@>X*I0k%P_*H{#4*8X0!zB4vgD@xGyMpEg1*T z0GAyN2EPmSxSEBKk0~gHi4t} z3v<-4+6t|LS`ISrAI$nCj7Jm-3M;cA6w*OR|fc2mC69qvL2SL=x3F z=x8R)rk$x%ns4&u81Y81-KyCU4Q=&A*CSGFimvkqL$LdIQ=OGt8rmLiw9YJzY=_s_ zJFcmhqPRoJ?`EU*B`Ms*nIfZAg~Dvw8Eo3T^efA*u+H;h9G6>n&BzX;RjkO!T&>^Z zH(0YHGNpM5ZO3k6ighpK$yvyVGgfGOaF`LFNp6)f{uq5x8Dkfbv5h7HLNK%`{50(? zJDe(wgeathA*ksQq}ab)NHkJX0edD}6WFYjQ6yWl3(dL$v!W1<%dzfyQ5qK`CSEvF zY)+3=USw7l@k}Jm;#fy(Ww8;zl*T2sTq(KafqU8l>PsG1sp-u5t(Ex$Ls9fjkMUj> zkYZ<4|7&(6C&^euKBpjkPFB0`deGudp-T!!l$2YN((83+v=jfKr2Gf!bIe~MCe^q40JFtrw@5x_YbIR zPERhvpJ*&to`rpgfT8!8;sn})P)a6$>7%015a!*kJCao_JLM(hll+ZKgi26iAbSnj zYbEnVq)9jAHgq}tjCJD^O1V6_2~4XtzVTJj7|UHELn`N9a+Pz>Sffnt!O=>92^5mH zY*5}Evb*2irm#;=EhcInx0>XzCo3`?5I-ai-(LIBVS=NNb0NI!R_8&Ft%d?|*3N;! zyw80uG#l=*=G;eIwc6%I#VquT5t%Ixum-H!-5fRne-3~@otE6AC@0Vo6LW7qMe|?A z+FWx#&=yQlO+Ni60E)lId%oaDkvC*FtXU&~UO-5C)fLtkmz2^K-BzvYRGz-B`zm?4 zkc&aIyQDQ|4P1w{V7KQrae&wXvM3>}AW^fyY}jBnZR!pwMXE!qx{zm(+)Tv(&{q2m zv=354)276N-7SZDTe$Zoo+~ZPd0cj>=aE5-_R3;whL=SfT4CjeeIhT7=6j+(U_J{) zYFL@5&5s^B*?h^E8CkhERKPHOub+*yxMRCREBN9l!iCyDC1f1oSAEs`@b1t`d6R*DQ&qfD_{LG5UX$jkeAbbiuQqE| z1bf0W%{gsm{2H_3>uac&l=PSvA3`oM=`}v??b_O_SW3 z%1R@Tn^k2-Y?X$cbis~K1a>tYsIyQAWGe}@@{}?m@aXH{on1U8J*WTT9s8}!sg;Y+ z>kIZ6u^K*doNoWg#_i2i9(%!>USKUKGvab{PxGR}obXMh)APfTy8M;p}TuxFl0wv!p7p>?w z90mP)+Mki9+FwbYmS=OyVW};LUXOhZ)5+~K#K``d(ECrUuWzr;T3>V4Bu^r?3KL-l-c>u;*YRUy*!kV1H=Y-_X!-oU!~0x{~l}cQwM?g;v2O>hI>B0`> zmu1blGqc>Yw9xj6@h-_M_eK&iTWGQa*e??OKqzEa#FYo_ZTB4Nx8D(KDwKPTqTGKH z`t!qw6`@aUun$L+;2e~_gI{Lqj`t5zIJAMigKX#PY{{+i5%}AWA?DaWa;&r80WD=` z5dEe-e=(<-fE*X)N6kCJ6>kVwI_6*fEJMSxe z{xY9k!tVUaW+pea$#!yl8}$C_R4CiCu4?}YJaL>|3HQ_K7RR#elc~MCyijNbmRb4XHETaA_v?>(PbgP= zLRWb{*<=^wr$~Of%8NbS<>Tein#O_h$_Y4lnw1l+5F5Q&>5_Rua+#H7=1JXEx(&xX z`%~%dC4LYso5*Xz&$%1a^Me_0Q<_qDto}-#rk7c@6U;^9mHVz-nlgQ&c+o(z^`$Fi z_&ebFk7wb@(hO%}=)3O4Cs{TSTb=S=7jWa*4#6x(UUAX;`L?0Z--yo60H%hwO=tNEI;1y>Fe3@80LwiEjZCN<@S0K5VEc zObg_vvY-%)S9h+e4AOigm2_A7u7z)~YHShbHkvd1c$9hi#SHcy1$I(E31fXq65HLK z`><3|>FbdnE&ZC6`BungDSy=pBx<%Yu>K44teVY29V1(17NtU#Gt6fAFo%9vH3KPD zsLz_g9b}tz8}veId{0?@-J)FVJ5Y3Uy3$0=&g?J-(qmg%2k%0m2ziR zs@RuEM<00plPJ@e53g(ufa75<>SDfT__}iy)GB=fH9JCuNIKu4K55MXVisiWI;YWd z$&`9XfY4>va7;2$v)K;un|i?PYD?`>B=Z!>^GEgg)CQEA54uP?)clWg=YQ;=`G4#) z&i`~h|CeXYzf>mkPbL3h{-+fVo_{}IC{!#z|5xTeV~} zS$)p@uXpBOwi20tlxfcVs|qW90yR4#6zFC9B|T(0j!sL@}wRp z=S|mTGUX2a3apV@jdr|`B4utHeLxoh;;s&yWKUZwThyPW6}xy1DCqQK6aC;hI+fP? zzIUj9jpRt3gcZM!s>E4Hb@v-GQL@X}2l3#GO89{}>uH-Yn#9TpecYWR+njdb7~(sg zy83^vKcVEdKfq~pkPl$DM^XkDa#fe|ClTinNn0ZW0dz--&j=lQkV-a6Uqmty$CJ?R zXoq;6Aaf!2i6e^kLOJ|!u~~Tkaz2$vS+t$IyUPRD^7A9tAd?CJe!DYQKZpU@qiMH+Lb;X%KD2cT?tDyje2)<+D&~`{mRa)qD7(N-7T- zIjvuUx+511bR@GMPKO)Fm)T$vW!(P;KEDu}n}&~^nazUF zndxq=xyFHyPr=9W7gA6K#4-;uuP@*;r{-0sf5vH(soBjy)Fq~1$x-R~c@#atVBGnR z+eRkt6i`J_bQT%7bA~e+!iY)#H0~&d>@Om1@D1EijGM+C@otKCr1{u5y4wNR{5=yk z(%dM~VW{PG-#0!x?ubJ?g~bEsZmVf!;K|qUEY85c|Dt~T z2KcX`@b4U{_Xt(5i+}0$BkX3kM{!pFY5n-NX7zvUC;Gnyqrd%2mQ_ao|BL$X-|{K_ zUncdQr|Nb44}N6sA2pg5gC2@RLpqq;9LKLTGp{8q#Bs9BxX+SMsQfhSwvI8M@9$N& z)4TkNf{)KS98zLfBl|B5KuShnD&k*sgYPoU18M%mXUVSMwtENcKxVsXK1qsZ>}yh_ zQ^hw_?Pm1RsZY`PQ@>pW;@K!TqS3L)4_(A6!`qgPa*9!)@HtZS@LNalDl!fb~)8NKsE0295g4{a7x2*Iiu$Vh&EB% z;Q8H{FNiW|e$#VOdcEsgF6>sP{Q(PJfpL0zPDG>d>2q>mo>Rf#IjPh8?hus?%t;fi z>p6MrvhcI}A+^CP4C_l%A+Kigz@?)*%VY7VEG zPnn-=n5F0E@9c?seiGC+cz(vx+ceE|@u&4a_76tviRblr|2}H)c<;KDj$XxL{Ot8P zurpG%|su@i+nd23CK7ppQ)BZXf2Zy3Wz1wLYb2$N@pg2vtb5N?v#z4FmD?fpr zv_YR^=zo#5OUXoom|G}v0p-=FK3-1Om8ruFJ`OWbG4~?Da1f(YJ+t6>mcNNwsRmxt zeBM6NtwTB_cEQxCq6C*3x60cvd6TrK6d#gO-kUeh*2uQrSzpvoZCEtzo#fIK#-*(T zX~l5SpOz+Z7d|zO^9!Gr*74z|rxpG)D^2PD*+>1B2S1Je9ZDaQ4us&$P`&bE5{H1gVZ=F7Sv z&6foO=F3azgb<+%RcF)~hO${c>)Irr9MWWYubbSaRBe%MFwp?!uNQ;3879m3j~QgL z%!0>rr2apdF9nbDv(2A3Q2BuQbFRD%W&S*A05av|5y(tZ-4e)LGqk;SlRNnJnU-vi z6bA->ZpcvJWsUdsk^k%QI((g_MtqSKRsP|Y>mR;$F|LGBaSTsb;w8?i7FEk(a^@l` zuHgww{KTEl&7AZQ=QOW9YNpoLPN9RscnqwUtp1Pr&;8Hl(UcWT(L=S@cr{tQA3K_+ zH$$EhgMcc+%89Xn;)aK+6V6eHdJ9!iHH?`sjp_+4mGcyUsqSYiL+#h9XXlFHGgE`0 zY{S_yeX5=<`7n4Lg%3|W+Mh^HKynWzXZKmm#5E1 z#A@{GP7{BT?i?93#%%pFsETXaJcoiGE+sr+XKDv_tgL(iHG{!|?MZen6^;7d|FR4;n)6D{6D$k&&~9!fnyl-t|5#vuLA9e*C< zFO%`htp^h#$6@m?wk{ynlOK=cEuH;ig0DB7JalJSc#Jn+kN0MY-dgN=hE9FgXU_7c zo({fyLwD+3w?WN6B+f19uGrZlXWnPb(5SrNXjyA$ecYV-x7#DRqMZfFFOX5m6l%W4 z3)VIHtqF2+TzufITg9i4AV+na3`s<`+u!`@q5j029k}V}Los&C&xF|*&rVpK-Ct9_ zz@T-a(Q)>R%ok!(i7zeb6Tgm)!?_HBTJ(91mM%H>MlQ2yhkXowJQNT1g-?Vrp+(^z zcG-`qR=lZuobx+nMfR)r(G$|8AIfQH?@x1clGyV534djqCy7;HSu_#arc?JX$7fVc zrF})1&WMZYujsDOs-y4@5DGC|ev$LGD~F|R^65<}CL>7JX3#UMV!Xu-lNICF(DR)2 zZB|`gXzSYBO-a^G1?n_9FYDfHv96(k<91%MD^}6&y8=J`>;BYvZrD~ zbL8)2gq0&1e!;BEOV^sQDeHK}b&X=IurBqQv&UPP`pnsR_!F9SjhAI_=1g&S#d!L~ z;cO=b+CkSOh{AYl{@l{}R~fMx_)A$;J>oBS8-l)7waHp6BT7{D3dr}{*Io*_ytvP* z5?5XPl<>wTI9hc9C(Jn3iDY{0Uu1Q`zYthUye{unHSRX6aY?LVgss)$l32CftR}v| z4!L!qYNuI^OJbGXTAgprXtWm0O)TyyT{2G^zqrS^B_g=SIf`NYb{~duJIAc%Jmuzb z^l6s225wepH_4sVI;rkp1s$c<+mZPTzhE6=*P*P6K*hyLL6 z;d61&=YT9j7-^kg-QYFzjdsA<=xx2k2Sm}61fLhD*&P;+{BySQKDM(nIqbTP%4ySk zE-w9vX)QQy?xcU;rpceQrMsVfBHj z?CJ6u@#kpBIyY}mS9AEtk`8W3HR5tEWKUPQ5&xy6E$~@WI5RtTpUk4T!9FNqHE(^E zw9*T_YCV}36m(S=dW^fOec~lOEXOp=nE`WVo_N7_RTZQ5Q|R4QIR&&klImH+){*w8 zXVs3nr?SM0IWYO53~u$QGI9$&5##N@(5G;gfeG6B1a0HziV=kL{tNxdvw1F^QP5_@ zFQQhWj{c51tO}nvNn6vs)`YM(xGP*Zb{85Oj)LIKiW8}EL02gwKU|ksN(uYDUhRpSTY&$BD%sqo-24~)h?1{8 z>XIP6mLV~VnE$E7`86vR*<0{#GS{`NlN-{x(OA~kyzXXsL$J*;TR-N>T(wXBR?ai) z8#Da%q>tP`oMTlK3(JEyB+3Mxf$u_a6}cbyembwWL? ziahHG+_1+!CH~b1)btWe^ww=u9<1=26@f(f``gWme6z>6tAaqIx#8p4Z>>7cr24zc z3vhov6;&hbHc~5*O?W}NP$`aYU^hwz0PMfa*EYwHRM>=dlOd-8~eA;e+|3t zeF1AQwV*yR{<6-ux!Z>DF@Ce`bS`AS$#32iU|4x<;O&b7Op0}_KXQsXzclv4^a&@f zKRz*6;!_?pzvFGa!k1hsi|B@;)Jyg*v=nXj)AD!VpUgk;#Ly|6&u#_3+H$}+jaj+l zSeg9!zCG1vN`S25*3gS`9-ebmBh1idBmN_jo10$DK^hKi4uQ&1thzbKTtrbkmN^nGJ7N;4yapS*I1obS{(=<-@L30AMJp}j#H}q zwcB$iaf#l*%}Z8wp13`8^AP9B*@I&0U=u~R4-^e=)ChfxbdkmGfvLo~%$ilq255HS z6Rq;bzA5R)$mxhn$CJKJOs7{V2g`csSHmG@ueG3xh zlv1<8En1--3XThHP7~!|=h91=4bD;#G0up8RcNWpxWOM^5lB5~kJ!XVeg1dO=7jgc z_zMYd)G#NLHz{^-9QB;9ErwYsUrVJL_8WSe@JjEz(Z%qk-7zfxH=G?OE1ffn0L@yG zXH76`i>P31Uk3P$Xq3J(O1X?_k++M;GpX+hqqD>(4Y^#_u)6<}%kogGB|OAu|&yeQpcz1ar?bYoTqzi}x{f$$s0Ok=6Nx=Mt=jDG{` zr@&e~-m3P&z=n2)zs~kvS`i43;vR$g;^rknbaNsTuW6e!?W_Lq5v&d;*dcp&v`ffs zX=Ep!x8c)*gjw1l1t>?E@Uucd!>48tPa&OatR*z|iG^tY_L@W4D_r+aq#5K@#f1nx zx61QHoLQ#O(r-Rpvd58w%!&yR3+9IV!p=t^BT%HKMg5V7+gq%fpYbGnXf=jG`>) zE%h|KFPIp4B=raBfD-kKoz+^!92xEBmZ>Etm!kTu`tfig5-5Z>rcgQm*$XS+v{kQuhGMz=$ZqtH5WBjgPbdH;rSl8J9M>zhmRzF5EY5&=#LhO0wRFa1%kcd8#Hh^=3i?q zz6#mE>=ThW_qvWhUB9hewxT-=%8F<=GJqU#9($hPe6sjxj{M2 z&-Tsfj!kA|0g1h>m4$F8oD)&!pjKL!%(X%*3B+MuGM5cLP3WAElXBq?M->6S(x*(` z4~1iPX0aj7g(;T>QM<{yaxSDOF{9T$ubT9#LhIrJy^ZKt1xxzOdJdQL4M9ksm5rjR z$gJEgf|7K6pXh%4W+l;{0%qk7tBQ~WJ4qxSfvpf@ymbi{uA9GQ?n^8zx0W>~F0f0d z&oi4=7`MoE2jq!wM6d~$cYB62!DdCCIp1qlmz%Q@w0(&R80vDA7qGv<7jGV(Iz~Mh zvF}RRa`wK+Ke{WF0u8vB(+MOu-ii>hh?CWG<+Lyg&Z#|F9Iwmfi~v^dtqM@)EA|o5 zPwq{&=B%_T=R)oKa6f@~huZ9^q=}Lq^|3k&7P`}Zj|Gi7@p95 z9Dk2YHG7grN%w~0kB)HoBayELqN{v=FHx6>t}U+sk=?_ek|514fU=19j>8e)J(e5t@trTCL_O*Hdjm0#tew@{na za3^$u+nsjoOB4)CJgQ(_ca=GNt~vkOq#UD_=@jX*peQl@DmySyg{)#7B!^3#4QmFp zP8U(7Y_|T%B-Hx`&ZCw}0#o}@Q1iP7nMNygr`weRlI^`P0roF{O~&>1(+6}#>&Y*2 zT9eQn(SvC9)#LZD`;S=xGfEhO^>)o#O#aI?=~jP5A0pamG$P|IZj5QK^|#iQB`zKw zJurOXVf{sS72n;{C`Yp8I;TAqXL^meC3Ah9uek}$TnLL&4yVj}jaV5O#`Z>^BRK+N@qZ7k0&RFuYzt52uB?dNH6P$l>_k*i&iUl{Z{%+ z^k^Iu4_L@|z3EDW-A2?atH8U=^i!)NKdKEAEsol@C_y-I799`PO++Q zbU?y=#XG1xY;?nKvSJo_&FQ|@T4+L+DhT_6qk`lXW*_5xitDQ=Oi+l90Ksaa2a1gI z`!a?mONgP3afUX6Pzl`?Y7${k;t2Ibv1>D<>|SjDo+AOAIRWN|7pMyP*a-LG`20E2F-X zT%T839|%vP;E#xc5mp9$m{ggBVMEQU~ypIxf_8qJu|REa@(fmk8ZRs-7d6-Ag-3j(_($O5i|ii6udAH;PZs|? zo)y%*_H)vK#3EmKG_0*Ra+LKWv5IzuUiYL%wlyz4Cx_|&k+?1JiTzJxR+yX0z}Oz5 zzgDe-CF}7#6?`6^+K9bRRRh9yWWLef(Oh;|PNWu8Ft>~&7?TQ=N0;|6oY>s-dQRj! z!L`zyvHWq0vU-BZ1T6VjidUnZ3+bkf@b}u$9UjepJ5ud>`XSgD+9Bwe5Iu*~o?4;R zqc2Kb1L{#2C3VdY@NQl!;ZSqJN9$&993ca$%n$Ale_nw$P+B?fhB;shlo9_#MHw5# z-AvF%t?ewnggtR*Nq_QGremOZr7nKt;Ntap$rH&aDwdu0AKp<#C=UTh-EQ6Lr(e&@ zK$H3DOt)ucy5BzO;%x4o^&$4(LN>ARH^i!YW*~Bw*n_V#+Hc~1`Ld%B_+W=H3v>C{ zogKcda&1J}QDG#s!GfP--#*xU&>wz7$$lb_G*3Pv@*)>5zUu0aW>47D?TP$^`yt*U zq(tgZM*GzMvLnKeaPkTR^ZjIfGy~nle{R;rC3~Dbc5zS}VflzLKq% zVdcK!$^kRC8jp(kG|!sd*xckJsM|^-{uYy$DGz=0klAP5IJdO%+AgFbGjg8}ZzIkP z2gvHgA0RGEN&mRe8aF6`7K~sYdPUbhC@4>81^ARB+guMdSfLf%F#hmwqD zsez^?qr&%K1(A&E5jEzTwLQW&A{i~5n?OkPavy51ea2+6fED#(IROS*IJ&vdy!bs6 zWB4bvOk({-^=4Kf992$~XhtF&Rpy&j+X;STR_!40ky(XsR9VzoWm^lzCzcEmvjjc9 zpVpN8c2i0i)|KX>#!N~f7$o>uvIpC)j|J|mr}#aktox~@-ptTp%OF1EWn1( zMMO~yz19y53f?b~U0Ph$UD?Bj)Km#gaWz$bc^*;>5DCMr3l7rd=V9iVELosu7pGbJ z^GVlC^**e_!poO`k&XMvpD_G-{{Tb(t#>s;{{>QA5#V_YTy`A^sqRc-!Lu8$M6A75 zG51!+WcRlJ`G#;51U-zKGGQ|V*2Q@Wo;X$DLoo~rbfTs}c&3QP<>I`E4UgvBftk3} z6MWgcA}@^l1Dwb!d!`MakQ-i)d(VBU;>cI1k6MFIMSho2O5`W7T$qO|J?AU-_=bt)g= zohoWBLRX*+YYlC~v6jk!5;V6qFS4#Hw2hrMv<-AsB-GpjrRC0hRSm`W!;fnf*|Acv z+fzzhM*=l-f6|!LW?sUbR;YK6H$OM>dFdU!ZrEwWIm`toJy5Oguf_TG;vI@TJVP?8 zp`>v5ka9^CN{SpKbPkRntIx7t=p}~Uf$Hox5e!{;I{rn%&qNpb0N-zbC>BJ&!`-xE zLO4-zH%10`bFAWQ>ho3>SlFbgm&wQSYnxA>=RaL~{XWEA5XVzwAy5FA3 zz0tC0{sdz#?6D)X-y<^0x7viog-<~y_aT!bjk$X244=X*einUjAUs33i^Yn&FxHMh zWvE$;vrd*pfaip-bU|Tj=&f)lfu49j?4#x{w9@z}a+wSA$Tf*9S#~8y(9R_4NuMn1yNzD zyFDTT>2ir$53VQ@w`j(ABdP+Pia2N1>@;FRhq;E5HQBRg+R^@D;fF=9-s50nWRbJK ziDpFhHfKG=?vrMqdw_j0^ND|+$jfPW3ARbS62umj&B04AW0!(&(aOev64o7pMH#16 zvp0N)?)ie{XgACm`O3Y71)ZErLD@g$z+1)Oo!MNM#2Bg5shkD62dM)PUcpzb7vSKP zYFLSQhl^C^6{&2GV%y0%k@VDNyXicQ(5Imm%|Phk;*E1}Ld(3TWT#D(IHgTa8ry4T zxyvQ(YA0=McG_ALTz1GwJ2g9Px1^0FP2HCTVp(z}ZsiYgC(t$I> z(P@S~bN<#NvlikuM{Qy2|P5oejq)_1eFUP2VB5lynSYq1{Ic|(%DyqFSQn+ z4+xJboe-{I(AX&w7-|(CPeeL|T2V0lpytzPhmjVT$BG=7LV3nzuYc&bmpN_ewjLV2d zA@N^*Qn2}{*I`2+8%m`fdD-EZQ@vJ0h6lqvln{Qm_T>Klf&NrXxWCzm-zlJ*52dcZ z9J(2+^BJ)gJ~@0y->vwKbp445!)rv)TPExo@ zsJgn~QK5{>K=^cX3zr7}#SIvEX}%jMtw&odlpa-|(LGElL~in$H(;Of@W*miX-i zws;tkL~WnNYwB_FPm%ADtnWIwsrCoU(4&a5MavT<+eE{UKgn_diS=DEK?PF9;3K|y z!Jo^=8&5F5GalCdAslGMW*m82K&H*WM*H2OB;)esFPHvYX{&DOW*B&=$UE<}Y9P?VgNe0!=f#EdY z%pAqe1Ukui{K=|fs;)vb5oSge$p9Jgs*v98e^Hmwy6co>-K|ttGT3AfLLoqWNoNtw zmRxe0@lWm_6mQP)%trGQO7&v=I%<&`#AVH~S+Ob(hg)x8^*S{L8|88B;5Q~uVS z_45z&_a^b;k+G2%DgMmb>w!V_GEa_xvn8NztJ7RE=y3*&il z4E_nq!GZPG<-r#t(wpW4NOGtL4iMN+hVpOt-GF~XK}EI()T-l}+YJ48wqBF-yAHM~ zf9G-uQO+GQa@q@M6j;|{qV`&Ul=T<<(1>n#zc0q<=Eq$mKe!K0JA8(iaC4Yjh_nw*YFWWd;XqjpMwv6wfV1V#bQN?T-~M;uMB>OrDQ1$Qe+m! zadc?nvo17Pha2T^l0y#^f6C`HNtMlvn`lKTS=R`GL3iOF7Fnye$R}`UPyIy30$;!y zDulDcv5X#-RtSq)0gD=!2_F`@Ewzbl+?VubahQsW?7t;F$?krpq!Hr8IuJXKDip*T zaqITV?LbpTo6ytgetcVqdo9UTP*o$gKprpV$|xfyLPvDc(MG(Ihtl6E!Wk7GfFOr6 zlvV?OmP*!Zy|Z3NktS;uhFvY&r78e7QOMPLts~eo61QAA_Y)>c#FXfh9&K4-uhk78 zsbF$iU=SvKn$dotXV0`z%*nm3SW+shJwfT9>JIl+$gEKRch#&o!pOj^w7HT+XZT6o zz=FSu)L);U`lH5&q2@~@6sbeak>*EON{d*OZIYxW5&0r=hn__B(Ge_W3>GY|rBrH* z9sc`p5e$5P$Y%6w?}E`UZ_$Fq@3YgC5K!c#tnRIwF8jSbdZX;fTvS4;n)GguR^m`=a0?6(^S9uOVv#%3X!mJhv?q8Vyin$~ z$!iiPAU&@xdq{2^1>rZWZ#QDH7vP)UZVZ1yu#0TaQ}iU6)RTE#29qiLgPQ7s%&E?r z;#g{}Oxyk0tFBk%Gjo{+@o%%!)YM$>q&<|KmM?N-os;%pcAA=+FFR=uWTz=q7)=`b zl*W3lG|<8zd;KsoSC7j%%r_waW$7d2d|akJLS_lAL_8n6os!RV8S!V-1S^fi zC{#L*M&c(j*OLt+E_b`QbNvd>N+abq zQLN0(N%)zsl5481b7)Xa0nm$Z=CwKk=|sg5m|#fk~a3Mx6m&gVs;1lY9f3 zI^9!j4yv>9`u-u+6tw5kliqOLg~VbqJKBox$RpYcPVu|)(WmGuMBkwF8Cm*@nS52# zsUpq`B06LRlXAAcqKKU6E1n5zeZ{;XmbviZg1g_!PHPpN#4}FX_1S5wCGGc4+IOd9$YFMrqMyz$TBEr;Z< zF|!M{@%*jk>`CxxY_FGfS4@%w^+IcFr4eZ|l2GlX?s2Id{;lkSK8%R4=Ev%ju+FL2 z+2zqnzvmOjVxtv}-jWW-8=SV1PwyHao>cou{v_XsZ;|%d!-YR7C*HJI?1t*&9H01B zik`#zt1zi!_o+>vO-#!dvI9RQrQuzy*%PgW{zQ`>83S+O#Kjy>_Q)~c*%Kq(_iK^&@L> zAh;N6@Li@-IFKaqC|!G(ZgUWSBUrX@2#WR1n=}S4%TB8hDmcSQTa=xqsNk1KbEa&7 zU!|*J)9p&3$XO6ZsMM|>leFsxKbdYH=7&c6hq$5j_p+v$>rL>h!1k^V&B-#61NFmU ziv3}p-Fq45!rSDqWBdhE9dtBeCrS63<(vGo>gNUP8;x6id_~XIUAZVn(kmxQ;+_p$ z$hF#t-z1b1$JBaUHt|g;(C+>ZvSP69?3Fv@a7)KUBEBP+PwK+Euc*YLMB^|svf2#Y zFK1mV{av9=kYF~zhoLFf6z(!LQHk_q9Dpt5rqj?WWBCKrRPsXbIdfn53+9}a0-}aZ z)|?F-jWjRW%@tRzwI7?8>kL6k5{@Jp@=;xP^T@W2E0YGm1{7qlACXU@>%NAAV3C) zZU$D{Wk(x~x`n7M*7MoeVpM5s3t){GdpRR=R?j{?*)CJ3xYna^opJD^sls)BpeCx0xh z-!DxsT`pcr!%dKOzcnTJoDusgS%sXFsz2NX@K6e#Eq!c~cM zg0(zKI4jOq^}$?REl5w9as92Px6iOL;5xBko=B&^Jbn=EI$q`s2}(;VFF+N<|Nl2P@~kJ zR;o`I01Fd!(G8oBz|!7&EB6a1FO0lzf9nO%>E`_4&1}I3s5JRUffSQE)QRl77D)Z8 zGV5PRe~=EJrj+?y@>x1y9!RPIHm!yX?N44x2RJF!9X<@rTG?vS_a(p0jw)?jO-%}M z*b?d7BeFA=(1yLUjeK49Z=a!amGh+k(}+jytaUav`-gaeu!pJ5%Q|;F46jH~C>Rh= zFB<7LU+R4~`i{rk68*c!{1DsC@pu+Jiw5*m_chj*f`%n5j zc$t0GMH%~T^*nP{qY>LK02$bCtLFu)*>Ah}%AL;L)q20JR{Jfdu~kr!3Ff-yXPX~T z+v={sDYBB96$bIx|C_<7nrM4hlfm!(hGsQ5GZ zj3Phc_(A*`7&(bQBR76p7feuY=1PAwG`$j9=+dii%5$|Zc@Dqq2cNQAl)-E(eZ~;+ zQlRcqhjSm1+?@>+z-y>pkH9&38Wg7F1$E$EC`D`c0Hxb+|7EvJ>6(R@uw$n~1Uf*_ zXCV(t8#>jW{D(B+9DH4j1_(g}pav&kbxa;bn)z&UijcK!W*21bW&0bC@U1V^!V!%F zJ+#7VrX%04g=A@55PRE>!?Nscav)etZ7~tjG~F8IH=l=Yz2Rx)bYb({BA=)A{31ha zS(AqwF`?(y@AAnVeK%j3wz_y0P37-MF{g6VUwQX1Sm~UE$o}x7<>t5iLavsSTT^`; zCL5s5N;*{?UxJQt5K8$=hZhB_1Ca&h^Fig|jCgcoxTFKafsqp)8SV6#7k~?C z${BTz545RDxet?$AnM7SGN$J=RQm@TnUo=~5*kG@<&n{WwW4I7-&bpQU;Hgz$buEeesB1H{TpsFv+uNCTm? z96lE{Ak8Ir3)1{ZZ2`|SZO^|e^JU5-55DA7k|7lIUA9Nn3*26K#PmsWyGl;V2Rd`L z?o6WA1|rE*_$d6tbiaVAJRnC&E?_coQ^-qBlSIv*ameOoU!qR!QzypdYR2?d1rnSm zTUGL9)qoIV`(swWvoZ0SdNxD8)F;%>Y+lS+^ZDbgIyr70`I0EGmX2V^c$JC^QM59T zqY%V<$S`}jr#Gd)V*dzaXqH$usmJV7iXF3u))y35b#vu#rW|Vl(}nMRMc{rg@!jGS zcW!cOUOS_{-=WW_;qDNgY;GO9&k7G00cyJirVAFL3;j5im32JYGU^Wj~kBIS4mo2R6AKSWoS~RC8vu$77`u z_?V}2h0)0v@_{Fu&JFbU@A3&)S#{H`ifI5?E(KRZQsEg}*;-r=E+xw6TNTAF1Rs*J z1Kz#&$!o5gcsp;=tRQ#b1J+GkJ9k>RXx93OEi3#P%R5KJu14<6BfdPC zgu|6zR1&yG%O5Z$QOjP4i>B9_vpaRPP*Z4*{cW0bL)Km`8}8OrzWZLM-*Zf8=N~w` z;)IfixMn?9@(W?7MrqY;7h6rv=$2+F)%7S-37KOx|mlB~Za>EhW zprY?hEb0oqbahu~OOE{!M1&;RB0;UYl+UWr(;}=1CEL27a|G9OLj$6zX8(h~Ft;jG zZ6dTa(eSb?C4%LM`U1>CAg$;My_{p;OU+bESb;>tHl1f@I?pSm;y!Cf$RkPsWXg)& zD2iH75Q5Gn?l1ozv7jG!Z0$*BHEkzOkG1UMc>ki2QrBoH(6pVXaq_)s11gnv z|5v%+Sa9x;wTvE^P3Q%0q7&wap1mb|%+TZ9)%TkD^fhfI8z-M&+}Vj)(}T?<(r1R& za4G@L^CN4KD)_h&6WP#w&C^}-0+B5?PR^J79Ujj7>?1!pgAHp4YeZ}KSEjgiZ@V}( z%-(I>7Gie_Ub@>zfC~N27~*BJWrh3_W=sk&Gl|IG66fuf#r%)2FqF^^!ZJYiM6=olehzj!EaWbq`BJ?*ja}a`? zbdKcFd{k|vIvw4m{J87ua&GFjngY(f>!^oXQSK2r_R7K_v9Ci+@S})tcurs#myj%= zMVTlaXAxDZLk0s?EtUN%;%hF=F(X@zxSVcnZrXqqW`q%MTn2O(~7<> z^te{=T~0A>GBckwYgQ+SBv|tXTcl6H0m{MJMP%!+?;%Jd5|)sPPLK?}sQu-$1@R=V zTFD+26l4palf0KtB%xZOFGvTzB10<8G2$~AhM0+_%3_ayk+FQHS+fR0R9dr@+s~;-<9k{P()zcM?b@~$>U>s^L^<$SOxX^Dbe*`CsOWmihw>a8*i$~L5QQ5V6*lbD z*uci?V8cwI@kGpw>_{}ct@Nd`AT%PdrFGa(j9|~uhyWUJ6m5e&zEn{l;E+ZG`w|E& zAHc_wJ%R;efFYBI0m#9C@K}ik6Prg*teOqd03l_m-%yUSf;p{nX_&ItIq+&;f>ATB zP9LSwNL(~E8Z}By3|WDYZUHx;kbrJeiS%!S^v{8ZgFdKSS>UA+K_Me9(V;*wLJNag z$v^RCRjUw1d)+qTLWr2pUrNWIJ~Db^Eoaf#TWMWXUHnz<7{BOc!O0ZK$QaiBUlMo( zk|~PH@uMS~CxiM^feQMZnhl`D00{gi$>u2_xI@KhXxN?{O-3np1jX7o--FJKQh>~U z9mz#!Rsoqa;U%ah_!TggFA*i%!wg9^`w*Q--pU_ABLH;b=Y*N@LPe5~iPkUVcL9}w zXQzJT;#vFyDgQ$O7ib1N;xZ^6lV7G8vj@U&G7$jr2Hx$T7NDSD3`a|%6R(%`Ck>xD zK@)Dq@zwnhZc=3<6HsVUGE!$qZIq;)skiK_p2VNk;cvJ0+Gc;@K$`06#kSdg;;R`{w`rS6pl5c#B;=HSTGJKP-Dt$l zqIEq&p;zhUGF;x8U_*T@0Z+6Sz7ntzPEakB|53HbeZB7dYkC^-rB2Xfc#6g;sX2BA zV-4;NpQV8}BK)dVvq{rXNL3~cb!lXH9rQ7_hn{KBMigj4(lm69<-`u_Pu{Cg)2Zwo z0qFoib}H*NVln1Y2=3*AeTqaFvFSXwB{@*we95A>GLd>oG(vKrV=`4T15G_bayciQ zCb>O=op(a(fd$1NxxF$vOh`~ER<)hq=d6bC@uW8|g6N)-Cb%qsIp8Y}af*Hnmk~Ib zwxu&kj%=zdnuRn~?&bWIg|1ZDuim7ubkw2ByCf(R=plTy^m9C1Ll#NiY~Kq5!&;*E z4ubTIcgI3BxJ7LNBuE@)s0cK2e}UL`Yg;ao#lAB{HomGhnL;vbcu17#4{* z17(;-Oa`Rko4ixVsfK|O-zSh})%FDsC1!aDDdD1jL(d?`e??aX-A;bKkn>W085QaiV@j+YuAbFEp zsYbQ+Plh4zOTH-Mso5lR(R;i@N_&&-%YH`Udr>?Z#d} zVd>zd4yD||09f5jq3s*z%-?orLieiSs~gBa{z#L~ovG){^{MT48Df40yDI!D@^zkQ zl~IA9_B#P+sBoyLgz^JXJGbokgwWF4-p z^0nz*D>wSC*ZiRrw$?~py56w|qU&;_Z+`4KV5)YkT%DT8Goq83$zMu-ak;_~W^50d zT1!=7_Ku6HmiOTu5l*CjoY4{FU;zrv?lNu{50$;;dCVE?n|x1%-b_SxD#YFeFsA(! zd)nwJZtTD?)|kq<<0>yFiLfui9C_{2ub~ejI{4LY|CX$rQ;Tzq>oI-Sx3-k7_(}5lL z0s!-+mUmQO$3r@>qeLX=;x2RT%v7%&az7B_eMEFWgDnya+ds^RS?b{gN@A<}kUuAmU{E$m2h*p$qDLk@T)r>wL?aYn7@v-N5Q@xYg zsxU*(H^w&Etj%d95a%jsvvO`}{mkks%f zC*|#>Qs`LgQPtD$$v7xV)OJ0TU8eek9`j}E2WpV(7`HU48h2LTqPVK#!aS!*Al3P9 z9>*&P(6ojcU6D{OKCzZCT0)TbTIa|6{Im>Ir9^#8$GN6LDNErtht=(|7um=pxr3AhlM;}l0K4hs|Z=j&j zzI51;;l9 zh>fD7;yFVTY^Mw>!CemEkvd-u@p#}(g*0ec)}siJL5+Y}yFWJ^Ataw+U7Vk&>^J^r zopFmLX;pLaph+z1H*cP6jWpUX>38i}%}Y-R_`_qO_Arw?BZ-~Ro-b)~xDTMJOD-}{ITO{^+m(j)L_Lo^St@Y|W$fon*p=*K4ihjy4-4d)v%FJs0o&Q) zjD*3tVy>}v5=$3jkO0mi{`7lZ#75OqlRH0L6~g?vR^>G2z*sv)CO}sEv2P31Q9Xp$ zrZx?59J)O@JqEkMiMtc5#=Pc(*M}!N`=@dHFM(Y1!39PP8#xb)jJPQJTAr0YaX5h~ zH!J3bPc+w2n39oa_}KDJKMa*lioA`p6ueVFX^cd50RAMk`vPfYEnFxF`bPrz6@ zXQvUnk!15DX3%K=$eOdWdFfdJPvqrsb+Rc5$0AxT`=4_L&0_Px>mn!9DQpPJ9g`ls z-rvs$2v4#>c0SDyG#@;}?2Bwb|&{tx<7FUor4`2*E%A$dAEe~J#?iQEGe zW&?#|H5Bfk(dMNApl~YqE>JjLnwWrVB_S`uM7$RWe2C(}^01djTgSMuP;cRKVS#$Msu>{@I{^di0N+K_cf4{j*bk#E-Kp^bB8n_1De% z>sC*ska##o`z%lN-NNPrvyA2Sv}d%xK-|K6SUBioDeFnSf+bt|*CB~SR?F&=3LvW} znXQEi?*;Kz@i|&K*Q0dTDD2>!luUO2O0mpzxUcuBS2TM%^?SU^EGkQiaCDW^oVHRw zV16U36HTkoz(QL=U5r4l$Dv_$glfNotXcEn)ap+?Fm$o8s+c*rSVkYzG|q9medXYsP6JIz zu@q_k1AM{LR>kigz!!{c;7g${E&x?HbGYD)qU}1q zqOq(aHE8^U2Xd-AkRSc0oTs}v=l!Rge;@Fne(enJ_{PPTT8+Cs zT@qW2EAmEiR9O51`Y+70LaS(!Y~;C2=c!rgB-?fG(H@?_Dv#m-AEA_e`U#@0S}DTc zL8Udpxz&y!W0H|7tlEz~UGWzd{eZ7m>aSef0*Tyj*M1_?_xU>6$rQH>M`(6)m1^vF z(%4@|!*0rq?6Rk_p9|ypmp3I>>V3UY4eU>4Lc+ApIjjAO*h87=Bm zNAvrFkjaDhy4&WCtnqU>iADxMSR!M8cCd3 zkjQMrf?W7_fd^w&6k5AkM0O@ZucwK7IjCkohB8;*%z$>qrQHlbqzC)ii<|*y-O3Ib z@lz~Zty`HTy~wU|sZ@FGzpHWyRi+*qRBVkDEBSZDrcq2?@o4{e7+O(`?Z0?f8{1c@ zS$mxspmRsjxeJrrRH^JgTCwxGB;=7$3)t1teNDa$lP|Jh4}U#VirkTUGqsEL`=W+# z>g{ZXb6`E6FN+yAlfZ7oa_bcdBK9Z?!D`q{@J|mHn^|Yd>6!urDs#Wl&i~J!5@_CE zWT<h?yDKIc>`wf=v!oeh{&W%>Vib{806^sIrrC@LkU8}ti| zlm#?kodv}e6c=AnDl#i8j2T#k#l@MGJ)TCX%*?D%snD>fknknkU2qqWba_cZ$PmfS zaZCaE0gKB1Ki}t^d0ANLfBmoP&vmggbI$X6KlgLr_jA8J3eBpWH?*V&kweTk6@61w z|Iu6P5qQzv8K;M@qfyRcRaR#QBnk|Nn0*yUFxuc}XSL5gaqSV*MytclGOM{;pc@XA zHduKqf9i?$h$~mvbX>W@UsSk|Q767t*};L|Is?B8v?=w>z|@EH3o6$`FkLU00va+B z0cR*cd?V`#NNeYnl?=kMyhXOrLxR_AhfD-rrTY^9teqDs85G}58viRoW$S=EUWg-c zLk>w-RAdTt6CB^B`%d9_M(GLR_&-;&EB2WU(8(g~LJN9=Mc6l)%JNs}wCBf9TzQ2m z&-tXvx16~0995Q2H1sasnyT94fZCf_Mm7`lGi($gXb z&C%Wbe@oH>K3gYaZ*d=th&HP%8aD2BtgqZ{-7`;{v083gJyquWei>3Wg_OgM>w~I@ z?i`Z3?7URfZsVGw{#)IVZw4~kTWBZO3ooMK<}riRz7A&w<=zy^HJ(zG-K}1wOfuwH z4P+sByN~JbRti_co}yR`e-Z~_428Axx|LuKTxVTEEqI3YK(s{=h^}+1-!gSL;C-gH zrUin6oTCuik%BC&uAPPjsTYxpJjN!Y@lFfE+;Z;j_sA@?62hV!J@kp{+V0x2{-4};EmVUtZyefyX%Q7 z_f_TB1%%G1>v~kACm;*214i!`RMs^eV?*flVNm!NYR2Wo*2*hGI*7+6NIBHQs{6j4 zSFN*FehLY;q-1pO*cV5iYSj^n+n#7FgyiMKRHO>&Slxc#%`8;kHe{UjM?UVXsF9%l z^PNo5cMs?DbVKvUoE+$S$G?Wt>+bX}$(&cx&!wM9{{_J^ z^*s7ii6Y1GcRzo9V(g5N#35r{@DD@o&5Q=)!ezaOZ3b-*zBn*`@`5*|!GkvS-%NhE z`pIE~0>(mljDG5J?q5z#4UM{Tx)BxHM4j+$*^0dSgfS!4Z2_^ZmGeW~^W|J1#>`13 z$HXzSC`~6?&M`2tX3A#uQ5!WAAI=OWD@rfF%?uaY#AUrnM&-<{X4F~xiF5A=+JFH% zb8o|T$3X5j77<)-iW0j%3bDa#^F(GLz448V=wC_3JkOp|-CRD8&}n6`YR6g8{S3Uw zmuJ|>Rd4B(P@E)@mzCVdm}=+FgPhJ+k9!;4-lSP~dX6M*bY%mf@iFd8i=b9mYtOx{ zzI-0?0$4{zFG>RoYvl+Z96gzSR;D56qw!3v+$d)IDqT2VJXq1EHa6I)Y=A*K&s?JF z_5}VW-V2qsHMSKIr<9Nnqus~}*S`Evu?zr`zqHT+VF zUqwGIXx6R#sx3&($F`5;aVyT68beL1SE^0)NkiP|wtg!+#EqQ}F+04x!I(p1fYbxb zTpQelYN$%eHM2JFhFPBav0?8z?d|B+!BcJwZrFB~8*si88ns;hfp*od*o`>tk|%f< zieS5|Jr$O=HPIZlO+hilXsh>CbAE9*^`}OY_ZE$!Ef?{HAcQr9?e2>e>~n1@Z>?UV z?qEgI|AcRIAk%kLr3)IhqV8oree4iAGW{QNxcP(-U4m@jU7oOg@M zvgV6CdoEWVg}LHOK7KGvcS;{%P(Gdef7l7-GZ>2UMm|MzL;`|>hz5S?IdU)nLMaGh+M6@mbES>8bHV!OSRY#&t(^x?3yfgtU=P)@c2r!!+7f-e$B< zoKAe9rf<{;DCy7LvPg%Q3U2z7+>hE{V{3aYJ2uqH75zgROHM3T6xKdH&dg-xmCxrpyIh+}7_OS8IOU!6<&EtOWM#e;Rd5dVL_z1m#EM zmsdgd0e=hJ%Y*Vi%P)^MLFs@rU-nwr9w6%{gpjUgROe51%_s*>4c1TXhhz2hJ9Z+11upf975n<`K;P_PrX@7e zI0hwercVCEL>w55mc@PR>sj$C?5(0wp#KP}DxXd#Rn>yKG{0(1UVrjE?WB@s=+4To zBv-(W{psA)NmV1?jL5I5Xv@s}?&`df_LW*(Ru!oxiFJ+vZtXk}XsydNG0oum!Bno?v9ZU}-UTKrhm7Hnbs z%ZeUb{a+$MJbc&x*z12B&_{E0C;$J!%RTxjL(@(!TOA{8GrUMoq3+F5mlMG*cP<() zD4WREpLnAqmoHLPy-SG0$qM2kcg9a_nZ(Fk(3IyJ+;<4UdlnyN&-}CmQj$zicK& z+5?d__cb(n5>M9}S=DTuSW%#jn!8cjDD=tu*D-$B!?$>l-jpFg(m!SHW9JBa`wV%f zkDXrD4BN7jkF$2p*h|no(F7@Tp~yskNcRKT{Nsye5ZGzzZ8_tobLR*BiF^D=J#uj``98*9LOi~SYg)sN z={h!=e$`Mtr`q##-AjnDx7i;kNS`*YP#ZMBu>yT95GB*|I^+>qiBGpVTO^mM+c`7J z;>^)8Jzhe96qy`3Hoi({1ferq|7=+w-RL&2%}#Zq`r2>55lq)uMHCccZm6eCr_fq? zvO4}M9gAp}_)#RvP7h3Ydqulmm-9OD9>?}@i4{A|&a0@r;7FL}O&q@NZhJ#V70Fx~ zn=I-f^*?8ZRd*}<(CH?pH*to#UutGI7yG@bF9kPRNnH_Y8ca<+8e3*xGs7veRvNRx zbG+duilDdjBAiP{akKr+G%YWDft8r0Tn9@yLts_ObTAd~MRgEUGnx+bwUXn(N}t|n zVu%fWRA#a%Lsyg`eqX^<`Q0Ve-5YsbJpgl~zUDD~Dk_BWGwim(Ld!mMhsd1=pwf13*bbC zKjt8Hk-_a5T8+u=0y!72O)%~}<26PXVD%8NPSXrP4PG0sK2&tRLl18O(}&Q_>_B6s z;Az}f@USQRjd)%Y6^yIPt=ZL!@5}?_!x{+^Un_<=da{uwFXNCM2%yjKmeG)eCm4`T zkNE?7$P{4R`~iK7*Pux3mx$*1dmN}J)DX(>m%nO2>~X99B7#`x)MaC13k2Ph-w z89jTQjAD6ECcZfz$`6ia0@Cde`e|sK@yc9uw9wcPGagIEhS=E}o_kE|$E@LqZ0otU zhacZ|szSiyd`5Vpb2`G0r1gjL^ z0WsaHb66YgfmYy>_`C{pf2JvA0#Z6aDx(R%p;t#p9W$5PMuCrC(Dv&L5NDpa@)uNj zzjh3V&^C=Hh=r;6J2=Q`VU0ICP!aOZ-zS+BT=S`p<2q&qw=yrUOihoU4(n%t?Lvq- zMyZsy?J~{9PTX9bntKOCba%Ku@5^(#t^TMG^fPCnnipYqyHMU7%;;yfpuBk{PhXRF z_lS66&K@%wHfZ>v;Y&Y<=*YorCHDwQ8t9KCXssmi(bXeM67QT+d*obeVY8tya@N`N zOKca$o@Vb~bvkS7+tY$0!x}ItaK23L#{wchzxg3KLSYeTKsqHM;>siJPn`%M5OLZ~ z&1}aUppw;)5KeVg^1)omttuI@lJj^Z2SL(y5H-*uMcc}u{(x^)>3#W@`JIF3-l#JZ z=m*DX)GS_ZPS>!-_%3(LGeT7D@nkjCIpU&P5uwAj+$Tfm zK45kMp^L=MH0K4%@!Al&zniy)u0-N*r=oAlFlB@g*up1AElTtM5ms_m(P{v&pltXp8ohu>*dqO_AxpE+=0c-~V#;f98q%|AP8=SqgiLz!;3fOG$hSuYGNZFB!eh?q!>iKY63{G3*}poV%i#b}&?plQl}4=sQeX z=7_pSDDPbVQQeN}o|Jcc?k`k9?yw;cPN8@@f^2mkIK*RP+3`=Hzk;u+&fmA2-)M&6_ExxFVybOebuXf{DX- zSqs0W8q&9pbWS$8maOD%9vNj9^hw4}gyT2G0`Q9kNxMoe5ik^rZ{)Pt8L4qc^YQml zHU3HXJ4X0B5;N8D_?u<06Nj_L@<0i84xZL?^C;F>)3bKYr`b8aKB|v=t<8=*JHPim zqM!1DXTf}5>q+M`ILukxA==>&%jaPtcA@g_3z{9XGBZw<-7J(@F;&$^lo>l)#+ zuBTML&9E+`B#p#(O2dX?%^RbM%qsStlgJ7Nu??qk9*Or&&pnnt#lD%PP465-_j+sW zg(n_+FO7YphyqR@en@J`0rnuBPAryw<9ZpC4tc-j!>!nrFO(R*^wtN31y}0){m%2p zx`+Hd{eDh9*(1YKo_w-3y*YDM&&nqz{$R8-EsWKsnH7_YmT@2)i~xQTPksQRntf&j zl-eW62D=64BPYiO)gI~Yr}r?|fgvFjG*^TQ>bvTIXpOd*!j+O`Prz zhHHoA7NJ-dV!)dN{2d6(El20dtmwq-;29kEP&ORt0D`aneovcof`4)@%H zQUYs^USFQ4ste2Ta|zsE2PBd2-*=r*CR^05S4(dj4oUB zi~o({PPgDJtw<1&tuFC@5Y~k@m*jsMY4W!!g+fJsJf=}8wz7?4^}L7Qsd0u=XZl^Q zI$54^b>PJ?uYso|BN{8d!Ipq!%$eofVZ0K=E_SBDN$zu78LID^xZ^-*_MOhykLntH zUh+cb<=9Yt1ws99CA^4)i}Cx6!0cf-mD52+<89~~6vUnL`QuixGv9>C6chO)G0@}o zy7Vf6JpD7-OP_Lw<6@Svpwh8=-L$u`z&K28dnV_GpOe3DbS|CY%$<(O7`GY$u}w%J zc5-RR=_91L8p%z9%t=;K%iyd3@(q^llT@SHj<0fN-G);QCm5oZi^!?W<&;4P)-{p* z07cA~$Hypgp~XCBl}wiPRWB$s%S6aWWsi zsH2@Mt1ZwFtL{T;Fi>BTmmKfI+GTtJUkIVD@`q-4;>+fZktjof6u(P+$Alq`kiBea zac5kiHyx>*`^*q}R6Mw^_czq?>GwF=A7)&cBhxX?$k)-Sm_{geUTUnN{5T=Azl;;| zXkO;?%aELqw;B^I!`ePfMn3iK{_1lSq?ZhJ;{HctD3-gYvC@To>XSy~H^8^*Dmcxt zHnlYk1ppy-wr_`i6+mOx^-&7@cIDa;T$wvThUh5~44M~bgB^|KyL3Yk2D>2}2I~h( z`k|1mq5Y+M36U$Cf{p$P#*(Pn`jJ(4P%DETwAEQYg5?jrnz;BBdoNaeo$Qbbx7)88 z;f!~D7Av6D{c9z4dik-50Jv1)iB3_GX@CrYPH(f39-(OB$mv0TCDt~x{yF?}nc*j_ zzj^Zs>pxGn)TM=;t^Y}M>aRbm;IIF%_S`w{&+qy)sjoP@QS9d#)ZKF~rw$rWuCF0; zYM9%8?KrC2#`k(F$?ZO4QQv6H)vK_k;|lPC@dKDSs{GbD?2{E{w=7pi!{}B7&ij_Z z*cZSdYe}sr%8wTr+1l=tV%fPzX5!LD+50zGi5^&;@niv;5?;u@ytNqAO0=D2-TzIR z;E~bz8;iYnBTww|ThsTGNWf>JR&uCi2Cf(%3B^|OepXKzdP{1Le2HK%VcL;%NEQKj z5KP(47avk~sWBKl%%#AiiAoH{qZhEUE%DVB;2WQIk)Fgs#HUb$K>CCWk%}j$p zsquy6P$F^p%4oxg@%TL5Eu0}&Hcu)W(h)Fv!~}(#@)*}sNnc!|3l>ahR~v|~RQ3tM zKRLA9=sgZgfnW|Fi6ZWw)mp$u7h`A@kMeh39tn>WXlh7v)W;Kc1dZ4$ad%VnF> zBD>=+lby%VF%?4pT%<+z!-f4F^zw0gsF&|=GWc$74i??(!MVt=Df&Vd|AfAFT$=4m zh5jG=`XxfG06%3qoiRss1|Y?@E(QkRNNSe6LVRlol958S7A@t?-06r4*g_z_Y*6kE zOeRhiMt~1j)mJTp%NagF^7JFMM@Eyn%zjnh&egZqFhsP4H|T21aqL1wDF3h)8wcSI z)wW%1CExfI2-S8j7687GF&)%M_d}jHFK5z|h?(Bc;5#n5I_1Xy2`xp;L99$&V-z}w z)pIzQiNq$~(1~}iwQ?`}L~gsG*brzaCzlo-r0_X`3>z^i+{rETr?rOIx6)4xH<)#5;DMd%BQm$c?Y8&zXb?7gJU|Xm*NDAg)Ln`k(heJrKf!x;A937(|B<;RPSwZ7I zOFTC<{;1UbnM0J3ph-l~;Sd$d9ilvrEa0oaVqBLDk^-kZApPst0g$Zw#vR~9+EV`EfM`DWC=eOuY^}T<8|o0nkuFmxpkV`4C_y2oS3t#7fPiV%H52$B_P))bgsi!V(S1&_ zlCo(Pk!8O`Y`E@L7GyznSQozHwaO3Sn!h-221Mpa}4N zo_x;PK=B*&oFUEZ)8av9VozSeTr#o_Gr~vF>yCE-BGFawEt=rlXA#$#65l3U$wlA- z+T{gJOk~!KQM0DQACeVtIz({@&6wW94*M>A@aTH@Omt%)xf=h_lSzHPIreRMWDjT} zsI`dYsXa0XN+g>ujuwx zoQ<@VE>>6Zo$kWckIB)Tm4T52*xxbN(6M19q15D~v9oE<=!;QzTPWvvkI(8}V@ah* z{NJ>iIY%+f0`gBv*8TiI?W3?amL%Nx{nImA3=()o2Jt%V^mHR%p#Vo(Ar4f@i&9X< z%o)Pp=+hvC*^Q1FFQ@1?8~tL@$vj0r8{KzeqJQrw%^^)5B_*KHuT!-87(UoJTFKS! z6Vd8jf(s+cXZQ}o1W*{aG9xW@ z6?ymyBhcJIgKr?$h~q#x`s!6h@QNkpDg?HFMnC3jZc*48@SH`lW5DD2-q#zEuz1;? z6&K_|<@<8x3nx#G6*dQ)Xt0r_wMha3aT;swE~JQ4q$SLkSy=b~F0@qb|Dhpue{3*Q6DlJyk^Thd z4YOFv(bsXYcA!v2_RcUxU7EAqeGS5-U8Pt;1{G`;gD^wQa5yNE+>Nhb1zm6k&uDZ@ zc$h`$J>F)1qSg(Zi@37 zeJ`#pTRt6j0#T784MN;60UOh^R>Ee@%pL;m?M4GAgmb(_;6b7%qd3V&8yI8kc2jCX^Dw15$K_h{=96&Q@PD+f$K!IA#C#iE z@SfsQwxaS|?PhPdxF-xHx|N-+t*sAlpim(rEnCS$V0mqI=(AAyE-b^$LL7s{5RwFP zAQ==RO&1d7Ob%kSPHzA#T-pO1|251gXC0Er%c>w>`^)wxQ`XF;Futt}vKy!Tu=Vza z>}u`qntGrxyIQTR)}c>WtqrL^y}!-p$Raj|Bb)8m4<8iJUptbJU>H)^T6sQnR3hh4 zEv=;W+Iho7HGe?=EN$xhzVLWwyAxKi?keV=>dLfN-h?lL`{F#W8inmhzucRE6Bhc8 z&q686GCv*g(CXfHz{f|FM=~z>%fitYAcQ0rg0^JNuvYTB|LH`uXneo7d--T)c7)tW zOh}SNl!C|dKgJLswheV`an)@6Awm`@NNaH+j3 zbg@-;66${H1MiTyBQBJhgRW<5Y$@B&R=A#(+{Rwa8YKTr zId-He8s9N&eVMMass;h2uY1|v(D+UvTe|V>uBjD$d=!}69@;-_6B@o<#sI0A9}iZV zq%W}-lYQFZm^M|%G|51+IkNOt@T)h=LnjDYp{yEGeEnbq~m5!xnyQNcW;jhdZJNzR8-PwdA7 z4zRKn0>ahQfpCrczam_0fgI;GTj3=9Lf8Rp1!OW%X!N<(PZ~#G%te0#8|_zuo1&r3 z-_Ouy0I)!`S&>MWnedqc0i_L`mL{Ja6N4mZ9R%MV!TJYpVOv-(JFu-D+D*^#K9kT! z`z{pU0i(+pM+~Wwab#d0pKT3)N5utiV+J+OS%!Jd%Jy@H7!f-gVaIswUB{ciYwvgg zzrR@i7vDc2nY^SgWbz)?!-!lB9MyD)m(JN*If(?A4Srs+eG&>#JA*yX&?UtZ?-!;| z=1?CzeOyn${=D;|Kmb14{z z2jDK^ft3uidkx)c=KbCo$M>U`Twt3rCS{5*BHET!>*d?Hg=)=>v_yDD%;W zSjm2*M4}|)V94oS>@MXtGDlIel-Wxl_#fo*TS&;!A{X!Dk7_?1zu>Xb6^IE6h(PN;tA+xEUs8B~PK> zfRojW%Au#qP0twmu*SU$H89gd_A=-UTk(Za<`(2_3Z9=TAwFM>V?V@qcu&$ofDh%x z{*g`BlmY;ML*2{!fTW)V-AGj!{Y6Jv@D?))14-j)!KU)w2m5@Qz7GK@RWD6#Ccvln zAoqJunaC0E7TR1b-s!yn8l`52GW^|-uZLex2*k1wodhS%-hLM0#P0WvLbkiG6-3vd z!oDhWD>xBsgICn?%)McSj6Q>(R?G3OF z5p`4w(X9w5?cM|uZ6T)ky5sm;Qh4WeUzO{Aa?pM6MaT4iw?-WhFZyo{`adn(zcz@0 zvs0!R@(?cq{mg~Jd!5CTHDcmWZoJ6hw41GRbcs3I?@&jEX(STQegc_u^-GNs$d6`hs;JLVk~j zbZ77k$~sumLq{~Mq(p#*6L{Mh8h+l$9LJ$yub@N0H9Lx1I{gGt>x z0M|$S%t2Gq#dVA)nDf=N#n95P8=pMyv-55*5Sx1ocrGN{U<@H;&d|Dp$h_MTOO0DbE`DMj&Z5rP>2h6bA|lt0 zF0o8jR^v5V5pw$L0>7s*>sTuaHUxdK!Cra`* z$Q5pdL)1UHm>LmOD<7%uLBvaI@B;6c_#++DK&=3JCf|cq{~Zp0enX2tsiB3zi^@mj zzUS*4&VCG#L?5AJn!;?!Oy$(@(JLCvBUr9koVu@pcLZ?!c8fkNKh@^5L$lFUS?e~5 zty0rgNJD5&brEpE{r?J~N(zi7F##r-&V8%-a&>+eop*5GyJZmw z6!M;hD+l|pIr>m2byH#4v?U7hNVYS1`3+SRO1@ugC3~Z@shw9Sx8pxb@U2{&np$LH zcStS|@(p=3hkS~)sb(3p{$dM5`CeP|(Ek@y#JqbfHX2lXs-xrggE8_O$K_DBR7 z?+0uk)(LkF!2TpmeK(9}UX@C812P5Ku$hOTGCr#7XiYW#7Pv2bp2_wl+8xme`9d!6 z$Ar5d7vpXs+|5V?6|a=8w13+OQPD;M+-e;l7r0-cb-yI4s{$<%WV4gPs^bpNFT91( z2J6{Lc~+soEzU3h_zBAsE?nSl9g;VgS-JAZz-cC6aBjYlUR%b`m_Uximhm^5kK#f4 zaG&}J=eD*k`fiV(?%sqG0{P#VynXYH_N3`ve_HNj$kMO6SLP34ujIMT;UR|X4$3dQ zMuk^^2`qJ+Yp;glFaPBFy;OhC;Jo=JI@ZTT?`fi+&_8%o;4aCpU!JSq$>iX11#T?A ze6L)2_9M>dIe0VvpZ%8c@8#H`{`2_3UMV|rTX&!A%E8vHkFs^IW8vW~h2+ezk~f3* zquIpQ=(9hZh|*a97dJ;AG)!gm=dA~#KaE=i3}tA+*VJHiiTJXnXir8oBUbXTh{v2_a>)8_4$sp#ec96%*{>6h zw|L}@p%N>}Rm%kZF9AhHL0cz5kS=Gu41(OojyVD+sh7GkL?P~&UOe*ZekJiuHW4@v zS;>b~xpE2juvI=}*F54>ElL+J!ZX5J-JQF^-arr9_+DXZ#f8$Wg!T=43AVfm)Alx_ z2&KzSu2b_!zB+Wvf;G|)aWi^t%})zrJ)H5ka_TDGX0IVp^LM#$2gxkD#AIu3w(joF zNEdvl3iGdWx@iCtik+c$X&!Z5@%+BtUaHtln~tO+ zukygUe~*5*BF(;27JrDr#JZ2Vsn|;XMmnS%1p@*;1>4JnMc%{SW*uWz@*IYEAk+xM z^ZE!o$ZxmJ=rxzv@khALo~X0f=bUMaO~$R$C4dYU(EOw77fVWFlWiPb@ETY`$vC(1 zbznnF#D>yuoRAHD#OS=3`u6u93`6&_6DI}BH6jmDSp}&I($E<$0{^75=wkP+hZ%ez z#lT4F)~F3|4K^xE7?^4@J)$QO`o-7g^ZwDCYJ8UcpQht@|6;@Yw+1i7`xk#A?|)n8 zCX;P($tN}B1TO$)miM2_*f9Y4tUsHHFL~JLD2m-{Zt5bn!2K@2B^H2$zJ9>ZD zqs)>mLq~B8$gdX2tN+m%$N{5|1_U1$cp+gxzMLdL>6WS`?xkz;U}Z}_bgn%RS|d1I zp=_9bS_P90Gb;w&ahG3)S^BTt@}K3+F)QAj!7SwL++E$@RFokdkFg-4Hg5t?s85~l z7ec7O1h)88C{D;rLGkiXIy;v$Ky~jHHD*@f%tn7Xxk(#QZVi%t{Wsye$a2O08$V5? zDZ9VnxU&8IvfKPOUJrBXdBl5Jo%=vv?0r#30c8iZ
ghaHiAs8-A))yL0 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 z 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

WWo@Hbc$4b~*^nXE!1`aZpr>Rp^D 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

l)U~$4 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

^ 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 K|NReLf&T-Wp(bGf diff --git a/code/__HELPERS/bygex/bygex.dm b/code/__HELPERS/bygex/bygex.dm deleted file mode 100644 index c5c4999ccca..00000000000 --- a/code/__HELPERS/bygex/bygex.dm +++ /dev/null @@ -1,144 +0,0 @@ -/* - This file is part of bygex. - - bygex is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation, either version 3 of - the License, or (at your option) any later version. - - bygex is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with bygex. If not, see - - Based on code by Zac Stringham - Copyright 2009 (LGPL) - Written 6-Oct-2013 - carnie (elly1989@rocketmail.com), accreditation appreciated but not required. - Please do not remove this comment. - - Full source code is available at https://code.google.com/p/byond-regex/ - Please report any relevant issues on the tracker at the above address. - ~Carn -*/ - -#ifdef USE_BYGEX - -#ifndef LIBREGEX_LIBRARY - #define LIBREGEX_LIBRARY "bin/bygex" -#endif - -/proc - regEx_compare(str, exp) - return new /datum/regex(str, exp, call(LIBREGEX_LIBRARY, "regEx_compare")(str, exp)) - - regex_compare(str, exp) - return new /datum/regex(str, exp, call(LIBREGEX_LIBRARY, "regex_compare")(str, exp)) - - regEx_find(str, exp) - return new /datum/regex(str, exp, call(LIBREGEX_LIBRARY, "regEx_find")(str, exp)) - - regex_find(str, exp) - return new /datum/regex(str, exp, call(LIBREGEX_LIBRARY, "regex_find")(str, exp)) - - regEx_replaceall(str, exp, fmt) - return call(LIBREGEX_LIBRARY, "regEx_replaceall")(str, exp, fmt) - - regex_replaceall(str, exp, fmt) - return call(LIBREGEX_LIBRARY, "regex_replaceall")(str, exp, fmt) - - replacetextEx(str, exp, fmt) - return call(LIBREGEX_LIBRARY, "regEx_replaceallliteral")(str, exp, fmt) - - replacetext(str, exp, fmt) - return call(LIBREGEX_LIBRARY, "regex_replaceallliteral")(str, exp, fmt) - - regEx_replace(str, exp, fmt) - return call(LIBREGEX_LIBRARY, "regEx_replace")(str, exp, fmt) - - regex_replace(str, exp, fmt) - return call(LIBREGEX_LIBRARY, "regex_replace")(str, exp, fmt) - - regEx_findall(str, exp) - return new /datum/regex(str, exp, call(LIBREGEX_LIBRARY, "regEx_findall")(str, exp)) - - regex_findall(str, exp) - return new /datum/regex(str, exp, call(LIBREGEX_LIBRARY, "regex_findall")(str, exp)) - - -//upon calling a regex match or search, a /datum/regex object is created with str(haystack) and exp(needle) variables set -//it also contains a list(matches) of /datum/match objects, each of which holds the position and length of the match -//matched strings are not returned from the dll, in order to save on memory allocation for large numbers of strings -//instead, you can use regex.str(matchnum) to fetch this string as needed. -//likewise you can also use regex.pos(matchnum) and regex.len(matchnum) as shorthands -/datum/regex - var/str - var/exp - var/error - var/anchors = 0 - var/list/matches = list() - - New(str, exp, results) - src.str = str - src.exp = exp - - if(findtext(results, "$Err$", 1, 6)) //error message - src.error = results - else - var/list/L = params2list(results) - var/list/M - var{i;j} - for(i in L) - M = L[i] - for(j=2, j<=M.len, j+=2) - matches += new /datum/match(text2num(M[j-1]),text2num(M[j])) - anchors = (j-2)/2 - return matches - - proc - str(i) - if(!i) return str - var/datum/match/M = matches[i] - if(i < 1 || i > matches.len) - throw EXCEPTION("str(): out of bounds") - return copytext(str, M.pos, M.pos+M.len) - - pos(i) - if(!i) return 1 - if(i < 1 || i > matches.len) - throw EXCEPTION("pos(): out of bounds") - var/datum/match/M = matches[i] - return M.pos - - len(i) - if(!i) return length(str) - if(i < 1 || i > matches.len) - throw EXCEPTION("len(): out of bounds") - var/datum/match/M = matches[i] - return M.len - - end(i) - if(!i) return length(str) - if(i < 1 || i > matches.len) - throw EXCEPTION("end() out of bounds") - var/datum/match/M = matches[i] - return M.pos + M.len - - report() //debug tool - . = ":: RESULTS ::\n:: str :: [html_encode(str)]\n:: exp :: [html_encode(exp)]\n:: anchors :: [anchors]" - if(error) - . += "\n[error]" - return - for(var/i=1, i<=matches.len, ++i) - . += "\nMatch[i]\n\t[html_encode(str(i))]\n\tpos=[pos(i)] len=[len(i)]" - -/datum/match - var/pos - var/len - - New(pos, len) - src.pos = pos - src.len = len - -#endif \ No newline at end of file diff --git a/code/__HELPERS/bygex/demo.dm b/code/__HELPERS/bygex/demo.dm deleted file mode 100644 index f89be30ded2..00000000000 --- a/code/__HELPERS/bygex/demo.dm +++ /dev/null @@ -1,54 +0,0 @@ -/mob - var/expression = "\\S+" - var/format = "*" - - var/datum/regex/results - - verb - set_expression() - var/t = input(usr,"Input Expression","title",expression) as text|null - if(t != null) - expression = t - usr << "Expression set to:\t[html_encode(t)]" - - set_format() - var/t = input(usr,"Input Formatter","title",format) as text|null - if(t != null) - format = t - usr << "Format set to:\t[html_encode(t)]" - - compare_casesensitive(t as text) - results = regEx_compare(t, expression) - world << results.report() - - compare(t as text) - results = regex_compare(t, expression) - world << results.report() - - find_casesensitive(t as text) - results = regEx_find(t, expression) - world << results.report() - - find(t as text) - results = regex_find(t, expression) - world << results.report() - - replaceall_casesensitive(t as text) - usr << regEx_replaceall(t, expression, format) - - replaceall(t as text) - usr << regex_replaceall(t, expression, format) - - replace_casesensitive(t as text) - usr << html_encode(regEx_replace(t, expression, format)) - - replace(t as text) - usr << regex_replace(t, expression, format) - - findall(t as text) - results = regex_findall(t, expression) - world << results.report() - - findall_casesensitive(t as text) - results = regEx_findall(t, expression) - world << results.report() \ No newline at end of file diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index fc00a9dcf3b..0dde21ad08b 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -203,13 +203,6 @@ proc/checkhtml(var/t) * Text modification */ // See bygex.dm -#ifndef USE_BYGEX -/proc/replacetext(text, find, replacement) - return list2text(text2list(text, find), replacement) - -/proc/replacetextEx(text, find, replacement) - return list2text(text2listEx(text, find), replacement) -#endif /proc/replace_characters(var/t,var/list/repl_chars) for(var/char in repl_chars) t = replacetext(t, char, repl_chars[char]) diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 62459bf70b3..1c5fd05d3e0 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -18,6 +18,4 @@ Due to BYOND features used in this codebase, you must update to version 508 or l This may require updating to a beta release. #endif -var/global/list/processing_objects = list() //This has to be initialized BEFORE world - -#define USE_BYGEX \ No newline at end of file +var/global/list/processing_objects = list() //This has to be initialized BEFORE world \ No newline at end of file diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 208c41ffcf6..f19de3e80c8 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -167,8 +167,6 @@ var/disable_away_missions = 0 // disable away missions - var/autoconvert_notes = 0 //if all connecting player's notes should attempt to be converted to the database - var/ooc_allowed = 1 var/looc_allowed = 1 var/dooc_allowed = 1 @@ -546,9 +544,6 @@ if("disable_away_missions") config.disable_away_missions = 1 - if("autoconvert_notes") - config.autoconvert_notes = 1 - if("disable_lobby_music") config.disable_lobby_music = 1 diff --git a/code/modules/admin/sql_notes.dm b/code/modules/admin/sql_notes.dm index c9b472e9f92..7678814f0c6 100644 --- a/code/modules/admin/sql_notes.dm +++ b/code/modules/admin/sql_notes.dm @@ -177,73 +177,7 @@ output += "

\[Add Note\]
" output += ruler usr << browse(output, "window=show_notes;size=900x500") - -/proc/regex_note_sql_extract(str, exp) - return new /datum/regex(str, exp, call(LIBREGEX_LIBRARY, "regEx_find")(str, exp)) -// If the AUTOCONVERT_NOTES is turned on, any time a player connects this will be run to try and add all their notes to the database -/proc/convert_notes_sql(ckey) - if(!ckey) - return 0 - - var/playerfile = "data/player_saves/[copytext(ckey, 1, 2)]/[ckey]/info.sav" - var/savefile/info = new(playerfile) - var/list/infos - info >> infos - if(!infos || !infos.len) - fdel(playerfile) - return 0 - - ckey = ckey - for(var/datum/player_info/I in infos) - var/notetext = I.content - var/adminckey = I.author - var/server - if (config && config.server_name) - server = config.server_name - - var/timestamp = I.timestamp - var/regex = "\[A-Za-z\]+\\, (\[A-Za-z\]+) (\[0-9\]+)\[A-Za-z\]+ of (\[0-9\]+)" - var/datum/regex/results = regex_note_sql_extract(timestamp, regex) - var/month = month2number(results.str(2)) - var/day = results.str(3) - var/year = results.str(4) - timestamp = "[year]-[month]-[day] 00:00:00" - - add_note(ckey, notetext, timestamp, adminckey, 0, server, 0) - - fdel(playerfile) - return 1 - -// Using this proc causes lag - you have been warned. -/proc/mass_convert_notes() - if(!check_rights(R_SERVER)) - return 0 - world << "Beginning mass note conversion." - - var/player_notes_file = "data/player_notes.sav" - var/savefile/notesfile = new(player_notes_file) - var/list/note_keys - notesfile >> note_keys - - if(!notesfile) - log_game("Error: Cannot access player_notes.sav file.") - return 0 - if(!note_keys || !note_keys.len) - log_game("Error: player_notes.sav file is empty. Deleting it.") - fdel(player_notes_file) - return 0 - - note_keys = sortList(note_keys) - var/i = 1 - for(i, i <= note_keys.len, i++) - var/ckey = note_keys[i] - convert_notes_sql(ckey) - world << "Finished mass note conversion ([i] notes converted). Remember to turn off AUTOCONVERT_NOTES." - world << "Deleting the player_notes.sav file." - fdel(player_notes_file) - return 1 - /proc/show_player_info_irc(var/key as text) var/target_sql_ckey = sanitizeSQL(key) var/DBQuery/query_get_notes = dbcon.NewQuery("SELECT timestamp, notetext, adminckey, server FROM [format_table_name("notes")] WHERE ckey = '[target_sql_ckey]' ORDER BY timestamp") diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 6ddc2d51241..1fb224d194f 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -304,9 +304,6 @@ src << message clientmessages.Remove(ckey) - if (config && config.autoconvert_notes) - convert_notes_sql(ckey) - send_resources() diff --git a/code/modules/scripting/Implementations/Telecomms.dm b/code/modules/scripting/Implementations/Telecomms.dm index eadc1d398c4..eafe0c94bd3 100644 --- a/code/modules/scripting/Implementations/Telecomms.dm +++ b/code/modules/scripting/Implementations/Telecomms.dm @@ -138,7 +138,7 @@ @param replacestring: the string to replace the substring with */ - interpreter.SetProc("replace", /proc/replacetext) + interpreter.SetProc("replace", /proc/n_replacetext) /* -> Locates an element/substring inside of a list or string @@ -194,7 +194,7 @@ interpreter.SetProc("reverse", /proc/reverse_text) interpreter.SetProc("tonum", /proc/n_str2num) interpreter.SetProc("capitalize", /proc/capitalize) - interpreter.SetProc("replacetextEx",/proc/replacetextEx) + interpreter.SetProc("replacetextEx",/proc/n_replacetextEx) // Numbers interpreter.SetProc("tostring", /proc/n_num2str) diff --git a/code/modules/scripting/Implementations/_Logic.dm b/code/modules/scripting/Implementations/_Logic.dm index c71839eaad9..415f591cdce 100644 --- a/code/modules/scripting/Implementations/_Logic.dm +++ b/code/modules/scripting/Implementations/_Logic.dm @@ -260,4 +260,10 @@ proc/n_round(var/num) /proc/n_log(var/num) if(isnum(num) && 0 < num) - return log(num) \ No newline at end of file + return log(num) + +/proc/n_replacetext(text, r, with) + return replacetext(text, r, with) + +/proc/n_replacetextEx(text, r, with) + return replacetextEx(text, r, with) \ No newline at end of file diff --git a/config/example/config.txt b/config/example/config.txt index e7eaed2443a..e2061b48652 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -302,9 +302,6 @@ PLAYER_REROUTE_CAP 0 ## Disable the loading of away missions #DISABLE_AWAY_MISSIONS -## Uncomment this if you still use the old .sav file based notes system and haven't used the mass conversion proc -#AUTOCONVERT_NOTES - ## Uncomment to disable the OOC/LOOC channel by default. #DISABLE_OOC diff --git a/paradise.dme b/paradise.dme index b313ca1ab5f..b3b9b34f283 100644 --- a/paradise.dme +++ b/paradise.dme @@ -58,7 +58,6 @@ #include "code\__HELPERS\timed_alerts.dm" #include "code\__HELPERS\type2type.dm" #include "code\__HELPERS\unsorted.dm" -#include "code\__HELPERS\bygex\bygex.dm" #include "code\_DATASTRUCTURES\heap.dm" #include "code\_DATASTRUCTURES\linked_lists.dm" #include "code\_DATASTRUCTURES\priority_queue.dm" From 18779eef4d0c18c0697aa4961ce35c24f6579280 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Sun, 28 Feb 2016 11:25:18 -0800 Subject: [PATCH 002/328] Add stddef.dm to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index f784b30d80e..0b419963a3e 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ data/ /_maps/map_files/**/*.dmm.backup /nano/debug.html *.db +stddef.dm From 976887b2e000e199b268763342660c2ca1022790 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Sun, 28 Feb 2016 12:07:19 -0800 Subject: [PATCH 003/328] Replace text2list and list2text --- code/__HELPERS/_string_lists.dm | 4 +- code/__HELPERS/type2type.dm | 151 +----------------- code/__HELPERS/unsorted.dm | 6 +- code/_onclick/hud/movable_screen_objects.dm | 6 +- code/controllers/Processes/timer.dm | 2 +- code/controllers/configuration.dm | 4 +- code/datums/cargoprofile.dm | 2 +- code/game/dna/genes/goon_disabilities.dm | 4 +- .../bluespace_contagion_directive.dm | 2 +- .../gamemodes/mutiny/directives/vox_heist.dm | 2 +- code/game/jobs/access.dm | 4 +- code/game/jobs/whitelist.dm | 6 +- code/game/machinery/camera/camera_assembly.dm | 2 +- code/game/machinery/computer/skills.dm | 2 +- .../airlock_docking_controller_multi.dm | 16 +- .../docking_program_multi.dm | 2 +- code/game/machinery/navbeacon.dm | 2 +- code/game/machinery/vending.dm | 4 +- code/game/objects/structures/musician.dm | 8 +- .../structures/transit_tubes/transit_tube.dm | 2 +- code/modules/admin/admin.dm | 4 +- code/modules/admin/admin_ranks.dm | 4 +- code/modules/admin/admin_verbs.dm | 4 +- code/modules/admin/create_mob.dm | 2 +- code/modules/admin/create_object.dm | 4 +- code/modules/admin/create_turf.dm | 2 +- code/modules/admin/stickyban.dm | 23 ++- code/modules/admin/topic.dm | 4 +- code/modules/admin/verbs/adminhelp.dm | 4 +- code/modules/admin/verbs/alt_check.dm | 4 +- code/modules/admin/verbs/debug.dm | 16 +- code/modules/awaymissions/maploader/reader.dm | 6 +- code/modules/client/client procs.dm | 2 +- code/modules/computer3/computers/security.dm | 2 +- code/modules/customitems/item_spawning.dm | 8 +- code/modules/detective_work/scanner.dm | 2 +- code/modules/economy/POS.dm | 4 +- code/modules/flufftext/TextFilters.dm | 8 +- code/modules/karma/karma.dm | 18 +-- code/modules/mob/hear_say.dm | 4 +- code/modules/mob/living/autohiss.dm | 2 +- code/modules/mob/living/silicon/ai/ai.dm | 4 +- code/modules/mob/living/silicon/ai/say.dm | 6 +- .../modules/mob/living/silicon/robot/robot.dm | 4 +- code/modules/nano/modules/virus2_creator.dm | 2 +- code/modules/power/singularity/emitter.dm | 4 +- .../procedural_mapping/mapGenerator.dm | 8 +- code/modules/projectiles/gun.dm | 6 +- code/modules/research/server.dm | 4 +- .../finds/finds_talkingitem.dm | 4 +- .../scripting/Implementations/Telecomms.dm | 7 +- .../scripting/Implementations/_Logic.dm | 12 +- .../space_transition/space_transition.dm | 2 +- code/modules/virus2/disease2.dm | 2 +- code/modules/virus2/diseasesplicer.dm | 6 +- code/world.dm | 2 +- 56 files changed, 144 insertions(+), 287 deletions(-) diff --git a/code/__HELPERS/_string_lists.dm b/code/__HELPERS/_string_lists.dm index 3336e16b560..f9b5e179aa1 100644 --- a/code/__HELPERS/_string_lists.dm +++ b/code/__HELPERS/_string_lists.dm @@ -12,11 +12,11 @@ var/global/list/string_cache var/list/stringsList = list() fileList = file2list("strings/[filename]") for(var/s in fileList) - stringsList = text2list(s, "@=") + stringsList = splittext(s, "@=") if(stringsList.len != 2) CRASH("Invalid string list in strings/[filename]") if(findtext(stringsList[2], "@,")) - string_cache[filename][stringsList[1]] = text2list(stringsList[2], "@,") + string_cache[filename][stringsList[1]] = splittext(stringsList[2], "@,") else string_cache[filename][stringsList[1]] = stringsList[2] // Its a single string! else diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index 2421c64b62f..2cf94c551e7 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -2,7 +2,6 @@ * Holds procs designed to change one type of value, into another. * Contains: * hex2num & num2hex - * text2list & list2text * file2list * angle2dir * angle2text @@ -60,161 +59,15 @@ hex = "0[hex]" return hex || "0" -// Concatenates a list of strings into a single string. A seperator may optionally be provided. -/proc/list2text(list/ls, sep) - if(ls.len <= 1) // Early-out code for empty or singleton lists. - return ls.len ? ls[1] : "" - - var/l = ls.len // Made local for sanic speed. - var/i = 0 // Incremented every time a list index is accessed. - - if(sep != null) - // Macros expand to long argument lists like so: sep, ls[++i], sep, ls[++i], sep, ls[++i], etc... - #define S1 sep, ls[++i] - #define S4 S1, S1, S1, S1 - #define S16 S4, S4, S4, S4 - #define S64 S16, S16, S16, S16 - - . = "[ls[++i]]" // Make sure the initial element is converted to text. - - // Having the small concatenations come before the large ones boosted speed by an average of at least 5%. - if(l-1 & 0x01) // 'i' will always be 1 here. - . = text("[][][]", ., S1) // Append 1 element if the remaining elements are not a multiple of 2. - if(l-i & 0x02) - . = text("[][][][][]", ., S1, S1) // Append 2 elements if the remaining elements are not a multiple of 4. - if(l-i & 0x04) - . = text("[][][][][][][][][]", ., S4) // And so on.... - if(l-i & 0x08) - . = text("[][][][][][][][][][][][][][][][][]", ., S4, S4) - if(l-i & 0x10) - . = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S16) - if(l-i & 0x20) - . = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ - [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S16, S16) - if(l-i & 0x40) - . = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ - [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ - [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ - [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S64) - while(l > i) // Chomp through the rest of the list, 128 elements at a time. - . = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ - [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ - [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ - [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ - [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ - [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ - [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ - [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S64, S64) - - #undef S64 - #undef S16 - #undef S4 - #undef S1 - - else - // Macros expand to long argument lists like so: ls[++i], ls[++i], ls[++i], etc... - #define S1 ls[++i] - #define S4 S1, S1, S1, S1 - #define S16 S4, S4, S4, S4 - #define S64 S16, S16, S16, S16 - - . = "[ls[++i]]" // Make sure the initial element is converted to text. - - if(l-1 & 0x01) // 'i' will always be 1 here. - . += S1 // Append 1 element if the remaining elements are not a multiple of 2. - if(l-i & 0x02) - . = text("[][][]", ., S1, S1) // Append 2 elements if the remaining elements are not a multiple of 4. - if(l-i & 0x04) - . = text("[][][][][]", ., S4) // And so on... - if(l-i & 0x08) - . = text("[][][][][][][][][]", ., S4, S4) - if(l-i & 0x10) - . = text("[][][][][][][][][][][][][][][][][]", ., S16) - if(l-i & 0x20) - . = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S16, S16) - if(l-i & 0x40) - . = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ - [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S64) - while(l > i) // Chomp through the rest of the list, 128 elements at a time. - . = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ - [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ - [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ - [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S64, S64) - - #undef S64 - #undef S16 - #undef S4 - #undef S1 - -//slower then list2text, but correctly processes associative lists. -proc/tg_list2text(list/list, glue=",", assocglue=";") - if(!istype(list) || !list.len) - return - var/output - for(var/i=1 to list.len) - if(!isnull(list["[list[i]]"])) - output += (i!=1? glue : null)+ "[list[i]]"+(i!=1? assocglue : null)+"[list["[list[i]]"]]" - else - output += (i!=1? glue : null)+ "[list[i]]" - return output - -proc/tg_text2list(text, glue=",", assocglue=";") - var/length = length(glue) - if(length < 1) return list(text) - . = list() - var/lastglue_found = 1 - var/foundglue - var/foundassocglue - var/searchtext - do - foundglue = findtext(text, glue, lastglue_found, 0) - searchtext = copytext(text, lastglue_found, foundglue) - foundassocglue = findtext(searchtext, assocglue, 1, 0) - if(foundassocglue) - var/sublist = copytext(searchtext, 1, foundassocglue) - sublist[1] = copytext(searchtext, foundassocglue, 0) - . += sublist - else - . += copytext(text, lastglue_found, foundglue) - lastglue_found = foundglue + length - while(foundglue) - - -//Converts a string into a list by splitting the string at each delimiter found. (discarding the seperator) -/proc/text2list(text, delimiter="\n") - var/delim_len = length(delimiter) - if(delim_len < 1) return list(text) - . = list() - var/last_found = 1 - var/found - do - found = findtext(text, delimiter, last_found, 0) - . += copytext(text, last_found, found) - last_found = found + delim_len - while(found) - -//Case Sensitive! -/proc/text2listEx(text, delimiter="\n") - var/delim_len = length(delimiter) - if(delim_len < 1) return list(text) - . = list() - var/last_found = 1 - var/found - do - found = findtextEx(text, delimiter, last_found, 0) - . += copytext(text, last_found, found) - last_found = found + delim_len - while(found) - /proc/text2numlist(text, delimiter="\n") var/list/num_list = list() - for(var/x in text2list(text, delimiter)) + for(var/x in splittext(text, delimiter)) num_list += text2num(x) return num_list //Splits the text of a file at seperator and returns them in a list. /proc/file2list(filename, seperator="\n") - return text2list(return_file_text(filename),seperator) + return splittext(return_file_text(filename),seperator) //Turns a direction into text diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 773572cc0fc..ddd164bed17 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1663,11 +1663,11 @@ var/mob/dview/dview_mob = new return 1 /proc/screen_loc2turf(scr_loc, turf/origin) - var/tX = text2list(scr_loc, ",") - var/tY = text2list(tX[2], ":") + var/tX = splittext(scr_loc, ",") + var/tY = splittext(tX[2], ":") var/tZ = origin.z tY = tY[1] - tX = text2list(tX[1], ":") + tX = splittext(tX[1], ":") tX = tX[1] tX = max(1, min(world.maxx, origin.x + (text2num(tX) - (world.view + 1)))) tY = max(1, min(world.maxy, origin.y + (text2num(tY) - (world.view + 1)))) diff --git a/code/_onclick/hud/movable_screen_objects.dm b/code/_onclick/hud/movable_screen_objects.dm index a0dc4827ba9..e8d4e4b3d73 100644 --- a/code/_onclick/hud/movable_screen_objects.dm +++ b/code/_onclick/hud/movable_screen_objects.dm @@ -27,13 +27,13 @@ return //Split screen-loc up into X+Pixel_X and Y+Pixel_Y - var/list/screen_loc_params = text2list(PM["screen-loc"], ",") + var/list/screen_loc_params = splittext(PM["screen-loc"], ",") //Split X+Pixel_X up into list(X, Pixel_X) - var/list/screen_loc_X = text2list(screen_loc_params[1],":") + var/list/screen_loc_X = splittext(screen_loc_params[1],":") //Split Y+Pixel_Y up into list(Y, Pixel_Y) - var/list/screen_loc_Y = text2list(screen_loc_params[2],":") + var/list/screen_loc_Y = splittext(screen_loc_params[2],":") if(snap2grid) //Discard Pixel Values screen_loc = "[screen_loc_X[1]],[screen_loc_Y[1]]" diff --git a/code/controllers/Processes/timer.dm b/code/controllers/Processes/timer.dm index 8cea3c60514..4db4a8d2138 100644 --- a/code/controllers/Processes/timer.dm +++ b/code/controllers/Processes/timer.dm @@ -60,7 +60,7 @@ var/global/datum/controller/process/timer/PStimer event.thingToCall = thingToCall event.procToCall = procToCall event.timeToRun = world.time + wait - event.hash = list2text(args) + event.hash = jointext(args, "") if(args.len > 4) event.argList = args.Copy(5) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index f19de3e80c8..2d98b267f95 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -221,7 +221,7 @@ if(type == "config") switch (name) if ("resource_urls") - config.resource_urls = text2list(value, " ") + config.resource_urls = splittext(value, " ") if ("admin_legacy_system") config.admin_legacy_system = 1 @@ -456,7 +456,7 @@ config.comms_password = value if("irc_bot_host") - config.irc_bot_host = text2list(value, ";") + config.irc_bot_host = splittext(value, ";") if("main_irc") config.main_irc = value diff --git a/code/datums/cargoprofile.dm b/code/datums/cargoprofile.dm index 5d2bdf58bf6..b251fbc3733 100644 --- a/code/datums/cargoprofile.dm +++ b/code/datums/cargoprofile.dm @@ -557,7 +557,7 @@ return "[garbletext(copytext(Text,l/2,0))][pick("#","|","/","*",".","."," ","."," "," ")]" proc/garble_keeptags(var/Text) - var/list/L = text2list(Text,">") + var/list/L = splittext(Text,">") var/result = "" for(var/string in L) var/index = findtextEx(string,"<") diff --git a/code/game/dna/genes/goon_disabilities.dm b/code/game/dna/genes/goon_disabilities.dm index 04fa6d5f524..8b1317dfb65 100644 --- a/code/game/dna/genes/goon_disabilities.dm +++ b/code/game/dna/genes/goon_disabilities.dm @@ -205,7 +205,7 @@ else prefix="" - var/list/words = text2list(message," ") + var/list/words = splittext(message," ") var/list/rearranged = list() for(var/i=1;i<=words.len;i++) var/cword = pick(words) @@ -216,7 +216,7 @@ suffix = copytext(cword,length(cword)-1,length(cword) ) if(length(cword)) rearranged += cword - return "[prefix][uppertext(list2text(rearranged," "))]!!" + return "[prefix][uppertext(jointext(rearranged," "))]!!" // WAS: /datum/bioEffect/toxic_farts /datum/dna/gene/disability/toxic_farts diff --git a/code/game/gamemodes/mutiny/directives/bluespace_contagion_directive.dm b/code/game/gamemodes/mutiny/directives/bluespace_contagion_directive.dm index cf7179f539d..e8afea4e1d0 100644 --- a/code/game/gamemodes/mutiny/directives/bluespace_contagion_directive.dm +++ b/code/game/gamemodes/mutiny/directives/bluespace_contagion_directive.dm @@ -32,7 +32,7 @@ datum/directive/bluespace_contagion/initialize() infected_names+="[candidate.mind.assigned_role] [candidate.mind.name]" special_orders = list( - "Quarantine these personnel: [list2text(infected_names, ", ")].", + "Quarantine these personnel: [jointext(infected_names, ", ")].", "Allow one hour for a cure to be manufactured.", "If no cure arrives after that time, execute and burn the infected.") diff --git a/code/game/gamemodes/mutiny/directives/vox_heist.dm b/code/game/gamemodes/mutiny/directives/vox_heist.dm index 52e8d0771ef..f652f7016d2 100644 --- a/code/game/gamemodes/mutiny/directives/vox_heist.dm +++ b/code/game/gamemodes/mutiny/directives/vox_heist.dm @@ -69,7 +69,7 @@ datum/directive/vox_heist/initialize() sympathizer_names.Add("[candidate.mind.assigned_role] [candidate.mind.name]") if(sympathizers.len) - special_orders.Add("Brig the following sympathizers: [list2text(sympathizer_names, ", ")]") + special_orders.Add("Brig the following sympathizers: [jointext(sympathizer_names, ", ")]") datum/directive/vox_heist/meets_prerequisites() var/list/candidates = get_vox_candidates() diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index 14f5eb08b9a..eb34011de1d 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -137,7 +137,7 @@ if(!src.req_access) src.req_access = list() if(src.req_access_txt) - var/list/req_access_str = text2list(req_access_txt,";") + var/list/req_access_str = splittext(req_access_txt,";") for(var/x in req_access_str) var/n = text2num(x) if(n) @@ -146,7 +146,7 @@ if(!src.req_one_access) src.req_one_access = list() if(src.req_one_access_txt) - var/list/req_one_access_str = text2list(req_one_access_txt,";") + var/list/req_one_access_str = splittext(req_one_access_txt,";") for(var/x in req_one_access_str) var/n = text2num(x) if(n) diff --git a/code/game/jobs/whitelist.dm b/code/game/jobs/whitelist.dm index 68610e3c0a7..2574e4bdcd0 100644 --- a/code/game/jobs/whitelist.dm +++ b/code/game/jobs/whitelist.dm @@ -34,7 +34,7 @@ var/list/whitelist = list() while(query.NextRow()) var/joblist = query.item[1] if(joblist!="*") - var/allowed_jobs = text2list(joblist,",") + var/allowed_jobs = splittext(joblist,",") if(rank in allowed_jobs) return 1 else return 1 return 0 @@ -56,7 +56,7 @@ var/list/whitelist = list() if (!text) diary << "Failed to load config/alienwhitelist.txt\n" else - alien_whitelist = text2list(text, "\n") + alien_whitelist = splittext(text, "\n") //todo: admin aliens /proc/is_alien_whitelisted(mob/M, var/species) @@ -78,7 +78,7 @@ var/list/whitelist = list() while(query.NextRow()) var/specieslist = query.item[1] if(specieslist!="*") - var/allowed_species = text2list(specieslist,",") + var/allowed_species = splittext(specieslist,",") if(species in allowed_species) return 1 else return 1 return 0 diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm index 73ee5cdb2aa..fa85743b1ef 100644 --- a/code/game/machinery/camera/camera_assembly.dm +++ b/code/game/machinery/camera/camera_assembly.dm @@ -82,7 +82,7 @@ usr << "No input found please hang up and try your call again." return - var/list/tempnetwork = text2list(input, ",") + var/list/tempnetwork = splittext(input, ",") if(tempnetwork.len < 1) usr << "No network found please hang up and try your call again." return diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm index 3dc5a599a6e..86e5978c3f6 100644 --- a/code/game/machinery/computer/skills.dm +++ b/code/game/machinery/computer/skills.dm @@ -221,7 +221,7 @@ What a mess.*/ return Perp = new/list() t1 = lowertext(t1) - var/list/components = text2list(t1, " ") + var/list/components = splittext(t1, " ") if(components.len > 5) return //Lets not let them search too greedily. for(var/datum/data/record/R in data_core.general) diff --git a/code/game/machinery/embedded_controller/airlock_docking_controller_multi.dm b/code/game/machinery/embedded_controller/airlock_docking_controller_multi.dm index d03bffcbae5..0cffb34dc6f 100644 --- a/code/game/machinery/embedded_controller/airlock_docking_controller_multi.dm +++ b/code/game/machinery/embedded_controller/airlock_docking_controller_multi.dm @@ -2,21 +2,21 @@ //this is the master controller, that things will try to dock with. /obj/machinery/embedded_controller/radio/docking_port_multi name = "docking port controller" - + var/child_tags_txt var/child_names_txt var/list/child_names = list() - + var/datum/computer/file/embedded_program/docking/multi/docking_program /obj/machinery/embedded_controller/radio/docking_port_multi/initialize() ..() docking_program = new/datum/computer/file/embedded_program/docking/multi(src) program = docking_program - - var/list/names = text2list(child_names_txt, ";") - var/list/tags = text2list(child_tags_txt, ";") - + + var/list/names = splittext(child_names_txt, ";") + var/list/tags = splittext(child_tags_txt, ";") + if (names.len == tags.len) for (var/i = 1; i <= tags.len; i++) child_names[tags[i]] = names[i] @@ -84,10 +84,10 @@ /obj/machinery/embedded_controller/radio/airlock/docking_port_multi/Topic(href, href_list) if(..()) return - + usr.set_machine(src) src.add_fingerprint(usr) - + var/clean = 0 switch(href_list["command"]) //anti-HTML-hacking checks if("cycle_ext") diff --git a/code/game/machinery/embedded_controller/docking_program_multi.dm b/code/game/machinery/embedded_controller/docking_program_multi.dm index 46f7538afde..dc582b915f9 100644 --- a/code/game/machinery/embedded_controller/docking_program_multi.dm +++ b/code/game/machinery/embedded_controller/docking_program_multi.dm @@ -17,7 +17,7 @@ if (istype(M,/obj/machinery/embedded_controller/radio/docking_port_multi)) //if our parent controller is the right type, then we can auto-init stuff at construction var/obj/machinery/embedded_controller/radio/docking_port_multi/controller = M //parse child_tags_txt and create child tags - children_tags = text2list(controller.child_tags_txt, ";") + children_tags = splittext(controller.child_tags_txt, ";") children_ready = list() children_override = list() diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index 3559013ce54..b9b2722650c 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -44,7 +44,7 @@ codes = new() - var/list/entries = text2list(codes_txt, ";") // entries are separated by semicolons + var/list/entries = splittext(codes_txt, ";") // entries are separated by semicolons for(var/e in entries) var/index = findtext(e, "=") // format is "key=value" diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index ea498f444cd..a8bcf2e39ea 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -102,7 +102,7 @@ wires = new(src) spawn(50) if(src.product_slogans) - src.slogan_list += text2list(src.product_slogans, ";") + src.slogan_list += splittext(src.product_slogans, ";") // So not all machines speak at the exact same time. // The first time this machine says something will be at slogantime + this random value, @@ -110,7 +110,7 @@ src.last_slogan = world.time + rand(0, slogan_delay) if(src.product_ads) - src.ads_list += text2list(src.product_ads, ";") + src.ads_list += splittext(src.product_ads, ";") src.build_inventory() power_change() diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm index 367208bbfe4..8a5f144aac2 100644 --- a/code/game/objects/structures/musician.dm +++ b/code/game/objects/structures/musician.dm @@ -80,10 +80,10 @@ for(var/line in lines) //world << line - for(var/beat in text2list(lowertext(line), ",")) + for(var/beat in splittext(lowertext(line), ",")) //world << "beat: [beat]" - var/list/notes = text2list(beat, "/") - for(var/note in text2list(notes[1], "-")) + var/list/notes = splittext(beat, "/") + for(var/note in splittext(notes[1], "-")) //world << "note: [note]" if(!playing || shouldStopPlaying(user))//If the instrument is playing, or special case playing = 0 @@ -165,7 +165,7 @@ //split into lines spawn() - lines = text2list(t, "\n") + lines = splittext(t, "\n") if(copytext(lines[1],1,6) == "BPM: ") tempo = sanitize_tempo(600 / text2num(copytext(lines[1],6))) lines.Cut(1,2) diff --git a/code/game/objects/structures/transit_tubes/transit_tube.dm b/code/game/objects/structures/transit_tubes/transit_tube.dm index 5a0b7df79a3..c7926870ccf 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube.dm @@ -244,7 +244,7 @@ obj/structure/transit_tube/ex_act(severity) if(text in direction_table) return direction_table[text] - var/list/split_text = text2list(text, "-") + var/list/split_text = splittext(text, "-") // If the first token is D, the icon_state represents // a purely decorative tube, and doesn't actually diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 0896a6e5488..6d4af33476a 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -58,9 +58,9 @@ var/global/nologevent = 0 body += "Mob type: [M.type]
" if(M.client) if(M.client.related_accounts_cid.len) - body += "Related accounts by CID: [list2text(M.client.related_accounts_cid, " - ")]
" + body += "Related accounts by CID: [jointext(M.client.related_accounts_cid, " - ")]
" if(M.client.related_accounts_ip.len) - body += "Related accounts by IP: [list2text(M.client.related_accounts_ip, " - ")]

" + body += "Related accounts by IP: [jointext(M.client.related_accounts_ip, " - ")]

" body += "Kick | " body += "Warn | " diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm index ae6ea3c4aae..7b5c4073293 100644 --- a/code/modules/admin/admin_ranks.dm +++ b/code/modules/admin/admin_ranks.dm @@ -14,7 +14,7 @@ var/list/admin_ranks = list() //list of all ranks with associated rights if(!length(line)) continue if(copytext(line,1,2) == "#") continue - var/list/List = text2list(line,"+") + var/list/List = splittext(line,"+") if(!List.len) continue var/rank = ckeyEx(List[1]) @@ -78,7 +78,7 @@ var/list/admin_ranks = list() //list of all ranks with associated rights if(copytext(line,1,2) == "#") continue //Split the line at every "-" - var/list/List = text2list(line, "-") + var/list/List = splittext(line, "-") if(!List.len) continue //ckey is before the first "-" diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index a5b2a7617df..5b7edffcc7d 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -446,7 +446,7 @@ var/list/admin_verbs_proccall = list ( /client/proc/big_brother() set category = "Admin" set name = "Big Brother Mode" - + if(!check_rights(R_PERMISSIONS)) return @@ -705,7 +705,7 @@ var/list/admin_verbs_proccall = list ( //load text from file var/list/Lines = file2list("config/admins.txt") for(var/line in Lines) - var/list/splitline = text2list(line, " - ") + var/list/splitline = splittext(line, " - ") if(n_lower(splitline[1]) == ckey) if(splitline.len >= 2) rank = ckeyEx(splitline[2]) diff --git a/code/modules/admin/create_mob.dm b/code/modules/admin/create_mob.dm index a723fe37956..4a892d893da 100644 --- a/code/modules/admin/create_mob.dm +++ b/code/modules/admin/create_mob.dm @@ -2,7 +2,7 @@ /datum/admins/proc/create_mob(var/mob/user) if (!create_mob_html) var/mobjs = null - mobjs = list2text(typesof(/mob), ";") + mobjs = jointext(typesof(/mob), ";") create_mob_html = file2text('html/create_object.html') create_mob_html = replacetext(create_mob_html, "null /* object types */", "\"[mobjs]\"") diff --git a/code/modules/admin/create_object.dm b/code/modules/admin/create_object.dm index 584dd9331b6..c5cb9f42152 100644 --- a/code/modules/admin/create_object.dm +++ b/code/modules/admin/create_object.dm @@ -4,7 +4,7 @@ var/list/create_object_forms = list(/obj, /obj/structure, /obj/machinery, /obj/e /datum/admins/proc/create_object(var/mob/user) if (!create_object_html) var/objectjs = null - objectjs = list2text(typesof(/obj), ";") + objectjs = jointext(typesof(/obj), ";") create_object_html = file2text('html/create_object.html') create_object_html = replacetext(create_object_html, "null /* object types */", "\"[objectjs]\"") @@ -15,7 +15,7 @@ var/list/create_object_forms = list(/obj, /obj/structure, /obj/machinery, /obj/e var/html_form = create_object_forms[path] if (!html_form) - var/objectjs = list2text(typesof(path), ";") + var/objectjs = jointext(typesof(path), ";") html_form = file2text('html/create_object.html') html_form = replacetext(html_form, "null /* object types */", "\"[objectjs]\"") create_object_forms[path] = html_form diff --git a/code/modules/admin/create_turf.dm b/code/modules/admin/create_turf.dm index 0938b7bd33d..fdaa103b5d5 100644 --- a/code/modules/admin/create_turf.dm +++ b/code/modules/admin/create_turf.dm @@ -2,7 +2,7 @@ /datum/admins/proc/create_turf(var/mob/user) if (!create_turf_html) var/turfjs = null - turfjs = list2text(typesof(/turf), ";") + turfjs = jointext(typesof(/turf), ";") create_turf_html = file2text('html/create_object.html') create_turf_html = replacetext(create_turf_html, "null /* object types */", "\"[turfjs]\"") diff --git a/code/modules/admin/stickyban.dm b/code/modules/admin/stickyban.dm index 474b7c76265..94f7a84daa1 100644 --- a/code/modules/admin/stickyban.dm +++ b/code/modules/admin/stickyban.dm @@ -126,7 +126,7 @@ log_admin("[key_name(usr)] has edited [ckey]'s sticky ban reason from [oldreason] to [reason]") message_admins("[key_name_admin(usr)] has edited [ckey]'s sticky ban reason from [oldreason] to [reason]") - + spawn(10) stickyban_show() @@ -147,7 +147,7 @@ /datum/admins/proc/stickyban_show() if(!check_rights(R_BAN)) return - + var/list/bans = sortList(world.GetConfig("ban")) var/banhtml = "" for(var/key in bans) @@ -181,23 +181,23 @@ if (!ban) return null . = params2list(ban) - .["keys"] = text2list(.["keys"], ",") - .["type"] = text2list(.["type"], ",") - .["IP"] = text2list(.["IP"], ",") - .["computer_id"] = text2list(.["computer_id"], ",") + .["keys"] = splittext(.["keys"], ",") + .["type"] = splittext(.["type"], ",") + .["IP"] = splittext(.["IP"], ",") + .["computer_id"] = splittext(.["computer_id"], ",") /proc/list2stickyban(var/list/ban) if (!ban || !islist(ban)) return null . = ban.Copy() if (.["keys"]) - .["keys"] = list2text(.["keys"], ",") + .["keys"] = jointext(.["keys"], ",") if (.["type"]) - .["type"] = list2text(.["type"], ",") + .["type"] = jointext(.["type"], ",") if (.["IP"]) - .["IP"] = list2text(.["IP"], ",") + .["IP"] = jointext(.["IP"], ",") if (.["computer_id"]) - .["computer_id"] = list2text(.["computer_id"], ",") + .["computer_id"] = jointext(.["computer_id"], ",") . = list2params(.) /client/proc/stickybanpanel() @@ -206,6 +206,5 @@ if(!check_rights(R_BAN)) return - + holder.stickyban_show() - \ No newline at end of file diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 26813c0ba91..9855ac57f88 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1019,7 +1019,7 @@ message_admins("\blue [key_name_admin(usr)] removed [t]", 1) jobban_remove(t) href_list["ban"] = 1 // lets it fall through and refresh - var/t_split = text2list(t, " - ") + var/t_split = splittext(t, " - ") var/key = t_split[1] var/job = t_split[2] DB_ban_unban(ckey(key), BANTYPE_JOB_PERMA, job) @@ -2066,7 +2066,7 @@ alert("Select fewer object types, (max 5)") return - var/list/offset = text2list(href_list["offset"],",") + var/list/offset = splittext(href_list["offset"],",") var/number = dd_range(1, 100, text2num(href_list["object_count"])) var/X = offset.len > 0 ? text2num(offset[1]) : 0 var/Y = offset.len > 1 ? text2num(offset[2]) : 0 diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index b8a6f370834..494961eb767 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -32,7 +32,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," var/original_msg = msg //explode the input msg into a list - var/list/msglist = text2list(msg, " ") + var/list/msglist = splittext(msg, " ") //generate keywords lookup var/list/surnames = list() @@ -43,7 +43,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," if(M.mind) indexing += M.mind.name for(var/string in indexing) - var/list/L = text2list(string, " ") + var/list/L = splittext(string, " ") var/surname_found = 0 //surnames for(var/i=L.len, i>=1, i--) diff --git a/code/modules/admin/verbs/alt_check.dm b/code/modules/admin/verbs/alt_check.dm index 5366f240945..c356ba00b6b 100644 --- a/code/modules/admin/verbs/alt_check.dm +++ b/code/modules/admin/verbs/alt_check.dm @@ -11,10 +11,10 @@ dat += "

[C.ckey] (Player Age: [C.player_age]) - [C.computer_id] / [C.address]
" if(C.related_accounts_cid.len) dat += "--Accounts associated with CID: " - dat += "[list2text(C.related_accounts_cid, " - ")]
" + dat += "[jointext(C.related_accounts_cid, " - ")]
" if(C.related_accounts_ip.len) dat += "--Accounts associated with IP: " - dat += "[list2text(C.related_accounts_ip, " - ")] " + dat += "[jointext(C.related_accounts_ip, " - ")] " usr << browse(dat, "window=alt_panel;size=640x480") return diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index c3489499058..9c6f671fba7 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -1166,21 +1166,21 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that switch(input("Which list?") in list("Players","Admins","Mobs","Living Mobs","Dead Mobs","Silicons","Clients","Respawnable Mobs")) if("Players") - usr << list2text(player_list,",") + usr << jointext(player_list,",") if("Admins") - usr << list2text(admins,",") + usr << jointext(admins,",") if("Mobs") - usr << list2text(mob_list,",") + usr << jointext(mob_list,",") if("Living Mobs") - usr << list2text(living_mob_list,",") + usr << jointext(living_mob_list,",") if("Dead Mobs") - usr << list2text(dead_mob_list,",") + usr << jointext(dead_mob_list,",") if("Silicons") - usr << list2text(silicon_mob_list,",") + usr << jointext(silicon_mob_list,",") if("Clients") - usr << list2text(clients,",") + usr << jointext(clients,",") if("Respawnable Mobs") - usr << list2text(respawnable_list,",") + usr << jointext(respawnable_list,",") /client/proc/cmd_admin_toggle_block(var/mob/M,var/block) diff --git a/code/modules/awaymissions/maploader/reader.dm b/code/modules/awaymissions/maploader/reader.dm index 0ec790896f6..01b728d4a35 100644 --- a/code/modules/awaymissions/maploader/reader.dm +++ b/code/modules/awaymissions/maploader/reader.dm @@ -143,7 +143,7 @@ var/global/dmm_suite/preloader/_preloader = null var/variables_start = findtext(full_def,"{") if(variables_start)//if there's any variable full_def = copytext(full_def,variables_start+1,length(full_def))//removing the last '}' - fields = text2list(full_def,";") + fields = dmm_splittext(full_def,";") //then fill the members_attributes list with the corresponding variables members_attributes.len++ @@ -245,7 +245,7 @@ var/global/dmm_suite/preloader/_preloader = null //build a list from variables in text form (e.g {var1="derp"; var2; var3=7} => list(var1="derp", var2, var3=7)) //return the filled list -/dmm_suite/proc/text2list(var/text as text,var/delimiter=",") +/dmm_suite/proc/dmm_splittext(var/text as text,var/delimiter=",") var/list/to_return = list() @@ -279,7 +279,7 @@ var/global/dmm_suite/preloader/_preloader = null //Check for list else if(copytext(trim_right,1,5) == "list") - trim_right = text2list(copytext(trim_right,6,length(trim_right))) + trim_right = dmm_splittext(copytext(trim_right,6,length(trim_right))) //Check for file else if(copytext(trim_right,1,2) == "'") diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 1fb224d194f..6b9acf0face 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -365,7 +365,7 @@ //Log all the alts if(related_accounts_cid.len) - log_access("Alts: [key_name(src)]:[list2text(related_accounts_cid, " - ")]") + log_access("Alts: [key_name(src)]:[jointext(related_accounts_cid, " - ")]") var/watchreason = check_watchlist(sql_ckey) if(watchreason) diff --git a/code/modules/computer3/computers/security.dm b/code/modules/computer3/computers/security.dm index 6cc18293a49..3c6560d6aa9 100644 --- a/code/modules/computer3/computers/security.dm +++ b/code/modules/computer3/computers/security.dm @@ -305,7 +305,7 @@ What a mess.*/ return Perp = new/list() t1 = lowertext(t1) - var/list/components = text2list(t1, " ") + var/list/components = splittext(t1, " ") if(components.len > 5) return //Lets not let them search too greedily. for(var/datum/data/record/R in data_core.general) diff --git a/code/modules/customitems/item_spawning.dm b/code/modules/customitems/item_spawning.dm index 18735c73cc9..909abc1bbdc 100644 --- a/code/modules/customitems/item_spawning.dm +++ b/code/modules/customitems/item_spawning.dm @@ -12,7 +12,7 @@ var/jobmask = query.item[3] var/ok = 0 if(jobmask != "*") - var/list/allowed_jobs = text2list(jobmask,",") + var/list/allowed_jobs = splittext(jobmask,",") for(var/i = 1, i <= allowed_jobs.len, i++) if(istext(allowed_jobs[i])) allowed_jobs[i] = trim(allowed_jobs[i]) @@ -66,13 +66,13 @@ // This is hacky, but since it's difficult as fuck to make a proper parser in BYOND without killing the server, here it is. - N3X /proc/HackProperties(var/mob/living/carbon/human/M,var/obj/item/I,var/script) - var/list/statements = text2list(script,";") + var/list/statements = splittext(script,";") if(statements.len == 0) return for(var/statement in statements) - var/list/assignmentChunks = text2list(statement,"=") + var/list/assignmentChunks = splittext(statement,"=") var/varname = assignmentChunks[1] - var/list/typeChunks=text2list(script,":") + var/list/typeChunks=splittext(script,":") var/desiredType=typeChunks[1] switch(desiredType) if("string") diff --git a/code/modules/detective_work/scanner.dm b/code/modules/detective_work/scanner.dm index 5aec21ac94e..e59eb8b9ba2 100644 --- a/code/modules/detective_work/scanner.dm +++ b/code/modules/detective_work/scanner.dm @@ -25,7 +25,7 @@ var/obj/item/weapon/paper/P = new(get_turf(src)) P.name = "paper- 'Scanner Report'" P.info = "

Scanner Report


" - P.info += list2text(log, "
") + P.info += jointext(log, "
") P.info += "
Notes:
" P.info_links = P.info diff --git a/code/modules/economy/POS.dm b/code/modules/economy/POS.dm index 8cc707f3b2f..0123156d174 100644 --- a/code/modules/economy/POS.dm +++ b/code/modules/economy/POS.dm @@ -427,8 +427,8 @@ var/const/POS_HEADER = {" if("Add to Order") AddToOrder(href_list["preset"],text2num(href_list["units"])) if("Add Products") - for(var/list/line in text2list(href_list["csv"],"\n")) - var/list/cells = text2list(line,",") + for(var/list/line in splittext(href_list["csv"],"\n")) + var/list/cells = splittext(line,",") if(cells.len<2) usr << "\red The CSV must have at least two columns: Product Name, followed by Price (as a number)." src.attack_hand(usr) diff --git a/code/modules/flufftext/TextFilters.dm b/code/modules/flufftext/TextFilters.dm index 44cc91a8e45..5a40ea1934a 100644 --- a/code/modules/flufftext/TextFilters.dm +++ b/code/modules/flufftext/TextFilters.dm @@ -26,7 +26,7 @@ proc/Intoxicated(phrase) proc/NewStutter(phrase,stunned) phrase = html_decode(phrase) - var/list/split_phrase = text2list(phrase," ") //Split it up into words. + var/list/split_phrase = splittext(phrase," ") //Split it up into words. var/list/unstuttered_words = split_phrase.Copy() var/i = rand(1,3) @@ -57,7 +57,7 @@ proc/NewStutter(phrase,stunned) split_phrase[index] = word - return sanitize(list2text(split_phrase," ")) + return sanitize(jointext(split_phrase," ")) proc/Stagger(mob/M,d) //Technically not a filter, but it relates to drunkenness. step(M, pick(d,turn(d,90),turn(d,-90))) @@ -67,7 +67,7 @@ proc/Ellipsis(original_msg, chance = 50) if(chance >= 100) return original_msg var/list - words = text2list(original_msg," ") + words = splittext(original_msg," ") new_words = list() var/new_msg = "" @@ -78,6 +78,6 @@ proc/Ellipsis(original_msg, chance = 50) else new_words += w - new_msg = list2text(new_words," ") + new_msg = jointext(new_words," ") return new_msg diff --git a/code/modules/karma/karma.dm b/code/modules/karma/karma.dm index 9633383e98a..c3c0ca4eef1 100644 --- a/code/modules/karma/karma.dm +++ b/code/modules/karma/karma.dm @@ -270,10 +270,10 @@ You've gained [totalkarma] total karma in your time here.
"} karmacharge(cost) if(dbckey) - var/list/joblist = text2list(dbjob,",") + var/list/joblist = splittext(dbjob,",") if(!(job in joblist)) joblist += job - var/newjoblist = list2text(joblist,",") + var/newjoblist = jointext(joblist,",") query = dbcon.NewQuery("UPDATE [format_table_name("whitelist")] SET job='[newjoblist]' WHERE ckey='[dbckey]'") if(!query.Execute()) var/err = query.ErrorMsg() @@ -310,10 +310,10 @@ You've gained [totalkarma] total karma in your time here.
"} karmacharge(cost) if(dbckey) - var/list/specieslist = text2list(dbspecies,",") + var/list/specieslist = splittext(dbspecies,",") if(!(species in specieslist)) specieslist += species - var/newspecieslist = list2text(specieslist,",") + var/newspecieslist = jointext(specieslist,",") query = dbcon.NewQuery("UPDATE [format_table_name("whitelist")] SET species='[newspecieslist]' WHERE ckey='[dbckey]'") if(!query.Execute()) var/err = query.ErrorMsg() @@ -388,15 +388,15 @@ You've gained [totalkarma] total karma in your time here.
"} if(dbckey) var/list/typelist = list() if(type == "job") - typelist = text2list(dbjob,",") + typelist = splittext(dbjob,",") else if(type == "species") - typelist = text2list(dbspecies,",") + typelist = splittext(dbspecies,",") else usr << "\red Type [type] is not a valid column." if(name in typelist) typelist -= name - var/newtypelist = list2text(typelist,",") + var/newtypelist = jointext(typelist,",") query = dbcon.NewQuery("UPDATE [format_table_name("whitelist")] SET [type]='[newtypelist]' WHERE ckey='[dbckey]'") if(!query.Execute()) var/err = query.ErrorMsg() @@ -426,8 +426,8 @@ You've gained [totalkarma] total karma in your time here.
"} dbspecies = query.item[4] if(dbckey) - var/list/joblist = text2list(dbjob,",") - var/list/specieslist = text2list(dbspecies,",") + var/list/joblist = splittext(dbjob,",") + var/list/specieslist = splittext(dbspecies,",") var/list/combinedlist = joblist + specieslist if(name) if(name in combinedlist) diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index 8f63a34942c..52676f9c97d 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -114,7 +114,7 @@ message = stars(message) var/speaker_name = "unknown" - if(speaker) + if(speaker) speaker_name = speaker.name if(vname) @@ -203,7 +203,7 @@ var/heard = "" if(prob(15)) var/list/punctuation = list(",", "!", ".", ";", "?") - var/list/messages = text2list(message, " ") + var/list/messages = splittext(message, " ") var/R = rand(1, messages.len) var/heardword = messages[R] if(copytext(heardword,1, 1) in punctuation) diff --git a/code/modules/mob/living/autohiss.dm b/code/modules/mob/living/autohiss.dm index 219ec491624..4b9bfd96f49 100644 --- a/code/modules/mob/living/autohiss.dm +++ b/code/modules/mob/living/autohiss.dm @@ -102,7 +102,7 @@ . += pick(map[min_char]) message = copytext(message, min_index + 1) - return list2text(.) + return jointext(., "") #undef AUTOHISS_OFF #undef AUTOHISS_BASIC diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 8509d59e547..9ede31debe6 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -268,11 +268,11 @@ var/list/ai_verbs_default = list( return if(!custom_sprite) //Check to see if custom sprite time, checking the appopriate file to change a var var/file = file2text("config/custom_sprites.txt") - var/lines = text2list(file, "\n") + var/lines = splittext(file, "\n") for(var/line in lines) // split & clean up - var/list/Entry = text2list(line, ":") + var/list/Entry = splittext(line, ":") for(var/i = 1 to Entry.len) Entry[i] = trim(Entry[i]) diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm index acf3a2db3c0..c54f2a30a6e 100644 --- a/code/modules/mob/living/silicon/ai/say.dm +++ b/code/modules/mob/living/silicon/ai/say.dm @@ -30,7 +30,7 @@ var/const/VOX_PATH = "sound/vox_fem/" /mob/living/silicon/ai/proc/ai_announcement() if(check_unable(AI_CHECK_WIRELESS | AI_CHECK_RADIO)) return - + if(announcing_vox > world.time) src << "Please wait [round((announcing_vox - world.time) / 10)] seconds." return @@ -38,14 +38,14 @@ var/const/VOX_PATH = "sound/vox_fem/" var/message = input(src, "WARNING: Misuse of this verb can result in you being job banned. More help is available in 'Announcement Help'", "Announcement", last_announcement) as text|null last_announcement = message - + if(check_unable(AI_CHECK_WIRELESS | AI_CHECK_RADIO)) return if(!message || announcing_vox > world.time) return - var/list/words = text2list(trim(message), " ") + var/list/words = splittext(trim(message), " ") var/list/incorrect_words = list() if(words.len > 30) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 34ecf876574..5f085cafacc 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -175,11 +175,11 @@ var/list/robot_verbs_default = list( //Check for custom sprite if(!custom_sprite) var/file = file2text("config/custom_sprites.txt") - var/lines = text2list(file, "\n") + var/lines = splittext(file, "\n") for(var/line in lines) // split & clean up - var/list/Entry = text2list(line, ";") + var/list/Entry = splittext(line, ";") for(var/i = 1 to Entry.len) Entry[i] = trim(Entry[i]) diff --git a/code/modules/nano/modules/virus2_creator.dm b/code/modules/nano/modules/virus2_creator.dm index 40bf1480914..d6d9bd62ec1 100644 --- a/code/modules/nano/modules/virus2_creator.dm +++ b/code/modules/nano/modules/virus2_creator.dm @@ -25,7 +25,7 @@ var/virusstats[0] virusstats["antigen"] = antigens2string(curr_virus.antigen) virusstats["spreadType"] = curr_virus.spreadtype - virusstats["affectedSpecies"] = list2text(curr_virus.affected_species, ", ") + virusstats["affectedSpecies"] = jointext(curr_virus.affected_species, ", ") virusstats["speed"] = curr_virus.speed data["virusStats"] = virusstats diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index e78ed83fa1f..f181fab77af 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -106,8 +106,8 @@ active=on var/statestr=on?"on":"off" // Spammy message_admins("Emitter turned [statestr] by radio signal ([signal.data["command"]] @ [frequency]) in [formatJumpTo(src)]",0,1) - log_game("Emitter turned [statestr] by radio signal ([signal.data["command"]] @ [frequency]) in ([x], [y], [z]) AAC prints: [list2text(signal.data["hiddenprints"])]") - investigate_log("turned [statestr] by radio signal ([signal.data["command"]] @ [frequency]) AAC prints: [list2text(signal.data["hiddenprints"])]","singulo") + log_game("Emitter turned [statestr] by radio signal ([signal.data["command"]] @ [frequency]) in ([x], [y], [z]) AAC prints: [jointext(signal.data["hiddenprints"], "")]") + investigate_log("turned [statestr] by radio signal ([signal.data["command"]] @ [frequency]) AAC prints: [jointext(signal.data["hiddenprints"], "")]","singulo") update_icon() /obj/machinery/power/emitter/Destroy() diff --git a/code/modules/procedural_mapping/mapGenerator.dm b/code/modules/procedural_mapping/mapGenerator.dm index c0b89549f3e..d0c5440dc95 100644 --- a/code/modules/procedural_mapping/mapGenerator.dm +++ b/code/modules/procedural_mapping/mapGenerator.dm @@ -156,8 +156,8 @@ src << "Missing Input" return - var/list/startCoords = text2list(startInput, ";") - var/list/endCoords = text2list(endInput, ";") + var/list/startCoords = splittext(startInput, ";") + var/list/endCoords = splittext(endInput, ";") if(!startCoords || !endCoords) src << "Invalid Coords" src << "Start Input: [startInput]" @@ -178,7 +178,7 @@ var/moduleClusters = input("Cluster Flags (Cancel to leave unchanged from defaults)","Map Gen Settings") as null|anything in clusters //null for default - + var/theCluster = 0 if(moduleClusters != "None") if(!clusters[moduleClusters]) @@ -187,7 +187,7 @@ theCluster = clusters[moduleClusters] else theCluster = CLUSTER_CHECK_NONE - + if(theCluster) for(var/datum/mapGeneratorModule/M in N.modules) M.clusterCheckFlags = theCluster diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index d44fb37f20b..329cd56e9f4 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -226,13 +226,13 @@ in_chamber.p_y = text2num(mouse_control["icon-y"]) if(mouse_control["screen-loc"]) //Split screen-loc up into X+Pixel_X and Y+Pixel_Y - var/list/screen_loc_params = text2list(mouse_control["screen-loc"], ",") + var/list/screen_loc_params = splittext(mouse_control["screen-loc"], ",") //Split X+Pixel_X up into list(X, Pixel_X) - var/list/screen_loc_X = text2list(screen_loc_params[1],":") + var/list/screen_loc_X = splittext(screen_loc_params[1],":") //Split Y+Pixel_Y up into list(Y, Pixel_Y) - var/list/screen_loc_Y = text2list(screen_loc_params[2],":") + var/list/screen_loc_Y = splittext(screen_loc_params[2],":") var/x = text2num(screen_loc_X[1]) * 32 + text2num(screen_loc_X[2]) - 32 var/y = text2num(screen_loc_Y[1]) * 32 + text2num(screen_loc_Y[2]) - 32 diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index c539b0c958f..a36e9159991 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -48,12 +48,12 @@ var/list/temp_list if(!id_with_upload.len) temp_list = list() - temp_list = text2list(id_with_upload_string, ";") + temp_list = splittext(id_with_upload_string, ";") for(var/N in temp_list) id_with_upload += text2num(N) if(!id_with_download.len) temp_list = list() - temp_list = text2list(id_with_download_string, ";") + temp_list = splittext(id_with_download_string, ";") for(var/N in temp_list) id_with_download += text2num(N) diff --git a/code/modules/research/xenoarchaeology/finds/finds_talkingitem.dm b/code/modules/research/xenoarchaeology/finds/finds_talkingitem.dm index 65a2e24ca08..4a8c9be2a89 100644 --- a/code/modules/research/xenoarchaeology/finds/finds_talkingitem.dm +++ b/code/modules/research/xenoarchaeology/finds/finds_talkingitem.dm @@ -40,7 +40,7 @@ /*var/l = lentext(msg) if(findtext(msg," ",l,l+1)==0) msg+=" "*/ - seperate = text2list(msg, " ") + seperate = splittext(msg, " ") for(var/Xa = 1,XaAntigen:
[antigens2string(antigen)]
Transmitted By: [spreadtype]
Rate of Progression: [stageprob * 10]
- Species Affected: [list2text(affected_species, ", ")]
+ Species Affected: [jointext(affected_species, ", ")]
"} r += "Symptoms:
" diff --git a/code/modules/virus2/diseasesplicer.dm b/code/modules/virus2/diseasesplicer.dm index 4129e77ecf6..8719a18b361 100644 --- a/code/modules/virus2/diseasesplicer.dm +++ b/code/modules/virus2/diseasesplicer.dm @@ -52,7 +52,7 @@ if (memorybank) data["buffer"] = list("name" = (analysed ? memorybank.effect.name : "Unknown Symptom"), "stage" = memorybank.stage) if (species_buffer) - data["species_buffer"] = analysed ? list2text(species_buffer, ", ") : "Unknown Species" + data["species_buffer"] = analysed ? jointext(species_buffer, ", ") : "Unknown Species" if (splicing) data["busy"] = "Splicing..." @@ -65,7 +65,7 @@ if (dish.virus2) if (dish.virus2.affected_species) - data["affected_species"] = dish.analysed ? list2text(dish.virus2.affected_species, ", ") : "Unknown" + data["affected_species"] = dish.analysed ? jointext(dish.virus2.affected_species, ", ") : "Unknown" if (dish.growth >= 50) var/list/effects[0] @@ -109,7 +109,7 @@ d.name = "[memorybank.effect.name] GNA disk (Stage: [memorybank.effect.stage])" d.effect = memorybank else if (species_buffer) - d.name = "[list2text(species_buffer, ", ")] GNA disk" + d.name = "[jointext(species_buffer, ", ")] GNA disk" d.species = species_buffer else if (memorybank) diff --git a/code/world.dm b/code/world.dm index 5f60f4aa5cf..1e38f67e9c2 100644 --- a/code/world.dm +++ b/code/world.dm @@ -399,7 +399,7 @@ var/world_topic_spam_protect_time = world.timeofday // features += "hosted by [config.hostedby]" if (features) - s += ": [list2text(features, ", ")]" + s += ": [jointext(features, ", ")]" /* does this help? I do not know */ if (src.status != s) From 0c9a469f2cd467f3eab99742e98553693de6a378 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Sun, 28 Feb 2016 18:09:43 -0800 Subject: [PATCH 004/328] 510: HUD, Flash Refactor, Rip out unused pain system --- code/_onclick/_defines.dm | 1 + code/_onclick/click.dm | 4 +- code/_onclick/hud/alien.dm | 17 +- code/_onclick/hud/alien_larva.dm | 17 +- code/_onclick/hud/fullscreen.dm | 108 +++++++++ code/_onclick/hud/hud.dm | 89 +------- code/_onclick/hud/human.dm | 29 +-- code/_onclick/hud/monkey.dm | 83 +------ code/_onclick/hud/other_mobs.dm | 11 +- code/_onclick/hud/robot.dm | 35 +-- code/controllers/Processes/timer.dm | 2 +- code/datums/spells/horsemask.dm | 2 +- code/game/gamemodes/cult/runes.dm | 4 +- code/game/machinery/atmoalter/canister.dm | 7 +- code/game/machinery/camera/camera.dm | 6 +- code/game/machinery/camera/camera_assembly.dm | 5 +- code/game/machinery/flasher.dm | 27 +-- code/game/objects/items/crayons.dm | 2 +- code/game/objects/items/devices/flash.dm | 29 ++- code/game/objects/items/devices/flashlight.dm | 27 +-- .../objects/items/devices/laserpointer.dm | 57 +---- .../items/weapons/grenades/bananade.dm | 5 +- .../items/weapons/grenades/clusterbuster.dm | 1 - .../items/weapons/grenades/flashbang.dm | 47 +--- .../items/weapons/grenades/spawnergrenade.dm | 6 +- code/game/objects/items/weapons/tools.dm | 46 +--- code/modules/clothing/glasses/glasses.dm | 6 - code/modules/events/anomaly_bluespace.dm | 8 +- code/modules/mob/living/carbon/alien/alien.dm | 4 +- code/modules/mob/living/carbon/alien/death.dm | 1 - .../mob/living/carbon/alien/humanoid/life.dm | 75 +------ .../mob/living/carbon/alien/larva/death.dm | 1 - .../mob/living/carbon/alien/larva/life.dm | 80 ------- code/modules/mob/living/carbon/alien/life.dm | 22 +- code/modules/mob/living/carbon/brain/death.dm | 1 - code/modules/mob/living/carbon/carbon.dm | 40 +++- code/modules/mob/living/carbon/human/death.dm | 1 - code/modules/mob/living/carbon/human/human.dm | 12 +- .../mob/living/carbon/human/human_damage.dm | 42 +++- code/modules/mob/living/carbon/human/life.dm | 30 --- .../living/carbon/human/species/species.dm | 209 ++++++++++-------- code/modules/mob/living/carbon/life.dm | 120 ++++------ code/modules/mob/living/carbon/slime/death.dm | 2 - code/modules/mob/living/death.dm | 5 + code/modules/mob/living/life.dm | 55 +++-- code/modules/mob/living/living.dm | 15 +- code/modules/mob/living/living_defense.dm | 2 - code/modules/mob/living/silicon/ai/ai.dm | 2 - code/modules/mob/living/silicon/ai/death.dm | 5 +- code/modules/mob/living/silicon/ai/life.dm | 13 +- code/modules/mob/living/silicon/ai/login.dm | 14 +- code/modules/mob/living/silicon/pai/death.dm | 1 - code/modules/mob/living/silicon/pai/pai.dm | 2 +- .../modules/mob/living/silicon/robot/death.dm | 1 - .../mob/living/silicon/robot/drone/drone.dm | 4 + .../modules/mob/living/silicon/robot/robot.dm | 4 +- code/modules/mob/living/silicon/silicon.dm | 6 +- code/modules/mob/living/simple_animal/bees.dm | 1 - code/modules/mob/mob.dm | 3 - code/modules/mob/mob_defines.dm | 4 - code/modules/organs/pain.dm | 7 - code/modules/reagents/newchem/pyro.dm | 25 +-- .../chemical_reaction_slime.dm | 20 +- icons/mob/screen1_full.dmi | Bin 1245935 -> 0 bytes icons/mob/screen_full.dmi | Bin 0 -> 1367919 bytes icons/mob/screen_gen.dmi | Bin 120075 -> 118895 bytes paradise.dme | 3 + 67 files changed, 558 insertions(+), 955 deletions(-) create mode 100644 code/_onclick/_defines.dm create mode 100644 code/_onclick/hud/fullscreen.dm create mode 100644 code/modules/mob/living/death.dm delete mode 100644 icons/mob/screen1_full.dmi create mode 100644 icons/mob/screen_full.dmi diff --git a/code/_onclick/_defines.dm b/code/_onclick/_defines.dm new file mode 100644 index 00000000000..3c76c35e807 --- /dev/null +++ b/code/_onclick/_defines.dm @@ -0,0 +1 @@ +#define CLICKCATCHER_PLANE -99 \ No newline at end of file diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 5c13314833c..febf7c87414 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -405,9 +405,9 @@ buckled.handle_rotation()*/ /obj/screen/click_catcher - icon = 'icons/mob/screen1_full.dmi' + icon = 'icons/mob/screen_full.dmi' icon_state = "passage0" - layer = 0 + plane = CLICKCATCHER_PLANE mouse_opacity = 2 screen_loc = "CENTER-7,CENTER-7" diff --git a/code/_onclick/hud/alien.dm b/code/_onclick/hud/alien.dm index 568ffa084f2..fa7017fd2d8 100644 --- a/code/_onclick/hud/alien.dm +++ b/code/_onclick/hud/alien.dm @@ -166,21 +166,6 @@ alien_plasma_display.name = "plasma stored" alien_plasma_display.screen_loc = ui_alienplasmadisplay - mymob.blind = new /obj/screen() - mymob.blind.icon = 'icons/mob/screen1_full.dmi' - mymob.blind.icon_state = "blackimageoverlay" - mymob.blind.name = " " - mymob.blind.screen_loc = "CENTER-7,CENTER-7" - mymob.blind.layer = 0 - mymob.blind.mouse_opacity = 0 - - mymob.flash = new /obj/screen() - mymob.flash.icon = 'icons/mob/screen1_alien.dmi' - mymob.flash.icon_state = "blank" - mymob.flash.name = "flash" - mymob.flash.screen_loc = "WEST,SOUTH to EAST,NORTH" - mymob.flash.layer = 17 - mymob.zone_sel = new /obj/screen/zone_sel() mymob.zone_sel.icon = 'icons/mob/screen1_alien.dmi' mymob.zone_sel.overlays.Cut() @@ -188,6 +173,6 @@ mymob.client.screen = list() - mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.toxin, mymob.fire, mymob.healths, nightvisionicon, mymob.pullin, alien_plasma_display, mymob.pullin, mymob.blind, mymob.flash) //, mymob.hands, mymob.rest, mymob.sleep, mymob.mach ) + mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.toxin, mymob.fire, mymob.healths, nightvisionicon, mymob.pullin, alien_plasma_display, mymob.pullin) //, mymob.hands, mymob.rest, mymob.sleep, mymob.mach ) mymob.client.screen += src.adding + src.other mymob.client.screen += mymob.client.void \ No newline at end of file diff --git a/code/_onclick/hud/alien_larva.dm b/code/_onclick/hud/alien_larva.dm index 18c2d344f53..8232f2073e2 100644 --- a/code/_onclick/hud/alien_larva.dm +++ b/code/_onclick/hud/alien_larva.dm @@ -61,21 +61,6 @@ mymob.pullin.update_icon(mymob) mymob.pullin.screen_loc = ui_pull_resist - mymob.blind = new /obj/screen() - mymob.blind.icon = 'icons/mob/screen1_full.dmi' - mymob.blind.icon_state = "blackimageoverlay" - mymob.blind.name = " " - mymob.blind.screen_loc = "CENTER-7,CENTER-7" - mymob.blind.layer = 0 - mymob.blind.mouse_opacity = 0 - - mymob.flash = new /obj/screen() - mymob.flash.icon = 'icons/mob/screen1_alien.dmi' - mymob.flash.icon_state = "blank" - mymob.flash.name = "flash" - mymob.flash.screen_loc = "WEST,SOUTH to EAST,NORTH" - mymob.flash.layer = 17 - mymob.zone_sel = new /obj/screen/zone_sel() mymob.zone_sel.icon = 'icons/mob/screen1_alien.dmi' mymob.zone_sel.overlays.Cut() @@ -83,6 +68,6 @@ mymob.client.screen = list() - mymob.client.screen += list( mymob.zone_sel, mymob.oxygen, mymob.toxin, mymob.fire, mymob.healths, nightvisionicon, mymob.pullin, mymob.blind, mymob.flash) //, mymob.rest, mymob.sleep, mymob.mach ) + mymob.client.screen += list( mymob.zone_sel, mymob.oxygen, mymob.toxin, mymob.fire, mymob.healths, nightvisionicon, mymob.pullin) //, mymob.rest, mymob.sleep, mymob.mach ) mymob.client.screen += src.adding + src.other mymob.client.screen += mymob.client.void \ No newline at end of file diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm new file mode 100644 index 00000000000..5b0088e69aa --- /dev/null +++ b/code/_onclick/hud/fullscreen.dm @@ -0,0 +1,108 @@ +#define FULLSCREEN_LAYER 18 +#define DAMAGE_LAYER FULLSCREEN_LAYER + 0.1 +#define BLIND_LAYER DAMAGE_LAYER + 0.1 +#define CRIT_LAYER BLIND_LAYER + 0.1 + +/mob + var/list/screens = list() + +/mob/proc/overlay_fullscreen(category, type, severity) + var/obj/screen/fullscreen/screen + if(screens[category]) + screen = screens[category] + if(screen.type != type) + clear_fullscreen(category, FALSE) + return .() + else if(!severity || severity == screen.severity) + return null + else + screen = new type + + screen.icon_state = "[initial(screen.icon_state)][severity]" + screen.severity = severity + + screens[category] = screen + if(client) + client.screen += screen + return screen + +/mob/proc/clear_fullscreen(category, animate = 10) + set waitfor = 0 + var/obj/screen/fullscreen/screen = screens[category] + if(!screen) + return + + if(animate) + animate(screen, alpha = 0, time = animate) + sleep(animate) + + screens -= category + if(client) + client.screen -= screen + qdel(screen) + +/mob/proc/clear_fullscreens() + for(var/category in screens) + clear_fullscreen(category) + +/datum/hud/proc/reload_fullscreen() + var/list/screens = mymob.screens + for(var/category in screens) + mymob.client.screen |= screens[category] + +/obj/screen/fullscreen + icon = 'icons/mob/screen_full.dmi' + icon_state = "default" + screen_loc = "CENTER-7,CENTER-7" + layer = FULLSCREEN_LAYER + mouse_opacity = 0 + var/severity = 0 + +/obj/screen/fullscreen/Destroy() + ..() + severity = 0 + return QDEL_HINT_HARDDEL_NOW + +/obj/screen/fullscreen/brute + icon_state = "brutedamageoverlay" + layer = DAMAGE_LAYER + +/obj/screen/fullscreen/oxy + icon_state = "oxydamageoverlay" + layer = DAMAGE_LAYER + +/obj/screen/fullscreen/crit + icon_state = "passage" + layer = CRIT_LAYER + +/obj/screen/fullscreen/blind + icon_state = "blackimageoverlay" + layer = BLIND_LAYER + +/obj/screen/fullscreen/impaired + icon_state = "impairedoverlay" + +/obj/screen/fullscreen/blurry + icon = 'icons/mob/screen_gen.dmi' + screen_loc = "WEST,SOUTH to EAST,NORTH" + icon_state = "blurry" + +/obj/screen/fullscreen/flash + icon = 'icons/mob/screen_gen.dmi' + screen_loc = "WEST,SOUTH to EAST,NORTH" + icon_state = "flash" + +/obj/screen/fullscreen/flash/noise + icon = 'icons/mob/screen_gen.dmi' + screen_loc = "WEST,SOUTH to EAST,NORTH" + icon_state = "noise" + +/obj/screen/fullscreen/high + icon = 'icons/mob/screen_gen.dmi' + screen_loc = "WEST,SOUTH to EAST,NORTH" + icon_state = "druggy" + +#undef FULLSCREEN_LAYER +#undef BLIND_LAYER +#undef DAMAGE_LAYER +#undef CRIT_LAYER diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index f78bfd929a1..46b6fc4855e 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -1,84 +1,3 @@ -/* - The global hud: - Uses the same visual objects for all players. -*/ -var/datum/global_hud/global_hud = new() - -/datum/hud/var/obj/screen/grab_intent -/datum/hud/var/obj/screen/hurt_intent -/datum/hud/var/obj/screen/disarm_intent -/datum/hud/var/obj/screen/help_intent - -/datum/global_hud - var/obj/screen/druggy - var/obj/screen/blurry - var/list/vimpaired - var/list/darkMask - -/datum/global_hud/New() - //420erryday psychedellic colours screen overlay for when you are high - druggy = new /obj/screen() - druggy.screen_loc = "WEST,SOUTH to EAST,NORTH" - druggy.icon_state = "druggy" - druggy.layer = 17 - druggy.mouse_opacity = 0 - - //that white blurry effect you get when you eyes are damaged - blurry = new /obj/screen() - blurry.screen_loc = "WEST,SOUTH to EAST,NORTH" - blurry.icon_state = "blurry" - blurry.layer = 17 - blurry.mouse_opacity = 0 - - var/obj/screen/O - var/i - //that nasty looking dither you get when you're short-sighted - vimpaired = newlist(/obj/screen,/obj/screen,/obj/screen,/obj/screen) - O = vimpaired[1] - O.screen_loc = "WEST,SOUTH to CENTER-3,NORTH" - O = vimpaired[2] - O.screen_loc = "WEST,SOUTH to EAST,CENTER-3" - O = vimpaired[3] - O.screen_loc = "CENTER+3,SOUTH to EAST,NORTH" - O = vimpaired[4] - O.screen_loc = "WEST,CENTER+3 to EAST,NORTH" - - //welding mask overlay black/dither - darkMask = newlist(/obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen) - O = darkMask[1] - O.screen_loc = "CENTER-5,CENTER-5 to CENTER-3,CENTER+5" - O = darkMask[2] - O.screen_loc = "CENTER-5,CENTER-5 to CENTER+5,CENTER-3" - O = darkMask[3] - O.screen_loc = "CENTER+3,CENTER-5 to CENTER+5,CENTER+5" - O = darkMask[4] - O.screen_loc = "CENTER-5,CENTER+3 to CENTER+5,CENTER+5" - O = darkMask[5] - O.screen_loc = "WEST,SOUTH to CENTER-5,NORTH" - O = darkMask[6] - O.screen_loc = "WEST,SOUTH to EAST,CENTER-5" - O = darkMask[7] - O.screen_loc = "CENTER+5,SOUTH to EAST,NORTH" - O = darkMask[8] - O.screen_loc = "WEST,CENTER+5 to EAST,NORTH" - - for(i = 1, i <= 4, i++) - O = vimpaired[i] - O.icon_state = "dither50" - O.layer = 17 - O.mouse_opacity = 0 - - O = darkMask[i] - O.icon_state = "dither50" - O.layer = 17 - O.mouse_opacity = 0 - - for(i = 5, i <= 8, i++) - O = darkMask[i] - O.icon_state = "black" - O.layer = 17 - O.mouse_opacity = 0 - /* The hud datum Used to show and hide huds for all the different mob types, @@ -180,8 +99,6 @@ datum/hud/New(mob/owner) monkey_hud(ui_style, ui_color, ui_alpha) else if(ishuman(mymob)) human_hud(ui_style, ui_color, ui_alpha) // Pass the player the UI style chosen in preferences - else if(isbrain(mymob)) - brain_hud(ui_style) else if( islarva(mymob) || isfacehugger(mymob) ) larva_hud() else if (isembryo(mymob)) @@ -205,6 +122,8 @@ datum/hud/New(mob/owner) else if(isguardian(mymob)) guardian_hud() + reload_fullscreen() + //Triggered when F12 is pressed (Unless someone changed something in the DMF) /mob/verb/button_pressed_F12(var/full = 0 as null) set name = "F12" @@ -269,7 +188,9 @@ datum/hud/New(mob/owner) hud_used.hidden_inventory_update() hud_used.persistant_inventory_update() update_action_buttons() + //hud_used.reorganize_alerts() + else usr << "\red Inventory hiding is currently only supported for human mobs, sorry." else - usr << "\red This mob type does not use a HUD." + usr << "\red This mob type does not use a HUD." \ No newline at end of file diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 7236feb439f..2bf587c1cc1 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -424,31 +424,6 @@ lingstingdisplay = new /obj/screen/ling/sting() lingstingdisplay.screen_loc = ui_lingstingdisplay - mymob.blind = new /obj/screen() - mymob.blind.icon = 'icons/mob/screen1_full.dmi' - mymob.blind.icon_state = "blackimageoverlay" - mymob.blind.name = "blind" - mymob.blind.screen_loc = "CENTER-7,CENTER-7" - mymob.blind.mouse_opacity = 0 - mymob.blind.layer = 0 - - mymob.damageoverlay = new /obj/screen() - mymob.damageoverlay.icon = 'icons/mob/screen1_full.dmi' - mymob.damageoverlay.icon_state = "oxydamageoverlay0" - mymob.damageoverlay.name = "dmg" - mymob.damageoverlay.screen_loc = "CENTER-7,CENTER-7" - mymob.damageoverlay.mouse_opacity = 0 - mymob.damageoverlay.layer = 18.1 //The black screen overlay sets layer to 18 to display it, this one has to be just on top. - - mymob.flash = new /obj/screen() - mymob.flash.icon = ui_style - mymob.flash.icon_state = "blank" - mymob.flash.name = "flash" - mymob.flash.screen_loc = "WEST,SOUTH to EAST,NORTH" - mymob.flash.layer = 17 - - mymob.pain = new /obj/screen( null ) - mymob.zone_sel = new /obj/screen/zone_sel( null ) mymob.zone_sel.icon = ui_style mymob.zone_sel.color = ui_color @@ -480,10 +455,10 @@ mymob.client.screen = list() - mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.pressure, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.healths, mymob.healthdoll, mymob.nutrition_icon, mymob.pullin, mymob.blind, mymob.flash, mymob.damageoverlay, mymob.gun_setting_icon, lingchemdisplay, lingstingdisplay) //, mymob.hands, mymob.rest, mymob.sleep) //, mymob.mach ) + mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.pressure, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.healths, mymob.healthdoll, mymob.nutrition_icon, mymob.pullin, mymob.gun_setting_icon, lingchemdisplay, lingstingdisplay) //, mymob.hands, mymob.rest, mymob.sleep) //, mymob.mach ) mymob.client.screen += src.adding + src.hotkeybuttons mymob.client.screen += mymob.client.void - inventory_shown = 0; + inventory_shown = 0 return diff --git a/code/_onclick/hud/monkey.dm b/code/_onclick/hud/monkey.dm index 18b45befa88..b7a9a102116 100644 --- a/code/_onclick/hud/monkey.dm +++ b/code/_onclick/hud/monkey.dm @@ -19,59 +19,6 @@ src.adding += using action_intent = using -//intent small hud objects -/* var/icon/ico - - ico = new(ui_style, "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),1,ico.Height()/2,ico.Width()/2,ico.Height()) - using = new /obj/screen( src ) - using.name = "help" - using.icon = ico - using.screen_loc = ui_acti - using.alpha = ui_alpha - using.layer = 21 - src.adding += using - help_intent = using - - ico = new(ui_style, "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),ico.Width()/2,ico.Height()/2,ico.Width(),ico.Height()) - using = new /obj/screen( src ) - using.name = "disarm" - using.icon = ico - using.screen_loc = ui_acti - using.alpha = ui_alpha - using.layer = 21 - src.adding += using - disarm_intent = using - - ico = new(ui_style, "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),ico.Width()/2,1,ico.Width(),ico.Height()/2) - using = new /obj/screen( src ) - using.name = "grab" - using.icon = ico - using.screen_loc = ui_acti - using.alpha = ui_alpha - using.layer = 21 - src.adding += using - grab_intent = using - - ico = new(ui_style, "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),1,1,ico.Width()/2,ico.Height()/2) - using = new /obj/screen( src ) - using.name = "harm" - using.icon = ico - using.screen_loc = ui_acti - using.alpha = ui_alpha - using.layer = 21 - src.adding += using - hurt_intent = using -*/ -//end intent small hud objects - using = new /obj/screen/mov_intent() using.name = "mov_intent" using.dir = SOUTHWEST @@ -245,32 +192,6 @@ lingstingdisplay = new /obj/screen/ling/sting() lingstingdisplay.screen_loc = ui_lingstingdisplay - mymob.blind = new /obj/screen() - mymob.blind.icon = 'icons/mob/screen1_full.dmi' - mymob.blind.icon_state = "blackimageoverlay" - mymob.blind.name = "blind" - mymob.blind.screen_loc = "CENTER-7,CENTER-7" - mymob.blind.mouse_opacity = 0 - mymob.blind.layer = 0 - mymob.blind.mouse_opacity = 0 - - mymob.damageoverlay = new /obj/screen() - mymob.damageoverlay.icon = 'icons/mob/screen1_full.dmi' - mymob.damageoverlay.icon_state = "oxydamageoverlay0" - mymob.damageoverlay.name = "dmg" - mymob.damageoverlay.screen_loc = "CENTER-7,CENTER-7" - mymob.damageoverlay.mouse_opacity = 0 - mymob.damageoverlay.layer = 18.1 //The black screen overlay sets layer to 18 to display it, this one has to be just on top. - - mymob.flash = new /obj/screen() - mymob.flash.icon = ui_style - mymob.flash.icon_state = "blank" - mymob.flash.name = "flash" - mymob.flash.screen_loc = "WEST,SOUTH to EAST,NORTH" - mymob.flash.layer = 17 - - mymob.pain = new /obj/screen( null ) - mymob.zone_sel = new /obj/screen/zone_sel( null ) mymob.zone_sel.icon = ui_style mymob.zone_sel.color = ui_color @@ -302,8 +223,8 @@ mymob.client.screen = list() - mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.pressure, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.healths, mymob.healthdoll, mymob.nutrition_icon, mymob.pullin, mymob.blind, mymob.flash, mymob.damageoverlay, mymob.gun_setting_icon, lingchemdisplay, lingstingdisplay) //, mymob.hands, mymob.rest, mymob.sleep) //, mymob.mach ) + mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.pressure, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.healths, mymob.healthdoll, mymob.nutrition_icon, mymob.pullin, mymob.gun_setting_icon, lingchemdisplay, lingstingdisplay) //, mymob.hands, mymob.rest, mymob.sleep) //, mymob.mach ) mymob.client.screen += src.adding + src.hotkeybuttons mymob.client.screen += mymob.client.void - return + return \ No newline at end of file diff --git a/code/_onclick/hud/other_mobs.dm b/code/_onclick/hud/other_mobs.dm index e2923055324..e0b1ea11f1a 100644 --- a/code/_onclick/hud/other_mobs.dm +++ b/code/_onclick/hud/other_mobs.dm @@ -35,19 +35,10 @@ mymob.toxin.name = "toxin" mymob.toxin.screen_loc = ui_toxin - mymob.client.screen = null + mymob.client.screen = list() mymob.client.screen += list(mymob.fire, mymob.healths, mymob.pullin, mymob.oxygen, mymob.toxin) -/datum/hud/proc/brain_hud(ui_style = 'icons/mob/screen1_Midnight.dmi') - mymob.blind = new /obj/screen() - mymob.blind.icon = 'icons/mob/screen1_full.dmi' - mymob.blind.icon_state = "blackimageoverlay" - mymob.blind.name = " " - mymob.blind.screen_loc = "CENTER-7,CENTER-7" - mymob.blind.layer = 0 - mymob.blind.mouse_opacity = 0 - /datum/hud/proc/blob_hud(ui_style = 'icons/mob/screen1_Midnight.dmi') diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index 78ee883960c..b83bfcf411a 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -210,50 +210,17 @@ mymob.pullin.update_icon(mymob) mymob.pullin.screen_loc = ui_borg_pull - mymob.blind = new /obj/screen() - mymob.blind.icon = 'icons/mob/screen1_full.dmi' - mymob.blind.icon_state = "blackimageoverlay" - mymob.blind.name = " " - mymob.blind.screen_loc = "CENTER-7,CENTER-7" - mymob.blind.layer = 0 - mymob.blind.mouse_opacity = 0 - - mymob.flash = new /obj/screen() - mymob.flash.icon = 'icons/mob/screen1_robot.dmi' - mymob.flash.icon_state = "blank" - mymob.flash.name = "flash" - mymob.flash.screen_loc = "WEST,SOUTH to EAST,NORTH" - mymob.flash.layer = 17 - mymob.zone_sel = new /obj/screen/zone_sel() mymob.zone_sel.icon = 'icons/mob/screen1_robot.dmi' mymob.zone_sel.overlays.Cut() mymob.zone_sel.overlays += image('icons/mob/zone_sel.dmi', "[mymob.zone_sel.selecting]") - //Handle the gun settings buttons mymob.gun_setting_icon = new /obj/screen/gun/mode(null) mymob.item_use_icon = new /obj/screen/gun/item(null) - //if (mymob.client) - // if (mymob.client.gun_mode) // If in aim mode, correct the sprite - // mymob.gun_setting_icon.dir = 2 - //for(var/obj/item/weapon/gun/G in mymob) // If targeting someone, display other buttons - // if (G.target) - // mymob.item_use_icon = new /obj/screen/gun/item(null) - // if (mymob.client.target_can_click) - // mymob.item_use_icon.dir = 1 - //src.adding += mymob.item_use_icon - /*mymob.gun_move_icon = new /obj/screen/gun/move(null) - if (mymob.client.target_can_move) - mymob.gun_move_icon.dir = 1 - mymob.gun_run_icon = new /obj/screen/gun/run(null) - if (mymob.client.target_can_run) - mymob.gun_run_icon.dir = 1 - src.adding += mymob.gun_run_icon - src.adding += mymob.gun_move_icon*/ mymob.client.screen = list() - mymob.client.screen += list(mymob.zone_sel, mymob.oxygen, mymob.fire, mymob.hands, mymob.healths, mymob:cells, mymob.pullin, mymob.blind, mymob.flash, mymob.gun_setting_icon, mymob:lamp_button) //, mymob.rest, mymob.sleep, mymob.mach ) + mymob.client.screen += list(mymob.zone_sel, mymob.oxygen, mymob.fire, mymob.hands, mymob.healths, mymob:cells, mymob.pullin, mymob.gun_setting_icon, mymob:lamp_button) //, mymob.rest, mymob.sleep, mymob.mach ) mymob.client.screen += src.adding + src.other mymob.client.screen += mymob.client.void return diff --git a/code/controllers/Processes/timer.dm b/code/controllers/Processes/timer.dm index 4db4a8d2138..71836a8a92a 100644 --- a/code/controllers/Processes/timer.dm +++ b/code/controllers/Processes/timer.dm @@ -60,7 +60,7 @@ var/global/datum/controller/process/timer/PStimer event.thingToCall = thingToCall event.procToCall = procToCall event.timeToRun = world.time + wait - event.hash = jointext(args, "") + event.hash = jointext(args, null) if(args.len > 4) event.argList = args.Copy(5) diff --git a/code/datums/spells/horsemask.dm b/code/datums/spells/horsemask.dm index 2c31c943284..fd9a6e64bed 100644 --- a/code/datums/spells/horsemask.dm +++ b/code/datums/spells/horsemask.dm @@ -44,4 +44,4 @@ qdel(target.wear_mask) target.equip_to_slot_if_possible(magichead, slot_wear_mask, 1, 1) - flick("e_flash", target.flash) + target.flash_eyes() diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 18883600ad4..53a24d84dd0 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -986,7 +986,7 @@ var/list/sacrificed = list() if(iscarbon(L)) var/mob/living/carbon/C = L - flick("e_flash", C.flash) + C.flash_eyes() if(C.stuttering < 1 && (!(HULK in C.mutations))) C.stuttering = 1 C.Weaken(1) @@ -1013,7 +1013,7 @@ var/list/sacrificed = list() else if(iscarbon(T)) var/mob/living/carbon/C = T - flick("e_flash", C.flash) + C.flash_eyes() if (!(HULK in C.mutations)) C.silent += 15 C.Weaken(10) diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 99db01bfae2..0f7688bdadb 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -375,7 +375,7 @@ update_flag /obj/machinery/portable_atmospherics/canister/attack_alien(mob/living/carbon/alien/humanoid/user) return - + /obj/machinery/portable_atmospherics/canister/attack_ghost(var/mob/user as mob) return src.ui_interact(user) @@ -427,7 +427,7 @@ update_flag /obj/machinery/portable_atmospherics/canister/Topic(href, href_list) if(..()) return 1 - + if (href_list["choice"] == "menu") menu = text2num(href_list["mode_target"]) @@ -625,13 +625,12 @@ update_flag if(busy) return 0 - if(!WT.isOn()) + if(!WT.remove_fuel(0, user)) return 0 // Do after stuff here user << "You start to slice away at \the [src]..." playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) - WT.eyecheck(user) busy = 1 if(do_after(user, 50, target = src)) busy = 0 diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 6e9c41ff983..a8a392da527 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -347,17 +347,15 @@ return null -/obj/machinery/camera/proc/weld(var/obj/item/weapon/weldingtool/WT, var/mob/user) +/obj/machinery/camera/proc/weld(var/obj/item/weapon/weldingtool/WT, var/mob/living/user) if(busy) return 0 - if(!WT.isOn()) + if(!WT.remove_fuel(0, user)) return 0 - // Do after stuff here user << "You start to weld [src]." playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) - WT.eyecheck(user) busy = 1 if(do_after(user, 100, target = src)) busy = 0 diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm index fa85743b1ef..46c448f2035 100644 --- a/code/game/machinery/camera/camera_assembly.dm +++ b/code/game/machinery/camera/camera_assembly.dm @@ -153,16 +153,15 @@ if(!anchored) ..() -/obj/item/weapon/camera_assembly/proc/weld(var/obj/item/weapon/weldingtool/WT, var/mob/user) +/obj/item/weapon/camera_assembly/proc/weld(var/obj/item/weapon/weldingtool/WT, var/mob/living/user) if(busy) return 0 - if(!WT.isOn()) + if(!WT.remove_fuel(0, user)) return 0 user << "You start to weld the [src].." playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) - WT.eyecheck(user) busy = 1 if(do_after(user, 20, target = src)) busy = 0 diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index f22c68bb0f0..b133195e055 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -66,31 +66,12 @@ src.last_flash = world.time use_power(1000) - for (var/mob/O in viewers(src, null)) - if (get_dist(src, O) > src.range) + for(var/mob/living/L in viewers(src, null)) + if (get_dist(src, L) > src.range) continue - if (istype(O, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = O - if(!H.eyecheck() <= 0) - continue - - if (istype(O, /mob/living/carbon/alien))//So aliens don't get flashed (they have no external eyes)/N - continue - - O.Weaken(strength) - if(O.weakeyes) - O.Weaken(strength * 1.5) - O.visible_message("[O] gasps and shields their eyes!") - if (istype(O, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = O - var/obj/item/organ/eyes/E = H.internal_organs_by_name["eyes"] - if (E && (E.damage > E.min_bruised_damage && prob(E.damage + 50))) - flick("e_flash", O:flash) - E.damage += rand(1, 2) - else - if(!O.blinded) - flick("flash", O:flash) + if(L.flash_eyes(affect_silicon = 1)) + L.Weaken(strength) /obj/machinery/flasher/emp_act(severity) diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 84b4c895e07..b83d13d580f 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -237,7 +237,7 @@ if(C.client) C.eye_blurry = max(C.eye_blurry, 3) C.eye_blind = max(C.eye_blind, 1) - if(C.eyecheck() <= 0) // no eye protection? ARGH IT BURNS. + if(C.check_eye_prot() <= 0) // no eye protection? ARGH IT BURNS. C.confused = max(C.confused, 3) C.Weaken(3) C.lip_style = "spray_face" diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index d39a8dfbc93..c27e80306b5 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -77,24 +77,21 @@ /obj/item/device/flash/proc/flash_carbon(var/mob/living/carbon/M, var/mob/user = null, var/power = 5, convert = 1) add_logs(M, user, "flashed", object="[src.name]") - if(M.weakeyes) - M.Weaken(3) //quick weaken bypasses eye protection but has no eye flash - var/safety = M:eyecheck() - if(safety <= 0) - M.confused += power - flick("e_flash", M.flash) - if(user && convert) + + if(user) + if(M.flash_eyes(1, 1)) + M.confused += power terrible_conversion_proc(M, user) M.Stun(1) - user.visible_message("[user] blinds [M] with the [src.name]!") if(M.weakeyes) M.Stun(2) M.visible_message("[M] gasps and shields their eyes!") - return 1 - else - if(user) + user.visible_message("[user] blinds [M] with the [src.name]!") + else user.visible_message("[user] fails to blind [M] with the [src.name]!") - return 0 + else + if(M.flash_eyes()) + M.confused += power /obj/item/device/flash/attack(mob/living/M, mob/user) if(!try_use_flash(user)) @@ -111,16 +108,16 @@ else if(issilicon(M)) if(isrobot(M)) var/mob/living/silicon/robot/R = M - - if (R.module) // Perhaps they didn't choose a module yet + if(R.module) // Perhaps they didn't choose a module yet for(var/obj/item/borg/combat/shield/S in R.module.modules) if(R.activated(S)) add_logs(M, user, "flashed", object="[src.name]") user.visible_message("[user] tries to overloads [M]'s sensors with the [src.name], but if blocked by [M]'s shield!", "You try to overload [M]'s sensors with the [src.name], but are blocked by his shield!") return 1 - M.Weaken(rand(5,10)) add_logs(M, user, "flashed", object="[src.name]") - user.visible_message("[user] overloads [M]'s sensors with the [src.name]!", "You overload [M]'s sensors with the [src.name]!") + if(M.flash_eyes()) + M.Weaken(rand(5,10)) + user.visible_message("[user] overloads [M]'s sensors with the [src.name]!", "You overload [M]'s sensors with the [src.name]!") return 1 user.visible_message("[user] fails to blind [M] with the [src.name]!", "You fail to blind [M] with the [src.name]!") diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index ef8cba90463..caa673882a1 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -55,28 +55,25 @@ return if(M == user) //they're using it on themselves - if(!M.blinded) - flick("flash", M.flash) + if(M.flash_eyes(visual = 1)) M.visible_message("[M] directs [src] to \his eyes.", \ "You wave the light in front of your eyes! Trippy!") else M.visible_message("[M] directs [src] to \his eyes.", \ "You wave the light in front of your eyes.") - return + else - user.visible_message("[user] directs [src] to [M]'s eyes.", \ - "You direct [src] to [M]'s eyes.") + user.visible_message("[user] directs [src] to [M]'s eyes.", \ + "You direct [src] to [M]'s eyes.") - if(istype(M, /mob/living/carbon/human)) //robots and aliens are unaffected - if(M.stat == DEAD || M.sdisabilities & BLIND) //mob is dead or fully blind - user << "[M] pupils does not react to the light!" - else if(XRAY in M.mutations) //mob has X-RAY vision - flick("flash", M.flash) //Yes, you can still get flashed wit X-Ray. - user << "[M] pupils give an eerie glow!" - else //they're okay! - if(!M.blinded) - flick("flash", M.flash) //flash the affected mob - user << "[M]'s pupils narrow." + if(istype(M, /mob/living/carbon/human)) //robots and aliens are unaffected + if(M.stat == DEAD || M.sdisabilities & BLIND) //mob is dead or fully blind + user << "[M] pupils does not react to the light!" + else if(XRAY in M.mutations) //mob has X-RAY vision + user << "[M] pupils give an eerie glow!" + else //they're okay! + if(M.flash_eyes(visual = 1)) + user << "[M]'s pupils narrow." else return ..() diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index ed55d931d8c..f74681f63cd 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -90,58 +90,18 @@ //human/alien mobs if(iscarbon(target)) + var/mob/living/carbon/C = target if(user.zone_sel.selecting == "eyes") - var/mob/living/carbon/C = target + add_logs(C, user, "shone in the eyes", object="laser pointer") - //20% chance to actually hit the eyes + var/severity = 1 + if(prob(33)) + severity = 2 + else if(prob(50)) + severity = 0 - if(prob(effectchance * diode.rating)) - add_logs(C, user, "shone in the eyes", object="laser pointer") - - - //eye target check + if(prob(effectchance * diode.rating) && C.flash_eyes(severity)) outmsg = "You blind [C] by shining [src] in their eyes." - if(C.weakeyes) - C.Stun(1) - var/eye_prot = C.eyecheck() - if(C.blinded || eye_prot >= 2) - eye_prot = 4 - var/severity = 3 - eye_prot - if(prob(33)) - severity += 1 - else if(prob(50)) - severity -= 1 - severity = min(max(severity, 0), 4) - var/mob/living/carbon/human/H = C - var/obj/item/organ/eyes/E = H.internal_organs_by_name["eyes"] - - switch(severity) - if(0) - //no effect - C << "A small, bright dot appears in your vision." - if(1) - //industrial grade eye protection - E.damage += rand(0, 2) - C << "Something bright flashes in the corner of your vision!" - if(2) - //basic eye protection (sunglasses) - flick("flash", C.flash) - E.damage += rand(1, 6) - C << "Your eyes were blinded!" - if(3) - //no eye protection - if(prob(2)) - C.Weaken(1) - flick("e_flash", C.flash) - E.damage += rand(3, 7) - C << "Your eyes were blinded!" - if(4) - //the effect has been worsened by something - if(prob(5)) - C.Weaken(1) - flick("e_flash", C.flash) - E.damage += rand(5, 10) - C << "Your eyes were blinded!" else outmsg = "You fail to blind [C] by shining [src] at their eyes." @@ -150,6 +110,7 @@ var/mob/living/silicon/S = target //20% chance to actually hit the sensors if(prob(effectchance * diode.rating)) + S.flash_eyes(affect_silicon = 1) S.Weaken(rand(5,10)) S << "Your sensors were overloaded by a laser!" outmsg = "You overload [S] by shining [src] at their sensors." diff --git a/code/game/objects/items/weapons/grenades/bananade.dm b/code/game/objects/items/weapons/grenades/bananade.dm index 998c19e9837..bbb86c31442 100644 --- a/code/game/objects/items/weapons/grenades/bananade.dm +++ b/code/game/objects/items/weapons/grenades/bananade.dm @@ -16,9 +16,8 @@ var/turf/T // Make a quick flash var/turf/T = get_turf(src) playsound(T, 'sound/items/bikehorn.ogg', 100, 1) - for(var/mob/living/carbon/human/M in viewers(T, null)) - if(M:eyecheck() <= 0) - flick("e_flash", M.flash) // flash dose faggots + for(var/mob/living/carbon/C in viewers(T, null)) + C.flash_eyes() for(var/i=1, i<=deliveryamt, i++) var/atom/movable/x = new spawner_type x.loc = T diff --git a/code/game/objects/items/weapons/grenades/clusterbuster.dm b/code/game/objects/items/weapons/grenades/clusterbuster.dm index a160c99f8c3..9ccd2c94d7b 100644 --- a/code/game/objects/items/weapons/grenades/clusterbuster.dm +++ b/code/game/objects/items/weapons/grenades/clusterbuster.dm @@ -78,7 +78,6 @@ ///////////////////////////////// /obj/item/weapon/grenade/flashbang/cluster icon_state = "flashbang_active" - banglet = 1 /obj/item/weapon/grenade/clusterbuster/emp name = "Electromagnetic Storm" diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index 260160a63c3..85103833754 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -3,7 +3,6 @@ icon_state = "flashbang" item_state = "flashbang" origin_tech = "materials=2;combat=1" - var/banglet = 0 /obj/item/weapon/grenade/flashbang/prime() update_mob() @@ -24,42 +23,17 @@ playsound(loc, 'sound/effects/bang.ogg', 25, 1) //Checking for protections - var/eye_safety = 0 - var/ear_safety = 0 + var/ear_safety = M.check_ear_prot() var/distance = max(1,get_dist(src,T)) - if(iscarbon(M)) - var/mob/living/carbon/C = M - eye_safety = C.eyecheck() - if(ishuman(C)) - var/mob/living/carbon/human/H = C - if((H.r_ear && (H.r_ear.flags & EARBANGPROTECT)) || (H.l_ear && (H.l_ear.flags & EARBANGPROTECT)) || (H.head && (H.head.flags & HEADBANGPROTECT))) - ear_safety++ - //Flash - var/eye_damage = rand(1,3) - if(M.weakeyes) - M.visible_message("[M] screams and collapses!") - M << "AAAAGH! IT BURNS!" - M.Weaken(15) //hella stunned - M.Stun(15) - eye_damage += 8 - - if(!eye_safety && ishuman(M)) - var/mob/living/carbon/human/H = M - var/obj/item/organ/eyes/E = H.internal_organs_by_name["eyes"] - flick("e_flash", M.flash) - if (E) - E.damage += eye_damage + if(M.flash_eyes(affect_silicon = 1)) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/obj/item/organ/eyes/E = H.internal_organs_by_name["eyes"] + if(E) + E.damage += rand(1, 3) M.Stun(max(10/distance, 3)) M.Weaken(max(10/distance, 3)) - if (istype(E) && E.damage >= E.min_bruised_damage) - if(!(E.status & ORGAN_ROBOT)) - M << "Your eyes start to burn badly!" - else - M << "The flash blinds you!" - if(!banglet) - if (E.damage >= E.min_broken_damage) - M << "You can't see anything!" //Bang if((loc == M) || loc == M.loc)//Holding on person or being exactly where lies is significantly more dangerous and voids protection @@ -72,10 +46,9 @@ M.ear_deaf = max(M.ear_deaf,15) if (M.ear_damage >= 15) M << "Your ears start to ring badly!" - if(!banglet) - if(prob(M.ear_damage - 10 + 5)) - M << "You can't hear anything!" - M.disabilities |= DEAF + if(prob(M.ear_damage - 10 + 5)) + M << "You can't hear anything!" + M.disabilities |= DEAF else if (M.ear_damage >= 5) M << "Your ears start to ring!" \ No newline at end of file diff --git a/code/game/objects/items/weapons/grenades/spawnergrenade.dm b/code/game/objects/items/weapons/grenades/spawnergrenade.dm index dbcb27c5f16..074617d4d10 100644 --- a/code/game/objects/items/weapons/grenades/spawnergrenade.dm +++ b/code/game/objects/items/weapons/grenades/spawnergrenade.dm @@ -5,7 +5,6 @@ icon_state = "delivery" item_state = "flashbang" origin_tech = "materials=3;magnets=4" - var/banglet = 0 var/spawner_type = null // must be an object path var/deliveryamt = 1 // amount of type to deliver spawner_type = /mob/living/simple_animal/hostile/viscerator @@ -16,9 +15,8 @@ // Make a quick flash var/turf/T = get_turf(src) playsound(T, 'sound/effects/phasein.ogg', 100, 1) - for(var/mob/living/carbon/human/M in viewers(T, null)) - if(M:eyecheck() <= 0) - flick("e_flash", M.flash) // flash dose faggots + for(var/mob/living/carbon/C in viewers(T, null)) + C.flash_eyes() for(var/i=1, i<=deliveryamt, i++) var/atom/movable/x = new spawner_type diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index ac5897367f8..d01cc125918 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -291,15 +291,15 @@ /obj/item/weapon/weldingtool/proc/get_fuel() return reagents.get_reagent_amount("fuel") -//Removes fuel from the welding tool. If a mob is passed, it will perform an eyecheck on the mob. This should probably be renamed to use() -/obj/item/weapon/weldingtool/proc/remove_fuel(var/amount = 1, var/mob/M = null) +//Removes fuel from the welding tool. If a mob is passed, it will try to flash the mob's eyes. This should probably be renamed to use() +/obj/item/weapon/weldingtool/proc/remove_fuel(var/amount = 1, var/mob/living/M = null) if(!welding || !check_fuel()) return 0 if(get_fuel() >= amount) reagents.remove_reagent("fuel", amount) check_fuel() if(M) - eyecheck(M) + M.flash_eyes(light_intensity) return 1 else if(M) @@ -351,46 +351,6 @@ hitsound = "swing_hit" update_icon() -//Decides whether or not to damage a player's eyes based on what they're wearing as protection -//Note: This should probably be moved to mob -/obj/item/weapon/weldingtool/proc/eyecheck(mob/user as mob) - if(!iscarbon(user)) return 1 - var/safety = user:eyecheck() - if(ishuman(user)) - var/mob/living/carbon/human/H = user - var/obj/item/organ/eyes/E = H.internal_organs_by_name["eyes"] - if(!istype(E)) // No eyes? No problem! - return - switch(safety) - if(1) - usr << "Your eyes sting a little." - E.damage += rand(1, 2) - if(E.damage > 12) - user.eye_blurry += rand(3,6) - if(0) - usr << "Your eyes burn." - E.damage += rand(2, 4) - if(E.damage > 10) - E.damage += rand(4,10) - if(-1) - usr << "Your thermals intensify the welder's glow. Your eyes itch and burn severely." - user.eye_blurry += rand(12,20) - E.damage += rand(12, 16) - if(safety<2) - if(E.damage > 10) - user << "Your eyes are really starting to hurt. This can't be good for you!" - if (E.damage >= E.min_broken_damage) - user << "You go blind!" - user.sdisabilities |= BLIND - else if (E.damage >= E.min_bruised_damage) - user << "You go blind!" - user.eye_blind = 5 - user.eye_blurry = 5 - user.disabilities |= NEARSIGHTED - spawn(100) - user.disabilities &= ~NEARSIGHTED - return - /obj/item/weapon/weldingtool/proc/flamethrower_screwdriver(obj/item/I, mob/user) if(welding) user << "Turn it off first!" diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index e2b3a96de71..aa5d16fa785 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -291,9 +291,6 @@ "Vox" = 'icons/mob/species/vox/eyes.dmi' ) -/obj/item/clothing/glasses/welding/proc/getMask() - return global_hud.darkMask - /obj/item/clothing/glasses/welding/attack_self() toggle() @@ -336,9 +333,6 @@ "Vox" = 'icons/mob/species/vox/eyes.dmi' ) -/obj/item/clothing/glasses/welding/superior/getMask() - return null - /obj/item/clothing/glasses/sunglasses/blindfold name = "blindfold" desc = "Covers the eyes, preventing sight." diff --git a/code/modules/events/anomaly_bluespace.dm b/code/modules/events/anomaly_bluespace.dm index 118f4f4ddff..82a4da4cc15 100644 --- a/code/modules/events/anomaly_bluespace.dm +++ b/code/modules/events/anomaly_bluespace.dm @@ -36,10 +36,9 @@ command_announcement.Announce("Massive bluespace translocation detected.", "Anomaly Alert") var/list/flashers = list() - for(var/mob/living/carbon/human/M in viewers(TO, null)) - if(M:eyecheck() <= 0) - flick("e_flash", M.flash) // flash dose faggots - flashers += M + for(var/mob/living/carbon/C in viewers(TO, null)) + if(C.flash_eyes()) + flashers += C var/y_distance = TO.y - FROM.y var/x_distance = TO.x - FROM.x @@ -66,4 +65,3 @@ M.client.screen -= blueeffect qdel(blueeffect) qdel(newAnomaly) - \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index e58b3420c93..eb71abb2f3f 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -71,7 +71,7 @@ /mob/living/carbon/alien/proc/getPlasma() return storedPlasma -/mob/living/carbon/alien/eyecheck() +/mob/living/carbon/alien/check_eye_prot() return 2 /mob/living/carbon/alien/updatehealth() @@ -314,4 +314,4 @@ Des: Removes all infected images from the alien. playsound(T, S, volume, 1, range) return 1 - return 0 + return 0 diff --git a/code/modules/mob/living/carbon/alien/death.dm b/code/modules/mob/living/carbon/alien/death.dm index 693763e4960..56783b787fd 100644 --- a/code/modules/mob/living/carbon/alien/death.dm +++ b/code/modules/mob/living/carbon/alien/death.dm @@ -50,7 +50,6 @@ for(var/mob/O in viewers(src, null)) O.show_message("[src] lets out a waning guttural screech, green blood bubbling from its maw...", 1) update_canmove() - if(client) blind.layer = 0 update_icons() timeofdeath = worldtime2text() diff --git a/code/modules/mob/living/carbon/alien/humanoid/life.dm b/code/modules/mob/living/carbon/alien/humanoid/life.dm index 6e4fe3705f4..2c79a007fa8 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/life.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/life.dm @@ -130,77 +130,4 @@ if(druggy) druggy = max(druggy-1, 0) - return 1 - - -/mob/living/carbon/alien/humanoid/handle_regular_hud_updates() - - if (stat == 2 || (XRAY in mutations)) - sight |= SEE_TURFS - sight |= SEE_MOBS - sight |= SEE_OBJS - see_in_dark = 8 - see_invisible = SEE_INVISIBLE_LEVEL_TWO - else if (stat != 2) - sight |= SEE_MOBS - sight &= ~SEE_TURFS - sight &= ~SEE_OBJS - if(nightvision) - see_in_dark = 8 - see_invisible = SEE_INVISIBLE_MINIMUM - else if(!nightvision) - see_in_dark = 4 - see_invisible = 45 - if(see_override) - see_invisible = see_override - - if (healths) - if (stat != 2) - switch(health) - if(100 to INFINITY) - healths.icon_state = "health0" - if(75 to 100) - healths.icon_state = "health1" - if(50 to 75) - healths.icon_state = "health2" - if(25 to 50) - healths.icon_state = "health3" - if(0 to 25) - healths.icon_state = "health4" - else - healths.icon_state = "health5" - else - healths.icon_state = "health6" - - if (toxin) toxin.icon_state = "tox[toxins_alert ? 1 : 0]" - if (oxygen) oxygen.icon_state = "oxy[oxygen_alert ? 1 : 0]" - if (fire) fire.icon_state = "fire[fire_alert ? 1 : 0]" - //NOTE: the alerts dont reset when youre out of danger. dont blame me, - //blame the person who coded them. Temporary fix added. - - client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired) - - if ((blind && stat != 2)) - if ((blinded)) - blind.layer = 18 - else - blind.layer = 0 - - if (disabilities & NEARSIGHTED) - client.screen += global_hud.vimpaired - - if (eye_blurry) - client.screen += global_hud.blurry - - if (druggy) - client.screen += global_hud.druggy - - if (stat != 2) - if (machine) - if (!( machine.check_eye(src) )) - reset_view(null) - else - if(!client.adminobs) - reset_view(null) - - return 1 + return 1 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/larva/death.dm b/code/modules/mob/living/carbon/alien/larva/death.dm index 574b617ca58..03eeeaa5c81 100644 --- a/code/modules/mob/living/carbon/alien/larva/death.dm +++ b/code/modules/mob/living/carbon/alien/larva/death.dm @@ -7,7 +7,6 @@ if(!gibbed) visible_message("[src] lets out a waning high-pitched cry.") update_canmove() - if(client) blind.layer = 0 timeofdeath = worldtime2text() if(mind) mind.store_memory("Time of death: [timeofdeath]", 0) diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm index d4e57324826..4e7b974d855 100644 --- a/code/modules/mob/living/carbon/alien/larva/life.dm +++ b/code/modules/mob/living/carbon/alien/larva/life.dm @@ -85,84 +85,4 @@ if(druggy) druggy = max(druggy-1, 0) - return 1 - - -/mob/living/carbon/alien/larva/handle_regular_hud_updates() - - if (stat == 2 || (XRAY in mutations)) - sight |= SEE_TURFS - sight |= SEE_MOBS - sight |= SEE_OBJS - see_in_dark = 8 - see_invisible = SEE_INVISIBLE_LEVEL_TWO - else if (stat != 2) - sight |= SEE_MOBS - sight &= ~SEE_TURFS - sight &= ~SEE_OBJS - if(nightvision) - see_in_dark = 8 - see_invisible = SEE_INVISIBLE_MINIMUM - else if(!nightvision) - see_in_dark = 4 - see_invisible = 45 - if(see_override) - see_invisible = see_override - - if (healths) - if (stat != 2) - switch(health) - if(25 to INFINITY) - healths.icon_state = "health0" - if(19 to 25) - healths.icon_state = "health1" - if(13 to 19) - healths.icon_state = "health2" - if(7 to 13) - healths.icon_state = "health3" - if(0 to 7) - healths.icon_state = "health4" - else - healths.icon_state = "health5" - else - healths.icon_state = "health6" - - if(pullin) - if(pulling) - pullin.icon_state = "pull" - else - pullin.icon_state = "pull0" - - if (toxin) toxin.icon_state = "tox[toxins_alert ? 1 : 0]" - if (oxygen) oxygen.icon_state = "oxy[oxygen_alert ? 1 : 0]" - if (fire) fire.icon_state = "fire[fire_alert ? 1 : 0]" - //NOTE: the alerts dont reset when youre out of danger. dont blame me, - //blame the person who coded them. Temporary fix added. - - - client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired) - - if ((blind && stat != 2)) - if ((blinded)) - blind.layer = 18 - else - blind.layer = 0 - - if (disabilities & NEARSIGHTED) - client.screen += global_hud.vimpaired - - if (eye_blurry) - client.screen += global_hud.blurry - - if (druggy) - client.screen += global_hud.druggy - - if (stat != 2) - if (machine) - if (!( machine.check_eye(src) )) - reset_view(null) - else - if(!client.adminobs) - reset_view(null) - return 1 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index 70603b1daf9..9789e382c7f 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -36,4 +36,24 @@ src << "You feel a searing heat in your lungs!" fire_alert = max(fire_alert, 1) else - fire_alert = 0 \ No newline at end of file + fire_alert = 0 + +/mob/living/carbon/alien/update_sight() + if(stat == 2 || (XRAY in mutations)) + sight |= SEE_TURFS + sight |= SEE_MOBS + sight |= SEE_OBJS + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_LEVEL_TWO + else if(stat != 2) + sight |= SEE_MOBS + sight &= ~SEE_TURFS + sight &= ~SEE_OBJS + if(nightvision) + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_MINIMUM + else if(!nightvision) + see_in_dark = 4 + see_invisible = 45 + if(see_override) + see_invisible = see_override \ No newline at end of file diff --git a/code/modules/mob/living/carbon/brain/death.dm b/code/modules/mob/living/carbon/brain/death.dm index efcfac98624..737e7d31f38 100644 --- a/code/modules/mob/living/carbon/brain/death.dm +++ b/code/modules/mob/living/carbon/brain/death.dm @@ -6,7 +6,6 @@ container.icon_state = "mmi_dead" stat = DEAD - if(blind) blind.layer = 0 sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS see_in_dark = 8 see_invisible = SEE_INVISIBLE_LEVEL_TWO diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 6cee1e30afd..a3c80d670bf 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -286,9 +286,45 @@ mob/living if(H.w_uniform) H.w_uniform.add_fingerprint(M) +/mob/living/carbon/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0) + . = ..() + var/damage = intensity - check_eye_prot() + if(.) + if(visual) + return + switch(damage) + if(1) + src << "Your eyes sting a little." + /*if(prob(40)) //waiting on carbon organs + eye_stat += 1*/ + + if(2) + src << "Your eyes burn." + //eye_stat += rand(2, 4) + + else + src << "Your eyes itch and burn severely!" + //eye_stat += rand(12, 16) + + /*if(eye_stat > 10) + eye_blind += damage + eye_blurry += damage * rand(3, 6) + + if(eye_stat > 20) + if (prob(eye_stat - 20)) + src << "Your eyes start to burn badly!" + disabilities |= NEARSIGHTED + else if(prob(eye_stat - 25)) + src << "You can't see anything!" + sdisabilities |= BLIND + else + src << "Your eyes are really starting to hurt. This can't be good for you!"*/ + return 1 + + else if(damage == 0) // just enough protection + if(prob(20)) + src << "Something bright flashes in the corner of your vision!" -/mob/living/carbon/proc/eyecheck() - return 0 /mob/living/carbon/proc/tintcheck() return 0 diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 0da65146ba7..ac018973c1b 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -122,7 +122,6 @@ if(!gibbed) update_canmove() - if(client) blind.layer = 0 timeofdeath = worldtime2text() med_hud_set_health() diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index d70e22f1496..edae9b6f66c 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1113,9 +1113,9 @@ . = ..() -///eyecheck() +///check_eye_prot() ///Returns a number between -1 to 2 -/mob/living/carbon/human/eyecheck() +/mob/living/carbon/human/check_eye_prot() var/number = 0 if(istype(src.head, /obj/item/clothing/head)) //are they wearing something on their head var/obj/item/clothing/head/HFP = src.head //if yes gets the flash protection value from that item @@ -1128,6 +1128,14 @@ number += MFP.flash_protect return number +/mob/living/carbon/human/check_ear_prot() + if(head && (head.flags & HEADBANGPROTECT)) + return 1 + if(l_ear && (l_ear.flags & EARBANGPROTECT)) + return 1 + if(r_ear && (r_ear.flags & EARBANGPROTECT)) + return 1 + ///tintcheck() ///Checks eye covering items for visually impairing tinting, such as welding masks ///Checked in life.dm. 0 & 1 = no impairment, 2 = welding mask overlay, 3 = You can see jack, but you can't see shit. diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index c0d566d63e7..4c7c87e367b 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -406,4 +406,44 @@ This function restores all organs. // Will set our damageoverlay icon to the next level, which will then be set back to the normal level the next mob.Life(). updatehealth() - return 1 \ No newline at end of file + return 1 + +// CARBON ORGANS: REMOVE THIS SHIT +/mob/living/carbon/human/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0) + . = ..() + var/obj/item/organ/eyes/E = internal_organs_by_name["eyes"] + if(!E) + return + + var/damage = intensity - check_eye_prot() + if(.) + if(visual) + return + switch(damage) + if(1) + if(prob(40)) + E.damage += 1 + if(2) + E.damage += rand(2, 4) + else + E.damage += rand(12, 16) + + if(E.damage > 10) + eye_blind += damage + eye_blurry += damage * rand(3, 6) + + if(E.damage > 20) + if (prob(E.damage - 20)) + src << "Your eyes start to burn badly!" + disabilities |= NEARSIGHTED + else if(prob(E.damage - 25)) + src << "You can't see anything!" + sdisabilities |= BLIND + else + src << "Your eyes are really starting to hurt. This can't be good for you!" + return 1 + + else if(damage == 0) // just enough protection + if(prob(20)) + src << "Something bright flashes in the corner of your vision!" + diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 1651de21c24..72d999b4bfd 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1,30 +1,5 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 - -var/global/list/unconscious_overlays = list("1" = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "passage1"),\ - "2" = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "passage2"),\ - "3" = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "passage3"),\ - "4" = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "passage4"),\ - "5" = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "passage5"),\ - "6" = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "passage6"),\ - "7" = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "passage7"),\ - "8" = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "passage8"),\ - "9" = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "passage9"),\ - "10" = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "passage10")) -var/global/list/oxyloss_overlays = list("1" = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "oxydamageoverlay1"),\ - "2" = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "oxydamageoverlay2"),\ - "3" = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "oxydamageoverlay3"),\ - "4" = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "oxydamageoverlay4"),\ - "5" = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "oxydamageoverlay5"),\ - "6" = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "oxydamageoverlay6"),\ - "7" = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "oxydamageoverlay7")) -var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay1"),\ - "2" = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay2"),\ - "3" = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay3"),\ - "4" = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay4"),\ - "5" = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay5"),\ - "6" = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay6")) - #define TINT_IMPAIR 2 //Threshold of tint level to apply weld mask overlay #define TINT_BLIND 3 //Threshold of tint level to obscure vision fully @@ -51,10 +26,6 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc loc_as_cryobag.used++ in_stasis = 1 - //if(mob_master.current_cycle % 30 == 15) - //hud_updateflag = 1022 - //HudRefactor:WTF do i put here.... - voice = GetVoice() if(..() && !in_stasis) @@ -952,7 +923,6 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc /mob/living/carbon/human/handle_vision() - client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask) if(machine) if(!machine.check_eye(src)) reset_view(null) else diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 75b82119fd6..81e1533c088 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -377,127 +377,148 @@ return 0 /datum/species/proc/handle_vision(mob/living/carbon/human/H) - if( H.stat == DEAD ) + if(H.stat == DEAD) H.sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS) H.see_in_dark = 8 - if(!H.druggy) H.see_invisible = SEE_INVISIBLE_LEVEL_TWO - else - H.sight &= ~(SEE_TURFS|SEE_MOBS|SEE_OBJS) + if(!H.druggy) + H.see_invisible = SEE_INVISIBLE_LEVEL_TWO + return - H.see_in_dark = darksight //set their variables to default, modify them later - H.see_invisible = SEE_INVISIBLE_LIVING + H.sight &= ~(SEE_TURFS|SEE_MOBS|SEE_OBJS) - if(H.mind && H.mind.vampire) - if((VAMP_VISION in H.mind.vampire.powers) && (!(VAMP_FULL in H.mind.vampire.powers))) - H.sight |= SEE_MOBS + H.see_in_dark = darksight //set their variables to default, modify them later + H.see_invisible = SEE_INVISIBLE_LIVING - else if(VAMP_FULL in H.mind.vampire.powers) - H.sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS - H.see_in_dark = 8 - H.see_invisible = SEE_INVISIBLE_MINIMUM + if(H.mind && H.mind.vampire) + if((VAMP_VISION in H.mind.vampire.powers) && (!(VAMP_FULL in H.mind.vampire.powers))) + H.sight |= SEE_MOBS - - if(XRAY in H.mutations) + else if(VAMP_FULL in H.mind.vampire.powers) H.sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS H.see_in_dark = 8 - H.see_invisible = SEE_INVISIBLE_MINIMUM - if(H.seer == 1) - var/obj/effect/rune/R = locate() in H.loc - if(R && R.word1 == cultwords["see"] && R.word2 == cultwords["hell"] && R.word3 == cultwords["join"]) - H.see_invisible = SEE_INVISIBLE_OBSERVER - else - H.see_invisible = SEE_INVISIBLE_LIVING - H.seer = 0 + if(XRAY in H.mutations) + H.sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS + H.see_in_dark = 8 - //This checks how much the mob's eyewear impairs their vision - if(H.tinttotal >= TINT_IMPAIR) - if(tinted_weldhelh) - if(H.tinttotal >= TINT_BLIND) - H.eye_blind = max(H.eye_blind, 1) - if(H.client) - H.client.screen += global_hud.darkMask + H.see_invisible = SEE_INVISIBLE_MINIMUM - var/minimum_darkness_view = INFINITY - if(H.glasses) - if(istype(H.glasses, /obj/item/clothing/glasses)) - var/obj/item/clothing/glasses/G = H.glasses - H.sight |= G.vision_flags - if(G.darkness_view) - H.see_in_dark = G.darkness_view - minimum_darkness_view = G.darkness_view + if(H.seer == 1) + var/obj/effect/rune/R = locate() in H.loc + if(R && R.word1 == cultwords["see"] && R.word2 == cultwords["hell"] && R.word3 == cultwords["join"]) + H.see_invisible = SEE_INVISIBLE_OBSERVER + else + H.see_invisible = SEE_INVISIBLE_LIVING + H.seer = 0 - if(!G.see_darkness) - H.see_invisible = SEE_INVISIBLE_MINIMUM + //This checks how much the mob's eyewear impairs their vision + if(H.tinttotal >= TINT_IMPAIR) + if(tinted_weldhelh) + H.overlay_fullscreen("tint", /obj/screen/fullscreen/impaired, 2) + if(H.tinttotal >= TINT_BLIND) + H.eye_blind = max(H.eye_blind, 1) + else + H.clear_fullscreen("tint") - if(H.head) - if(istype(H.head, /obj/item/clothing/head)) - var/obj/item/clothing/head/hat = H.head - H.sight |= hat.vision_flags + var/minimum_darkness_view = INFINITY + if(H.glasses) + if(istype(H.glasses, /obj/item/clothing/glasses)) + var/obj/item/clothing/glasses/G = H.glasses + H.sight |= G.vision_flags - if(hat.darkness_view && hat.darkness_view < minimum_darkness_view) // Pick the lowest of the two darkness_views between the glasses and helmet. - H.see_in_dark = hat.darkness_view + if(G.darkness_view) + H.see_in_dark = G.darkness_view + minimum_darkness_view = G.darkness_view - if(!hat.see_darkness) - H.see_invisible = SEE_INVISIBLE_MINIMUM + if(!G.see_darkness) + H.see_invisible = SEE_INVISIBLE_MINIMUM - //switch(hat.HUDType) - // if(SECHUD) - // process_sec_hud(H,1) - // if(MEDHUD) - // process_med_hud(H,1) - // if(ANTAGHUD) - // process_antag_hud(H) + if(H.head) + if(istype(H.head, /obj/item/clothing/head)) + var/obj/item/clothing/head/hat = H.head + H.sight |= hat.vision_flags - if(istype(H.back, /obj/item/weapon/rig)) ///ahhhg so snowflakey - var/obj/item/weapon/rig/rig = H.back - if(rig.visor) - if(!rig.helmet || (H.head && rig.helmet == H.head)) - if(rig.visor && rig.visor.vision && rig.visor.active && rig.visor.vision.glasses) - var/obj/item/clothing/glasses/G = rig.visor.vision.glasses - if(istype(G)) - H.see_in_dark = (G.darkness_view ? G.darkness_view : darksight) // Otherwise we keep our darkness view with togglable nightvision. - if(G.vision_flags) // MESONS - H.sight |= G.vision_flags + if(hat.darkness_view && hat.darkness_view < minimum_darkness_view) // Pick the lowest of the two darkness_views between the glasses and helmet. + H.see_in_dark = hat.darkness_view - if(!G.see_darkness) - H.see_invisible = SEE_INVISIBLE_MINIMUM + if(!hat.see_darkness) + H.see_invisible = SEE_INVISIBLE_MINIMUM - //switch(G.HUDType) - // if(SECHUD) - // process_sec_hud(H,1) - // if(MEDHUD) - // process_med_hud(H,1) - // if(ANTAGHUD) - // process_antag_hud(H) + //switch(hat.HUDType) + // if(SECHUD) + // process_sec_hud(H,1) + // if(MEDHUD) + // process_med_hud(H,1) + // if(ANTAGHUD) + // process_antag_hud(H) - if(H.vision_type) - H.see_in_dark = max(H.see_in_dark, H.vision_type.see_in_dark, darksight) - H.see_invisible = H.vision_type.see_invisible - if(H.vision_type.light_sensitive) - H.weakeyes = 1 - H.sight |= H.vision_type.sight_flags + if(istype(H.back, /obj/item/weapon/rig)) ///ahhhg so snowflakey + var/obj/item/weapon/rig/rig = H.back + if(rig.visor) + if(!rig.helmet || (H.head && rig.helmet == H.head)) + if(rig.visor && rig.visor.vision && rig.visor.active && rig.visor.vision.glasses) + var/obj/item/clothing/glasses/G = rig.visor.vision.glasses + if(istype(G)) + H.see_in_dark = (G.darkness_view ? G.darkness_view : darksight) // Otherwise we keep our darkness view with togglable nightvision. + if(G.vision_flags) // MESONS + H.sight |= G.vision_flags - if(H.see_override) //Override all - H.see_invisible = H.see_override + if(!G.see_darkness) + H.see_invisible = SEE_INVISIBLE_MINIMUM - if(H.blind) - if(H.blinded) H.blind.layer = 18 - else H.blind.layer = 0 + //switch(G.HUDType) + // if(SECHUD) + // process_sec_hud(H,1) + // if(MEDHUD) + // process_med_hud(H,1) + // if(ANTAGHUD) + // process_antag_hud(H) - if(H.disabilities & NEARSIGHTED) //this looks meh but saves a lot of memory by not requiring to add var/prescription - if(H.glasses) //to every /obj/item - var/obj/item/clothing/glasses/G = H.glasses - if(!G.prescription) - H.client.screen += global_hud.vimpaired - else - H.client.screen += global_hud.vimpaired + if(H.vision_type) + H.see_in_dark = max(H.see_in_dark, H.vision_type.see_in_dark, darksight) + H.see_invisible = H.vision_type.see_invisible + if(H.vision_type.light_sensitive) + H.weakeyes = 1 + H.sight |= H.vision_type.sight_flags - if(H.eye_blurry) H.client.screen += global_hud.blurry - if(H.druggy) H.client.screen += global_hud.druggy + if(H.see_override) //Override all + H.see_invisible = H.see_override + + if(!H.client) + return 1 + + if(H.blinded || H.eye_blind) + H.overlay_fullscreen("blind", /obj/screen/fullscreen/blind) + //H.throw_alert("blind", /obj/screen/alert/blind) + else + H.clear_fullscreen("blind") + //H.clear_alert("blind") + + + if(H.disabilities & NEARSIGHTED) //this looks meh but saves a lot of memory by not requiring to add var/prescription + if(H.glasses) //to every /obj/item + var/obj/item/clothing/glasses/G = H.glasses + if(!G.prescription) + H.overlay_fullscreen("nearsighted", /obj/screen/fullscreen/impaired, 1) + else + H.overlay_fullscreen("nearsighted", /obj/screen/fullscreen/impaired, 1) + else + H.clear_fullscreen("nearsighted") + + if(H.eye_blurry) + H.overlay_fullscreen("blurry", /obj/screen/fullscreen/blurry) + else + H.clear_fullscreen("blurry") + + if(H.druggy) + H.overlay_fullscreen("high", /obj/screen/fullscreen/high) + //H.throw_alert("high", /obj/screen/alert/high) + else + H.clear_fullscreen("high") + //H.clear_alert("high") /datum/species/proc/handle_hud_icons(mob/living/carbon/human/H) if(H.healths) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 55daaba2dd8..6876ac71663 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -367,83 +367,55 @@ //this handles hud updates. Calls update_vision() and handle_hud_icons() /mob/living/carbon/handle_regular_hud_updates() - if(!client) return 0 + if(!client) + return 0 - if(damageoverlay) - if(damageoverlay.overlays) - damageoverlay.overlays = list() - - if(stat == UNCONSCIOUS) - //Critical damage passage overlay - if(health <= config.health_threshold_crit) - var/image/I = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "passage0") - I.blend_mode = BLEND_OVERLAY //damageoverlay is BLEND_MULTIPLY - switch(health) - if(-20 to -10) - I.icon_state = "passage1" - if(-30 to -20) - I.icon_state = "passage2" - if(-40 to -30) - I.icon_state = "passage3" - if(-50 to -40) - I.icon_state = "passage4" - if(-60 to -50) - I.icon_state = "passage5" - if(-70 to -60) - I.icon_state = "passage6" - if(-80 to -70) - I.icon_state = "passage7" - if(-90 to -80) - I.icon_state = "passage8" - if(-95 to -90) - I.icon_state = "passage9" - if(-INFINITY to -95) - I.icon_state = "passage10" - damageoverlay.overlays += I + if(stat == UNCONSCIOUS && health <= config.health_threshold_crit) + var/severity = 0 + switch(health) + if(-20 to -10) severity = 1 + if(-30 to -20) severity = 2 + if(-40 to -30) severity = 3 + if(-50 to -40) severity = 4 + if(-60 to -50) severity = 5 + if(-70 to -60) severity = 6 + if(-80 to -70) severity = 7 + if(-90 to -80) severity = 8 + if(-95 to -90) severity = 9 + if(-INFINITY to -95) severity = 10 + overlay_fullscreen("crit", /obj/screen/fullscreen/crit, severity) + else + clear_fullscreen("crit") + if(oxyloss) + var/severity = 0 + switch(oxyloss) + if(10 to 20) severity = 1 + if(20 to 25) severity = 2 + if(25 to 30) severity = 3 + if(30 to 35) severity = 4 + if(35 to 40) severity = 5 + if(40 to 45) severity = 6 + if(45 to INFINITY) severity = 7 + overlay_fullscreen("oxy", /obj/screen/fullscreen/oxy, severity) else - //Oxygen damage overlay - if(oxyloss) - var/image/I = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "oxydamageoverlay0") - switch(oxyloss) - if(10 to 20) - I.icon_state = "oxydamageoverlay1" - if(20 to 25) - I.icon_state = "oxydamageoverlay2" - if(25 to 30) - I.icon_state = "oxydamageoverlay3" - if(30 to 35) - I.icon_state = "oxydamageoverlay4" - if(35 to 40) - I.icon_state = "oxydamageoverlay5" - if(40 to 45) - I.icon_state = "oxydamageoverlay6" - if(45 to INFINITY) - I.icon_state = "oxydamageoverlay7" - damageoverlay.overlays += I + clear_fullscreen("oxy") + + //Fire and Brute damage overlay (BSSR) + var/hurtdamage = getBruteLoss() + getFireLoss() + damageoverlaytemp + damageoverlaytemp = 0 // We do this so we can detect if someone hits us or not. + if(hurtdamage) + var/severity = 0 + switch(hurtdamage) + if(5 to 15) severity = 1 + if(15 to 30) severity = 2 + if(30 to 45) severity = 3 + if(45 to 70) severity = 4 + if(70 to 85) severity = 5 + if(85 to INFINITY) severity = 6 + overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity) + else + clear_fullscreen("brute") - //Fire and Brute damage overlay (BSSR) - var/hurtdamage = src.getBruteLoss() + src.getFireLoss() + damageoverlaytemp - damageoverlaytemp = 0 // We do this so we can detect if someone hits us or not. - if(hurtdamage) - var/image/I = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay0") - I.blend_mode = BLEND_ADD - switch(hurtdamage) - if(5 to 15) - I.icon_state = "brutedamageoverlay1" - if(15 to 30) - I.icon_state = "brutedamageoverlay2" - if(30 to 45) - I.icon_state = "brutedamageoverlay3" - if(45 to 70) - I.icon_state = "brutedamageoverlay4" - if(70 to 85) - I.icon_state = "brutedamageoverlay5" - if(85 to INFINITY) - I.icon_state = "brutedamageoverlay6" - var/image/black = image(I.icon, I.icon_state) //BLEND_ADD doesn't let us darken, so this is just to blacken the edge of the screen - black.color = "#170000" - damageoverlay.overlays += I - damageoverlay.overlays += black ..() return 1 diff --git a/code/modules/mob/living/carbon/slime/death.dm b/code/modules/mob/living/carbon/slime/death.dm index 6e951320bdc..240454f3e0f 100644 --- a/code/modules/mob/living/carbon/slime/death.dm +++ b/code/modules/mob/living/carbon/slime/death.dm @@ -20,8 +20,6 @@ O.show_message("The [name] seizes up and falls limp...", 1) //ded -- Urist update_canmove() - if(blind) - blind.layer = 0 if(ticker && ticker.mode) ticker.mode.check_win() diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm new file mode 100644 index 00000000000..14585f6ae21 --- /dev/null +++ b/code/modules/mob/living/death.dm @@ -0,0 +1,5 @@ +/mob/living/death(gibbed) + blinded = max(blinded, 1) + + clear_fullscreens() + ..(gibbed) \ No newline at end of file diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index ee8ef7efee2..c2dddbf1eb7 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -161,7 +161,7 @@ /mob/living/proc/handle_disabilities() //Eyes - if(disabilities & BLIND || stat) //blindness from disability or unconsciousness doesn't get better on its own + if(sdisabilities & BLIND || stat) //blindness from disability or unconsciousness doesn't get better on its own eye_blind = max(eye_blind, 1) else if(eye_blind) //blindness, heals slowly over time eye_blind = max(eye_blind-1,0) @@ -187,33 +187,40 @@ return 1 /mob/living/proc/handle_vision() - - client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask) - update_sight() - if(stat != DEAD) - if(blind) - if(eye_blind) - blind.layer = 18 - else - blind.layer = 0 + if(stat == DEAD) + return + if(blinded || eye_blind) + overlay_fullscreen("blind", /obj/screen/fullscreen/blind) + //throw_laert("blind", /obj/screen/alert/blind) + else + clear_fullscreen("blind") + //clear_alert("blind") - if (disabilities & NEARSIGHTED) - client.screen += global_hud.vimpaired - - if (eye_blurry) - client.screen += global_hud.blurry - - if (druggy) - client.screen += global_hud.druggy - - if(machine) - if (!( machine.check_eye(src) )) - reset_view(null) + if(disabilities & NEARSIGHTED) + overlay_fullscreen("nearsighted", /obj/screen/fullscreen/impaired, 1) else - if(!client.adminobs) - reset_view(null) + clear_fullscreen("nearsighted") + + if(eye_blurry) + overlay_fullscreen("blurry", /obj/screen/fullscreen/blurry) + else + clear_fullscreen("blurry") + + if(druggy) + overlay_fullscreen("high", /obj/screen/fullscreen/high) + //throw_alert("high", /obj/screen/alert/high) + else + clear_fullscreen("high") + //clear_alert("high") + + if(machine) + if (!( machine.check_eye(src) )) + reset_view(null) + else + if(!client.adminobs) + reset_view(null) /mob/living/proc/update_sight() return diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 25358ee11b1..9fda6d09b17 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -51,8 +51,7 @@ /mob/living/ex_act(severity) ..() - if(client && !eye_blind) - flick("flash", src.flash) + flash_eyes() /mob/living/proc/updatehealth() if(status_flags & GODMODE) @@ -794,6 +793,18 @@ /mob/living/proc/can_use_vents() return "You can't fit into that vent." +//called when the mob receives a bright flash +/mob/living/proc/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /obj/screen/fullscreen/flash) + if(check_eye_prot() < intensity && (override_blindness_check || !(sdisabilities & BLIND))) + overlay_fullscreen("flash", type) + addtimer(src, "clear_fullscreen", 25, FALSE, "flash", 25) + return 1 + +/mob/living/proc/check_eye_prot() + return 0 + +/mob/living/proc/check_ear_prot() + // The src mob is trying to strip an item from someone // Override if a certain type of mob should be behave differently when stripping items (can't, for example) /mob/living/stripPanelUnequip(obj/item/what, mob/who, where, var/silent = 0) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 4c1780e34d0..f2523e2d823 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -39,8 +39,6 @@ /mob/living/bullet_act(var/obj/item/projectile/P, var/def_zone) - flash_weak_pain() - //Being hit while using a cloaking device var/obj/item/weapon/cloaking_device/C = locate((/obj/item/weapon/cloaking_device) in src) if(C && C.active) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 9ede31debe6..495797a4f56 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -573,8 +573,6 @@ var/list/ai_verbs_default = list( playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1) visible_message("[M] has slashed at [src]!",\ "[M] has slashed at [src]!") - if(prob(8)) - flick("noise", flash) adjustBruteLoss(damage) updatehealth() else diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm index 44119424aa0..b0b0f44d0e6 100644 --- a/code/modules/mob/living/silicon/ai/death.dm +++ b/code/modules/mob/living/silicon/ai/death.dm @@ -5,9 +5,8 @@ icon_state = "[ckey]-ai-crash" else icon_state = "ai-crash" update_canmove() - if(src.eyeobj) - src.eyeobj.setLoc(get_turf(src)) - if(blind) blind.layer = 0 + if(eyeobj) + eyeobj.setLoc(get_turf(src)) sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS see_in_dark = 8 see_invisible = SEE_INVISIBLE_LEVEL_TWO diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index 93ee8a54a2b..727d03b5696 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -49,22 +49,20 @@ if(aiRestorePowerRoutine == 2) src << "Alert cancelled. Power has been restored without our assistance." aiRestorePowerRoutine = 0 - blind.layer = 0 + clear_fullscreen("blind") else if(aiRestorePowerRoutine == 3) src << "Alert cancelled. Power has been restored." aiRestorePowerRoutine = 0 - blind.layer = 0 + clear_fullscreen("blind") else - - blind.screen_loc = "1,1 to 15,15" - if(blind.layer != 18) - blind.layer = 18 sight &= ~SEE_TURFS sight &= ~SEE_MOBS sight &= ~SEE_OBJS + overlay_fullscreen("blind", /obj/screen/fullscreen/blind) + see_in_dark = 0 see_invisible = SEE_INVISIBLE_LIVING @@ -85,7 +83,6 @@ if(my_area && my_area.power_equip && !istype(T, /turf/space)) src << "Alert cancelled. Power has been restored without our assistance." aiRestorePowerRoutine = 0 - blind.layer = 0 return src << "Fault confirmed: missing external power. Shutting down main control system to save power." sleep(20) @@ -122,7 +119,7 @@ if (!istype(T, /turf/space)) src << "Alert cancelled. Power has been restored without our assistance." aiRestorePowerRoutine = 0 - blind.layer = 0 + clear_fullscreen("blind") return switch(PRP) diff --git a/code/modules/mob/living/silicon/ai/login.dm b/code/modules/mob/living/silicon/ai/login.dm index 95c6e52b13f..7d3a65445ff 100644 --- a/code/modules/mob/living/silicon/ai/login.dm +++ b/code/modules/mob/living/silicon/ai/login.dm @@ -5,21 +5,9 @@ blood.override = 1 client.images += blood regenerate_icons() - flash = new /obj/screen() - flash.icon_state = "blank" - flash.name = "flash" - flash.screen_loc = "WEST,SOUTH to EAST,NORTH" - flash.layer = 17 - blind = new /obj/screen() - blind.icon_state = "black" - blind.name = " " - blind.screen_loc = "1,1 to 15,15" - blind.layer = 0 - client.screen.Add( blind, flash ) if(stat != DEAD) for(var/obj/machinery/ai_status_display/O in machines) //change status O.mode = 1 O.emotion = "Neutral" - src.view_core() - return \ No newline at end of file + view_core() \ No newline at end of file diff --git a/code/modules/mob/living/silicon/pai/death.dm b/code/modules/mob/living/silicon/pai/death.dm index 08ec0e706d3..f9d75773ff9 100644 --- a/code/modules/mob/living/silicon/pai/death.dm +++ b/code/modules/mob/living/silicon/pai/death.dm @@ -12,7 +12,6 @@ card.overlays += "pai-off" stat = DEAD canmove = 0 - if(blind) blind.layer = 0 sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS see_in_dark = 8 see_invisible = SEE_INVISIBLE_LEVEL_TWO diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 420b897626b..2d1c82c3d9f 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -245,7 +245,7 @@ if ((O.client && !( O.blinded ))) O.show_message(text("\red [] has slashed at []!", M, src), 1) if(prob(8)) - flick("noise", src.flash) + flash_eyes(affect_silicon = 1) src.adjustBruteLoss(damage) src.updatehealth() else diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm index cafb53d8621..a4dcbd8c4d1 100644 --- a/code/modules/mob/living/silicon/robot/death.dm +++ b/code/modules/mob/living/silicon/robot/death.dm @@ -57,7 +57,6 @@ var/obj/machinery/recharge_station/RC = loc RC.go_out() - if(blind) blind.layer = 0 sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS see_in_dark = 8 see_invisible = SEE_INVISIBLE_LEVEL_TWO diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index c7ba0de8a64..30222e5c6cd 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -337,3 +337,7 @@ /mob/living/silicon/robot/drone/update_canmove() . = ..() density = 0 //this is reset every canmove update otherwise + +/mob/living/simple_animal/drone/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0) + if(affect_silicon) + return ..() diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 5f085cafacc..5a4f37eb4e2 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -865,7 +865,7 @@ var/list/robot_verbs_default = list( visible_message("[M] has slashed at [src]!",\ "[M] has slashed at [src]!") if(prob(8)) - flick("noise", flash) + flash_eyes(affect_silicon = 1) adjustBruteLoss(damage) updatehealth() else @@ -894,7 +894,7 @@ var/list/robot_verbs_default = list( /mob/living/silicon/robot/attack_slime(mob/living/carbon/slime/M as mob) if(..()) //successful slime shock - flick("noise", flash) + flash_eyes(affect_silicon = 1) var/stunprob = M.powerlevel * 7 + 10 if(prob(stunprob) && M.powerlevel >= 8) adjustBruteLoss(M.powerlevel * rand(6,10)) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 992f846c524..0a29a274914 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -73,7 +73,7 @@ if(2) src.take_organ_damage(10) Stun(3) - flick("noise", src:flash) + flash_eyes(affect_silicon = 1) src << "\red *BZZZT*" src << "\red Warning: Electromagnetic pulse detected." ..() @@ -349,4 +349,6 @@ /mob/living/silicon/adjustToxLoss(var/amount) return - +/mob/living/silicon/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /obj/screen/fullscreen/flash/noise) + if(affect_silicon) + return ..() diff --git a/code/modules/mob/living/simple_animal/bees.dm b/code/modules/mob/living/simple_animal/bees.dm index f88f41e6d17..10284d90191 100644 --- a/code/modules/mob/living/simple_animal/bees.dm +++ b/code/modules/mob/living/simple_animal/bees.dm @@ -56,7 +56,6 @@ M.apply_damage(min(strength,2)+mut, BRUTE, sharp=1) // Stinging. The more mutated I am, the harder I sting. M.apply_damage((round(feral/10,1)*(max((round(strength/20,1)),1)))+toxic, TOX) // Bee venom based on how angry I am and how many there are of me! M << "\red You have been stung!" - M.flash_pain() //if we're chasing someone, get a little bit angry if(target_mob && prob(10)) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index e1b2ce1477d..be22f2eb6c6 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1213,9 +1213,6 @@ var/list/slot_equipment_priority = list( \ /mob/proc/get_species() return "" -/mob/proc/flash_weak_pain() - flick("weak_pain",pain) - /mob/proc/get_visible_implants(var/class = 0) var/list/visible_implants = list() for(var/obj/item/O in embedded) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 48b562397ee..48b66b4d559 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -11,8 +11,6 @@ //Not in use yet var/obj/effect/organstructure/organStructure = null - var/obj/screen/flash = null - var/obj/screen/blind = null var/obj/screen/hands = null var/obj/screen/pullin = null var/obj/screen/internals = null @@ -26,8 +24,6 @@ var/obj/screen/throw_icon = null var/obj/screen/nutrition_icon = null var/obj/screen/pressure = null - var/obj/screen/damageoverlay = null - var/obj/screen/pain = null var/obj/screen/gun/item/item_use_icon = null var/obj/screen/gun/move/gun_move_icon = null var/obj/screen/gun/run/gun_run_icon = null diff --git a/code/modules/organs/pain.dm b/code/modules/organs/pain.dm index ebfc3442d54..470f7b3e9b6 100644 --- a/code/modules/organs/pain.dm +++ b/code/modules/organs/pain.dm @@ -1,6 +1,3 @@ -mob/proc/flash_pain() - flick("pain",pain) - mob/var/list/pain_stored = list() mob/var/last_pain_message = "" mob/var/next_pain_time = 0 @@ -30,20 +27,16 @@ mob/living/carbon/proc/pain(var/partname, var/amount, var/force, var/burning = 0 if(1 to 10) msg = "\red Your [partname] burns." if(11 to 90) - flash_weak_pain() msg = "\red Your [partname] burns badly!" if(91 to 10000) - flash_pain() msg = "\red OH GOD! Your [partname] is on fire!" else switch(amount) if(1 to 10) msg = "Your [partname] hurts." if(11 to 90) - flash_weak_pain() msg = "Your [partname] hurts badly." if(91 to 10000) - flash_pain() msg = "OH GOD! Your [partname] is hurting terribly!" if(msg && (msg != last_pain_message || prob(10))) last_pain_message = msg diff --git a/code/modules/reagents/newchem/pyro.dm b/code/modules/reagents/newchem/pyro.dm index c2adcc783e3..4b3a00c67fb 100644 --- a/code/modules/reagents/newchem/pyro.dm +++ b/code/modules/reagents/newchem/pyro.dm @@ -248,13 +248,12 @@ datum/reagent/blackpowder/reaction_turf(var/turf/T, var/volume) //oh shit s.set_up(2, 1, location) s.start() for(var/mob/living/carbon/C in viewers(5, location)) - if(C.eyecheck()) - continue - flick("e_flash", C.flash) - if(get_dist(C, location) < 4) - C.Weaken(5) - continue - C.Stun(5) + if(C.flash_eyes()) + if(get_dist(C, location) < 4) + C.Weaken(5) + continue + C.Stun(5) + /datum/chemical_reaction/flash_powder/on_reaction(var/datum/reagents/holder, var/created_volume) if(holder.has_reagent("stabilizing_agent")) @@ -264,13 +263,11 @@ datum/reagent/blackpowder/reaction_turf(var/turf/T, var/volume) //oh shit s.set_up(2, 1, location) s.start() for(var/mob/living/carbon/C in viewers(5, location)) - if(C.eyecheck()) - continue - flick("e_flash", C.flash) - if(get_dist(C, location) < 4) - C.Weaken(5) - continue - C.Stun(5) + if(C.flash_eyes()) + if(get_dist(C, location) < 4) + C.Weaken(5) + continue + C.Stun(5) holder.remove_reagent("flash_powder", created_volume) /datum/reagent/smoke_powder diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm index d6e1ed34ce4..ebf9c6bf8da 100644 --- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm +++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm @@ -89,9 +89,8 @@ playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) - for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null)) - if(M:eyecheck() <= 0) - flick("e_flash", M.flash) + for(var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null)) + C.flash_eyes() for(var/i = 1, i <= 5, i++) var/chosen = pick(critters) @@ -127,9 +126,8 @@ playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) - for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null)) - if(M:eyecheck() <= 0) - flick("e_flash", M.flash) + for(var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null)) + C.flash_eyes() var/chosen = pick(critters) var/mob/living/simple_animal/hostile/C = new chosen @@ -153,9 +151,8 @@ playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) - for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null)) - if(M:eyecheck() <= 0) - flick("e_flash", M.flash) + for(var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null)) + C.flash_eyes() for(var/i = 1, i <= 4 + rand(1,2), i++) var/chosen = pick(borks) @@ -181,9 +178,8 @@ playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) - for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null)) - if(M:eyecheck() <= 0) - flick("e_flash", M.flash) + for(var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null)) + C.flash_eyes() for(var/i = 1, i <= 4 + rand(1,2), i++) var/chosen = pick(borks) diff --git a/icons/mob/screen1_full.dmi b/icons/mob/screen1_full.dmi deleted file mode 100644 index d660f369ba034c81a2e03a1d65516c2495c8841d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1245935 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%0ADG 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%0A;ykgD$P6Y=GgnOTMxb(49 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%0A##^Wyb#N9XAd~c^VT&*xQfLmmEr7T5XQ#j0T`i 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%0A|}+XBPVu{v(D2vI|s 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 r6v65vg$jd1 z`Dw>*{AygG{y4{`acycU87QY>Ac+357z**iA;X*?gj1{Fi$1Fgi=>K5B-kphhBJl( zbB!&IvPg!?f&{)mq5IWWOe>5V#heNQ-!-OrQ*Ux(LUW(<38dk5_to4ohGz_~f0vLn zx?zVn{0zgf8fmk1f=+=y_J?{VL!vJ8#~)v9LRA?|a(<=^Fws$8$LbE1 zCD9!+I44(fQQYW;nP(g^O^$0+z15ll^H(5@lMI-k_R!a*wHgs|k4|Ktag_qwp;YF7 zd`l3YZWs{T>C<9ixQO5nQf@Yh+@pd8|D1*~Mxmtpv#zC1vy0+2`H-rf|6fq@J^q5; zHK%?})f`QeBx@aHdsoYA%(tdm(W}QB79DUI+_=oqbq2-c;U29~5-2csVPith7&19U zTN6nA;B?e=Gk$0*l1mvcXqnzU22DUo({Akd=R{*gO4Z!~5@R=C6p~EJ-3F9-o>x!lZb`$sM&-!%RHVZSo6QWpIAmu4+oTMe5d`Nq4FKkv06_c=hpg03(6}qW9?F|bG zGtGg-{g<=V-h`{}P^R+WDd-O4r3Z(-LRLR(*0%cvNlWxGNMCR@BPpQ(#84DppLQi0 zWpC?$b<3_M6q(JnhI3?M<-MQIpI3QP2I^VsQeN8?*W@d#mJJZT;m1|r354C9(}1f1 zwO^GnvuHHX;7R_~6{8V?0auI>$pvGeeo(nW3yLYT5yo%v>c?$@j zne@Hz(P73{(fGLaBui9M7AwDAm~_mitMAKo6^-yv*~sph9YD3F$K4xVzD^1N?&!X9 zoMA$ibv@fuL)&6aM$KRt5BWRRgsNj#8gJpw z9?`uG;Qx<)+ec4udD3|JSKL5MGVR!BTz{78Zz>=LpsUEYWuA`V1t&I08Bm?Srka^O zFJW%%bwZYrHVgPa$>tCx4$#E@+V+S{_d<4u8#570`qYFXWec1CGY-=sj9fepPh(a5 z=MVgcIor^rV~fIOIA!DA+LMv(TDyEn$aetXZDf^l*n+GO9KeyJ%2j=cUd482fkAX)%~>*z;Gh39w0mhzis;F z2&qXXf;ePtY~YW``u-K;6}k;oge_eKs9mvnxT?kmDJ6D;v`wgyV{Knuj-~8_+L!5> zO7~s)M@_euc}`6^KKSxO>K{ZH#3OXU-5D?BmTDj2wsiM7{Ze><@_P~`RIFF4`2o|B z^VBDpI?t;zFM_IZqcYD}6akb+ZS?6o@Od>$$(n2fvbVL%nb_RuKYF8EiGLpcWlnm4 z-NW$xD~uOYuD_fNv*tVS;DQ~G)>fPFkM>78ieIm5oj>Xq@XHvE@LyfxW&2!+rB_rB z$Jv$^z|E7_#)$vAA4rwhRy0fw5_B|7JYb~mCr5oS=Vf-Aot>Nyn3B( zNnD(UqZfp~&oi8A4h30)DyV^WR-!ARe->(nH$R+WWNI|0FpYDh(t2uCW}TB1NpLJz z9M1|gflO@1a6V&C`IVQr`m$o%9HFWgAZ=J~cFQO7HPAJFLr4ONw3A`C+?brPRI!Oj>}74(YHZ+vEbNE{Z@QIeS6B{_4lp4cOGi{IkV*eFzLlYT}g zCqr$5%k4nk^F7IU{eYmMP$36|kQ(AHbkzx7DINE|yEY@)asH{v∋(I_98sYr|_E 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

&2^a&OcEN6iw8s63S*rMAa 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 diff --git a/icons/mob/screen_full.dmi b/icons/mob/screen_full.dmi new file mode 100644 index 0000000000000000000000000000000000000000..e84b05469506dba025f5e6a0681e663318fb9368 GIT binary patch literal 1367919 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ⅇqWpAXMeKK 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 FS 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�Dw^5ajurkWa>5)CQpua#-lI6vEwIuuZ$ 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

%HK?9Teb-6UKrVrf9U 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

P1xAG@$UwltFr{1n9PRbg?qjzw`ESz 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%0D>PlqDEyire7Q&h0a} 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

1P;xDyaH3`#VJWe#uaG&^|q~8j_Kg0 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 literal 0 HcmV?d00001 diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi index 431f1df9ddb7082959a3332b5f078c9f2b7d5d1d..a97f1abc5a09da31c79ac078f8fe1f647cff3b46 100644 GIT binary patch literal 118895 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%0A|!v-X|oyJNR(ZJOSG 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 literal 120075 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ⅅzyHmg%lvV%n4J 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 W8L>FN$x{^k&q#l#-V+_$^ZySJvC_N% diff --git a/paradise.dme b/paradise.dme index b3b9b34f283..af0eb57e422 100644 --- a/paradise.dme +++ b/paradise.dme @@ -80,6 +80,7 @@ #include "code\_hooks\area.dm" #include "code\_hooks\hooks.dm" #include "code\_hooks\mob.dm" +#include "code\_onclick\_defines.dm" #include "code\_onclick\adjacent.dm" #include "code\_onclick\ai.dm" #include "code\_onclick\click.dm" @@ -97,6 +98,7 @@ #include "code\_onclick\hud\ai.dm" #include "code\_onclick\hud\alien.dm" #include "code\_onclick\hud\alien_larva.dm" +#include "code\_onclick\hud\fullscreen.dm" #include "code\_onclick\hud\hud.dm" #include "code\_onclick\hud\human.dm" #include "code\_onclick\hud\monkey.dm" @@ -1319,6 +1321,7 @@ #include "code\modules\mob\dead\observer\spells.dm" #include "code\modules\mob\living\autohiss.dm" #include "code\modules\mob\living\damage_procs.dm" +#include "code\modules\mob\living\death.dm" #include "code\modules\mob\living\default_language.dm" #include "code\modules\mob\living\life.dm" #include "code\modules\mob\living\living.dm" From cdb3dbe6abf76972fa528991d7eb3e96e22b23b1 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Sun, 28 Feb 2016 18:18:03 -0800 Subject: [PATCH 005/328] 510: Enforce >=510 compile --- code/_compile_options.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 1c5fd05d3e0..16a06898f26 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -12,7 +12,7 @@ #define MAX_NAME_LEN 26 // Version check, terminates compilation if someone is using a version of BYOND that's too old -#if DM_VERSION < 508 +#if DM_VERSION < 510 #error OUTDATED VERSION ERROR - \ Due to BYOND features used in this codebase, you must update to version 508 or later to compile. \ This may require updating to a beta release. From 131c9a2c857ef1bbaef6f3e661f58fd1736b846a Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Sun, 28 Feb 2016 18:45:40 -0800 Subject: [PATCH 006/328] [510] Travis bby plz --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index c1b99405aa7..34cf7a5a723 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,8 +4,8 @@ sudo: false env: global: - - BYOND_MAJOR="509" - - BYOND_MINOR="1315" + - BYOND_MAJOR="510" + - BYOND_MINOR="1327" matrix: - DM_MAPFILE="cyberiad" - DM_MAPFILE="metastation" From 902bac2ca6dde0aee20407a5d462f18d8548abe6 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Sun, 28 Feb 2016 19:13:55 -0800 Subject: [PATCH 007/328] [510] Flashes work now, and don't permastun --- code/game/objects/items/devices/flash.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index c27e80306b5..6f4e25a85e4 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -115,7 +115,7 @@ user.visible_message("[user] tries to overloads [M]'s sensors with the [src.name], but if blocked by [M]'s shield!", "You try to overload [M]'s sensors with the [src.name], but are blocked by his shield!") return 1 add_logs(M, user, "flashed", object="[src.name]") - if(M.flash_eyes()) + if(M.flash_eyes(affect_silicon = 1)) M.Weaken(rand(5,10)) user.visible_message("[user] overloads [M]'s sensors with the [src.name]!", "You overload [M]'s sensors with the [src.name]!") return 1 From d59ed9c91714c242249862664f5162862af80ab9 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Mon, 29 Feb 2016 08:49:12 -0800 Subject: [PATCH 008/328] Alien code. --- code/modules/mob/living/carbon/alien/life.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index 9789e382c7f..9ec603ccde1 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -39,13 +39,13 @@ fire_alert = 0 /mob/living/carbon/alien/update_sight() - if(stat == 2 || (XRAY in mutations)) + if(stat == DEAD || (XRAY in mutations)) sight |= SEE_TURFS sight |= SEE_MOBS sight |= SEE_OBJS see_in_dark = 8 see_invisible = SEE_INVISIBLE_LEVEL_TWO - else if(stat != 2) + else if(stat != DEAD) sight |= SEE_MOBS sight &= ~SEE_TURFS sight &= ~SEE_OBJS From 83396d41dfe6ce0fd4f8fb74c96628bd01e0012f Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Mon, 29 Feb 2016 15:48:49 -0500 Subject: [PATCH 009/328] Removes btime dependency, makes sleep check happen on Every SCHECK --- btime.dll | Bin 6656 -> 0 bytes code/__DEFINES/btime.dm | 18 -------- code/__DEFINES/process_scheduler.dm | 2 +- code/__HELPERS/time.dm | 26 ++++++++++-- .../ProcessScheduler/core/_stubs.dm | 27 ------------ .../ProcessScheduler/core/process.dm | 39 +++++------------- .../ProcessScheduler/core/processScheduler.dm | 13 ++---- code/game/objects/explosion.dm | 5 +-- paradise.dme | 2 - 9 files changed, 39 insertions(+), 93 deletions(-) delete mode 100644 btime.dll delete mode 100644 code/__DEFINES/btime.dm delete mode 100644 code/controllers/ProcessScheduler/core/_stubs.dm diff --git a/btime.dll b/btime.dll deleted file mode 100644 index 36dcbe3af7561942191dde97718a2844dc2a23ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6656 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 this_many_calls) sleepCheck() -#define SCHECK SCHECK_EVERY(50) +#define SCHECK sleepCheck() diff --git a/code/__HELPERS/time.dm b/code/__HELPERS/time.dm index 1bdd85841a5..4973de14b81 100644 --- a/code/__HELPERS/time.dm +++ b/code/__HELPERS/time.dm @@ -3,6 +3,25 @@ #define MINUTES *600 #define HOURS *36000 +#define TimeOfGame (get_game_time()) +#define TimeOfTick (world.tick_usage*0.01*world.tick_lag) + +/proc/get_game_time() + var/global/time_offset = 0 + var/global/last_time = 0 + var/global/last_usage = 0 + + var/wtime = world.time + var/wusage = world.tick_usage * 0.01 + + if(last_time < wtime && last_usage > 1) + time_offset += last_usage - 1 + + last_time = wtime + last_usage = wusage + + return wtime + (time_offset + wusage) * world.tick_lag + //Returns the world time in english /proc/worldtime2text(time = world.time) return "[round(time / 36000)+12]:[(time / 600 % 60) < 10 ? add_zero(time / 600 % 60, 1) : time / 600 % 60]" @@ -33,15 +52,14 @@ proc/isDay(var/month, var/day) * Returns "watch handle" (really just a timestamp :V) */ /proc/start_watch() - return world.timeofday + return TimeOfGame /** * Returns number of seconds elapsed. * @param wh number The "Watch Handle" from start_watch(). (timestamp) */ /proc/stop_watch(wh) - return round(0.1*(world.timeofday-wh),0.1) + return round(0.1 * (TimeOfGame - wh), 0.1) /proc/month2number(month) - return month_names.Find(month) - \ No newline at end of file + return month_names.Find(month) \ No newline at end of file diff --git a/code/controllers/ProcessScheduler/core/_stubs.dm b/code/controllers/ProcessScheduler/core/_stubs.dm deleted file mode 100644 index 94f4cc1fc4b..00000000000 --- a/code/controllers/ProcessScheduler/core/_stubs.dm +++ /dev/null @@ -1,27 +0,0 @@ -/** - * _stubs.dm - * - * This file contains constructs that the process scheduler expects to exist - * in a standard ss13 fork. - */ -/* -/** - * message_admins - * - * sends a message to admins - */ -/proc/message_admins(msg) - world << msg -*/ -/** - * logTheThing - * - * In goonstation, this proc writes a message to either the world log or diary. - * - * Blame Keelin. - */ -/proc/logTheThing(type, source, target, text, diaryType) - if(diaryType) - world << "Diary: \[[diaryType]:[type]] [text]" - else - world << "Log: \[[type]] [text]" diff --git a/code/controllers/ProcessScheduler/core/process.dm b/code/controllers/ProcessScheduler/core/process.dm index b7767c367fd..27ba2479ae5 100644 --- a/code/controllers/ProcessScheduler/core/process.dm +++ b/code/controllers/ProcessScheduler/core/process.dm @@ -69,10 +69,10 @@ * recordkeeping vars */ - // Records the time (1/10s timeofday) at which the process last finished sleeping + // Records the time (1/10s timeoftick) at which the process last finished sleeping var/tmp/last_slept = 0 - // Records the time (1/10s timeofday) at which the process last began running + // Records the time (1/10s timeofgame) at which the process last began running var/tmp/run_start = 0 // Records the number of times this process has been killed and restarted @@ -106,12 +106,8 @@ last_object = null /datum/controller/process/proc/started() - var/timeofhour = TimeOfHour - // Initialize last_slept so we can know when to sleep - last_slept = timeofhour - // Initialize run_start so we can detect hung processes. - run_start = timeofhour + run_start = TimeOfGame // Initialize defer count cpu_defer_count = 0 @@ -163,18 +159,13 @@ setStatus(PROCESS_STATUS_HUNG) /datum/controller/process/proc/handleHung() - var/timeofhour = TimeOfHour var/datum/lastObj = last_object var/lastObjType = "null" if(istype(lastObj)) lastObjType = lastObj.type - // If timeofhour has rolled over, then we need to adjust. - if (timeofhour < run_start) - run_start -= 36000 - var/msg = "[name] process hung at tick #[ticks]. Process was unresponsive for [(timeofhour - run_start) / 10] seconds and was restarted. Last task: [last_task]. Last Object Type: [lastObjType]" - logTheThing("debug", null, null, msg) - logTheThing("diary", null, null, msg, "debug") + var/msg = "[name] process hung at tick #[ticks]. Process was unresponsive for [(TimeOfGame - run_start) / 10] seconds and was restarted. Last task: [last_task]. Last Object Type: [lastObjType]" + log_debug(msg) message_admins(msg) main.restartProcess(src.name) @@ -182,8 +173,8 @@ /datum/controller/process/proc/kill() if (!killed) var/msg = "[name] process was killed at tick #[ticks]." - logTheThing("debug", null, null, msg) - logTheThing("diary", null, null, msg, "debug") + log_debug(msg) + message_admins(msg) //finished() // Allow inheritors to clean up if needed @@ -208,17 +199,12 @@ if (main.getCurrentTickElapsedTime() > main.timeAllowance) sleep(world.tick_lag) cpu_defer_count++ - last_slept = TimeOfHour + last_slept = 0 else - var/timeofhour = TimeOfHour - // If timeofhour has rolled over, then we need to adjust. - if (timeofhour < last_slept) - last_slept -= 36000 - - if (timeofhour > last_slept + sleep_interval) + if (TimeOfTick > last_slept + sleep_interval) // If we haven't slept in sleep_interval deciseconds, sleep to allow other work to proceed. sleep(0) - last_slept = TimeOfHour + last_slept = TimeOfTick /datum/controller/process/proc/update() // Clear delta @@ -239,10 +225,7 @@ /datum/controller/process/proc/getElapsedTime() - var/timeofhour = TimeOfHour - if (timeofhour < run_start) - return timeofhour - (run_start - 36000) - return timeofhour - run_start + return TimeOfGame - run_start /datum/controller/process/proc/tickDetail() return diff --git a/code/controllers/ProcessScheduler/core/processScheduler.dm b/code/controllers/ProcessScheduler/core/processScheduler.dm index eccb44c49c5..1c6a0c91a28 100644 --- a/code/controllers/ProcessScheduler/core/processScheduler.dm +++ b/code/controllers/ProcessScheduler/core/processScheduler.dm @@ -43,8 +43,6 @@ var/global/datum/controller/processScheduler/processScheduler var/tmp/currentTick = 0 - var/tmp/currentTickStart = 0 - var/tmp/timeAllowance = 0 var/tmp/cpuAverage = 0 @@ -247,7 +245,7 @@ var/global/datum/controller/processScheduler/processScheduler /datum/controller/processScheduler/proc/recordStart(var/datum/controller/process/process, var/time = null) if (isnull(time)) - time = TimeOfHour + time = TimeOfGame last_queued[process] = world.time last_start[process] = time else @@ -256,11 +254,7 @@ var/global/datum/controller/processScheduler/processScheduler /datum/controller/processScheduler/proc/recordEnd(var/datum/controller/process/process, var/time = null) if (isnull(time)) - time = TimeOfHour - - // If world.timeofday has rolled over, then we need to adjust. - if (time < last_start[process]) - last_start[process] -= 36000 + time = TimeOfGame var/lastRunTime = time - last_start[process] @@ -349,13 +343,12 @@ var/global/datum/controller/processScheduler/processScheduler updateCurrentTickData() return 0 else - return TimeOfHour - currentTickStart + return TimeOfTick /datum/controller/processScheduler/proc/updateCurrentTickData() if (world.time > currentTick) // New tick! currentTick = world.time - currentTickStart = TimeOfHour updateTimeAllowance() cpuAverage = (world.cpu + cpuAverage + cpuAverage) / 3 diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm index 068e3144e73..caaf79a9981 100644 --- a/code/game/objects/explosion.dm +++ b/code/game/objects/explosion.dm @@ -31,7 +31,7 @@ flame_range = min (MAX_EX_FLAME_RANGE, flame_range) spawn(0) - var/start = TimeOfHour + var/watch = start_watch() if(!epicenter) return var/max_range = max(devastation_range, heavy_impact_range, light_impact_range, flame_range) @@ -157,8 +157,7 @@ var/turf/throw_at = get_ranged_target_turf(I, throw_dir, throw_range) I.throw_at(throw_at, throw_range, 2, no_spin = 1) //Throw it at 2 speed, this is purely visual anyway; don't spin the thrown items, it's very costly. */ - var/timeofhour = TimeOfHour - var/took = round((start <= timeofhour) ? ((timeofhour-start)/10) : ((timeofhour-(start-36000))/10), 0.01) + var/took = stop_watch(watch) //You need to press the DebugGame verb to see these now....they were getting annoying and we've collected a fair bit of data. Just -test- changes to explosion code using this please so we can compare if(Debug2) log_to_dd("## DEBUG: Explosion([x0],[y0],[z0])(d[devastation_range],h[heavy_impact_range],l[light_impact_range]): Took [took] seconds.") diff --git a/paradise.dme b/paradise.dme index af0eb57e422..b796d5cd55d 100644 --- a/paradise.dme +++ b/paradise.dme @@ -17,7 +17,6 @@ #include "code\__DEFINES\_readme.dm" #include "code\__DEFINES\admin.dm" #include "code\__DEFINES\atmospherics.dm" -#include "code\__DEFINES\btime.dm" #include "code\__DEFINES\clothing.dm" #include "code\__DEFINES\combat.dm" #include "code\__DEFINES\flags.dm" @@ -173,7 +172,6 @@ #include "code\controllers\Processes\vote.dm" #include "code\controllers\Processes\shuttles\emergency.dm" #include "code\controllers\Processes\shuttles\supply.dm" -#include "code\controllers\ProcessScheduler\core\_stubs.dm" #include "code\controllers\ProcessScheduler\core\process.dm" #include "code\controllers\ProcessScheduler\core\processScheduler.dm" #include "code\datums\ai_law_sets.dm" From a653dfd69dfd59b5826a575c334e24423e30bd3f Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Sat, 12 Mar 2016 00:49:36 -0500 Subject: [PATCH 010/328] god its late --- code/game/gamemodes/changeling/powers/augmented_eyesight.dm | 3 +++ code/modules/surgery/organs/augments_eyes.dm | 2 ++ code/modules/surgery/organs/organ.dm | 2 +- code/modules/surgery/organs/organ_external.dm | 3 ++- code/modules/surgery/organs/organ_internal.dm | 6 ++++++ 5 files changed, 14 insertions(+), 2 deletions(-) diff --git a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm index 832973d4ce6..21d703b9a83 100644 --- a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm +++ b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm @@ -43,6 +43,7 @@ origin_tech = "biotech=4" slot = "eye_ling" status = 0 + aug_message = "We feel a minute twitch in our eyes, our eyes feel more durable." /obj/item/organ/internal/cyberimp/eyes/shield/ling/on_life() ..() @@ -64,6 +65,8 @@ implant_overlay = null origin_tech = "biotech=5;magnets=5" slot = "eye_ling" + darkness_view = 8 + see_darkness = 0 status = 0 aug_message = "We feel a minute twitch in our eyes, and darkness creeps away." diff --git a/code/modules/surgery/organs/augments_eyes.dm b/code/modules/surgery/organs/augments_eyes.dm index 6dcd76bedfa..f3cf645f3a0 100644 --- a/code/modules/surgery/organs/augments_eyes.dm +++ b/code/modules/surgery/organs/augments_eyes.dm @@ -8,6 +8,8 @@ w_class = 1 var/vision_flags = 0 + var/darkness_view = 0 + var/see_darkness = 1 var/list/eye_colour = list(0,0,0) var/list/old_eye_colour = list(0,0,0) var/flash_protect = 0 diff --git a/code/modules/surgery/organs/organ.dm b/code/modules/surgery/organs/organ.dm index fee4aaa1eb6..eceb5d03737 100644 --- a/code/modules/surgery/organs/organ.dm +++ b/code/modules/surgery/organs/organ.dm @@ -81,7 +81,7 @@ var/list/organ_cache = list() return //Process infections - if ((status & ORGAN_ROBOT) || (sterile) ||(owner && owner.species && (owner.species.flags & IS_PLANT))) + if ((status & ORGAN_ROBOT) || sterile == 1 ||(owner && owner.species && (owner.species.flags & IS_PLANT))) germ_level = 0 return diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm index c020b873354..f7c51acc6d7 100644 --- a/code/modules/surgery/organs/organ_external.dm +++ b/code/modules/surgery/organs/organ_external.dm @@ -312,7 +312,8 @@ This function completely restores a damaged organ to perfect condition. // handle internal organs for(var/obj/item/organ/internal/current_organ in internal_organs) - current_organ.rejuvenate() + if(!istype(current_organ,/obj/item/organ/internal/cyberimp)) + current_organ.rejuvenate() // remove embedded objects and drop them on the floor diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 48b97ed4c88..33dd362f81b 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -15,6 +15,12 @@ insert(holder) ..() + +/obj/item/organ/internal/process() + + ..() + + /obj/item/organ/internal/proc/insert(mob/living/carbon/M, special = 0) if(!iscarbon(M) || owner == M) return From 2eaff84f42aba91458cd05fdbb3fe73eeca66a1e Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Sun, 13 Mar 2016 08:08:15 -0400 Subject: [PATCH 011/328] mogjtbosdopm ues --- .../changeling/powers/augmented_eyesight.dm | 6 ++--- code/modules/surgery/organs/augments_eyes.dm | 2 -- code/modules/surgery/organs/organ.dm | 2 +- code/modules/surgery/organs/organ_external.dm | 2 +- code/modules/surgery/organs/organ_internal.dm | 13 +++++------ code/modules/surgery/other.dm | 22 +++++++++++++------ 6 files changed, 26 insertions(+), 21 deletions(-) diff --git a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm index 21d703b9a83..c7a858d7be7 100644 --- a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm +++ b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm @@ -13,7 +13,6 @@ if(!istype(user)) return if(user.get_int_organ(/obj/item/organ/internal/cyberimp/eyes/thermals/ling)) - user << "Our eyes are protected from flashes." var/obj/item/organ/internal/cyberimp/eyes/O = new /obj/item/organ/internal/cyberimp/eyes/shield/ling() O.insert(user) @@ -65,8 +64,6 @@ implant_overlay = null origin_tech = "biotech=5;magnets=5" slot = "eye_ling" - darkness_view = 8 - see_darkness = 0 status = 0 aug_message = "We feel a minute twitch in our eyes, and darkness creeps away." @@ -78,9 +75,12 @@ if(ishuman(owner)) var/mob/living/carbon/human/H = owner H.weakeyes = 1 + if(!H.vision_type) + H.vision_type = new /datum/vision_override/nightvision /obj/item/organ/internal/cyberimp/eyes/thermals/ling/remove(mob/living/carbon/M, special = 0) if(ishuman(owner)) var/mob/living/carbon/human/H = owner H.weakeyes = 0 + H.vision_type = null ..() \ No newline at end of file diff --git a/code/modules/surgery/organs/augments_eyes.dm b/code/modules/surgery/organs/augments_eyes.dm index f3cf645f3a0..6dcd76bedfa 100644 --- a/code/modules/surgery/organs/augments_eyes.dm +++ b/code/modules/surgery/organs/augments_eyes.dm @@ -8,8 +8,6 @@ w_class = 1 var/vision_flags = 0 - var/darkness_view = 0 - var/see_darkness = 1 var/list/eye_colour = list(0,0,0) var/list/old_eye_colour = list(0,0,0) var/flash_protect = 0 diff --git a/code/modules/surgery/organs/organ.dm b/code/modules/surgery/organs/organ.dm index eceb5d03737..5209237339f 100644 --- a/code/modules/surgery/organs/organ.dm +++ b/code/modules/surgery/organs/organ.dm @@ -81,7 +81,7 @@ var/list/organ_cache = list() return //Process infections - if ((status & ORGAN_ROBOT) || sterile == 1 ||(owner && owner.species && (owner.species.flags & IS_PLANT))) + if ((status & ORGAN_ROBOT) || sterile ||(owner && owner.species && (owner.species.flags & IS_PLANT))) germ_level = 0 return diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm index f7c51acc6d7..7060cfa034f 100644 --- a/code/modules/surgery/organs/organ_external.dm +++ b/code/modules/surgery/organs/organ_external.dm @@ -312,7 +312,7 @@ This function completely restores a damaged organ to perfect condition. // handle internal organs for(var/obj/item/organ/internal/current_organ in internal_organs) - if(!istype(current_organ,/obj/item/organ/internal/cyberimp)) + if(!istype(current_organ,/obj/item/organ/internal/cyberimp)|| !istype(current_organ,/obj/item/organ/internal/xenos) || !istype(current_organ,/obj/item/organ/internal/hivelord_core)) current_organ.rejuvenate() diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 33dd362f81b..bff48e21bc4 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -16,15 +16,12 @@ ..() -/obj/item/organ/internal/process() - - ..() - - /obj/item/organ/internal/proc/insert(mob/living/carbon/M, special = 0) if(!iscarbon(M) || owner == M) return + processing_objects -= src + var/obj/item/organ/internal/replaced = M.get_organ_slot(slot) if(replaced) replaced.remove(M, special = 1) @@ -48,6 +45,8 @@ /obj/item/organ/internal/remove(mob/living/carbon/M, special = 0) owner = null + + processing_objects |= src if(M) M.internal_organs -= src if(vital && !special) @@ -350,7 +349,7 @@ /obj/item/organ/internal/shadowtumor/New() ..() - processing_objects.Add(src) + processing_objects |= src /obj/item/organ/internal/shadowtumor/Destroy() processing_objects.Remove(src) @@ -383,7 +382,7 @@ /obj/item/organ/internal/honktumor/New() ..() - processing_objects.Add(src) + processing_objects |= src /obj/item/organ/internal/honktumor/insert(mob/living/carbon/M, special = 0) ..() diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index 004cea35e59..f5859bd6541 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -2,10 +2,16 @@ ////////////////////////////////////////////////////////////////// // INTERNAL WOUND PATCHING // ////////////////////////////////////////////////////////////////// + +/datum/surgery/infection + name = "external infection treatment/autopsy" + steps = list(/datum/surgery_step/generic/cut_open, /datum/surgery_step/generic/retract_skin, /datum/surgery_step/generic/cauterize) + possible_locs = list("chest","head","groin", "l_arm", "r_arm", "l_leg", "r_leg") + /datum/surgery/bleeding name = "internal bleeding" steps = list(/datum/surgery_step/generic/cut_open,/datum/surgery_step/generic/clamp_bleeders,/datum/surgery_step/generic/retract_skin,/datum/surgery_step/fix_vein,/datum/surgery_step/generic/cauterize) - possible_locs = list("chest","head","groin") + possible_locs = list("chest","head","groin", "l_arm", "r_arm", "l_leg", "r_leg") /datum/surgery/bleeding/can_start(mob/user, mob/living/carbon/target) if(ishuman(target)) @@ -14,9 +20,10 @@ if(!affected) return 0 var/internal_bleeding = 0 - for(var/datum/wound/W in affected.wounds) if(W.internal) - internal_bleeding = 1 - break + for(var/datum/wound/W in affected.wounds) + if(W.internal) + internal_bleeding = 1 + break if(internal_bleeding) return 1 return 0 @@ -37,9 +44,10 @@ if(!affected) return 0 var/internal_bleeding = 0 - for(var/datum/wound/W in affected.wounds) if(W.internal) - internal_bleeding = 1 - break + for(var/datum/wound/W in affected.wounds) + if(W.internal) + internal_bleeding = 1 + break return affected.open == 2 && internal_bleeding From 84caa73a3c01a8dca86618f2aa7a3ce6a183f5e5 Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Mon, 14 Mar 2016 23:45:47 -0400 Subject: [PATCH 012/328] rrollback --- code/modules/mob/living/living.dm | 1 - code/modules/surgery/organs/organ_external.dm | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index dd37b374fd1..5e1614f3cff 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -363,7 +363,6 @@ var/mob/living/carbon/C = src C.handcuffed = initial(C.handcuffed) C.heart_attack = 0 - C.brain_op_stage = 0 // restore all of the human's blood and reset their shock stage if(ishuman(src)) diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm index 7060cfa034f..c020b873354 100644 --- a/code/modules/surgery/organs/organ_external.dm +++ b/code/modules/surgery/organs/organ_external.dm @@ -312,8 +312,7 @@ This function completely restores a damaged organ to perfect condition. // handle internal organs for(var/obj/item/organ/internal/current_organ in internal_organs) - if(!istype(current_organ,/obj/item/organ/internal/cyberimp)|| !istype(current_organ,/obj/item/organ/internal/xenos) || !istype(current_organ,/obj/item/organ/internal/hivelord_core)) - current_organ.rejuvenate() + current_organ.rejuvenate() // remove embedded objects and drop them on the floor From 13184b27e7a1955ffeea92306ec0e04e535a1f0f Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Tue, 15 Mar 2016 02:26:50 -0400 Subject: [PATCH 013/328] fixesd an issue with some eyes --- code/modules/surgery/organs/subtypes/diona.dm | 18 +++++++++++++++++ .../surgery/organs/subtypes/machine.dm | 20 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/code/modules/surgery/organs/subtypes/diona.dm b/code/modules/surgery/organs/subtypes/diona.dm index 170f93ecddc..0447cbff139 100644 --- a/code/modules/surgery/organs/subtypes/diona.dm +++ b/code/modules/surgery/organs/subtypes/diona.dm @@ -194,6 +194,24 @@ parent_organ = "head" slot = "eyes" + +/obj/item/organ/internal/diona_receptor/remove(var/mob/living/user,special = 0) + if(!special) + owner.disabilities |= NEARSIGHTED + owner.sdisabilities |= BLIND + owner.eye_blind = 20 + owner.eye_blurry = 40 + ..() + +/obj/item/organ/internal/diona_receptor/surgeryize() + if(!owner) + return + owner.disabilities &= ~NEARSIGHTED + owner.sdisabilities &= ~BLIND + owner.eye_blurry = 0 + owner.eye_blind = 0 + + //TODO:Make absorb rads on insert /obj/item/organ/internal/liver/diona diff --git a/code/modules/surgery/organs/subtypes/machine.dm b/code/modules/surgery/organs/subtypes/machine.dm index 6ba6f5055db..12b3d8aded1 100644 --- a/code/modules/surgery/organs/subtypes/machine.dm +++ b/code/modules/surgery/organs/subtypes/machine.dm @@ -129,6 +129,26 @@ robotize() ..() + +/obj/item/organ/internal/optical_sensor/remove(var/mob/living/user,special = 0) + if(!special) + owner.disabilities |= NEARSIGHTED + owner.sdisabilities |= BLIND + owner.eye_blind = 20 + owner.eye_blurry = 40 + owner << "Error 404:Optical Sensors not found." + + ..() + +/obj/item/organ/internal/optical_sensor/surgeryize() + if(!owner) + return + owner.disabilities &= ~NEARSIGHTED + owner.sdisabilities &= ~BLIND + owner.eye_blurry = 0 + owner.eye_blind = 0 + + // Used for an MMI or posibrain being installed into a human. /obj/item/organ/internal/brain/mmi_holder name = "brain" From 9b4854524b9ecd88f93cbdefaff070be3aad3a49 Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Thu, 10 Mar 2016 23:35:34 -0500 Subject: [PATCH 014/328] boop --- icons/mob/guardian.dmi | Bin 2746 -> 41260 bytes icons/mob/mob.dmi | Bin 249664 -> 238556 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/guardian.dmi b/icons/mob/guardian.dmi index 9db3fbedc689b4c206903be487e836ad431d6187..a84ccec28adf9aa790d7f11b5c88c6604798a7e9 100644 GIT binary patch literal 41260 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 literal 2746 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 CqA-jA delta 40372 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 From 7dbc03555afc2119a7edde61da48d7ef17c540e8 Mon Sep 17 00:00:00 2001 From: taukausanake Date: Tue, 15 Mar 2016 23:37:21 -0500 Subject: [PATCH 015/328] Held mice sprite fix FoS made notice that dead mice don't have a sprite when held. An oversight on my part but I fixed it. Shouldn't cause anymore problems --- code/modules/mob/holder.dm | 1 + icons/obj/objects.dmi | Bin 144613 -> 143638 bytes 2 files changed, 1 insertion(+) diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm index 10ea0c752c7..64ad7a2417c 100644 --- a/code/modules/mob/holder.dm +++ b/code/modules/mob/holder.dm @@ -91,4 +91,5 @@ /obj/item/weapon/holder/mouse name = "mouse" desc = "It's a small, disease-ridden rodent." + icon = 'icons/mob/animal.dmi' icon_state = "mouse_gray" diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi index 225f1b19ed31d8f13c3e298d34f914dc04625799..3ec5db973f520828b0c324d330719ba548a2f1f5 100644 GIT binary patch delta 4739 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 COHR%J delta 5751 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 V$I&xn^%)2Qs60%rSk^f3{{R?pFyR0I From 41d50617195e394df9d94581c132ec11dea70497 Mon Sep 17 00:00:00 2001 From: TravellingMerchant Date: Wed, 16 Mar 2016 06:31:44 +0000 Subject: [PATCH 016/328] I made some new sprites for Kidan. I made some new sprites for the Kidan race. They no longer look like a stick insect. Support for them has been massive on discord and the forums. Gibs and body parts all work fine. No clipping issues with clothes beyond the antenna that the original Kidan have. --- .../living/carbon/human/species/station.dm | 1 + icons/mob/human_face.dmi | Bin 80055 -> 80205 bytes icons/mob/human_races/r_def_kidan.dmi | Bin 6196 -> 1746 bytes icons/mob/human_races/r_kidan.dmi | Bin 6196 -> 1746 bytes 4 files changed, 1 insertion(+) diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 5d1428cf359..46e9bddf9b3 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -350,6 +350,7 @@ flags = IS_WHITELISTED clothing_flags = HAS_SOCKS bodyflags = FEET_CLAWS + eyes = "kidan_eyes" dietflags = DIET_HERB blood_color = "#FB9800" reagent_tag = PROCESS_ORG diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index 83dfb8e81e6fde4fe4bc91fa2847c188425605ca..a126f3d067a3e19bf18bfb6ded2a391fb048461b 100644 GIT binary patch delta 17368 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 delta 17216 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 diff --git a/icons/mob/human_races/r_def_kidan.dmi b/icons/mob/human_races/r_def_kidan.dmi index 13583badd71db00ecf9331fffbfb55a4c9c7cdfe..9cef8f9597cc38ebe83ffe4a9490891c4451ab65 100644 GIT binary patch literal 1746 zcmYjRdpOkj7yf>m8cYUh%B5P9OR?pa9Y!vL5KD%z*fqvRW~Zr0BbOL6mJ;SM%Wqe? z%#2paUCAY3^teS@R0c_7Q|^rWFf!jA+x~vPJ%60{^FGfx?{l8#yytVv-R(3Ip^g9m z0O{;xe-;2h=@SHGVN#%!`g%#h#NE})p}D!)?l9n|4@6o5N0b4GXKD2n0JScTHEk-@-<_Xx04~9rdb&QuU)&Bg|pm1^+l^l8* z0HSi4uXuTJx~4Tf1Y&RF`#5Y8`J%o)paTc(T>J(_!%SxHyUU#*P3Gv{v7eat1Znee zXsakw0KeFwtEQx7&gIj|Dg3v3j*drR3CINShWzb`=LeJ~?#TCES7^OezVy0vdiZd2 z2ZY@C6WbMs+Dv;sl zrB)t)F+`BAFN}bwy%V7?ynFv8`S^>k9ev+Wr=cWG^Q0u0p=&Oav5nx1VhfA) z(V}!rwBV%JXw=Cl6ZyAl@E-O_Q54!6S8SU;(jELZ;-%GnUi(*@*xN}5pRe`xT^ktO zxFqO8IxRn}iu3p1e4t$$`rm=1$aehntxJeu`*K?4$apfcM3n8KYblFg&1Kg%xby+E zH?QJmjr`d$iw&O$de@Rs^;0;<63 zT18^p@&F*rAXX1~+*E)yNz{976}Jyh8c)wc1(7e$&#tb@8GPT#r5#!DKBne{ zlOe7!o>+@oYi7A8z@B3*{oQwO8tfmx+E8PO6NqP!lQBO^Qdi|3{c`P6vjLU0vGa@C zzw$!=tO(kD@>AQs#tmmXs~*LuGHctW2$f&uumL4_R_I7ISkZsk?k(+;-<7@ zW<9%$=yRP@0TGp}J^gr`GKh$(_WXfIEbU9*A^BTA!Vp2DPwODQ9p8bfrAC7(HC79YBvFH46o^w*gnF2IzoK8Xp8ij{ocGi?U*&6Ag1 zB7Df7!2~WaXz%%%AnI-~9j_l_Ix710Xx@&c2N%^v{jrG0j|xutBhu$J1JtX_it*a% z;uMY1Ki#Q1u!P=IKAv^vaR>H(yt@0zdS!CI?<>rTJ1ikAQ@pcHWcWFrkuBaj_u=PO zPdsC3^94lYLhk}Mw%XPy7lf(I6(6BW(bq&nexZ;X)oAY>zR(5tA5~uf>)AUhWe9k1 zaF;6xOm|KwJSL%PBx)4+{Suum=(n`;ci=Q9qTR2CqZ7A&=FnpOT6YGfT`fq!ml>NJ zF8!z&HxQ9>NcFThvE!HiI5Z)OE&Bf#P#w)sJxw{j6+#ulrWp8(Q7JgbPP%F*SPgge ze9U(W`Z$23~Zk_E!#KFVrODE{~Ds(B(!-y@4Xf`ng$TG zpgL-PaIom7-ZyPQay-NDM0V5E!GlKQv>sf)MI=wL)ItSJ*OP8rp&%@$NX@|8s-XUi zC#CPp@h3$m>oi`Z=kjnIcirKps)?~9R-kK--^8`5NjA*kkVv8nvTrLoDYF0P5eYdU~59VV} TEDlU!0=BucgPVQ1U0}jr6DmEe literal 6196 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 TEDlU!0=BucgPVQ1U0}jr6DmEe literal 6196 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 Date: Wed, 16 Mar 2016 03:53:38 -0400 Subject: [PATCH 017/328] bwoink --- code/_onclick/hud/hud.dm | 2 + .../gamemodes/miniantags/guardian/guardian.dm | 124 +++++++++++------- code/game/objects/effects/overlays.dm | 10 ++ 3 files changed, 92 insertions(+), 44 deletions(-) diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index f78bfd929a1..232c0920987 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -96,6 +96,8 @@ var/datum/global_hud/global_hud = new() var/obj/screen/lingchemdisplay var/obj/screen/lingstingdisplay + var/obj/screen/guardianhealthdisplay + var/obj/screen/blobpwrdisplay var/obj/screen/blobhealthdisplay var/obj/screen/vampire_blood_display diff --git a/code/game/gamemodes/miniantags/guardian/guardian.dm b/code/game/gamemodes/miniantags/guardian/guardian.dm index 34a59ac9ac9..81126e26436 100644 --- a/code/game/gamemodes/miniantags/guardian/guardian.dm +++ b/code/game/gamemodes/miniantags/guardian/guardian.dm @@ -6,17 +6,17 @@ response_help = "passes through" response_disarm = "flails at" response_harm = "punches" - icon = 'icons/mob/mob.dmi' - icon_state = "stand" - icon_living = "stand" - icon_dead = "stand" + icon = 'icons/mob/guardian.dmi' + icon_state = "magicOrange" + icon_living = "magicOrange" + icon_dead = "magicOrange" speed = 0 a_intent = I_HARM stop_automated_movement = 1 floating = 1 attack_sound = 'sound/weapons/punch1.ogg' minbodytemp = 0 - maxbodytemp = 10000000 + maxbodytemp = INFINITY min_oxy = 0 max_oxy = INFINITY min_tox = 0 @@ -33,7 +33,6 @@ melee_damage_upper = 15 AIStatus = AI_OFF var/summoned = FALSE - var/animated_manifest = FALSE var/cooldown = 0 var/damage_transfer = 1 //how much damage from each attack we transfer to the owner var/mob/living/summoner @@ -47,6 +46,7 @@ /mob/living/simple_animal/hostile/guardian/Life() //Dies if the summoner dies ..() + updatehudhealth() if(summoner) if(summoner.stat == DEAD) src << "Your summoner has died!" @@ -60,7 +60,11 @@ src << "You moved out of range, and were pulled back! You can only move [range] meters from [summoner.real_name]" visible_message("The [src] jumps back to its user.") Recall() - if(summoned && !summoner) + if(summoned && !summoner && !adminseal) + src << "You somehow lack a summoner! As a result, you dispel!" + ghostize() + qdel() + if(!summoner && !adminseal) src << "You somehow lack a summoner! As a result, you dispel!" ghostize() qdel() @@ -80,6 +84,17 @@ summoner << "Your [name] died somehow!" summoner.death() + +/mob/living/simple_animal/hostile/guardian/proc/updatehudhealth() + if(summoner) + var/resulthealth + if(iscarbon(summoner)) + resulthealth = round((abs(config.health_threshold_dead - summoner.health) / abs(config.health_threshold_dead - summoner.maxHealth)) * 100) + else + resulthealth = round((summoner.health / summoner.maxHealth) * 100) + hud_used.guardianhealthdisplay.maptext = "

" + + /mob/living/simple_animal/hostile/guardian/adjustBruteLoss(amount) //The spirit is invincible, but passes on damage to the summoner var/damage = amount * damage_transfer if (summoner) @@ -92,6 +107,7 @@ if(summoner.stat == UNCONSCIOUS) summoner << "Your body can't take the strain of sustaining [src] in this condition, it begins to fall apart!" summoner.adjustCloneLoss(damage/2) + updatehudhealth() /mob/living/simple_animal/hostile/guardian/ex_act(severity, target) switch (severity) @@ -118,20 +134,16 @@ return if(!summoner) return if(loc == summoner) - loc = get_turf(summoner) + forceMove(summoner) src.client.eye = loc cooldown = world.time + 30 - if(animated_manifest) - var/end_icon = icon_state - icon_state = "parasite_forming" - spawn(6) - icon_state = end_icon /mob/living/simple_animal/hostile/guardian/proc/Recall() if(cooldown > world.time) return if(!summoner) return - loc = summoner + new /obj/effect/overlay/temp/guardian/phase/out(get_turf(src)) + forceMove(summoner) buckled = null cooldown = world.time + 30 @@ -204,8 +216,10 @@ /mob/living/simple_animal/hostile/guardian/proc/ToggleLight() if(!luminosity) set_light(3) + src << "You activate your light." else set_light(0) + src << "You deactivate your light." //////////////////////////TYPES OF GUARDIANS @@ -234,12 +248,10 @@ summoner.adjust_fire_stacks(-20) /mob/living/simple_animal/hostile/guardian/fire/AttackingTarget() - ..() - if(prob(45)) - if(istype(target, /atom/movable)) - var/atom/movable/M = target - if(!M.anchored && M != summoner) - do_teleport(M, M, 10) + if(..()) + if(ishuman(target)) + spawn(0) + new /obj/effect/hallucination/delusion(target.loc,target,force_kind="custom",duration=200,skip_nearby=0, custom_icon = src.icon_state, custom_icon_file = src.icon) /mob/living/simple_animal/hostile/guardian/fire/Crossed(AM as mob|obj) ..() @@ -446,7 +458,9 @@ if((Z.temperature > 270) && (Z.temperature < 360)) var/pressure = Z.return_pressure() if((pressure > 20) && (pressure < 550)) + new /obj/effect/overlay/temp/guardian/phase/out(get_turf(A)) do_teleport(A, beacon, 0) + new /obj/effect/overlay/temp/guardian/phase(get_turf(A)) else src << "The beacon isn't in a safe location!" else @@ -477,6 +491,8 @@ projectilesound = 'sound/effects/hit_on_shattered_glass.ogg' ranged = 1 range = 13 + see_invisible = SEE_INVISIBLE_MINIMUM + see_in_dark = 8 playstyle_string = "As a ranged type, you have only light damage resistance, but are capable of spraying shards of crystal at incredibly high speed. You can also deploy surveillance snares to monitor enemy movement. Finally, you can switch to scout mode, in which you can't attack, but can move without limit." magic_fluff_string = "..And draw the Sentinel, an alien master of ranged combat." tech_fluff_string = "Boot sequence complete. Ranged combat modules active. Holoparasite swarm online." @@ -507,6 +523,14 @@ else src << "You have to be recalled to toggle modes!" +/mob/living/simple_animal/hostile/guardian/ranged/ToggleLight() + if(see_invisible == SEE_INVISIBLE_MINIMUM) + src << "You deactivate your night vision." + see_invisible = SEE_INVISIBLE_LIVING + else + src << "You activate your night vision." + see_invisible = SEE_INVISIBLE_MINIMUM + /mob/living/simple_animal/hostile/guardian/ranged/verb/Snare() set name = "Set Surveillance Trap" set category = "Guardian" @@ -675,7 +699,6 @@ else gaurdiantype = input(user, "Pick the type of [mob_name]", "[mob_name] Creation") as null|anything in possible_guardians var/pickedtype = /mob/living/simple_animal/hostile/guardian/punch - var/picked_color = pick("#FFFFFF","#000000","#808080","#A52A2A","#FF0000","#8B0000","#DC143C","#FFA500","#FFFF00","#008000","#00FF00","#006400","#00FFFF","#0000FF","#000080","#008080","#800080","#4B0082") switch(gaurdiantype) if("Chaos") @@ -705,29 +728,42 @@ user.verbs += /mob/living/proc/guardian_comm user.verbs += /mob/living/proc/guardian_recall user.verbs += /mob/living/proc/guardian_reset - var/magic_suite = pick("Wands","Cups","Swords","Pentacles") - var/picked_name = pick("Aries", "Leo", "Sagittarius", "Taurus", "Virgo", "Capricorn", "Gemini", "Libra", "Aquarius", "Cancer", "Scorpio", "Pisces") + + var/color + var/picked_name + var/picked_color = pick("#FFFFFF","#000000","#808080","#A52A2A","#FF0000","#8B0000","#DC143C","#FFA500","#FFFF00","#008000","#00FF00","#006400","#00FFFF","#0000FF","#000080","#008080","#800080","#4B0082") + switch (theme) if("magic") - G.name = "[mob_name] of [magic_suite]" - G.color = picked_color - G.real_name = "[mob_name] of [magic_suite]" + color = pick("Pink", "Red", "Orange", "Green", "Blue") + picked_name = pick("Aries", "Leo", "Sagittarius", "Taurus", "Virgo", "Capricorn", "Gemini", "Libra", "Aquarius", "Cancer", "Scorpio", "Pisces") + + G.name = "[picked_name] [color]" + G.real_name = "[picked_name] [color]" + G.icon_living = "[theme][color]" + G.icon_state = "[theme][color]" + G.icon_dead = "[theme][color]" + user << "[G.magic_fluff_string]." if("tech") - var/colour = pick("orange", "neon", "pink", "red", "blue", "green") - G.name = "[picked_name] [capitalize(colour)]" - G.real_name = "[picked_name] [capitalize(colour)]" - G.icon_living = "parasite[colour]" - G.icon_state = "parasite[colour]" - G.icon_dead = "parasite[colour]" - G.animated_manifest = TRUE + color = pick("Rose", "Peony", "Lily", "Daisy", "Zinnia", "Ivy", "Iris", "Petunia", "Violet", "Lilac", "Orchid") //technically not colors, just flowers that can be specific colors + picked_name = pick("Gallium", "Indium", "Thallium", "Bismuth", "Aluminium", "Mercury", "Iron", "Silver", "Zinc", "Titanium", "Chromium", "Nickel", "Platinum", "Tellurium", "Palladium", "Rhodium", "Cobalt", "Osmium", "Tungsten", "Iridium") + + G.name = "[picked_name] [color]" + G.real_name = "[picked_name] [color]" + G.icon_living = "[theme][color]" + G.icon_state = "[theme][color]" + G.icon_dead = "[theme][color]" + user << "[G.tech_fluff_string]." G.speak_emote = list("states") if("bio") + G.icon = 'icons/mob/mob.dmi' + picked_name = pick("brood", "hive", "nest") user << "[G.bio_fluff_string]." - G.name = "[mob_name] [picked_name]" + G.name = "[picked_name] swarm" G.color = picked_color - G.real_name = "[mob_name] [picked_name]" + G.real_name = "[picked_name] swarm" G.icon_living = "headcrab" G.icon_state = "headcrab" G.attacktext = "swarms" @@ -798,17 +834,17 @@ - - - - -///HUD - -/datum/hud/proc/guardian_hud(ui_style = 'icons/mob/screen1_midnight.dmi') +/datum/hud/proc/guardian_hud(ui_style = 'icons/mob/screen1_Midnight.dmi') adding = list() var/obj/screen/using + guardianhealthdisplay = new /obj/screen/guardian() + guardianhealthdisplay.name = "summoner health" + guardianhealthdisplay.screen_loc = ui_health + guardianhealthdisplay.mouse_opacity = 0 + adding += guardianhealthdisplay + using = new /obj/screen/guardian/Manifest() using.screen_loc = ui_rhand adding += using @@ -834,12 +870,11 @@ mymob.client.screen += adding - - //HUD BUTTONS /obj/screen/guardian icon = 'icons/mob/guardian.dmi' + icon_state = "base" /obj/screen/guardian/Manifest icon_state = "manifest" @@ -882,6 +917,7 @@ var/mob/living/simple_animal/hostile/guardian/G = usr G.Communicate() + /obj/screen/guardian/ToggleLight icon_state = "light" name = "Toggle Light" diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index e1dc0b4108e..35ed65ad0df 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -43,6 +43,16 @@ icon_state = "purplecrack" duration = 6 +/obj/effect/overlay/temp/guardian + randomdir = 0 + +/obj/effect/overlay/temp/guardian/phase + duration = 5 + icon_state = "phasein" + +/obj/effect/overlay/temp/guardian/phase/out + icon_state = "phaseout" + /obj/effect/overlay/temp/emp name = "emp sparks" icon = 'icons/effects/effects.dmi' From 4f6b658e3b85332f996e6768020211556f3553ec Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Wed, 16 Mar 2016 07:26:33 -0400 Subject: [PATCH 018/328] Tweaks Regeneration Mutation --- code/modules/mob/living/carbon/human/life.dm | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 7ed777ebf77..2b80da048a4 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -200,11 +200,6 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc adjustCloneLoss(0.1) /mob/living/carbon/human/handle_mutations_and_radiation() - if(getFireLoss()) - if((RESIST_HEAT in mutations) || (prob(1))) - heal_organ_damage(0,1) - - for(var/datum/dna/gene/gene in dna_genes) if(!gene.block) continue @@ -833,13 +828,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc if(.) //alive if(REGEN in mutations) - if(nutrition) - if(prob(10)) - var/randumb = rand(1, 5) - nutrition -= randumb - heal_overall_damage(randumb, randumb) - if(nutrition < 0) - nutrition = 0 + heal_overall_damage(0.1, 0.1) if(!in_stasis) handle_organs() From b64d5012f704d01c307caa6d49f856aee62c01fa Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Wed, 16 Mar 2016 08:04:03 -0400 Subject: [PATCH 019/328] added hallucinate code i had to redo hallucinate for it to work...cuase reasons. Ranged does a burst fire, increased the cooldown cap cuase DAMN --- .../gamemodes/miniantags/guardian/guardian.dm | 11 +++++----- code/modules/flufftext/Hallucination.dm | 20 +++++++++++-------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/code/game/gamemodes/miniantags/guardian/guardian.dm b/code/game/gamemodes/miniantags/guardian/guardian.dm index 81126e26436..6476dcff1e6 100644 --- a/code/game/gamemodes/miniantags/guardian/guardian.dm +++ b/code/game/gamemodes/miniantags/guardian/guardian.dm @@ -64,10 +64,10 @@ src << "You somehow lack a summoner! As a result, you dispel!" ghostize() qdel() - if(!summoner && !adminseal) - src << "You somehow lack a summoner! As a result, you dispel!" - ghostize() - qdel() + //if(!summoner && !adminseal) + // src << "You somehow lack a summoner! As a result, you dispel!" + // ghostize() + // qdel() /mob/living/simple_animal/hostile/guardian/Move() //Returns to summoner if they move out of range ..() @@ -487,9 +487,10 @@ melee_damage_upper = 10 damage_transfer = 0.9 projectiletype = /obj/item/projectile/guardian - ranged_cooldown_cap = 1 + ranged_cooldown_cap = 2 projectilesound = 'sound/effects/hit_on_shattered_glass.ogg' ranged = 1 + rapid = 1 range = 13 see_invisible = SEE_INVISIBLE_MINIMUM see_in_dark = 8 diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 0151136b580..34b74aff54d 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -325,29 +325,33 @@ Gunshots/explosions/opening doors/less rare audio (done) /obj/effect/hallucination/delusion var/list/image/delusions = list() -/obj/effect/hallucination/delusion/New(loc,var/mob/living/carbon/T) +/obj/effect/hallucination/delusion/New(loc,mob/living/carbon/T,force_kind = null , duration = 300,skip_nearby = 1, custom_icon = null, custom_icon_file = null) target = T var/image/A = null - var/kind = rand(1,3) + var/kind = force_kind ? force_kind : pick("clown","corgi","carp","skeleton","demon") for(var/mob/living/carbon/human/H in living_mob_list) if(H == target) continue - if(H in view(target)) + if(skip_nearby && (H in view(target))) continue switch(kind) - if(1)//Clown + if("clown")//Clown A = image('icons/mob/animal.dmi',H,"clown") - if(2)//Carp + if("carp")//Carp A = image('icons/mob/animal.dmi',H,"carp") - if(3)//Corgi + if("corgi")//Corgi A = image('icons/mob/pets.dmi',H,"corgi") - if(4)//Skeletons + if("skeleton")//Skeletons A = image('icons/mob/human.dmi',H,"skeleton_s") + if("demon")//Demon + A = image('icons/mob/mob.dmi',H,"daemon") + if("custom") + A = image(custom_icon_file, H, custom_icon) A.override = 1 if(target.client) delusions |= A target.client.images |= A - sleep(300) + sleep(duration) for(var/image/I in delusions) if(target.client) target.client.images.Remove(I) From b16d1c0e7ce2a706d42d244bf06adafb20c4a50f Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Thu, 17 Mar 2016 00:01:33 -0400 Subject: [PATCH 020/328] pewpewpew --- code/game/gamemodes/miniantags/guardian/guardian.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/miniantags/guardian/guardian.dm b/code/game/gamemodes/miniantags/guardian/guardian.dm index 6476dcff1e6..b0c1ffd7e6d 100644 --- a/code/game/gamemodes/miniantags/guardian/guardian.dm +++ b/code/game/gamemodes/miniantags/guardian/guardian.dm @@ -487,7 +487,7 @@ melee_damage_upper = 10 damage_transfer = 0.9 projectiletype = /obj/item/projectile/guardian - ranged_cooldown_cap = 2 + ranged_cooldown_cap = 1 projectilesound = 'sound/effects/hit_on_shattered_glass.ogg' ranged = 1 rapid = 1 From 4a2bd5cc1675f3ea54348495f178c72934a63161 Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Thu, 17 Mar 2016 02:09:41 -0400 Subject: [PATCH 021/328] infection surgery edit --- code/modules/surgery/other.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index f5859bd6541..37192dbdc72 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -5,7 +5,7 @@ /datum/surgery/infection name = "external infection treatment/autopsy" - steps = list(/datum/surgery_step/generic/cut_open, /datum/surgery_step/generic/retract_skin, /datum/surgery_step/generic/cauterize) + steps = list(/datum/surgery_step/generic/cut_open, /datum/surgery_step/generic/cauterize) possible_locs = list("chest","head","groin", "l_arm", "r_arm", "l_leg", "r_leg") /datum/surgery/bleeding From 24addbd6cea6e7d6f8a4743441f767cb05c2f3d9 Mon Sep 17 00:00:00 2001 From: Regen Date: Thu, 17 Mar 2016 19:29:02 +0100 Subject: [PATCH 022/328] Makes robotic hearts fail when EMP'd People with robotic hearts will now get a heart attack if subject to an EMP Engineers stay away from the singularity --- code/modules/surgery/organs/organ.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/modules/surgery/organs/organ.dm b/code/modules/surgery/organs/organ.dm index e3b7f49abc4..b4b20f0bec2 100644 --- a/code/modules/surgery/organs/organ.dm +++ b/code/modules/surgery/organs/organ.dm @@ -256,6 +256,11 @@ var/list/organ_cache = list() if(3.0) take_damage(0,3) +/obj/item/organ/internal/heart/emp_act(intensity) + if(owner && robotic) + owner.heart_attack = 1 + owner.visible_message("[owner] clutches their chest and gasps!","You clutch your chest in pain!") + /obj/item/organ/proc/remove(var/mob/living/user,special = 0) if(!istype(owner)) return From e00a15b579dc32a251f5ada81d2c6e65c0e60a81 Mon Sep 17 00:00:00 2001 From: Regen Date: Thu, 17 Mar 2016 19:33:55 +0100 Subject: [PATCH 023/328] Internal organ fix This should fix internal robotic organs not being damaged by EMP's according to @Crazylemon64 --- code/modules/surgery/organs/organ.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/surgery/organs/organ.dm b/code/modules/surgery/organs/organ.dm index b4b20f0bec2..33bb8a41718 100644 --- a/code/modules/surgery/organs/organ.dm +++ b/code/modules/surgery/organs/organ.dm @@ -248,13 +248,13 @@ var/list/organ_cache = list() return switch (severity) if (1.0) - take_damage(0,20) + take_damage(20,0) return if (2.0) - take_damage(0,7) + take_damage(7,0) return if(3.0) - take_damage(0,3) + take_damage(3,0) /obj/item/organ/internal/heart/emp_act(intensity) if(owner && robotic) From d44db09ddf0ee79dc0e98ba00d14f1ccf6ed6cc4 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 17 Mar 2016 15:26:20 -0400 Subject: [PATCH 024/328] Automatic changelog generation for PR #3904 --- html/changelogs/AutoChangeLog-pr-3904.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3904.yml diff --git a/html/changelogs/AutoChangeLog-pr-3904.yml b/html/changelogs/AutoChangeLog-pr-3904.yml new file mode 100644 index 00000000000..7b4979d3dd3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3904.yml @@ -0,0 +1,4 @@ +author: TravellingMerchant +delete-after: True +changes: + - imageadd: "Kidan have new sprites!" From 509683af8c5e326fba5e9a5cb63fac80f95bfff6 Mon Sep 17 00:00:00 2001 From: Regen Date: Thu, 17 Mar 2016 21:20:01 +0100 Subject: [PATCH 025/328] Changes --- code/modules/surgery/organs/organ.dm | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/code/modules/surgery/organs/organ.dm b/code/modules/surgery/organs/organ.dm index 33bb8a41718..32bca624bc6 100644 --- a/code/modules/surgery/organs/organ.dm +++ b/code/modules/surgery/organs/organ.dm @@ -256,10 +256,29 @@ var/list/organ_cache = list() if(3.0) take_damage(3,0) +/obj/item/organ/internal/emp_act(severity) + if(!robotic) + return + if(ORGAN_ROBOT) + switch (severity) + if (1.0) + take_damage(20,1) + return + if (2.0) + take_damage(7,1) + return + if(3.0) + take_damage(3,1) + else if(ORGAN_ASSISTED) + take_damage(11,1) + /obj/item/organ/internal/heart/emp_act(intensity) - if(owner && robotic) + if(owner && robotic == 2) owner.heart_attack = 1 owner.visible_message("[owner] clutches their chest and gasps!","You clutch your chest in pain!") + return + else if(owner && robotic == 1) + take_damage(11,1) /obj/item/organ/proc/remove(var/mob/living/user,special = 0) if(!istype(owner)) From 09f10f3e9866de5ce1a580355ef2ba17051ed36f Mon Sep 17 00:00:00 2001 From: Crazylemon64 Date: Thu, 17 Mar 2016 13:44:21 -0700 Subject: [PATCH 026/328] Fixes multibrain weirdness --- code/modules/mob/living/carbon/brain/brain_item.dm | 4 ++-- code/modules/surgery/organs/organ_external.dm | 6 +++--- code/modules/surgery/organs/organ_internal.dm | 8 ++++++-- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm index e95315bb88c..cf0297ac4ea 100644 --- a/code/modules/mob/living/carbon/brain/brain_item.dm +++ b/code/modules/mob/living/carbon/brain/brain_item.dm @@ -67,7 +67,7 @@ if(borer) borer.detatch() //Should remove borer if the brain is removed - RR - if(owner.mind)//don't transfer if the owner does not have a mind. + if(owner.mind && !non_primary)//don't transfer if the owner does not have a mind. B.transfer_identity(user) if(istype(owner,/mob/living/carbon/human)) @@ -94,7 +94,7 @@ brainmob.mind.transfer_to(target) else target.key = brainmob.key - ..() + ..(target, special = special, dont_remove_slot = brain_already_exists) /obj/item/organ/internal/brain/prepare_eat() return // Too important to eat. diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm index c020b873354..2cddf6e490b 100644 --- a/code/modules/surgery/organs/organ_external.dm +++ b/code/modules/surgery/organs/organ_external.dm @@ -105,7 +105,7 @@ O.status |= ORGAN_CUT_AWAY if(!O.sterile) spread_germs_to_organ(O,user) // This wouldn't be any cleaner than the actual surgery - O.forceMove(src) + O.forceMove(get_turf(src)) if(!(user.l_hand && user.r_hand)) user.put_in_hands(removing) user.visible_message("[user] extracts [removing] from [src] with [W]!") @@ -892,13 +892,13 @@ Note that amputating the affected organ does in fact remove the infection from t // Attached organs also fly off. if(!ignore_children) for(var/obj/item/organ/external/O in children) - O.remove() + O.remove(victim) if(O) O.forceMove(src) // Grab all the internal giblets too. for(var/obj/item/organ/internal/organ in internal_organs) - organ.remove() + organ.remove(victim) organ.forceMove(src) release_restraints(victim) diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 48b97ed4c88..693feff936a 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -9,19 +9,23 @@ var/slot vital = 0 var/organ_action_name = null + var/non_primary = 0 /obj/item/organ/internal/New(var/mob/living/carbon/holder) if(istype(holder)) insert(holder) ..() -/obj/item/organ/internal/proc/insert(mob/living/carbon/M, special = 0) +/obj/item/organ/internal/proc/insert(mob/living/carbon/M, special = 0, var/dont_remove_slot = 0) if(!iscarbon(M) || owner == M) return var/obj/item/organ/internal/replaced = M.get_organ_slot(slot) if(replaced) - replaced.remove(M, special = 1) + if(dont_remove_slot) + non_primary = 1 + else + replaced.remove(M, special = 1) owner = M From c5df54260319b0308730b53983a62f1fcf66cf7a Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 17 Mar 2016 17:24:01 -0400 Subject: [PATCH 027/328] Automatic changelog generation for PR #3915 --- html/changelogs/AutoChangeLog-pr-3915.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3915.yml diff --git a/html/changelogs/AutoChangeLog-pr-3915.yml b/html/changelogs/AutoChangeLog-pr-3915.yml new file mode 100644 index 00000000000..cbffe8ad140 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3915.yml @@ -0,0 +1,4 @@ +author: Crazylemon64 +delete-after: True +changes: + - bugfix: "Repairs all sorts of eldritch occurences that happen when you put an organic head on an IPC body, as well as some decapitation bugs" From 98285c0518a65eb34a91c55e7d15ff1166ab565e Mon Sep 17 00:00:00 2001 From: KasparoVy Date: Thu, 17 Mar 2016 20:37:41 -0400 Subject: [PATCH 028/328] No longer, I hope. --- code/__DEFINES/flags.dm | 1 + code/__HELPERS/mobs.dm | 1 + code/_globalvars/lists/flavor_misc.dm | 2 +- code/game/objects/items/weapons/cosmetics.dm | 8 + code/game/objects/items/weapons/scissors.dm | 18 ++- code/modules/admin/admin_verbs.dm | 26 +++- code/modules/client/preferences.dm | 146 +++++++++++++----- .../mob/living/carbon/human/appearance.dm | 55 ++++++- code/modules/mob/living/carbon/human/human.dm | 40 +++-- .../living/carbon/human/species/station.dm | 6 +- .../mob/living/carbon/human/update_icons.dm | 4 +- .../mob/new_player/preferences_setup.dm | 4 +- .../mob/new_player/sprite_accessories.dm | 56 +++++-- code/modules/surgery/organs/robolimbs.dm | 25 +-- icons/mob/body_accessory.dmi | Bin 3999 -> 4069 bytes icons/mob/human_face.dmi | Bin 80205 -> 80515 bytes icons/mob/human_races/cyberlimbs/bishop.dmi | Bin 2642 -> 4617 bytes .../human_races/cyberlimbs/hesphaistos.dmi | Bin 2755 -> 4378 bytes .../human_races/cyberlimbs/wardtakahashi.dmi | Bin 1028 -> 1589 bytes icons/mob/human_races/cyberlimbs/xion.dmi | Bin 2426 -> 3955 bytes icons/mob/human_races/cyberlimbs/zenghu.dmi | Bin 2214 -> 1403 bytes icons/mob/human_races/robotic.dmi | Bin 3932 -> 1569 bytes 22 files changed, 292 insertions(+), 100 deletions(-) diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 2c5c77ffa9c..5c1f427a27e 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -49,6 +49,7 @@ #define NO_INTORGANS 4096 #define NO_POISON 8192 #define RADIMMUNE 16384 +#define ALL_RPARTS 32768 //Species clothing flags #define HAS_UNDERWEAR 1 diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index e30e904a462..001f2b148ce 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -46,6 +46,7 @@ proc/random_hair_style(var/gender, species = "Human") continue if( !(species in S.species_allowed)) continue + valid_hairstyles[hairstyle] = hair_styles_list[hairstyle] if(valid_hairstyles.len) diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 0cf3a0d2853..ba8513981ea 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -2,7 +2,7 @@ //Head accessory styles var/global/list/head_accessory_styles_list = list() //stores /datum/sprite_accessory/head_accessory indexed by name //Marking styles -var/global/list/marking_styles_list = list() //stores /datum/sprite_accessory/horns indexed by name +var/global/list/marking_styles_list = list() //stores /datum/sprite_accessory/body_markings indexed by name //Hairstyles var/global/list/hair_styles_list = list() //stores /datum/sprite_accessory/hair indexed by name var/global/list/hair_styles_male_list = list() diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm index 409679d4ac3..8a413049af4 100644 --- a/code/game/objects/items/weapons/cosmetics.dm +++ b/code/game/objects/items/weapons/cosmetics.dm @@ -95,6 +95,10 @@ if(!get_location_accessible(H, "mouth")) user << "The mask is in the way." return + if(H.species && H.species.flags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, but doesn't have one... + if(!H.client.prefs.rlimb_data["head"]) + user << "You find yourself disappointed at the appalling lack of facial hair." + return if(H.f_style == "Shaved") user << "Already clean-shaven." return @@ -123,6 +127,10 @@ if(!get_location_accessible(H, "head")) user << "The headgear is in the way." return + if(H.species && H.species.flags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, but doesn't have one... + if(!H.client.prefs.rlimb_data["head"]) + user << "You find yourself disappointed at the appalling lack of hair." + return if(H.h_style == "Bald" || H.h_style == "Balding Hair" || H.h_style == "Skinhead") user << "There is not enough hair left to shave..." return diff --git a/code/game/objects/items/weapons/scissors.dm b/code/game/objects/items/weapons/scissors.dm index 577f4b113b3..34b700d440d 100644 --- a/code/game/objects/items/weapons/scissors.dm +++ b/code/game/objects/items/weapons/scissors.dm @@ -34,8 +34,14 @@ if(H.species) for(var/i in facial_hair_styles_list) var/datum/sprite_accessory/facial_hair/tmp_facial = facial_hair_styles_list[i] - if(H.species.name in tmp_facial.species_allowed) + if(H.species.name in tmp_facial.species_allowed) //If the species is allowed to have the style, add the style to the list. Or, if the character has a prosthetic head, give them the human hair styles. species_facial_hair += i + else + if(H.species.flags & ALL_RPARTS) + if(("head" in H.client.prefs.rlimb_data) && ("Human" in tmp_facial.species_allowed)) + species_facial_hair += i + else + return else species_facial_hair = facial_hair_styles_list var/f_new_style = input(user, "Select a facial hair style", "Grooming") as null|anything in species_facial_hair @@ -44,8 +50,16 @@ if(H.species) for(var/i in hair_styles_list) var/datum/sprite_accessory/hair/tmp_hair = hair_styles_list[i] - if(H.species.name in tmp_hair.species_allowed) + if(H.species.name in tmp_hair.species_allowed) //If the species is allowed to have the style, add the style to the list. Or, if the character has a prosthetic head, give them the human facial hair styles. + if((H.species.flags & ALL_RPARTS) && !("head" in H.client.prefs.rlimb_data)) + return species_hair += i + else + if(H.species.flags & ALL_RPARTS) + if(("head" in H.client.prefs.rlimb_data) && ("Human" in tmp_hair.species_allowed)) + species_facial_hair += i + else + return else species_hair = hair_styles_list var/h_new_style = input(user, "Select a hair style", "Grooming") as null|anything in species_hair diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 4e0fbd3a666..f6a903ac10e 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -446,7 +446,7 @@ var/list/admin_verbs_proccall = list ( /client/proc/big_brother() set category = "Admin" set name = "Big Brother Mode" - + if(!check_rights(R_PERMISSIONS)) return @@ -809,7 +809,17 @@ var/list/admin_verbs_proccall = list ( return if(!istype(H)) - return + if(istype(H, /mob/living/carbon/brain)) + var/mob/living/carbon/brain/B = H + if(istype(B.container, /obj/item/device/mmi/posibrain/ipc)) + var/obj/item/device/mmi/posibrain/ipc/C = B.container + var/obj/item/organ/internal/brain/mmi_holder/posibrain/P = C.loc + if(istype(P.owner, /mob/living/carbon/human)) + H = P.owner + else + return + else + return if(holder) admin_log_and_message_admins("is altering the appearance of [H].") @@ -825,7 +835,17 @@ var/list/admin_verbs_proccall = list ( return if(!istype(H)) - return + if(istype(H, /mob/living/carbon/brain)) + var/mob/living/carbon/brain/B = H + if(istype(B.container, /obj/item/device/mmi/posibrain/ipc)) + var/obj/item/device/mmi/posibrain/ipc/C = B.container + var/obj/item/organ/internal/brain/mmi_holder/posibrain/P = C.loc + if(istype(P.owner, /mob/living/carbon/human)) + H = P.owner + else + return + else + return if(!H.client) usr << "Only mobs with clients can alter their own appearance." diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 077af57dfee..650cce78080 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -255,7 +255,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts // dat += "Skin pattern: Adjust
" dat += "
Handicaps
" dat += "\t\[Set Disabilities\]
" - dat += "Limbs: Adjust
" + dat += "Limbs and Parts: Adjust
" if(species != "Slime People" && species != "Machine") dat += "Internal Organs: Adjust
" @@ -266,6 +266,12 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts var/status = organ_data[name] var/organ_name = null switch(name) + if("chest") + organ_name = "torso" + if("groin") + organ_name = "lower body" + if("head") + organ_name = "head" if("l_arm") organ_name = "left arm" if("r_arm") @@ -296,7 +302,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts R = all_robolimbs[rlimb_data[name]] else R = basic_robolimb - dat += "\t[R.company] [organ_name] prothesis" + dat += "\t[R.company] [organ_name] prosthesis" else if(status == "amputated") @@ -350,7 +356,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts dat += "[TextPreview(flavor_text)]...
" dat += "
" - if((species in list("Unathi", "Vulpkanin", "Tajaran"))) //Species that have head accessories. + if((species in list("Unathi", "Vulpkanin", "Tajaran", "Machine"))) //Species that have head accessories. var/headaccessoryname = "Head Accessory" if(species == "Unathi") headaccessoryname = "Horns" @@ -358,23 +364,22 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts dat += "Change Color
__
" dat += "Style: [ha_style]
" + if((species in list("Unathi", "Vulpkanin", "Tajaran", "Machine"))) //Species that have body markings. dat += "
Body Markings
" dat += "Change Color
__
" dat += "
Style: [m_style]
" - var/hairname = "Hair" - if(species == "Machine") - hairname = "Frame Color" - dat += "
[hairname]
" + dat += "
Hair
" dat += "Change Color
__
" dat += "
Style: [h_style]
" - dat += "
Facial
" + dat += "
Facial Hair
" dat += "Change Color
__
" - dat += "
Style: [f_style]
" + dat += "
Style: [f_style ? "[f_style]" : "Shaved"]
" - dat += "
Eyes
" - dat += "Change Color
__

" + if(species != "Machine") + dat += "
Eyes
" + dat += "Change Color
__

" if((species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine")) || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) //admins can always fuck with this, because they are admins dat += "
Body Color
" @@ -1060,7 +1065,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts age = max(min( round(text2num(new_age)), AGE_MAX),AGE_MIN) if("species") - var/list/new_species = list("Human","Tajaran","Skrell","Unathi","Diona", "Vulpkanin") + var/list/new_species = list("Human", "Tajaran", "Skrell", "Unathi", "Diona", "Vulpkanin") var/prev_species = species // var/whitelisted = 0 @@ -1087,6 +1092,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts continue if( !(species in S.species_allowed)) continue + valid_hairstyles[hairstyle] = hair_styles_list[hairstyle] if(valid_hairstyles.len) @@ -1138,6 +1144,10 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts m_style = "None" // No Unathi markings on Tajara body_accessory = null //no vulptail on humans damnit + + //Reset prosthetics. + organ_data = list() + rlimb_data = list() if("speciesprefs")//oldvox code speciesprefs = !speciesprefs @@ -1176,7 +1186,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if("hair") if(species == "Human" || species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Machine" || species == "Vulpkanin") var/input = "Choose your character's hair colour:" - if(species == "Machine") + if(species == "Machine" && !("head" in rlimb_data)) input = "Choose your character's frame colour:" var/new_hair = input(user, input, "Character Preference", rgb(r_hair, g_hair, b_hair)) as color|null if(new_hair) @@ -1188,17 +1198,31 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts var/list/valid_hairstyles = list() for(var/hairstyle in hair_styles_list) var/datum/sprite_accessory/S = hair_styles_list[hairstyle] - if( !(species in S.species_allowed)) - continue + if(species == "Machine") //Species that can use prosthetic heads. + if((species in S.species_allowed)) + if(!rlimb_data["head"]) + valid_hairstyles[hairstyle] = S + continue + else + continue + else + if(!rlimb_data["head"]) + continue + else if(("Human" in S.species_allowed)) + valid_hairstyles[hairstyle] = S + continue + else + if(!(species in S.species_allowed)) + continue - valid_hairstyles[hairstyle] = hair_styles_list[hairstyle] + valid_hairstyles[hairstyle] = S var/new_h_style = input(user, "Choose your character's hair style:", "Character Preference") as null|anything in valid_hairstyles if(new_h_style) h_style = new_h_style if("headaccessory") - if((species in list("Unathi", "Vulpkanin", "Tajaran"))) // Species with head accessories + if((species in list("Unathi", "Vulpkanin", "Tajaran", "Machine"))) // Species with head accessories var/input = "Choose the colour of your your character's head accessory:" var/new_head_accessory = input(user, input, "Character Preference", rgb(r_headacc, g_headacc, b_headacc)) as color|null if(new_head_accessory) @@ -1207,7 +1231,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts b_headacc = hex2num(copytext(new_head_accessory, 6, 8)) if("ha_style") - if((species in list("Unathi", "Vulpkanin", "Tajaran"))) // Species with head accessories + if((species in list("Unathi", "Vulpkanin", "Tajaran", "Machine"))) // Species with head accessories var/list/valid_head_accessory_styles = list() for(var/head_accessory_style in head_accessory_styles_list) var/datum/sprite_accessory/H = head_accessory_styles_list[head_accessory_style] @@ -1221,8 +1245,8 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts ha_style = new_head_accessory_style if("markings") - if((species in list("Unathi", "Vulpkanin", "Tajaran"))) // Species with markings - var/input = "Choose the colour of your your character's body markings:" + if((species in list("Unathi", "Vulpkanin", "Tajaran", "Machine"))) // Species with markings + var/input = "Choose the colour of your your character's markings:" var/new_markings = input(user, input, "Character Preference", rgb(r_markings, g_markings, b_markings)) as color|null if(new_markings) r_markings = hex2num(copytext(new_markings, 2, 4)) @@ -1237,9 +1261,15 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if( !(species in M.species_allowed)) continue + if(species == "Machine") //Species that can use prosthetic heads. + if(!("head" in rlimb_data) && M.name != "None") //If the character can have prosthetic heads and they have the default head (with screen), no optic markings. + continue + else if(("head" in rlimb_data) && M.name == "None") //Otherwise, if they DON'T have the default head and since they must have optics, give them a list of styles excluding the "None" option. + continue + valid_markings[markingstyle] = marking_styles_list[markingstyle] - var/new_marking_style = input(user, "Choose the style of your character's body markings:", "Character Preference") as null|anything in valid_markings + var/new_marking_style = input(user, "Choose the style of your character's markings:", "Character Preference", m_style) as null|anything in valid_markings if(new_marking_style) m_style = new_marking_style @@ -1275,8 +1305,24 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts continue if(gender == FEMALE && S.gender == MALE) continue - if( !(species in S.species_allowed)) - continue + if(species == "Machine") //Species that can use prosthetic heads. + if((species in S.species_allowed)) + if(!rlimb_data["head"]) + valid_facialhairstyles[facialhairstyle] = S + continue + else + continue + else + if(!rlimb_data["head"]) + continue + else if(("Human" in S.species_allowed)) + valid_facialhairstyles[facialhairstyle] = S + continue + else + continue + else + if(!(species in S.species_allowed)) + continue valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle] @@ -1370,14 +1416,29 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts flavor_text = msg if("limbs") - var/limb_name = input(user, "Which limb do you want to change?") as null|anything in list("Left Leg","Right Leg","Left Arm","Right Arm","Left Foot","Right Foot","Left Hand","Right Hand") + var/valid_limbs = list("Left Leg", "Right Leg", "Left Arm", "Right Arm", "Left Foot", "Right Foot", "Left Hand", "Right Hand") + if(species == "Machine") + valid_limbs = list("Torso", "Lower Body", "Head", "Left Leg", "Right Leg", "Left Arm", "Right Arm", "Left Foot", "Right Foot", "Left Hand", "Right Hand") + var/limb_name = input(user, "Which limb do you want to change?") as null|anything in valid_limbs if(!limb_name) return var/limb = null var/second_limb = null // if you try to change the arm, the hand should also change var/third_limb = null // if you try to unchange the hand, the arm should also change - var/valid_limb_states=list("Normal","Amputated","Prothesis") + var/valid_limb_states = list("Normal", "Amputated", "Prosthesis") + var/no_amputate = 0 + switch(limb_name) + if("Torso") + limb = "chest" + second_limb = "groin" + no_amputate = 1 + if("Lower Body") + limb = "groin" + no_amputate = 1 + if("Head") + limb = "head" + no_amputate = 1 if("Left Leg") limb = "l_leg" second_limb = "l_foot" @@ -1392,37 +1453,50 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts second_limb = "r_hand" if("Left Foot") limb = "l_foot" - third_limb = "l_leg" + if(species != "Machine") + third_limb = "l_leg" if("Right Foot") limb = "r_foot" - third_limb = "r_leg" + if(species != "Machine") + third_limb = "r_leg" if("Left Hand") limb = "l_hand" - third_limb = "l_arm" + if(species != "Machine") + third_limb = "l_arm" if("Right Hand") limb = "r_hand" - third_limb = "r_arm" + if(species != "Machine") + third_limb = "r_arm" var/new_state = input(user, "What state do you wish the limb to be in?") as null|anything in valid_limb_states if(!new_state) return switch(new_state) if("Normal") + if(limb == "head") + m_style = "None" + h_style = random_hair_style(gender, species) + f_style = facial_hair_styles_list["Shaved"] organ_data[limb] = null rlimb_data[limb] = null if(third_limb) organ_data[third_limb] = null rlimb_data[third_limb] = null if("Amputated") - organ_data[limb] = "amputated" - rlimb_data[limb] = null - if(second_limb) - organ_data[second_limb] = "amputated" - rlimb_data[second_limb] = null + if(!no_amputate) + organ_data[limb] = "amputated" + rlimb_data[limb] = null + if(second_limb) + organ_data[second_limb] = "amputated" + rlimb_data[second_limb] = null if("Prothesis") var/choice = input(user, "Which manufacturer do you wish to use for this limb?") as null|anything in chargen_robolimbs if(!choice) return + if(limb == "head") + m_style = "Humanoid Optics" + ha_style = "None" + h_style = hair_styles_list["Bald"] rlimb_data[limb] = choice organ_data[limb] = "cyborg" if(second_limb) @@ -1499,7 +1573,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts UI_style_color = UI_style_color_new if("UIalpha") - var/UI_style_alpha_new = input(user, "Select a new alpha(transparence) parametr for UI, between 50 and 255") as num + var/UI_style_alpha_new = input(user, "Select a new alpha(transparence) parameter for UI, between 50 and 255", UI_style_alpha) as num if(!UI_style_alpha_new | !(UI_style_alpha_new <= 255 && UI_style_alpha_new >= 50)) return UI_style_alpha = UI_style_alpha_new @@ -1618,9 +1692,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts character.h_style = h_style character.f_style = f_style - // Destroy/cyborgize organs - for(var/name in organ_data) var/status = organ_data[name] diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm index 6cd20e79b19..e691e35ecac 100644 --- a/code/modules/mob/living/carbon/human/appearance.dm +++ b/code/modules/mob/living/carbon/human/appearance.dm @@ -169,6 +169,12 @@ return valid_species /mob/living/carbon/human/proc/generate_valid_hairstyles() + var/mob/living/carbon/human/user + if(istype(usr, /mob/new_player)) + user = usr + else + user = src + var/list/valid_hairstyles = new() for(var/hairstyle in hair_styles_list) var/datum/sprite_accessory/S = hair_styles_list[hairstyle] @@ -177,13 +183,34 @@ continue if(gender == FEMALE && S.gender == MALE) continue - if(!(species.name in S.species_allowed)) - continue - valid_hairstyles += hairstyle + if(species.flags & ALL_RPARTS) //If the user is a species who can have a robotic head... + if((species.name in S.species_allowed)) //If this is a hairstyle native to the user's species... + if(!user.client.prefs.rlimb_data["head"]) //Check to see if they have the default head. + valid_hairstyles += hairstyle //Give them their hairstyles if they do. + continue + else //If they don't have the default head, they shouldn't be getting any hairstyles they wouldn't normally. + continue + else + if(!user.client.prefs.rlimb_data["head"]) //If the hairstyle is not native to the user's species, and they're using the default head, don't let them access it. + continue + else + if(("Human" in S.species_allowed)) //If the user has a robotic head and the hairstyle can fit humans, let them use it as a wig for their humanoid robot head. + valid_hairstyles += hairstyle + continue + else + if(!(species.name in S.species_allowed)) //If the user is not a species who can have robotic heads, use the default handling. + continue + valid_hairstyles += hairstyle return valid_hairstyles /mob/living/carbon/human/proc/generate_valid_facial_hairstyles() + var/mob/living/carbon/human/user + if(istype(usr, /mob/new_player)) + user = usr + else + user = src + var/list/valid_facial_hairstyles = new() for(var/facialhairstyle in facial_hair_styles_list) var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle] @@ -192,9 +219,23 @@ continue if(gender == FEMALE && S.gender == MALE) continue - if(!(species.name in S.species_allowed)) - continue - - valid_facial_hairstyles += facialhairstyle + if(species.flags & ALL_RPARTS) //If the user is a species who can have a robotic head... + if((species.name in S.species_allowed)) //If this is a facial hair style native to the user's species... + if(!user.client.prefs.rlimb_data["head"]) //Check to see if they have the default head. + valid_facial_hairstyles += facialhairstyle //Give them their facial hair styles if they do. + continue + else //If they don't have the default head, they shouldn't be getting any facial hair styles they wouldn't normally. + continue + else + if(!user.client.prefs.rlimb_data["head"]) //If the facial hair style is not native to the user's species, and they're using the default head, don't let them access it. + continue + else + if(("Human" in S.species_allowed)) //If the user has a robotic head and the facial hair style can fit humans, let them use it as a postiche for their humanoid robot head. + valid_facial_hairstyles += facialhairstyle + continue + else //If the user is not a species who can have robotic heads, use the default handling. + if(!(species.name in S.species_allowed)) + continue + valid_facial_hairstyles += facialhairstyle return valid_facial_hairstyles diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 787d1e51b44..9eb01aec4fd 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1619,26 +1619,36 @@ // Allows IPC's to change their monitor display /mob/living/carbon/human/proc/change_monitor() set category = "IC" - set name = "Change Monitor Display" - set desc = "Change the display on your monitor." + set name = "Change Monitor/Optical Display" + set desc = "Change the display on your monitor or the colour of your optics." - if(stat || paralysis || stunned || weakened) - src << "You cannot change your monitor display in your current state." + if(incapacitated()) + src << "You cannot change your monitor or optical display in your current state." return - var/list/hair = list() - for(var/i in hair_styles_list) - var/datum/sprite_accessory/hair/tmp_hair = hair_styles_list[i] - if(species.name in tmp_hair.species_allowed) - hair += i + if(species.flags & ALL_RPARTS) //If they can have a fully cybernetic body... + if(client.prefs.rlimb_data["head"]) //If head is present here, that means it's not the default Morpheus. Thus, no screen to adjust. Instead, let them change the colour of their optics! + var/optic_colour = input(src, "Select optic colour", rgb(r_markings, g_markings, b_markings)) as color|null + if(optic_colour) + r_markings = hex2num(copytext(optic_colour, 2, 4)) + g_markings = hex2num(copytext(optic_colour, 4, 6)) + b_markings = hex2num(copytext(optic_colour, 6, 8)) - var/new_style = input(src, "Select a monitor display", "Monitor Display") as null|anything in hair - if(stat || paralysis || stunned || weakened) - return - if(new_style) - h_style = new_style + update_markings() + else if(!(client.prefs.rlimb_data["head"]))//Means that the character has the default Morpheus head, which has a screen. Time to customize. + var/list/hair = list() + for(var/i in hair_styles_list) + var/datum/sprite_accessory/hair/tmp_hair = hair_styles_list[i] + if(species.name in tmp_hair.species_allowed) + hair += i - update_hair() + var/new_style = input(src, "Select a monitor display", "Monitor Display", h_style) as null|anything in hair + if(incapacitated()) + return + if(new_style) + h_style = new_style + + update_hair() //Putting a couple of procs here that I don't know where else to dump. //Mostly going to be used for Vox and Vox Armalis, but other human mobs might like them (for adminbuse). diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 46e9bddf9b3..fd8fcd50909 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -712,9 +712,9 @@ passive_temp_gain = 10 //this should cause IPCs to stabilize at ~80 C in a 20 C environment. - flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_DNA | NO_POISON | RADIMMUNE - clothing_flags = HAS_SOCKS - bodyflags = HAS_SKIN_COLOR + flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_DNA | NO_POISON | RADIMMUNE | ALL_RPARTS + clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS + bodyflags = HAS_SKIN_COLOR | HAS_MARKINGS | HAS_HEAD_ACCESSORY dietflags = 0 //IPCs can't eat, so no diet blood_color = "#1F181F" flesh_color = "#AAAAAA" diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 07fe43107f9..7849deb633b 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -461,7 +461,7 @@ var/global/list/damage_icon_parts = list() //if(!src.get_int_organ(/obj/item/organ/internal/brain) && src.get_species() != "Machine" )//make it obvious we have NO BRAIN // hair_standing.Blend(debrained_s, ICON_OVERLAY) if(hair_style && hair_style.species_allowed) - if(src.species.name in hair_style.species_allowed) + if((src.species.name in hair_style.species_allowed) || (src.species.flags & ALL_RPARTS)) var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") if(src.get_species() == "Slime People") // I am el worstos hair_s.Blend(rgb(r_skin, g_skin, b_skin, 160), ICON_AND) @@ -499,7 +499,7 @@ var/global/list/damage_icon_parts = list() if(f_style) var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style] if(facial_hair_style && facial_hair_style.species_allowed) - if(src.species.name in facial_hair_style.species_allowed) + if((src.species.name in facial_hair_style.species_allowed) || (src.species.flags & ALL_RPARTS)) var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") if(src.get_species() == "Slime People") // I am el worstos facial_s.Blend(rgb(r_skin, g_skin, b_skin, 160), ICON_AND) diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index e8b9f948ee7..640197b09d6 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -227,12 +227,14 @@ datum/preferences var/icon/temp = new /icon("icon" = tail_icon, "icon_state" = tail_icon_state) preview_icon.Blend(temp, ICON_OVERLAY) - for(var/name in list("r_arm","r_hand","r_leg","r_foot","l_leg","l_foot","l_arm","l_hand")) + for(var/name in list("chest", "groin", "head", "r_arm", "r_hand", "r_leg", "r_foot", "l_leg", "l_foot", "l_arm", "l_hand")) if(organ_data[name] == "amputated") continue if(organ_data[name] == "cyborg") var/datum/robolimb/R if(rlimb_data[name]) R = all_robolimbs[rlimb_data[name]] if(!R) R = basic_robolimb + if(name == "chest") + name = "torso" preview_icon.Blend(icon(R.icon, "[name]"), ICON_OVERLAY) // This doesn't check gendered_icon. Not an issue while only limbs can be robotic. continue preview_icon.Blend(new /icon(icobase, "[name]"), ICON_OVERLAY) diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 60b28f69213..23e3fb1d906 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -64,7 +64,7 @@ name = "Bald" icon_state = "bald" gender = MALE - species_allowed = list("Human","Unathi","Vox","Diona","Kidan","Grey","Plasmaman","Skeleton") + species_allowed = list("Human", "Unathi", "Vox", "Diona", "Kidan", "Grey", "Plasmaman", "Skeleton") short name = "Short Hair" // try to capatilize the names please~ @@ -152,7 +152,7 @@ name = "Pompadour" icon_state = "hair_pompadour" gender = MALE - species_allowed = list("Human","Unathi") + species_allowed = list("Human", "Unathi") quiff name = "Quiff" @@ -175,19 +175,19 @@ name = "Beehive" icon_state = "hair_beehive" gender = FEMALE - species_allowed = list("Human","Unathi") + species_allowed = list("Human", "Unathi") bobcurl name = "Bobcurl" icon_state = "hair_bobcurl" gender = FEMALE - species_allowed = list("Human","Unathi") + species_allowed = list("Human", "Unathi") bob name = "Bob" icon_state = "hair_bobcut" gender = FEMALE - species_allowed = list("Human","Unathi") + species_allowed = list("Human", "Unathi") bowl name = "Bowl" @@ -203,7 +203,7 @@ name = "Buzzcut" icon_state = "hair_buzzcut" gender = MALE - species_allowed = list("Human","Unathi") + species_allowed = list("Human", "Unathi") crew name = "Crewcut" @@ -265,12 +265,23 @@ mohawk name = "Mohawk" icon_state = "hair_d" - species_allowed = list("Human","Unathi") + species_allowed = list("Human", "Unathi") + jensen name = "Adam Jensen Hair" icon_state = "hair_jensen" gender = MALE + cia + name = "CIA" + icon_state = "hair_cia" + gender = MALE + + mulder + name = "Mulder" + icon_state = "hair_mulder" + gender = MALE + gelled name = "Gelled Back" icon_state = "hair_gelled" @@ -284,7 +295,7 @@ spiky name = "Spiky" icon_state = "hair_spikey" - species_allowed = list("Human","Unathi") + species_allowed = list("Human", "Unathi") kusangi name = "Kusanagi Hair" @@ -485,7 +496,7 @@ name = "Shaved" icon_state = "bald" gender = NEUTER - species_allowed = list("Human","Unathi","Tajaran","Skrell","Vox","Diona","Kidan","Greys","Machine", "Vulpkanin", "Slime People") + species_allowed = list("Human", "Unathi", "Tajaran", "Skrell", "Vox", "Diona", "Kidan", "Greys", "Machine", "Vulpkanin", "Slime People") watson @@ -1074,7 +1085,7 @@ /datum/sprite_accessory/underwear icon = 'icons/mob/underwear.dmi' - species_allowed = list("Human","Unathi","Vox","Diona","Vulpkanin","Kidan","Grey","Plasmaman","Skeleton") + species_allowed = list("Human", "Unathi", "Vox", "Diona", "Vulpkanin", "Kidan", "Grey", "Plasmaman", "Skeleton", "Machine") nude name = "Nude" @@ -1222,7 +1233,7 @@ /datum/sprite_accessory/undershirt icon = 'icons/mob/underwear.dmi' - species_allowed = list("Human","Unathi","Vox","Diona","Vulpkanin","Kidan","Grey","Plasmaman","Skeleton") + species_allowed = list("Human", "Unathi", "Vox", "Diona", "Vulpkanin", "Kidan", "Grey", "Plasmaman", "Skeleton", "Machine") /datum/sprite_accessory/undershirt/nude name = "Nude" @@ -1508,13 +1519,13 @@ /////////////////////// /datum/sprite_accessory/socks icon = 'icons/mob/underwear.dmi' - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skeleton") + species_allowed = list("Human", "Unathi", "Diona", "Grey", "Machine", "Tajaran", "Vulpkanin", "Slime People", "Skeleton") /datum/sprite_accessory/socks/nude name = "Nude" icon_state = null gender = NEUTER - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skeleton","Vox") + species_allowed = list("Human", "Unathi", "Diona", "Grey", "Machine", "Tajaran", "Vulpkanin", "Slime People", "Skeleton", "Vox") /datum/sprite_accessory/socks/white_norm @@ -1681,12 +1692,12 @@ /datum/sprite_accessory/head_accessory icon = 'icons/mob/body_accessory.dmi' - species_allowed = list("Unathi", "Vulpkanin", "Tajaran") + species_allowed = list("Unathi", "Vulpkanin", "Tajaran", "Machine") icon_state = "accessory_none" /datum/sprite_accessory/head_accessory/none name = "None" - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skeleton","Vox") + species_allowed = list("Human", "Unathi", "Diona", "Grey", "Machine", "Tajaran", "Vulpkanin", "Slime People", "Skeleton", "Vox") icon_state = "accessory_none" /datum/sprite_accessory/head_accessory/simple @@ -1769,16 +1780,22 @@ icon_state = "ears_plain" species_allowed = list("Tajaran") +/datum/sprite_accessory/head_accessory/ipc_antennae + name = "Antennae" + icon_state = "antennae" + species_allowed = list("Machine") + + /* BODY MARKINGS */ /datum/sprite_accessory/body_markings icon = 'icons/mob/body_accessory.dmi' - species_allowed = list("Unathi", "Tajaran", "Vulpkanin") + species_allowed = list("Unathi", "Tajaran", "Vulpkanin", "Machine") icon_state = "accessory_none" /datum/sprite_accessory/body_markings/none name = "None" - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skeleton","Vox") + species_allowed = list("Human", "Unathi", "Diona", "Grey", "Machine", "Tajaran", "Vulpkanin", "Slime People", "Skeleton", "Vox") icon_state = "accessory_none" /datum/sprite_accessory/body_markings/stripe @@ -1811,6 +1828,11 @@ species_allowed = list("Unathi") icon_state = "markings_tigerheadface_una" +/datum/sprite_accessory/body_markings/optics + name = "Humanoid Optics" + species_allowed = list("Machine") + icon_state = "optics" + /datum/sprite_accessory/body_markings/tattoo // Tattoos applied post-round startup with tattoo guns in item_defines.dm name = "base tattoo" species_allowed = list() diff --git a/code/modules/surgery/organs/robolimbs.dm b/code/modules/surgery/organs/robolimbs.dm index ddb41ee3015..bcebd7e1e64 100644 --- a/code/modules/surgery/organs/robolimbs.dm +++ b/code/modules/surgery/organs/robolimbs.dm @@ -8,7 +8,8 @@ var/global/datum/robolimb/basic_robolimb var/datum/robolimb/R = new limb_type() all_robolimbs[R.company] = R if(!R.unavailable_at_chargen) - chargen_robolimbs[R.company] = R + if(R != "head" && R != "chest" && R != "groin" ) //Part of the method that ensures only IPCs can access head, chest and groin prosthetics. + chargen_robolimbs[R.company] = R /datum/robolimb var/company = "Unbranded" // Shown when selecting the limb. @@ -26,16 +27,6 @@ var/global/datum/robolimb/basic_robolimb desc = "This limb has a militaristic black and green casing with gold stripes." icon = 'icons/mob/human_races/cyberlimbs/hesphaistos.dmi' -/datum/robolimb/zenghu - company = "Zeng-Hu Pharmaceuticals" - desc = "This limb has a rubbery fleshtone covering with visible seams." - icon = 'icons/mob/human_races/cyberlimbs/zenghu.dmi' - -/datum/robolimb/xion - company = "Xion Manufacturing Group" - desc = "This limb has a minimalist black and red casing." - icon = 'icons/mob/human_races/cyberlimbs/xion.dmi' - /datum/robolimb/ipc company = "Morpheus Cyberkinetics" desc = "This limb is simple and functional; no effort has been made to make it look human." @@ -45,4 +36,14 @@ var/global/datum/robolimb/basic_robolimb /datum/robolimb/wardtakahashi company = "Ward-Takahashi" desc = "This limb features sleek black and white polymers." - icon = 'icons/mob/human_races/cyberlimbs/wardtakahashi.dmi' \ No newline at end of file + icon = 'icons/mob/human_races/cyberlimbs/wardtakahashi.dmi' + +/datum/robolimb/xion + company = "Xion Manufacturing Group" + desc = "This limb has a minimalist black and red casing." + icon = 'icons/mob/human_races/cyberlimbs/xion.dmi' + +/datum/robolimb/zenghu + company = "Zeng-Hu Pharmaceuticals" + desc = "This limb has a rubbery fleshtone covering with visible seams." + icon = 'icons/mob/human_races/cyberlimbs/zenghu.dmi' \ No newline at end of file diff --git a/icons/mob/body_accessory.dmi b/icons/mob/body_accessory.dmi index 1794a4782a3b8d261c852eba19317708bc0ecf0b..16d6b2f03f917153409dcef6e67a17932ccfa710 100644 GIT binary patch literal 4069 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 O;;vddSfMQ+B>W$|C>L=6 diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index a126f3d067a3e19bf18bfb6ded2a391fb048461b..abb390fdffee4446645ec228824c77d8aecfa8b4 100644 GIT binary patch literal 80515 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

D}lV>qBfTeG>h8!6$n|AgcBBU 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 z�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 HyQlvL%yIWm diff --git a/icons/mob/human_races/cyberlimbs/bishop.dmi b/icons/mob/human_races/cyberlimbs/bishop.dmi index a3fdb455f899a00f04b33135fce651f08154e892..3bf83ae98cdbbd0e831099ab3889796c85783601 100644 GIT binary patch literal 4617 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%0AoN+!yZ&uRcd zFpU6F@9zpeOaB`QsfvnCFA@+Rdx7-x1!9{NVem3l3sdUaDMaaOOdwJ%7wFJn!+{s1CR|Y_Vk_?)^ zjn?^;Bw-z!cE2buNm)yoTY~0Ow=OCnqd1`ngR$S)bMo4{fI8&)*xhLUMOH5{OndJ{ za$^kR&!T#Ag6y-#9oA@SD1o2*1UuDe|5h2<YEb%h|B1VL656_64ORoQ^F2uoFwKzt-pq!|*#1yLYUma+>H zl%jNj5Ly8HA|O(d2$E2h7D^xiB!Rr_+j(zx_U+!8d(X_7d%wB&obR0PCOIN)*+m7ESSVp`$ja=U$Hp$U0m%=RlL$8Dc;=%&4!2l4M=j?_H318G9tH9^%o!aDAt$VdIKNpqkadEZG?7DY1)cxBV-|M}YKISit zLa5-hB!Lj#wU|wZe(^?Y_b@4QTfhD1_h$M^ zm9FkmyL6inF|=ACrvfN03jj=kyRu^kIFNu@u1!=Cnso`5pz5M4A#lhdXq zaYW%j+8v%Mb+zkD<%L=22r~riO6MoWnz73w$w&gXLgtVxm95{Is(ulXaz2ggL>*`U zC60fDc7wd}UCUg_1s~7Btr;V4dLmZcv=#y))-Eh9b#-(QTL~ieW?$zVZ%^F9!a_ft z4yDuSjO|8{mVr2g^Mag$f@x*&^U2qt>cNZg01s^0=CGx6hA84XhlGZRD# zg~C|FZAXSmgYWkA{D86QVpjWPQ}V@Gu{G0VR)Gtn7UbpS3)QipF$0=Z@B8=aUr1pQ z5!vB-WRVZm)zww$-X}=Q7lRZd3Gl|j<><4n!;yOcm*b#6GjEz(c0?E`xcL}m2JR@% z8&rvniTN=)CdMl_IU^&(8jq(n()Bc@#++Jbb`o||qhH4Zo;eWezF;r+Klu8WhyMrL zC6huq@wlnUB!oV95HQZ(qOYGVRNU||J#~sV&wXRnUTzKG7N;Cw8MR`%_Mwk2^Mmp| zuqS_|IfB8!`(k}{KBt<+yd4}IjJ*6zl_1&C^dkg6=TNY*bLT?m=D6MS&}xtrP^yj) zT89+eg32mDBJ{HvPoHnGD+E8ei=vo^K}18Phxa)g&YiMrm8khI%3%Ll5hwQ`7Jo>e z(4OvjcP@72tDbukMSF-)Fnb~nAiw&NEX+xUVlONvra7A5E91k8-Ztj@oWv%DNCCy} zs-0FLf&+yWtP0c1j3t)7<6&jPk;PtTUR*LZplE#D??66s$4av5)bQh`yK2iVnMO9o~y8{X^-{XHw z%|VV~HF?U^)cn(EV7<&|l*X{S6CoiXp@J}?X`8w8dk2Wu^AuZdpvAeY@n?=lSiARM8Ljg-7)d zttz9%tjy&E06b;eB`X>_t2_gdy($W|dud>XXTezsLxh;X#Nds+fB;Xx$Mi2$cg?kh zA@ue286+PLGY?s69>oes`H8VSKH7b)z3R{H^8e{~M;90-co7l{QD$RkfYWeriA~F} zA!(}l&8o;6-<1BaM8@cSL)Mn`rA`34$AHbLiyt>%OQuSZ8-2_i(@;Q*kB~plR5N#R z1C(Qh+Q$r6>(cCti~O5yLSDpwd{U!#`cljr@qVpt^U1hc$-n91IQq=X)6F{h>KYnK zRHkK{z1QZ0^w@K#S!x)os*8kg4i^`j^o|x9&8xY&xq=c$^VswCQN5-Y)S8JLfK)OU zWTW~ms8nh(mCB@VA(2RRKA%4^$khT=jw29|kHf-Ck2=LTH-5*F`Z^SV2wDv_%WHd~ z2rSze{BvOv|0g$9NFXREXqT5F7LWJJ%E~G#Erl=Z_m!5EBsVmi47`3lQ>+$v@8c7^ zwWZParLLTrwwJhFRrY|jwY4QY!-BUD=24COK%zQN=jh( z353g$pwQ3(k8bSEn+)#11SYU%Y@{l2adGjkNm6oInXYVCF=~GBm+%$L77{z!d-TR6 z-!p-w@WfF^D){?XmybTqWS=gO!GDN1zWBlzhV0Wcv$3(UKCUj`t%^1;UXz*d((=4V zbKHFMCLs-3idT5Pyj)Y5KijPbNDy1MSWd?icf_V@~SZyN!N@vC?1FF&{rJcFAxT_3HBG>wMwtF z7@?n8YVU9IOa(f&KFQNY83GY`1av50s1Di^CITHNHZ@z?SUJd2F~T;ZnfKD+52^6{ zE#EXENBVE|N$VfEjB^E%S&{J{l#H)a#^t;u!XAk!U>6=vp?s6w&^fR+$c-Gy=%k99 z2paCY;8cRi3B>-Elq8!98&M!W^g98RmzTSl2DKb%L1m1xv#Z=Lua{9VV;qIvZJ8Mk zr#@CdhqpDNX#GmxNjQMWDHlm3l0OdT*bpmn_7~9Soc?d|i^9hO$6wRtA|fJ8(w9#H34WK>MdvK^vm8gtV|{&z2V|E( yzUx<+7Tn@B|0B$|w7IP(5=ytE#a|x95Rs%e7IoN{wevk79(Gnp%c`@!xBm@(PRI`c diff --git a/icons/mob/human_races/cyberlimbs/hesphaistos.dmi b/icons/mob/human_races/cyberlimbs/hesphaistos.dmi index 45423ee1698bf27f584573459ffb42083dd000c8..683339efc05c1b4c2d5767368703f65f872849a5 100644 GIT binary patch literal 4378 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 literal 2755 zcmai#cTm&W7RP@?R1gsmFf<`3ML>#1g{8Mpq)HDRl_sd67ZC!2NQqfMh;&&&6bMQe zLLdsV^j-p?3DOCnqY%Q2``)~H``+%nJ9EF^KhDgZduGo0eB(@wby-jGodN)WRbNlr zjP8V=m+1su&Bnb?(k(I6!p2|Q)$fk4C&J(J;R65&&N8<`_y+84nw`|uT<$THXajr`Q6CkcX3zoXO-R;Eaξ#9TsLwd|60Tmn?I;w?`;-LaRh z$a6Q}(6&lV%XQL>E>CQ(=eqD>F8>Xug{Ah3j`(MOa1I|Csm}{nU5{IDv*wZ*g=QpkFo;={Fc~%f z$&0)GxDQv7v=aoB%T3l$Q&$?Fph1_VrQ5#VEmTIOo*#Aecgn1+@o(K;1!1e0-^-@W zjmjpRMF-tfHOUF%R!6J5UHk@XNI+Sc2&vSND+obH0$3Rn@ZFFA`nys%+hIi-7?W%! zEJ|a3)g*YnT0lAZ1+BCk+tPc~*!M_pjixMRe7Z2Ojxl4aIWl=%HkoaT@xxPTwBUkh zAGm6WC+=88`)m8jalt{1-z9(Cy)s%X7#xICp3eyyiPyv>7=VOT!? zeBu#X-&=M)27ny^{#zi#MSh&x#K$|~BO&}~%tU(X8_vfiWU1c|*y6I~Q5=APhSCv@ z^L)AdIr*uvF2|dC?J>NOqdh5Czmu~BC`K8whfComLUX49)s%w<5;ZGR!XUz0v!PR3 zQ8h@brjXQ?rOy+Q+EtS{7dDtQ(!c?D`%Hx%_?wU^dFI`erVJJ{I7xg20GI&e{}CjR zPwznB3kn8;fA7wwLXa$|JiogE<=+ubOYeEjNz>%Tk)f}4*!e8dE4}G}tiUZ4AhSOG zdlc8jh-cg6YCIOF)|tt|7Nzt<2LSh8e*_h3$zS+Zl8Cw=p`;>CiG#C#&45H2(5tb1 z1C2Rp=D9MXrRdj3xu=My)*XNMl%Hbioz6xkI0gAd1HFTg{~TF@Rj?&E96DYEW@9o1 zXAZ^4rrz}3nl~Czye*kp^t8#vr`S;$qVC{r1#Z~RO4b-jRV^UY|@3LRH@o-hT zWE!UorAOHrrD+1e5?_9}rZ1oFxQo2qa9DqtBC}Yg)_xuE&Q)=5DNx*hZb-{vwx~k2 z?On}#Cx5b7_#!Q?Qv^iVl~XinU8F`PIuuM4Z7E42Rl|B?PU-0A*eluQ4=fc;&TnqT zeM{KG>;xU$N@*?Xs8j{-OdgzwJ>L8LovT@BkE)N#^jLVmr97-yH?UYNxy5fcvwl<< zpRB%D01m06e6_2h)ESzZKCoQ7#BjpOT8?9synj`-iafGAJA#uKzJG&^V9SRzJ)Uq| z;OE25z%NT?r0;FrDl6LZTv%A7JOTEJwPZwWSQxfR;X(rIO zS{jsTHD=Ht*4;5Ru~_SIk72v4;>xL18<@RN+DnrB^T4s`aJ8Jh&7hGKmdCeQRGH-b z+i^G{O2oRp*7%%9G)@|oobU$xzYO>j7a$0bjUV!fsgxk$7DH#hxNXR^r#uM+*F^!0LTF)^Y`YE0}m&BP$B^KI|BY^-hrGpT&6OGv^vv~cj7_3jbmzIZGSL|4rFeJ*CQ(hx8yZ32A2ML z4Ybl|-a-gKT z=jHbcBx!UpdustI6K_D(SL<8eX~hf{8k9D#x*Jm;Jn>g_uw3FVlYN=+k^f{vQc}{d zcR-BqW*_nTLD5ZBA~z|c{yUaR8Km38Godro>i`mVzqN)$^?t#!897u@#tjA`i*=9C z?*m$CoG^Hf%r$L8Tfs8=rtn&?9az8Thz8d0ouB_>6MhY@uMnQ;Q`j6}DX)=Vqr&6} zq4REzDGQDGTT*(NP9D!*Zt4i|nP50DY4<9NhJ*oy?w=E%ZA7Uqsl@PIc$4ZNeU`cA zrVJ(}wlO{|O#?vqe9Y4gCsXN+W93L`aj{R*E4e`8OA`hLyAFiH`Vln|vBnN%+?*hF zKc~SIkUCOqo>+Eg8}xT{{afrJvoEOcFUKsm&aHS=*;Fc0HfUPD`-{Jrc(p8^)uSip zmRdo(Qz9!N6^g7nGcsv2UcwXhZwBow`b>`Rtz*Z69L`B3d*s1BIWTN973Rp9Vbg%^Me7$tAs#_n^Eovr60Ja7oqjdHRsrn%Irdqo9-h}ez? zn4@CL#)J*E;7iDfy466>X4{=!?SEFlUPIsojHl7M4pQeMssCBka$a2b&wyn|&{zm8 Vbtzdp)H4A6=);V)OEsON{sD|R>+Apk diff --git a/icons/mob/human_races/cyberlimbs/wardtakahashi.dmi b/icons/mob/human_races/cyberlimbs/wardtakahashi.dmi index 01ded594a2c08e40e055c9c4e2a87a52b42ceeeb..7122cafb81875e7eb79fbe2aae97178960faaf20 100644 GIT binary patch delta 1566 zcmV+(2I2XH2(=6)iBL{Q4GJ0x0000DNk~Le0002s0002s2m=5B04?*H(*OVfJdq_U ze@IA3EiEk`9v;-x)WE>NW@cufFDZ*Bkpc$|&VJqp7x3_mZK^VMN<@#v|`Up{{LeKOwV0+b)c#YrbXA;5B<=Ee+5S{ z7!Q)m1poj5008t4y`ki5l=HXN>eyVAUHSjsH?~2_zoLCboFB|(DHIiY9~v9+#o(Xw zyU^H!yrOYTp`7Bnjlfb{0=4D71-{uEz*H(s8|k~;IDF54BW_F1w>8Ie@pKx;K(Y6= z)|6{pk=n02KU}&X_``IpWu)-;e~&BM02NaERo5_4>GRTg(e~lhKjVl%@ z+-d^lB<5uTHy#TD?d>ZkU32_2ZIDEukf&B9000000000000000006+=h_3-+;--gJH2CFD(SI&-WyfTEm(y^oqge&0H# z=%cQXV~q6-QE6QgSU>tJf4^5sG@wet{~yUO9@Ms5cwYym$}Jx56t z)&APRz}u0i?;CY(^{It*g|I_Oq;`N}#-)k`NydR=q?*4;Qsj7-}e(S+U6+$1G ze6`mNygbVq=E%sxe@YrL_^3i!0ssKe2tnR7hmxD3+({`K3rZUv?x>i#%k zgmLOa5`LhF=7}cfI-cr7x)+hoKeK$hJS9551~(vGg~~(&e*gdg000000Dxmsx8N+B zr8gOPKSHeebBn)cFi0B=ydPn4@k(deWWK?`1E7td8E^+Dct6i4R+#;{`OFGKcGo^X zPb|>6-@oX@Js6#vXgaaLbPZ;QZSQ8(q46$mnMLC$Z>beR&sQJ?pJp*%-S&;*gMJmr zBz+GLzoL-he^>md3Uz@?0UwSl@M|4SUEqVG3QS+N9__C#wp8N%vnY_iZbs?rX!ocB z4z5q1=hS(ybH<5An#O9JmiTcM5|8OVYpni~A~B^nt@tI#?@Y@OsNc$^vp2o*4CdsM zP(ixQNx`PC?2CYUm~(bvv0P%jOZ5}o>jN9)IH-UbYb>JQjwo) z(Z+E0ek22H36ICUS9`cyihn2hTfM`qxcE!>$amX|gDDkI3{C(5004BwU+p0uIxNu- QBme*a07*qoM6N<$f>UngCjbBd delta 1001 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%0Av6Qdo_z?oPTS!ixBeiE)7MVDG%0> z(4i(FwYF%>l+MCz@@0zoKdbZKDYsCBxXBH6v)fBHtT@9dm0)i2@os?6aF$e$=A3E; zW5ZBGlJ|3`+=|QEYsgFGDgQ_0+58Yl{bgTo>BbmCBO|?AU}?u-608v5wO+BwR{FG9 zY%IZb&WUov$^J}U+&}b5mmd$VJPIK6cic=SK<}nbToXPW#2JvOZx+KF!?qXC<**PCglYedKYo zoWM!#UAjpX=3Cf`o05{GJ*Uqte^JA&>*26{=ex&yyV;OsR)%|!pXfk@emObEd|ygQ^HX(`sE3O7B-LaD zR0*9q&U5qQkxOmS{Hs;6XT$=?4`Z-o-=Niv`SxLD|-!RZ-`h*pnZd+kaW10ea2ADLF|YpaA7@gyl+Q3^eNvdht8MJ zD*eiqUMNCU$5-il;*N+aP;K%k{$BIdF21&?+5g2B#)bPa%K=nAIMHf;Pwm3cV<;dQ zI%THoHB6nRRfm8y*kTN8p;MTL@Cf72L-@LgsKxTGh@BUD33Abt3wzn-VzVvX>rd6RW)lERwg9^~nGt`73 zvEMj+>?)JKT7M$^|CKw|uURbZU!qRc1{-pHD?VBXTmG{FtwI;|IfE@ih)LWic@GO~`d?8AOQn^+BmClo=jQzigBbuHE zFdqJ5YSp>^5flWi1W_?5M|w6XPvYuLCo1(TIPwU;hQjmcAukM*-beNxh=kY=i zC2ioT@bAKoSwCFZ-qGFXF+ZhZb8wM9YX+Q#t4wx0iH)bZ8g<5?RN7IG+fItDGz%rr z;G1E7yoiEYUrOID&GR`fQA%G{*F&SRJC^pEZD`{pt%gBO&QjAYzG-w2Hr@_?hr>C9 zp^zFZV7gY2d(iK4)_jte$-U@^+(M>GT_cY(Z(UtEX^qD#U?vdS>Ap(mT05NvXkA3DjY<;=}8*+=`O`tW=>6Zr7~S$0;| zaSC>>7vSs+HN5Hi4yxDw+ddZK1mU1op}JfI;BU_F%+JDZx8(Y8ILgXxaK<@T3=&Y*$4X43_SySs}I?@I1U zN38Fy9F*Fn(2a4V7GNuUDB0FyUO$-Lb3v2*Zx?UHcZ3ih*ug;!zjIk`iI9!AqebL={{LTSx)|h=X9TVr^?%q2$Jq=t8 za>RlEFVoLv<$gNsQm#6jL)&Em2X6R!GYSGyI{)^DXi5}LG$e-EwbO7uO#GXEfEEru zEj(LYkyIhVHdp88+zqt?9`R+w-g)bKdSpx&j&Y-7)?8ze8voe;(+ify*KQc9Btw&m zWXBtNQ~VGJ0QJ+h!nj(hhVgp0b?aHsEpyP6egirmi(cJFFsTnQCS6Ckz z!w3l^jONhL+%RFaMP40`K{d0ixfYWj`kw8hB{h>dUcKZ}wkrj@9~AOpm|A+9Sac$L z2A}1KAiu9=FE11-%*pIGH+&)gLz8wscTC-8YA~MEwQ+?zDTL!7VM0c%uuU*Zr^bXV zEC{T`x^aw)#1|J`IY|p*ANd*7G*!pjLF{ZPOa~GV_Ct}q7TMcz_6^}y6DHmfn%(QM v%0LOe%wo=oLBLhXsSP_`(Ea-^?+CJbW}~ye{qhCSMT2xTjWp`j9G?9H_=aqj literal 2426 zcmah~c{mi@8b2~IwxYCHicj|VDB-g&DUCvzv8C*?FIlpisU+)Hj5VT=C6Rq3V}?kU zY*}X*YabzljAceMm!8}0-lsqAd7g9LbKY~F^KQTA_r_c`(&u95X9oaq!7k~U>`MIJ zgtF|eCSx9~yCOaWVd1amf`U~?FB$k7TnCoH(+xe?z2jnmA))1-QCp#FE^F% zQ<$8V>A51+4t(Pi>i$wNQTU`_Ae=Rw)RKe{hD%9kR!Ex1#3_hX6&=stm8Ftrl#jG1 z>6xXZ=Gf>)R>rq9@QNgV&M!EOFx5-$jE(lQE^k!PW#QZj`;{P1K;&qp;Y7k zT}PqCFg+ba5aH|i85aS|lWnUwyql5?dowh!R=)01;zdZUrHFEIbIRo>R#z+Bj*dYc z+8*#6NEg&8Ki(}k^nyr*p>Q3n;;C7Mt&T~2IlJ?bYWWgI`d!|{Q|_d$ zhQvl8c^La6Yf>mKLpd*lA-X`R2XSsOe*z`|1=;}Y1Ka=w00anwJr$mkt%Y1x4_TMw zN&DIz=lfETpO1F0v zv>|N2aS{dFwoxnA|EQIu6`Pklv1=mL_+H(Wow^NWCcN&ce?#Yo_wotyi_OF_78zU6 z{E7p4Q{c*Q94k}$_1=If3ARdWbtoRuT*RRTdrXOnB#% zPA3U;drNL<2s*zua0e|6R!R}lZvsgN9=@}v#*BMi#t;LDH;WO6AfPedL~1iQjvNuE z9~!W>=qJ64KFfVg3=-pcR!8vk%N<)m7qy;;vKWMY@wu&~YbY>Dpsd4GC2*=z#fS}u z)#|54L9)qekDCw_1RD_Vf0#Y(OPO<^(P(f?CYY?!zZ>ke8?@ebf4Bt0NhQ^jObPL# zEvB%{f%F8UY})C7!oC5$~Bnp{u!{#DgcDPH!(8i{$ji~mA}jG}_) z+XM)nR^UUB6T0<+Xk%l8>r)QbArOgvscC6W?(Ur`s;cZ*jarJnplrr*2su+1drMGs zoG$luHlgtgN30PwE{U{5jbvw&&lf!ReKQXEfk?87 zvEO!ZK*~4*e{O#+{-G)5rJhVZ32ZjAp5nIW;-d$eti2jnE!=y{waE2;sG6FZ4@Rgx zz4g8$a>zRz15vk+xX?C=Wo)uLx`Vz8)F2xfIqUF4UrdEFsSb9`&&2xC?Xz2YE2fj? z8WD9n1{aT=I;~2Ek;`a|2=0}^*LCY{&DqS6gCideG%8$SZ5OZ`m{P5yROtWG)lbCy zV6bRs5Cj$A-~+Nvt5k|RW?^V~x$N8e7q~8}l?`RIQ1+1}$$Km24f^c!zgSiN84Vm(i{~-RF}e zs71-(p|~+|0cw+;02I%qb|dG0FYCQ^vQnfr@wxYxfwbhv!2(H5g`x^!0PiK@C_0DOQ zu(BGJ4Ei!W;bM`n1_P#153|^rp|azo#$k!PKFM{~W{LujJvhn8PVxRE=lHn0b)n`G z6}2&Z|JYhxjv{@`?FJ2^0MXv`G7lYyklCOMVYVgOS^EExq_sqy>3zv*hd@G0ZeG4U z?@tsr5Tvz0!Y?dSsrAX7PR=_HhC(i(XEWl7n&EN9eE^&chf(Fe=KH@L&k(n|`h4KU zyw6|$MCTnS2r?3tAY!cB*G?opH6lE@Ph<{+H_8aa56e>#&<*;Z@0%4&g{4prtr!I6@%!4h;=CdVBY%sH=-YpmHF>y)tt} zoAjYmD`{jZwH5xIThk`pV zi8O!_lT+5`pUnXoBsWzB#iclnJq6|fG@Na=Q2cFiJ0pA{A%6mwC^7SmNq7Kk6}Nlc zv)=!*v8UYyPyEEwq@q2*g$zO%t2^#+5AuL?RwT3f;fx|@g~181J75=#^vZN?@BIr( Co=XJ) diff --git a/icons/mob/human_races/cyberlimbs/zenghu.dmi b/icons/mob/human_races/cyberlimbs/zenghu.dmi index d54316e192e5d2e098beac7663f628083e9063bc..f697eb0e03c12c0d4a911d435555f6388705f00a 100644 GIT binary patch literal 1403 zcmV->1%&#EP)un0CVv0`CjbA~000wz;hQ<%qfYV=-0C=2@kvj^* zFc3s*?J0!ahy2U5+Qo?pIfczGV;2LJ#70PYHABv&xVGaBADdB|Bx z55}ornC?HVU?|VxU9`zJ7qSJf%Gporfeva6)jI(I000000002L6%*&{?<#*tuTc`; z*w^w%0k@}$1n}!yq=x*q;?FzIra>URy+s1!P0Z&xn^PcgNd&IC#j@lBF_Ga;K8z(b zP3ffDWTl}P#|U)8JK%PR6{z6;ZKW+cGXdnXD(<5N+b+=w@@s9E=mhz-CW>-!GlTRR z000000GN{U*DU2PWEm>z3zPMU=gVj>Z~9XcvdaYi!d%F1{&c6NzA#mv7!Hw-c#enc zR&fuel`!F?@zm89ruSyTN#m)jFO2IG&#j7Eu&%x^u1`GBQCgU$vc52?PXwTZFqB|# zba4mmgs}wMQ`6*u;ky?o=3XX9&hUt%B^3)bG$4+aX3sH-qb1G5Db2q1prpQVW{}$i z0000000000Ks}ZD!}M0glN9Re3*-94b2}f@92&2vsxM5`C!Pm!mMuN3b*d+I^@W+8 zh1$Zg5vQtvS8iuS%>V#kG;ESh&cNx<(dF0oTnfqyC#XMUSLl?M@0=k=$EMk&92|0V z0000000000002N6At=X1?Ly4XHk6_lF3)*kWS97;q&oz%iCi`=TUP7O6uY3FTp{ZbZ=by|0{9~A% zj<~wx9F7!tdhktwpQpfl3n>s7aDu>`J+xrB$Fc%e=ligc-zR_cA)yz^*_{<`!Q&KV zdzm%ZN3NnuZuO@)9~YAZN&=)4a5<6ySs;H2N|*5E1Oclckh4pjh}a2T&D8?M$H>(* z3zQz@(mAp;_qb|GhF%)0000000000004kr!Cz#G7caL&D5U@Z002ov JPDHLkV1m_!kl6qL literal 2214 zcmZ`)c{CJiAAV;H23d+4U9LtEicw@qVanKj$TCCG5Mv8tyY?-0326``S&~B{+{uT_kEt{Ja4?YsXjmNPrLvCenSI{ z#U8f&wc%WQr^UD@_a58}wXzAo5d59|+;Ep=B@J7wETdHTo>@WmsG2+Y@z&4*$A0Eo!Xvig|w8D(Rv|^i%(RRu6!n1u!m)` zXVnh3t75R}{{KI^8y_MBv0}BYcn?z;E3p zY|CtD@1oozhL}rM!5(Mk$AI)3Q#3R1+8Y5rtNuFjK^VUdjXd4dp@R?l%ItJxp<;2G#Lxsj8z zJbOc6vA1D)`+MMIX3j>$X-83BbF6g`SHDk*p2k`KAx4L00h%ptP?kg`>DD387+J_vm|YXm%f?-`9QgH!=2271mH4J6yXN z>TJ0TL+Zw926@XYRlQTnT|JdY`<~Uq?|#wyEv0ifM5u~RZL+k3*m0vfA9qo7QLdrZ zU8}h_h8ye0jLLxqEQWgnd=hi_LhZiTWFBj5zM$4RoW2G;?Z?PH!XMAzEL37uzZ8X9 z1~M^^s;u#2k87m13Xi8>OSxl~WhZCPofjfg`X&2u{3)~f&p$CE?DJV(?n|-f=GEMa zNDBt+LZxsx`cO>myVwOevA_sb?@`;UJRN-hqaA>>zz5@vG`KMgO@t)L{~##HSDcQ> zu0=VyzB0bvL%t`Yb95_)@w~xreF%>wHXQ=aPnCTQ{W1@_-R~2EPo8huxazD(^OwRQ zpnx{|uqb8rJRBG${o9-$__a^HHkpiEpSv<2FJ2Fk5To&9Y4ZiY=mMpuYdAd0w9C=_ z!I<33z>(OIvZp1B3dNt!Q7@7Ph?UtcVrBgp)(4qfO+BC#C~DG`u@YbKZa#s>9g7-d zvndfL&*w_Kga`ZzADb0(g45qVtk}hB;cGJkKFU9wne$CVW+J0LKN(qzNLzrlAVPWG z_f)XPGMuP8JGv!A=v0V|Lr`z{!d;Lzu7lmrT??{4DiT{0RUQ-(nRXFOEVQ}ST@Sm` zFBpr~uM(EX_Ob~RY%fJ<>ut9ZfM+Qm&FuO@$8B(+ouQbvqrv-IEPDUx|4HxPRDz2n z<2b&V`~XbZY%#rrOc42{8v1l8qO>p&A7gzR@lU}zc9$}KJ_myVTEL9%zf?1H-+!7E zxzUzFUPF5r*5S(iIMLn2DEnY$QTorUuZ|P}hK|GSJn8ypUpD~`0*!Xs4P7I(^|lU* zO*xMq!E@Gfqdk&372IDYt}N2R4%=j%00z_)t&yyXN|_;f^SYPiUOfyR1$MgAZDTO_ zfw^6eSsNP~=jT)5tlp2F9pp@-Pejeoc#eWIRi)~WdWK|j(r#(Rcog3=7b**fxY^|= z9ipZ9p7X_e+nkoY9R)^Ve^elMl}-|*YJwFC`9|B1Q&I)cemSNi8Da`&2-CsVoZ8cmIJMJr*{I+ z7S`W@E}QP z+?Gxz)WPLa87hzrP4QnFMs^2r%1$S=qFvNl3E4XW(5ViLPm3)GIK=E7(8jza9xfhF zD6o0{JIB!jx7v#OjQrJxqlz`t)+ByVcMih=194vo`g#b$YN14hEH^|n**kuHzFeJ_ zTa4QfPof|GR+}BNe1sa&Ux1R&Uc0&YVkPhS0iBw?NlHZ@xj;*qkX! z6@daijcv@!)K?Ky8I8rs5g5?nzZGsT{xA&CBZW&z(fXVapo4S}(rOkY*OZ(Q$);IHkM-$lQdisdQrM)$wy}X_r0}Te&nG zS54;7K_ZtyfTF?2qoJdC+3K(-SR4Uu$l>tb`4u~y#;R?o#A?1irY;KQZ#ZjvM9;S@ zRKy2P_n7-*=IS?DLl7Q3{AR{f{TLJi1F{r0IDLWr@O6v60N7iGx~7=&%MLMr0{dgc AFaQ7m diff --git a/icons/mob/human_races/robotic.dmi b/icons/mob/human_races/robotic.dmi index 203f627f6f1b6770e0be025da4bccc6cf99446ea..6b9b9cc53718f0f9c05457eb8d0a0cda2699b2e5 100644 GIT binary patch delta 1563 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 RS9<`;rF%nPt60-2>>q42?L+_o From 050727514f02acd7899257b2005e81a21404c960 Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Thu, 17 Mar 2016 22:28:26 -0400 Subject: [PATCH 029/328] mode toggle --- .../gamemodes/miniantags/guardian/guardian.dm | 33 +++++++++++++++---- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/code/game/gamemodes/miniantags/guardian/guardian.dm b/code/game/gamemodes/miniantags/guardian/guardian.dm index b0c1ffd7e6d..2b3e3bd9149 100644 --- a/code/game/gamemodes/miniantags/guardian/guardian.dm +++ b/code/game/gamemodes/miniantags/guardian/guardian.dm @@ -64,10 +64,10 @@ src << "You somehow lack a summoner! As a result, you dispel!" ghostize() qdel() - //if(!summoner && !adminseal) - // src << "You somehow lack a summoner! As a result, you dispel!" - // ghostize() - // qdel() + if(!summoner && !adminseal) + src << "You somehow lack a summoner! As a result, you dispel!" + ghostize() + qdel() /mob/living/simple_animal/hostile/guardian/Move() //Returns to summoner if they move out of range ..() @@ -240,6 +240,7 @@ magic_fluff_string = "..And draw the Wizard, bringer of endless chaos!" tech_fluff_string = "Boot sequence complete. Crowd control modules activated. Holoparasite swarm online." bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, ready to sow havoc at random." + var/toggle = FALSE /mob/living/simple_animal/hostile/guardian/fire/Life() //Dies if the summoner dies ..() @@ -247,11 +248,29 @@ summoner.ExtinguishMob() summoner.adjust_fire_stacks(-20) +/mob/living/simple_animal/hostile/guardian/fire/ToggleMode() + if(src.loc == summoner) + if(toggle) + src << "You switch to dispersion mode, and will teleport victims away from your master." + toggle = FALSE + else + src << "You switch to deception mode, and will turn your victims against their allies." + toggle = TRUE + /mob/living/simple_animal/hostile/guardian/fire/AttackingTarget() if(..()) - if(ishuman(target)) - spawn(0) - new /obj/effect/hallucination/delusion(target.loc,target,force_kind="custom",duration=200,skip_nearby=0, custom_icon = src.icon_state, custom_icon_file = src.icon) + if(toggle) + if(ishuman(target) && !summoner) + spawn(0) + new /obj/effect/hallucination/delusion(target.loc,target,force_kind="custom",duration=200,skip_nearby=0, custom_icon = src.icon_state, custom_icon_file = src.icon) + else + if(prob(45)) + if(istype(target, /atom/movable)) + var/atom/movable/M = target + if(!M.anchored && M != summoner) + new /obj/effect/overlay/temp/guardian/phase/out(get_turf(M)) + do_teleport(M, M, 10) + new /obj/effect/overlay/temp/guardian/phase/out(get_turf(M)) /mob/living/simple_animal/hostile/guardian/fire/Crossed(AM as mob|obj) ..() From be74bf87454c52e43e33f16b623f05c2dc93cf9b Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Fri, 18 Mar 2016 00:59:11 -0400 Subject: [PATCH 030/328] ......dammitiger --- code/game/gamemodes/miniantags/guardian/guardian.dm | 8 +++----- code/modules/flufftext/Hallucination.dm | 4 ++-- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/code/game/gamemodes/miniantags/guardian/guardian.dm b/code/game/gamemodes/miniantags/guardian/guardian.dm index 2b3e3bd9149..9be64bfc1d0 100644 --- a/code/game/gamemodes/miniantags/guardian/guardian.dm +++ b/code/game/gamemodes/miniantags/guardian/guardian.dm @@ -46,7 +46,6 @@ /mob/living/simple_animal/hostile/guardian/Life() //Dies if the summoner dies ..() - updatehudhealth() if(summoner) if(summoner.stat == DEAD) src << "Your summoner has died!" @@ -85,7 +84,7 @@ summoner.death() -/mob/living/simple_animal/hostile/guardian/proc/updatehudhealth() +/mob/living/simple_animal/hostile/guardian/handle_hud_icons_health() if(summoner) var/resulthealth if(iscarbon(summoner)) @@ -107,7 +106,6 @@ if(summoner.stat == UNCONSCIOUS) summoner << "Your body can't take the strain of sustaining [src] in this condition, it begins to fall apart!" summoner.adjustCloneLoss(damage/2) - updatehudhealth() /mob/living/simple_animal/hostile/guardian/ex_act(severity, target) switch (severity) @@ -134,7 +132,7 @@ return if(!summoner) return if(loc == summoner) - forceMove(summoner) + forceMove(get_turf(summoner)) src.client.eye = loc cooldown = world.time + 30 @@ -262,7 +260,7 @@ if(toggle) if(ishuman(target) && !summoner) spawn(0) - new /obj/effect/hallucination/delusion(target.loc,target,force_kind="custom",duration=200,skip_nearby=0, custom_icon = src.icon_state, custom_icon_file = src.icon) + new /obj/effect/hallucination/delusion(target.loc, target, force_kind="custom", duration=200, skip_nearby=0, custom_icon = src.icon_state, custom_icon_file = src.icon) else if(prob(45)) if(istype(target, /atom/movable)) diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 34b74aff54d..d9ad186fed6 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -325,10 +325,10 @@ Gunshots/explosions/opening doors/less rare audio (done) /obj/effect/hallucination/delusion var/list/image/delusions = list() -/obj/effect/hallucination/delusion/New(loc,mob/living/carbon/T,force_kind = null , duration = 300,skip_nearby = 1, custom_icon = null, custom_icon_file = null) +/obj/effect/hallucination/delusion/New(loc,mob/living/carbon/T, force_kind = null , duration = 300,skip_nearby = 1, custom_icon = null, custom_icon_file = null) target = T var/image/A = null - var/kind = force_kind ? force_kind : pick("clown","corgi","carp","skeleton","demon") + var/kind = force_kind ? force_kind : pick("clown", "corgi", "carp", "skeleton", "demon") for(var/mob/living/carbon/human/H in living_mob_list) if(H == target) continue From f4ea29fc437fa572e21ce303d3a0fca9e3f55fff Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Fri, 18 Mar 2016 01:21:34 -0400 Subject: [PATCH 031/328] Aliums polling forever because of organ change --- .../mob/living/carbon/alien/special/alien_embryo.dm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm index 60c6c996eae..f07cf2cf3e6 100644 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm @@ -6,6 +6,7 @@ icon = 'icons/mob/alien.dmi' icon_state = "larva0_dead" var/stage = 0 + var/polling = 0 /obj/item/organ/internal/body_egg/alien_embryo/on_find(mob/living/finder) ..() @@ -65,8 +66,9 @@ /obj/item/organ/internal/body_egg/alien_embryo/proc/AttemptGrow(var/gib_on_success = 1) - if(!owner) + if(!owner || polling) return + polling = 1 spawn() var/list/candidates = pollCandidates("Do you want to play as an alien?", ROLE_ALIEN, 0) var/mob/C = null @@ -81,7 +83,8 @@ else if(owner.client) C = owner.client else - stage = 4 // Let's try again later. + stage = 2 // Let's try again later. + polling = 0 return var/overlay = image('icons/mob/alien.dmi', loc = owner, icon_state = "burst_lie") From 89efc0b43631f54055cd55c52059db19b501a1ee Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Fri, 18 Mar 2016 02:07:04 -0400 Subject: [PATCH 032/328] Fixes vamp antage hud not showing on round start --- code/game/gamemodes/vampire/vampire.dm | 2 +- code/game/gamemodes/vampire/vampire_powers.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/gamemodes/vampire/vampire.dm b/code/game/gamemodes/vampire/vampire.dm index 264a280e3e0..f10227cc6c3 100644 --- a/code/game/gamemodes/vampire/vampire.dm +++ b/code/game/gamemodes/vampire/vampire.dm @@ -71,7 +71,7 @@ grant_vampire_powers(vampire.current) forge_vampire_objectives(vampire) greet_vampire(vampire) - + update_vampire_icons_added(vampire) ..() /datum/game_mode/proc/auto_declare_completion_vampire() diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm index d8dc1211b7b..0c69bd5b2a7 100644 --- a/code/game/gamemodes/vampire/vampire_powers.dm +++ b/code/game/gamemodes/vampire/vampire_powers.dm @@ -315,7 +315,7 @@ log_to_dd("something bad happened on enthralling a mob, attacker is [user] [user.key] \ref[user]") return 0 if(!C.mind) - user << "" + user << "[C.name]'s mind is not there for you to enthrall." return 0 if(enthrall_safe || ( C.mind in ticker.mode.vampires )||( C.mind.vampire )||( C.mind in ticker.mode.vampire_enthralled )) C.visible_message("[C] seems to resist the takeover!", "You feel a familiar sensation in your skull that quickly dissipates.") From d748ef23b88fd0bfb377ab778f5ef5dd7b679141 Mon Sep 17 00:00:00 2001 From: Crazylemon64 Date: Thu, 17 Mar 2016 23:07:45 -0700 Subject: [PATCH 033/328] Makes DNA swapping methods more reliable - Makes heads keep hair on removal - Amputated limbs from a DNA-injected individual now will keep their appearance of the DNA-injected person - Wounds will now vanish on their own now - Admins now have an "incarnate" option on the player panel when viewing ghosts for quick player instantiation - Fixes a runtime regarding failing a limb reconnection surgery - Copying a client's preferences now overrides the previous mob's DNA --- code/datums/datumvars.dm | 3 -- .../objects/items/weapons/dna_injector.dm | 15 ++++++-- .../objects/items/weapons/dnascrambler.dm | 2 +- code/modules/admin/admin.dm | 3 ++ code/modules/admin/topic.dm | 8 +++++ code/modules/client/preferences.dm | 5 +-- code/modules/mob/dead/observer/observer.dm | 10 ++++++ .../mob/living/carbon/human/human_organs.dm | 7 ++-- code/modules/surgery/limb_reattach.dm | 2 +- code/modules/surgery/organs/organ.dm | 2 +- code/modules/surgery/organs/organ_external.dm | 35 ++++++++++++++----- code/modules/surgery/organs/organ_icon.dm | 18 +++++++--- 12 files changed, 84 insertions(+), 26 deletions(-) diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 2088a50d748..01963850559 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -219,9 +219,6 @@ body += "

Refresh" - //if(ismob(D)) - // body += "
Show player panel

" - body += {"
+ "} + + body += {" + + "} + + + body += "" + body += "" + if(ismob(D)) + body += "" + + body += "" + + if(ismob(D)) + body += "" + body += "" + body += "" + body += "" + + body += "" + + body += "" + body += "" + body += "" + + body += "" + body += "" + body += "" + body += "" + body += "" + + body += "" + + body += "" + body += "" + if(ishuman(D)) + body += "" + body += "" + body += "" + body += "" + body += "" + body += "" + body += "" + body += "" + body += "" + body += "" + body += "" + if(isobj(D)) + body += "" + if(isobj(D) || ismob(D) || isturf(D)) + body += "" + body += "" + body += "" + + body += "
" + + body += "
" + + body += "E - Edit, tries to determine the variable type by itself.
" + body += "C - Change, asks you for the var type first.
" + body += "M - Mass modify: changes this variable for all objects of this type.

" + + body += "
Search:

" + + body += "
    " + + var/list/names = list() + for (var/V in D.vars) + names += V + + names = sortList(names) + + for (var/V in names) + body += debug_variable(V, D.vars[V], 0, D) + + body += "
" + + var/html = "" + if (title) + html += "[title]" + html += {""} + html += "" + html += body + + html += {" + + "} + + html += "" + + usr << browse(html, "window=variables\ref[D];size=475x650") + + return + +/client/proc/debug_variable(name, value, level, var/datum/DA = null) + var/html = "" + + if(DA) + html += "
  • (E) (C) (M) " + else + html += "
  • " + + if (isnull(value)) + html += "[name] = null" + + else if (istext(value)) + html += "[name] = \"[value]\"" + + else if (isicon(value)) + #ifdef VARSICON + var/icon/I = new/icon(value) + var/rnd = rand(1,10000) + var/rname = "tmp\ref[I][rnd].png" + usr << browse_rsc(I, rname) + html += "[name] = ([value]) " + #else + html += "[name] = /icon ([value])" + #endif + +/* else if (istype(value, /image)) + #ifdef VARSICON + var/rnd = rand(1, 10000) + var/image/I = value + + src << browse_rsc(I.icon, "tmp\ref[value][rnd].png") + html += "[name] = " + #else + html += "[name] = /image ([value])" + #endif +*/ + else if (isfile(value)) + html += "[name] = '[value]'" + + else if (istype(value, /datum)) + var/datum/D = value + html += "[name] \ref[value] = [D.type]" + + else if (istype(value, /client)) + var/client/C = value + html += "[name] \ref[value] = [C] [C.type]" +// + else if (istype(value, /list)) + var/list/L = value + html += "[name] = /list ([L.len])" + + if (L.len > 0 && !(name == "underlays" || name == "overlays" || name == "vars" || L.len > 500)) + // not sure if this is completely right... + if(0) //(L.vars.len > 0) + html += "
      " + html += "
    " + else + html += "
      " + var/index = 1 + for (var/entry in L) + if(istext(entry)) + html += debug_variable(entry, L[entry], level + 1) + //html += debug_variable("[index]", L[index], level + 1) + else + html += debug_variable(index, L[index], level + 1) + index++ + html += "
    " + + else + html += "[name] = [value]" + /* + // Bitfield stuff + if(round(value)==value) // Require integers. + var/idx=0 + var/bit=0 + var/bv=0 + html += "
    " + for(var/block=0;block<8;block++) + html += " " + for(var/i=0;i<4;i++) + idx=(block*4)+i + bit=1 << idx + bv=value & bit + html += "[bv?1:0]" + html += "" + html += "
    " + */ + html += "
  • " + + return html + +/client/proc/view_var_Topic(href, href_list, hsrc) + //This should all be moved over to datum/admins/Topic() or something ~Carn + if(!check_rights(R_ADMIN|R_MOD)) + return + if(href_list["Vars"]) + debug_variables(locate(href_list["Vars"])) + + //~CARN: for renaming mobs (updates their name, real_name, mind.name, their ID/PDA and datacore records). + else if(href_list["rename"]) + if(!check_rights(R_ADMIN)) return + + var/mob/M = locate(href_list["rename"]) + if(!istype(M)) + usr << "This can only be used on instances of type /mob" + return + + var/new_name = sanitize(copytext(input(usr,"What would you like to name this mob?","Input a name",M.real_name) as text|null,1,MAX_NAME_LEN)) + if( !new_name || !M ) return + + message_admins("Admin [key_name_admin(usr)] renamed [key_name_admin(M)] to [new_name].") + M.rename_character(M.real_name, new_name) + href_list["datumrefresh"] = href_list["rename"] + + else if(href_list["varnameedit"] && href_list["datumedit"]) + if(!check_rights(R_VAREDIT)) return + + var/D = locate(href_list["datumedit"]) + if(!istype(D,/datum) && !istype(D,/client)) + usr << "This can only be used on instances of types /client or /datum" + return + + modify_variables(D, href_list["varnameedit"], 1) + + else if(href_list["togbit"]) + if(!check_rights(R_VAREDIT)) return + + var/atom/D = locate(href_list["subject"]) + if(!istype(D,/datum) && !istype(D,/client)) + usr << "This can only be used on instances of types /client or /datum" + return + if(!(href_list["var"] in D.vars)) + usr << "Unable to find variable specified." + return + var/value = D.vars[href_list["var"]] + value ^= 1 << text2num(href_list["togbit"]) + D.vars[href_list["var"]] = value + + else if(href_list["varnamechange"] && href_list["datumchange"]) + if(!check_rights(R_VAREDIT)) return + + var/D = locate(href_list["datumchange"]) + if(!istype(D,/datum) && !istype(D,/client)) + usr << "This can only be used on instances of types /client or /datum" + return + + modify_variables(D, href_list["varnamechange"], 0) + + else if(href_list["varnamemass"] && href_list["datummass"]) + if(!check_rights(R_VAREDIT)) return + + var/atom/A = locate(href_list["datummass"]) + if(!istype(A)) + usr << "This can only be used on instances of type /atom" + return + + cmd_mass_modify_object_variables(A, href_list["varnamemass"]) + + else if(href_list["mob_player_panel"]) + if(!check_rights(R_ADMIN|R_MOD)) return + + var/mob/M = locate(href_list["mob_player_panel"]) + if(!istype(M)) + usr << "This can only be used on instances of type /mob" + return + + src.holder.show_player_panel(M) + href_list["datumrefresh"] = href_list["mob_player_panel"] + + else if(href_list["give_spell"]) + if(!check_rights(R_SERVER|R_EVENT)) return + + var/mob/M = locate(href_list["give_spell"]) + if(!istype(M)) + usr << "This can only be used on instances of type /mob" + return + + src.give_spell(M) + href_list["datumrefresh"] = href_list["give_spell"] + + + else if(href_list["give_disease2"]) + if(!check_rights(R_SERVER|R_EVENT)) return + + var/mob/M = locate(href_list["give_disease2"]) + if(!istype(M)) + usr << "This can only be used on instances of type /mob" + return + + src.give_disease2(M) + href_list["datumrefresh"] = href_list["give_spell"] + + else if(href_list["godmode"]) + if(!check_rights(R_REJUVINATE)) return + + var/mob/M = locate(href_list["godmode"]) + if(!istype(M)) + usr << "This can only be used on instances of type /mob" + return + + src.cmd_admin_godmode(M) + href_list["datumrefresh"] = href_list["godmode"] + + else if(href_list["gib"]) + if(!check_rights(R_ADMIN|R_EVENT)) return + + var/mob/M = locate(href_list["gib"]) + if(!istype(M)) + usr << "This can only be used on instances of type /mob" + return + + src.cmd_admin_gib(M) + + else if(href_list["build_mode"]) + if(!check_rights(R_BUILDMODE)) return + + var/mob/M = locate(href_list["build_mode"]) + if(!istype(M)) + usr << "This can only be used on instances of type /mob" + return + + togglebuildmode(M) + href_list["datumrefresh"] = href_list["build_mode"] + + else if(href_list["drop_everything"]) + if(!check_rights(R_DEBUG|R_ADMIN)) return + + var/mob/M = locate(href_list["drop_everything"]) + if(!istype(M)) + usr << "This can only be used on instances of type /mob" + return + + if(usr.client) + usr.client.cmd_admin_drop_everything(M) + + else if(href_list["direct_control"]) + if(!check_rights(R_DEBUG|R_ADMIN)) return + + var/mob/M = locate(href_list["direct_control"]) + if(!istype(M)) + usr << "This can only be used on instances of type /mob" + return + + if(usr.client) + usr.client.cmd_assume_direct_control(M) + + else if(href_list["make_skeleton"]) + if(!check_rights(R_SERVER|R_EVENT)) return + + var/mob/living/carbon/human/H = locate(href_list["make_skeleton"]) + if(!istype(H)) + usr << "This can only be used on instances of type /mob/living/carbon/human" + return + + var/confirm = alert("Are you sure you want to turn this mob into a skeleton?","Confirm Skeleton Transformation","Yes","No") + if(confirm != "Yes") + return + + H.makeSkeleton() + message_admins("[key_name(usr)] has turned [key_name(H)] into a skeleton") + log_admin("[key_name_admin(usr)] has turned [key_name_admin(H)] into a skeleton") + href_list["datumrefresh"] = href_list["make_skeleton"] + + else if(href_list["offer_control"]) + if(!check_rights(R_ADMIN)) return + + var/mob/M = locate(href_list["offer_control"]) + if(!istype(M)) + usr << "This can only be used on instances of type /mob" + return + M << "Control of your mob has been offered to dead players." + log_admin("[key_name(usr)] has offered control of ([key_name(M)]) to ghosts.") + message_admins("[key_name_admin(usr)] has offered control of ([key_name_admin(M)]) to ghosts") + var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as [M.real_name]?", poll_time = 100) + var/mob/dead/observer/theghost = null + + if(candidates.len) + theghost = pick(candidates) + M << "Your mob has been taken over by a ghost!" + message_admins("[key_name_admin(theghost)] has taken control of ([key_name_admin(M)])") + M.ghostize() + M.key = theghost.key + else + M << "There were no ghosts willing to take control." + message_admins("No ghosts were willing to take control of [key_name_admin(M)])") + + else if(href_list["delall"]) + if(!check_rights(R_DEBUG|R_SERVER)) return + + var/obj/O = locate(href_list["delall"]) + if(!isobj(O)) + usr << "This can only be used on instances of type /obj" + return + + var/action_type = alert("Strict type ([O.type]) or type and all subtypes?",,"Strict type","Type and subtypes","Cancel") + if(action_type == "Cancel" || !action_type) + return + + if(alert("Are you really sure you want to delete all objects of type [O.type]?",,"Yes","No") != "Yes") + return + + if(alert("Second confirmation required. Delete?",,"Yes","No") != "Yes") + return + + var/O_type = O.type + switch(action_type) + if("Strict type") + var/i = 0 + for(var/obj/Obj in world) + if(Obj.type == O_type) + i++ + qdel(Obj) + if(!i) + usr << "No objects of this type exist" + return + log_admin("[key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted)") + message_admins("[key_name_admin(usr)] deleted all objects of type [O_type] ([i] objects deleted)") + if("Type and subtypes") + var/i = 0 + for(var/obj/Obj in world) + if(istype(Obj,O_type)) + i++ + qdel(Obj) + if(!i) + usr << "No objects of this type exist" + return + log_admin("[key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted)") + message_admins("[key_name_admin(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted)") + + else if(href_list["addreagent"]) /* Made on /TG/, credit to them. */ + if(!check_rights(R_DEBUG|R_ADMIN)) return + + var/atom/A = locate(href_list["addreagent"]) + + if(!A.reagents) + var/amount = input(usr, "Specify the reagent size of [A]", "Set Reagent Size", 50) as num + if(amount) + A.create_reagents(amount) + + if(A.reagents) + var/list/reagent_options = list() + for(var/r_id in chemical_reagents_list) + var/datum/reagent/R = chemical_reagents_list[r_id] + reagent_options[R.name] = r_id + + if(reagent_options.len) + reagent_options = sortAssoc(reagent_options) + reagent_options.Insert(1, "CANCEL") + + var/chosen = input(usr, "Choose a reagent to add.", "Choose a reagent.") in reagent_options + var/chosen_id = reagent_options[chosen] + + if(chosen_id) + var/amount = input(usr, "Choose the amount to add.", "Choose the amount.", A.reagents.maximum_volume) as num + if(amount) + A.reagents.add_reagent(chosen_id, amount) + log_admin("[key_name(usr)] has added [amount] units of [chosen] to \the [A]") + message_admins("[key_name_admin(usr)] has added [amount] units of [chosen] to \the [A]") + + else if(href_list["explode"]) + if(!check_rights(R_DEBUG|R_EVENT)) return + + var/atom/A = locate(href_list["explode"]) + if(!isobj(A) && !ismob(A) && !isturf(A)) + usr << "This can only be done to instances of type /obj, /mob and /turf" + return + + src.cmd_admin_explosion(A) + href_list["datumrefresh"] = href_list["explode"] + + else if(href_list["emp"]) + if(!check_rights(R_DEBUG|R_EVENT)) return + + var/atom/A = locate(href_list["emp"]) + if(!isobj(A) && !ismob(A) && !isturf(A)) + usr << "This can only be done to instances of type /obj, /mob and /turf" + return + + src.cmd_admin_emp(A) + href_list["datumrefresh"] = href_list["emp"] + + else if(href_list["mark_object"]) + if(!check_rights(0)) return + + var/datum/D = locate(href_list["mark_object"]) + if(!istype(D)) + usr << "This can only be done to instances of type /datum" + return + + src.holder.marked_datum = D + href_list["datumrefresh"] = href_list["mark_object"] + + else if(href_list["proc_call"]) + if(!check_rights(R_PROCCALL)) + return + + var/T = locate(href_list["proc_call"]) + + if(T) + callproc_datum(T) + + else if(href_list["rotatedatum"]) + if(!check_rights(R_DEBUG|R_ADMIN)) return + + var/atom/A = locate(href_list["rotatedatum"]) + if(!istype(A)) + usr << "This can only be done to instances of type /atom" + return + + switch(href_list["rotatedir"]) + if("right") A.dir = turn(A.dir, -45) + if("left") A.dir = turn(A.dir, 45) + + message_admins("[key_name_admin(usr)] has rotated \the [A]") + log_admin("[key_name(usr)] has rotated \the [A]") + href_list["datumrefresh"] = href_list["rotatedatum"] + + else if(href_list["makemonkey"]) + if(!check_rights(R_SPAWN)) return + + var/mob/living/carbon/human/H = locate(href_list["makemonkey"]) + if(!istype(H)) + usr << "This can only be done to instances of type /mob/living/carbon/human" + return + + if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return + if(!H) + usr << "Mob doesn't exist anymore" + return + holder.Topic(href, list("monkeyone"=href_list["makemonkey"])) + + else if(href_list["makerobot"]) + if(!check_rights(R_SPAWN)) return + + var/mob/living/carbon/human/H = locate(href_list["makerobot"]) + if(!istype(H)) + usr << "This can only be done to instances of type /mob/living/carbon/human" + return + + if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return + if(!H) + usr << "Mob doesn't exist anymore" + return + holder.Topic(href, list("makerobot"=href_list["makerobot"])) + + else if(href_list["makealien"]) + if(!check_rights(R_SPAWN)) return + + var/mob/living/carbon/human/H = locate(href_list["makealien"]) + if(!istype(H)) + usr << "This can only be done to instances of type /mob/living/carbon/human" + return + + if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return + if(!H) + usr << "Mob doesn't exist anymore" + return + holder.Topic(href, list("makealien"=href_list["makealien"])) + + else if(href_list["makeslime"]) + if(!check_rights(R_SPAWN)) return + + var/mob/living/carbon/human/H = locate(href_list["makeslime"]) + if(!istype(H)) + usr << "This can only be done to instances of type /mob/living/carbon/human" + return + + if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return + if(!H) + usr << "Mob doesn't exist anymore" + return + holder.Topic(href, list("makeslime"=href_list["makeslime"])) + + else if(href_list["makesuper"]) + if(!check_rights(R_SPAWN)) return + + var/mob/living/carbon/human/H = locate(href_list["makesuper"]) + if(!istype(H)) + usr << "This can only be done to instances of type /mob/living/carbon/human" + return + + if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return + if(!H) + usr << "Mob doesn't exist anymore" + return + holder.Topic(href, list("makesuper"=href_list["makesuper"])) + + else if(href_list["makeai"]) + if(!check_rights(R_SPAWN)) return + + var/mob/living/carbon/human/H = locate(href_list["makeai"]) + if(!istype(H)) + usr << "This can only be done to instances of type /mob/living/carbon/human" + return + + if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return + if(!H) + usr << "Mob doesn't exist anymore" + return + holder.Topic(href, list("makeai"=href_list["makeai"])) + + else if(href_list["makemask"]) + if(!check_rights(R_SPAWN)) return + var/mob/currentMob = locate(href_list["makemask"]) + if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return + if(!currentMob) + usr << "Mob doesn't exist anymore" + return + holder.Topic(href, list("makemask"=href_list["makemask"])) + + + else if(href_list["setspecies"]) + if(!check_rights(R_SPAWN)) return + + var/mob/living/carbon/human/H = locate(href_list["setspecies"]) + if(!istype(H)) + usr << "This can only be done to instances of type /mob/living/carbon/human" + return + + var/new_species = input("Please choose a new species.","Species",null) as null|anything in all_species + + if(!H) + usr << "Mob doesn't exist anymore" + return + + if(H.set_species(new_species)) + usr << "Set species of [H] to [H.species]." + H.regenerate_icons() + message_admins("[key_name_admin(usr)] has changed the species of [key_name_admin(H)] to [new_species]") + log_admin("[key_name(usr)] has changed the species of [key_name(H)] to [new_species]") + else + usr << "Failed! Something went wrong." + + else if(href_list["addlanguage"]) + if(!check_rights(R_SPAWN)) return + + var/mob/H = locate(href_list["addlanguage"]) + if(!istype(H)) + usr << "This can only be done to instances of type /mob" + return + + var/new_language = input("Please choose a language to add.","Language",null) as null|anything in all_languages + + if(!new_language) + return + + if(!H) + usr << "Mob doesn't exist anymore" + return + + if(H.add_language(new_language)) + usr << "Added [new_language] to [H]." + message_admins("[key_name_admin(usr)] has given [key_name_admin(H)] the language [new_language]") + log_admin("[key_name(usr)] has given [key_name(H)] the language [new_language]") + else + usr << "Mob already knows that language." + + else if(href_list["remlanguage"]) + if(!check_rights(R_SPAWN)) return + + var/mob/H = locate(href_list["remlanguage"]) + if(!istype(H)) + usr << "This can only be done to instances of type /mob" + return + + if(!H.languages.len) + usr << "This mob knows no languages." + return + + var/datum/language/rem_language = input("Please choose a language to remove.","Language",null) as null|anything in H.languages + + if(!rem_language) + return + + if(!H) + usr << "Mob doesn't exist anymore" + return + + if(H.remove_language(rem_language.name)) + usr << "Removed [rem_language] from [H]." + message_admins("[key_name_admin(usr)] has removed language [rem_language] from [key_name_admin(H)]") + log_admin("[key_name(usr)] has removed language [rem_language] from [key_name(H)]") + else + usr << "Mob doesn't know that language." + + else if(href_list["addverb"]) + if(!check_rights(R_DEBUG)) return + + var/mob/living/H = locate(href_list["addverb"]) + + if(!istype(H)) + usr << "This can only be done to instances of type /mob/living" + return + var/list/possibleverbs = list() + possibleverbs += "Cancel" // One for the top... + possibleverbs += typesof(/mob/proc,/mob/verb,/mob/living/proc,/mob/living/verb) + switch(H.type) + if(/mob/living/carbon/human) + possibleverbs += typesof(/mob/living/carbon/proc,/mob/living/carbon/verb,/mob/living/carbon/human/verb,/mob/living/carbon/human/proc) + if(/mob/living/silicon/robot) + possibleverbs += typesof(/mob/living/silicon/proc,/mob/living/silicon/robot/proc,/mob/living/silicon/robot/verb) + if(/mob/living/silicon/ai) + possibleverbs += typesof(/mob/living/silicon/proc,/mob/living/silicon/ai/proc,/mob/living/silicon/ai/verb) + possibleverbs -= H.verbs + possibleverbs += "Cancel" // ...And one for the bottom + + var/verb = input("Select a verb!", "Verbs",null) as anything in possibleverbs + if(!H) + usr << "Mob doesn't exist anymore" + return + if(!verb || verb == "Cancel") + return + else + H.verbs += verb + message_admins("[key_name_admin(usr)] has given [key_name_admin(H)] the verb [verb]") + log_admin("[key_name(usr)] has given [key_name(H)] the verb [verb]") + + else if(href_list["remverb"]) + if(!check_rights(R_DEBUG)) return + + var/mob/H = locate(href_list["remverb"]) + + if(!istype(H)) + usr << "This can only be done to instances of type /mob" + return + var/verb = input("Please choose a verb to remove.","Verbs",null) as null|anything in H.verbs + if(!H) + usr << "Mob doesn't exist anymore" + return + if(!verb) + return + else + H.verbs -= verb + message_admins("[key_name_admin(usr)] has removed verb [verb] from [key_name_admin(H)]") + log_admin("[key_name(usr)] has removed verb [verb] from [key_name(H)]") + + else if(href_list["addorgan"]) + if(!check_rights(R_SPAWN)) return + + var/mob/living/carbon/M = locate(href_list["addorgan"]) + if(!istype(M)) + usr << "This can only be done to instances of type /mob/living/carbon" + return + + var/new_organ = input("Please choose an organ to add.","Organ",null) as null|anything in subtypesof(/obj/item/organ)-/obj/item/organ + if(!new_organ) return + + if(!M) + usr << "Mob doesn't exist anymore" + return + + if(locate(new_organ) in M.internal_organs) + usr << "Mob already has that organ." + return + var/obj/item/organ/internal/organ = new new_organ + organ.insert(M) + message_admins("[key_name_admin(usr)] has given [key_name_admin(M)] the organ [new_organ]") + log_admin("[key_name(usr)] has given [key_name(M)] the organ [new_organ]") + + else if(href_list["remorgan"]) + if(!check_rights(R_SPAWN)) return + + var/mob/living/carbon/M = locate(href_list["remorgan"]) + if(!istype(M)) + usr << "This can only be done to instances of type /mob/living/carbon" + return + + var/obj/item/organ/internal/rem_organ = input("Please choose an organ to remove.","Organ",null) as null|anything in M.internal_organs + + if(!M) + usr << "Mob doesn't exist anymore" + return + + if(!(locate(rem_organ) in M.internal_organs)) + usr << "Mob does not have that organ." + return + + usr << "Removed [rem_organ] from [M]." + rem_organ.remove(M) + message_admins("[key_name_admin(usr)] has removed the organ [rem_organ] from [key_name_admin(M)]") + log_admin("[key_name(usr)] has removed the organ [rem_organ] from [key_name(M)]") + qdel(rem_organ) + + else if(href_list["fix_nano"]) + if(!check_rights(R_DEBUG)) return + + var/mob/H = locate(href_list["fix_nano"]) + + if(!istype(H) || !H.client) + usr << "This can only be done on mobs with clients" + return + + H.client.reload_nanoui_resources() + + usr << "Resource files sent" + H << "Your NanoUI Resource files have been refreshed" + + log_admin("[key_name(usr)] resent the NanoUI resource files to [key_name(H)]") + + else if(href_list["regenerateicons"]) + if(!check_rights(0)) return + + var/mob/M = locate(href_list["regenerateicons"]) + if(!ismob(M)) + usr << "This can only be done to instances of type /mob" + return + M.regenerate_icons() + + else if(href_list["adjustDamage"] && href_list["mobToDamage"]) + if(!check_rights(R_DEBUG|R_ADMIN|R_EVENT)) return + + var/mob/living/L = locate(href_list["mobToDamage"]) + if(!istype(L)) return + + var/Text = href_list["adjustDamage"] + + var/amount = input("Deal how much damage to mob? (Negative values here heal)","Adjust [Text]loss",0) as num + + if(!L) + usr << "Mob doesn't exist anymore" + return + + switch(Text) + if("brute") L.adjustBruteLoss(amount) + if("fire") L.adjustFireLoss(amount) + if("toxin") L.adjustToxLoss(amount) + if("oxygen")L.adjustOxyLoss(amount) + if("brain") L.adjustBrainLoss(amount) + if("clone") L.adjustCloneLoss(amount) + else + usr << "You caused an error. DEBUG: Text:[Text] Mob:[L]" + return + + if(amount != 0) + log_admin("[key_name(usr)] dealt [amount] amount of [Text] damage to [L]") + message_admins("[key_name_admin(usr)] dealt [amount] amount of [Text] damage to [L]") + href_list["datumrefresh"] = href_list["mobToDamage"] + + if(href_list["datumrefresh"]) + var/datum/DAT = locate(href_list["datumrefresh"]) + if(!istype(DAT, /datum)) + return + src.debug_variables(DAT) + + return + diff --git a/code/modules/admin/verbs/VV/debug.dm b/code/modules/admin/verbs/VV/debug.dm new file mode 100644 index 00000000000..8654c0b50fc --- /dev/null +++ b/code/modules/admin/verbs/VV/debug.dm @@ -0,0 +1,1220 @@ +/client/proc/Debug2() + set category = "Debug" + set name = "Debug-Game" + + if(!check_rights(R_DEBUG)) + return + + if(Debug2) + Debug2 = 0 + message_admins("[key_name_admin(src)] toggled debugging off.") + log_admin("[key_name(src)] toggled debugging off.") + else + Debug2 = 1 + message_admins("[key_name_admin(src)] toggled debugging on.") + log_admin("[key_name(src)] toggled debugging on.") + + feedback_add_details("admin_verb","DG2") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + + +/proc/create_arbitrary_var(var/client/var_creator) + var/datum/admins/adm = var_creator.holder + if(adm && adm.marked_datum) + class = input("What kind of variable?","Variable Type") in list("text","num","type","reference","mob reference","icon","file","client","mob's area","Marked datum ([holder.marked_datum.type])","CANCEL") + if(holder.marked_datum && class == "Marked datum ([adm.marked_datum.type])") + class = "Marked datum" + else + class = input("What kind of variable?","Variable Type") in list("text","num","type","reference","mob reference","icon","file","client","mob's area","CANCEL") + switch(class) + if("CANCEL") + return null + + if("text") + lst += input("Enter new text:","Text",null) as text + + if("num") + lst += input("Enter new number:","Num",0) as num + + if("type") + lst += input("Enter type:","Type") in typesof(/obj,/mob,/area,/turf) + + if("reference") + lst += input("Select reference:","Reference",src) as mob|obj|turf|area in world + + if("mob reference") + lst += input("Select reference:","Reference",usr) as mob in world + + if("file") + lst += input("Pick file:","File") as file + + if("icon") + lst += input("Pick icon:","Icon") as icon + + if("client") + var/list/keys = list() + for(var/mob/M in world) + keys += M.client + lst += input("Please, select a player!", "Selection", null, null) as null|anything in keys + + if("mob's area") + var/mob/temp = input("Select mob", "Selection", usr) as mob in world + lst += temp.loc + + if("Marked datum") + lst += holder.marked_datum + +/* 21st Sept 2010 +Updated by Skie -- Still not perfect but better! +Stuff you can't do: +Call proc /mob/proc/Dizzy() for some player +Because if you select a player mob as owner it tries to do the proc for +/mob/living/carbon/human/ instead. And that gives a run-time error. +But you can call procs that are of type /mob/living/carbon/human/proc/ for that player. +*/ + +/client/proc/callproc() + set category = "Debug" + set name = "Advanced ProcCall" + + if(!check_rights(R_PROCCALL)) + return + + spawn(0) + var/target = null + var/targetselected = 0 + var/returnval = null + var/class = null + + switch(alert("Proc owned by something?",,"Yes","No")) + if("Yes") + targetselected = 1 + if(src.holder && src.holder.marked_datum) + class = input("Proc owned by...","Owner",null) as null|anything in list("Obj","Mob","Area or Turf","Client","Marked datum ([holder.marked_datum.type])") + if(class == "Marked datum ([holder.marked_datum.type])") + class = "Marked datum" + else + class = input("Proc owned by...","Owner",null) as null|anything in list("Obj","Mob","Area or Turf","Client") + switch(class) + if("Obj") + target = input("Enter target:","Target",usr) as obj in world + if("Mob") + target = input("Enter target:","Target",usr) as mob in world + if("Area or Turf") + target = input("Enter target:","Target",usr.loc) as area|turf in world + if("Client") + var/list/keys = list() + for(var/client/C) + keys += C + target = input("Please, select a player!", "Selection", null, null) as null|anything in keys + if("Marked datum") + target = holder.marked_datum + else + return + if("No") + target = null + targetselected = 0 + + var/procname = input("Proc path, eg: /proc/fake_blood","Path:", null) as text|null + if(!procname) return + + if(targetselected && !hascall(target,procname)) + usr << "Error: callproc(): target has no such call [procname]." + return + + var/list/lst = get_callproc_args() + if(!lst) + return + + if(targetselected) + if(!target) + usr << "Error: callproc(): owner of proc no longer exists." + return + message_admins("[key_name_admin(src)] called [target]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].") + log_admin("[key_name(src)] called [target]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].") + returnval = call(target,procname)(arglist(lst)) // Pass the lst as an argument list to the proc + else + //this currently has no hascall protection. wasn't able to get it working. + message_admins("[key_name_admin(src)] called [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]") + log_admin("[key_name(src)] called [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]") + returnval = call(procname)(arglist(lst)) // Pass the lst as an argument list to the proc + + usr << "[procname] returned: [returnval ? returnval : "null"]" + feedback_add_details("admin_verb","APC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/proc/callproc_datum(var/A as null|area|mob|obj|turf) + set category = "Debug" + set name = "Atom ProcCall" + + if(!check_rights(R_PROCCALL)) + return + + var/procname = input("Proc name, eg: fake_blood","Proc:", null) as text|null + if(!procname) + return + + if(!hascall(A,procname)) + usr << "Error: callproc_datum(): target has no such call [procname]." + return + + var/list/lst = get_callproc_args() + if(!lst) + return + + if(!A || !IsValidSrc(A)) + usr << "Error: callproc_datum(): owner of proc no longer exists." + return + message_admins("[key_name_admin(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]") + log_admin("[key_name(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]") + + spawn() + var/returnval = call(A,procname)(arglist(lst)) // Pass the lst as an argument list to the proc + usr << "[procname] returned: [returnval ? returnval : "null"]" + + feedback_add_details("admin_verb","DPC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/proc/get_callproc_args() + var/argnum = input("Number of arguments","Number:",0) as num|null + if(!argnum && (argnum!=0)) return + + var/list/lst = list() + //TODO: make a list to store whether each argument was initialised as null. + //Reason: So we can abort the proccall if say, one of our arguments was a mob which no longer exists + //this will protect us from a fair few errors ~Carn + + while(argnum--) + var/class = null + // Make a list with each index containing one variable, to be given to the proc + return lst + +/client/proc/Cell() + set category = "Debug" + set name = "Air Status in Location" + + if(!check_rights(R_DEBUG)) + return + + if(!mob) + return + var/turf/T = mob.loc + + if (!( istype(T, /turf) )) + return + + var/datum/gas_mixture/env = T.return_air() + + var/t = "" + t+= "Nitrogen : [env.nitrogen]\n" + t+= "Oxygen : [env.oxygen]\n" + t+= "Plasma : [env.toxins]\n" + t+= "CO2: [env.carbon_dioxide]\n" + + usr.show_message(t, 1) + feedback_add_details("admin_verb","ASL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/proc/cmd_admin_robotize(var/mob/M in mob_list) + set category = "Event" + set name = "Make Robot" + + if(!check_rights(R_SPAWN)) + return + + if(!ticker) + alert("Wait until the game starts") + return + if(istype(M, /mob/living/carbon/human)) + log_admin("[key_name(src)] has robotized [M.key].") + spawn(10) + M:Robotize() + + else + alert("Invalid mob") + +/client/proc/cmd_admin_animalize(var/mob/M in mob_list) + set category = "Event" + set name = "Make Simple Animal" + + if(!check_rights(R_SPAWN)) + return + + if(!ticker) + alert("Wait until the game starts") + return + + if(!M) + alert("That mob doesn't seem to exist, close the panel and try again.") + return + + if(istype(M, /mob/new_player)) + alert("The mob must not be a new_player.") + return + + log_admin("[key_name(src)] has animalized [M.key].") + spawn(10) + M.Animalize() + + +/client/proc/makepAI(var/turf/T in mob_list) + set category = "Event" + set name = "Make pAI" + set desc = "Specify a location to spawn a pAI device, then specify a key to play that pAI" + + if(!check_rights(R_SPAWN)) + return + + var/list/available = list() + for(var/mob/C in mob_list) + if(C.key) + available.Add(C) + var/mob/choice = input("Choose a player to play the pAI", "Spawn pAI") in available + if(!choice) + return 0 + if(!istype(choice, /mob/dead/observer)) + var/confirm = input("[choice.key] isn't ghosting right now. Are you sure you want to yank him out of them out of their body and place them in this pAI?", "Spawn pAI Confirmation", "No") in list("Yes", "No") + if(confirm != "Yes") + return 0 + var/obj/item/device/paicard/card = new(T) + var/mob/living/silicon/pai/pai = new(card) + pai.name = input(choice, "Enter your pAI name:", "pAI Name", "Personal AI") as text + pai.real_name = pai.name + pai.key = choice.key + card.setPersonality(pai) + for(var/datum/paiCandidate/candidate in paiController.pai_candidates) + if(candidate.key == choice.key) + paiController.pai_candidates.Remove(candidate) + feedback_add_details("admin_verb","MPAI") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/proc/cmd_admin_alienize(var/mob/M in mob_list) + set category = "Event" + set name = "Make Alien" + + if(!check_rights(R_SPAWN)) + return + + if(!ticker) + alert("Wait until the game starts") + return + if(ishuman(M)) + log_admin("[key_name(src)] has alienized [M.key].") + spawn(10) + M:Alienize() + feedback_add_details("admin_verb","MKAL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + log_admin("[key_name(usr)] made [key_name(M)] into an alien.") + message_admins("\blue [key_name_admin(usr)] made [key_name(M)] into an alien.", 1) + else + alert("Invalid mob") + +/client/proc/cmd_admin_slimeize(var/mob/M in mob_list) + set category = "Event" + set name = "Make slime" + + if(!check_rights(R_SPAWN)) + return + + if(!ticker) + alert("Wait until the game starts") + return + if(ishuman(M)) + log_admin("[key_name(src)] has slimeized [M.key].") + spawn(10) + M:slimeize() + feedback_add_details("admin_verb","MKMET") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + log_admin("[key_name(usr)] made [key_name(M)] into a slime.") + message_admins("\blue [key_name_admin(usr)] made [key_name(M)] into a slime.", 1) + else + alert("Invalid mob") + +/client/proc/cmd_admin_super(var/mob/M in mob_list) + set category = "Event" + set name = "Make Superhero" + + if(!check_rights(R_SPAWN)) + return + + if(!ticker) + alert("Wait until the game starts") + return + if(ishuman(M)) + var/type = input("Pick the Superhero","Superhero") as null|anything in all_superheroes + var/datum/superheroes/S = all_superheroes[type] + if(S) + S.create(M) + log_admin("[key_name(src)] has turned [M.key] into a Superhero.") + message_admins("\blue [key_name_admin(usr)] made [key_name(M)] into a Superhero.", 1) + else + alert("Invalid mob") + +//TODO: merge the vievars version into this or something maybe mayhaps +/client/proc/cmd_debug_del_all() + set category = "Debug" + set name = "Del-All" + + if(!check_rights(R_DEBUG)) + return + + // to prevent REALLY stupid deletions + var/blocked = list(/mob/living, /mob/living/carbon, /mob/living/carbon/human, /mob/dead, /mob/dead/observer, /mob/living/silicon, /mob/living/silicon/robot, /mob/living/silicon/ai) + var/hsbitem = input(usr, "Choose an object to delete.", "Delete:") as null|anything in subtypesof(/obj) + subtypesof(/mob) - blocked + if(hsbitem) + for(var/atom/O in world) + if(istype(O, hsbitem)) + qdel(O) + log_admin("[key_name(src)] has deleted all instances of [hsbitem].") + message_admins("[key_name_admin(src)] has deleted all instances of [hsbitem].", 0) + feedback_add_details("admin_verb","DELA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/proc/cmd_debug_make_powernets() + set category = "Debug" + set name = "Make Powernets" + + if(!check_rights(R_DEBUG)) + return + + makepowernets() + log_admin("[key_name(src)] has remade the powernet. makepowernets() called.") + message_admins("[key_name_admin(src)] has remade the powernets. makepowernets() called.", 0) + feedback_add_details("admin_verb","MPWN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/proc/cmd_admin_grantfullaccess(var/mob/M in mob_list) + set category = "Admin" + set name = "Grant Full Access" + + if(!check_rights(R_EVENT)) + return + + if (!ticker) + alert("Wait until the game starts") + return + if (istype(M, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + if (H.wear_id) + var/obj/item/weapon/card/id/id = H.wear_id + if(istype(H.wear_id, /obj/item/device/pda)) + var/obj/item/device/pda/pda = H.wear_id + id = pda.id + id.icon_state = "gold" + id:access = get_all_accesses()+get_all_centcom_access()+get_all_syndicate_access() + else + var/obj/item/weapon/card/id/id = new/obj/item/weapon/card/id(M); + id.icon_state = "gold" + id:access = get_all_accesses()+get_all_centcom_access()+get_all_syndicate_access() + id.registered_name = H.real_name + id.assignment = "Captain" + id.name = "[id.registered_name]'s ID Card ([id.assignment])" + H.equip_to_slot_or_del(id, slot_wear_id) + H.update_inv_wear_id() + else + alert("Invalid mob") + feedback_add_details("admin_verb","GFA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + log_admin("[key_name(src)] has granted [M.key] full access.") + message_admins("\blue [key_name_admin(usr)] has granted [M.key] full access.", 1) + +/client/proc/cmd_assume_direct_control(var/mob/M in mob_list) + set category = "Admin" + set name = "Assume direct control" + set desc = "Direct intervention" + + if(!check_rights(R_DEBUG|R_ADMIN)) + return + + if(M.ckey) + if(alert("This mob is being controlled by [M.ckey]. Are you sure you wish to assume control of it? [M.ckey] will be made a ghost.",,"Yes","No") != "Yes") + return + else + var/mob/dead/observer/ghost = new/mob/dead/observer(M,1) + ghost.ckey = M.ckey + message_admins("\blue [key_name_admin(usr)] assumed direct control of [M].", 1) + log_admin("[key_name(usr)] assumed direct control of [M].") + var/mob/adminmob = src.mob + M.ckey = src.ckey + if( isobserver(adminmob) ) + qdel(adminmob) + feedback_add_details("admin_verb","ADC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + + +/client/proc/cmd_admin_areatest() + set category = "Mapping" + set name = "Test areas" + + if(!check_rights(R_DEBUG)) + return + + var/list/areas_all = list() + var/list/areas_with_APC = list() + var/list/areas_with_air_alarm = list() + var/list/areas_with_RC = list() + var/list/areas_with_light = list() + var/list/areas_with_LS = list() + var/list/areas_with_intercom = list() + var/list/areas_with_camera = list() + + var/list/areas_with_multiple_APCs = list() + var/list/areas_with_multiple_air_alarms = list() + + for(var/area/A in world) + areas_all |= A.type + + for(var/obj/machinery/power/apc/APC in world) + var/area/A = get_area(APC) + if(!A) + continue + if(!(A.type in areas_with_APC)) + areas_with_APC |= A.type + else + areas_with_multiple_APCs |= A.type + + for(var/obj/machinery/alarm/alarm in world) + var/area/A = get_area(alarm) + if(!A) + continue + if(!(A.type in areas_with_air_alarm)) + areas_with_air_alarm |= A.type + else + areas_with_multiple_air_alarms |= A.type + + for(var/obj/machinery/requests_console/RC in world) + var/area/A = get_area(RC) + if(!A) + continue + areas_with_RC |= A.type + + for(var/obj/machinery/light/L in world) + var/area/A = get_area(L) + if(!A) + continue + areas_with_light |= A.type + + for(var/obj/machinery/light_switch/LS in world) + var/area/A = get_area(LS) + if(!A) + continue + areas_with_LS |= A.type + + for(var/obj/item/device/radio/intercom/I in world) + var/area/A = get_area(I) + if(!A) + continue + areas_with_intercom |= A.type + + for(var/obj/machinery/camera/C in world) + var/area/A = get_area(C) + if(!A) + continue + areas_with_camera |= A.type + + var/list/areas_without_APC = areas_all - areas_with_APC + var/list/areas_without_air_alarm = areas_all - areas_with_air_alarm + var/list/areas_without_RC = areas_all - areas_with_RC + var/list/areas_without_light = areas_all - areas_with_light + var/list/areas_without_LS = areas_all - areas_with_LS + var/list/areas_without_intercom = areas_all - areas_with_intercom + var/list/areas_without_camera = areas_all - areas_with_camera + + world << "AREAS WITHOUT AN APC:" + for(var/areatype in areas_without_APC) + world << "* [areatype]" + + world << "AREAS WITHOUT AN AIR ALARM:" + for(var/areatype in areas_without_air_alarm) + world << "* [areatype]" + + world << "AREAS WITH TOO MANY APCS:" + for(var/areatype in areas_with_multiple_APCs) + world << "* [areatype]" + + world << "AREAS WITH TOO MANY AIR ALARMS:" + for(var/areatype in areas_with_multiple_air_alarms) + world << "* [areatype]" + + world << "AREAS WITHOUT A REQUEST CONSOLE:" + for(var/areatype in areas_without_RC) + world << "* [areatype]" + + world << "AREAS WITHOUT ANY LIGHTS:" + for(var/areatype in areas_without_light) + world << "* [areatype]" + + world << "AREAS WITHOUT A LIGHT SWITCH:" + for(var/areatype in areas_without_LS) + world << "* [areatype]" + + world << "AREAS WITHOUT ANY INTERCOMS:" + for(var/areatype in areas_without_intercom) + world << "* [areatype]" + + world << "AREAS WITHOUT ANY CAMERAS:" + for(var/areatype in areas_without_camera) + world << "* [areatype]" + +/client/proc/cmd_admin_dress(var/mob/living/carbon/human/M in mob_list) + set category = "Event" + set name = "Select equipment" + + if(!check_rights(R_EVENT)) + return + + if(!ishuman(M)) + alert("Invalid mob") + return + + //log_admin("[key_name(src)] has alienized [M.key].") + var/list/dresspacks = list( + "strip", + "as job...", + "Engineer RIG", + "CE RIG", + "Mining RIG", + "Syndi RIG", + "Wizard RIG", + "Medical RIG", + "Atmos RIG", + "standard space gear", + "tournament standard red", + "tournament standard green", + "tournament gangster", + "tournament chef", + "tournament janitor", + "pirate", + "space pirate", + "soviet admiral", + "tunnel clown", + "masked killer", + "singuloth knight", + "dark lord", + "assassin", + "death commando", + "syndicate commando", + "chrono legionnaire", + "special ops officer", + "special ops formal", + "blue wizard", + "red wizard", + "marisa wizard", + "emergency response team member", + "emergency response team leader", + "nanotrasen officer", + "nanotrasen captain", + ) + var/dostrip = input("Do you want to strip [M] before equipping them? (0=no, 1=yes)", "STRIPTEASE") as null|anything in list(0,1) + if(isnull(dostrip)) + return + var/dresscode = input("Select dress for [M]", "Robust quick dress shop") as null|anything in dresspacks + if (isnull(dresscode)) + return + + var/datum/job/jobdatum + if (dresscode == "as job...") + var/jobname = input("Select job", "Robust quick dress shop") as null|anything in get_all_jobs() + jobdatum = job_master.GetJob(jobname) + + feedback_add_details("admin_verb","SEQ") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + if(dostrip) + for (var/obj/item/I in M) + if (istype(I, /obj/item/weapon/implant)) + continue + if(istype(I, /obj/item/organ)) + continue + qdel(I) + switch(dresscode) + if ("strip") + //do nothing + + if ("as job...") + if(jobdatum) + dresscode = "[jobdatum.title]" + jobdatum.equip(M) + + if ("standard space gear") + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes) + + M.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/clothing/suit/space(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space(M), slot_head) + var /obj/item/weapon/tank/jetpack/J = new /obj/item/weapon/tank/jetpack/oxygen(M) + M.equip_to_slot_or_del(J, slot_back) + J.toggle() + M.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(M), slot_wear_mask) + J.Topic(null, list("stat" = 1)) + if ("Engineer RIG","CE RIG","Mining RIG","Syndi RIG","Wizard RIG","Medical RIG","Atmos RIG") + if(dresscode=="Engineer RIG") + M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig(M), slot_head) + else if(dresscode=="CE RIG") + M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/elite(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/elite(M), slot_head) + else if(dresscode=="Mining RIG") + M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/mining(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/mining(M), slot_head) + else if(dresscode=="Syndi RIG") + M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/syndi(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/syndi(M), slot_head) + else if(dresscode=="Wizard RIG") + M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/wizard(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/wizard(M), slot_head) + else if(dresscode=="Medical RIG") + M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/medical(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/medical(M), slot_head) + else if(dresscode=="Atmos RIG") + M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/atmos(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/atmos(M), slot_head) + var /obj/item/weapon/tank/jetpack/J = new /obj/item/weapon/tank/jetpack/oxygen(M) + M.equip_to_slot_or_del(J, slot_back) + J.toggle() + M.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(M), slot_wear_mask) + J.Topic(null, list("stat" = 1)) + + if ("tournament standard red","tournament standard green") //we think stunning weapon is too overpowered to use it on tournaments. --rastaf0 + if (dresscode=="tournament standard red") + M.equip_to_slot_or_del(new /obj/item/clothing/under/color/red(M), slot_w_uniform) + else + M.equip_to_slot_or_del(new /obj/item/clothing/under/color/green(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes) + + M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/thunderdome(M), slot_head) + + M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle/destroyer(M), slot_r_hand) + M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_hand) + M.equip_to_slot_or_del(new /obj/item/weapon/grenade/smokebomb(M), slot_r_store) + + + if ("tournament gangster") //gangster are supposed to fight each other. --rastaf0 + M.equip_to_slot_or_del(new /obj/item/clothing/under/det(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes) + + M.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/det_suit(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(M), slot_glasses) + M.equip_to_slot_or_del(new /obj/item/clothing/head/det_hat(M), slot_head) + + M.equip_to_slot_or_del(new /obj/item/weapon/cloaking_device(M), slot_r_store) + + M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/proto(M), slot_r_hand) + M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_l_store) + + if ("tournament chef") //Steven Seagal FTW + M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chef(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/clothing/suit/chef(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/clothing/head/chefhat(M), slot_head) + + M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/rollingpin(M), slot_r_hand) + M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_hand) + M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_r_store) + M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_s_store) + + if ("tournament janitor") + M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/janitor(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes) + var/obj/item/weapon/storage/backpack/backpack = new(M) + for(var/obj/item/I in backpack) + del(I) + M.equip_to_slot_or_del(backpack, slot_back) + + M.equip_to_slot_or_del(new /obj/item/weapon/mop(M), slot_r_hand) + var/obj/item/weapon/reagent_containers/glass/bucket/bucket = new(M) + bucket.reagents.add_reagent("water", 70) + M.equip_to_slot_or_del(bucket, slot_l_hand) + + M.equip_to_slot_or_del(new /obj/item/weapon/grenade/chem_grenade/cleaner(M), slot_r_store) + M.equip_to_slot_or_del(new /obj/item/weapon/grenade/chem_grenade/cleaner(M), slot_l_store) + M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack) + + if ("pirate") + M.equip_to_slot_or_del(new /obj/item/clothing/under/pirate(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/clothing/head/bandana(M), slot_head) + M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), slot_glasses) + M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/pirate(M), slot_r_hand) + + if ("space pirate") + M.equip_to_slot_or_del(new /obj/item/clothing/under/pirate(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/pirate(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/pirate(M), slot_head) + M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), slot_glasses) + + M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/pirate(M), slot_r_hand) + + if ("soviet soldier") + M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/clothing/head/ushanka(M), slot_head) + + if("tunnel clown")//Tunnel clowns rule! + M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/clown(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves) + M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(M), slot_wear_mask) + M.equip_to_slot_or_del(new /obj/item/clothing/head/chaplain_hood(M), slot_head) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(M), slot_glasses) + M.equip_to_slot_or_del(new /obj/item/clothing/suit/chaplain_hoodie(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/snacks/grown/banana(M), slot_l_store) + M.equip_to_slot_or_del(new /obj/item/weapon/bikehorn(M), slot_r_store) + + var/obj/item/weapon/card/id/W = new(M) + W.name = "[M.real_name]'s ID Card (Tunnel Clown!)" + W.access = get_all_accesses() + W.assignment = "Tunnel Clown!" + W.registered_name = M.real_name + M.equip_to_slot_or_del(W, slot_wear_id) + + var/obj/item/weapon/twohanded/fireaxe/fire_axe = new(M) + M.equip_to_slot_or_del(fire_axe, slot_r_hand) + + if("masked killer") + M.equip_to_slot_or_del(new /obj/item/clothing/under/overalls(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/latex(M), slot_gloves) + M.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(M), slot_wear_mask) + M.equip_to_slot_or_del(new /obj/item/clothing/head/welding(M), slot_head) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(M), slot_glasses) + M.equip_to_slot_or_del(new /obj/item/clothing/suit/apron(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_store) + M.equip_to_slot_or_del(new /obj/item/weapon/scalpel(M), slot_r_store) + + var/obj/item/weapon/twohanded/fireaxe/fire_axe = new(M) + M.equip_to_slot_or_del(fire_axe, slot_r_hand) + + for(var/obj/item/carried_item in M.contents) + if(!istype(carried_item, /obj/item/weapon/implant))//If it's not an implant. + carried_item.add_blood(M)//Oh yes, there will be blood... + + if("dark lord") + M.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/dualsaber/red(M), slot_l_hand) + + var/obj/item/clothing/head/chaplain_hood/hood = new(M) + hood.name = "dark lord hood" + M.equip_to_slot_or_del(hood, slot_head) + + var/obj/item/clothing/suit/chaplain_hoodie/robe = new(M) + robe.name = "dark lord robes" + M.equip_to_slot_or_del(robe, slot_wear_suit) + + var/obj/item/weapon/card/id/syndicate/W = new(M) + W.name = "[M.real_name]'s ID Card (Dark Lord)" + W.icon_state = "syndie" + W.access = get_all_accesses() + W.assignment = "Dark Lord" + W.registered_name = M.real_name + M.equip_to_slot_or_del(W, slot_wear_id) + + if("assassin") + M.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses) + M.equip_to_slot_or_del(new /obj/item/clothing/suit/wcoat(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/saber(M), slot_l_store) + M.equip_to_slot_or_del(new /obj/item/weapon/cloaking_device(M), slot_r_store) + + var/obj/item/weapon/storage/secure/briefcase/sec_briefcase = new(M) + for(var/obj/item/briefcase_item in sec_briefcase) + qdel(briefcase_item) + for(var/i=3, i>0, i--) + sec_briefcase.contents += new /obj/item/weapon/spacecash/c1000 + sec_briefcase.contents += new /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow + sec_briefcase.contents += new /obj/item/weapon/gun/projectile/revolver/mateba + sec_briefcase.contents += new /obj/item/ammo_box/a357 + sec_briefcase.contents += new /obj/item/weapon/c4 + M.equip_to_slot_or_del(sec_briefcase, slot_l_hand) + + var/obj/item/device/pda/heads/pda = new(M) + pda.owner = M.real_name + pda.ownjob = "Reaper" + pda.name = "PDA-[M.real_name] ([pda.ownjob])" + + M.equip_to_slot_or_del(pda, slot_belt) + + var/obj/item/weapon/card/id/syndicate/W = new(M) + W.name = "[M.real_name]'s ID Card (Reaper)" + W.icon_state = "syndie" + W.access = get_all_accesses() + W.assignment = "Reaper" + W.registered_name = M.real_name + M.equip_to_slot_or_del(W, slot_wear_id) + + if("death commando")//Was looking to add this for a while. + M.equip_death_commando() + + if("syndicate commando") + M.equip_syndicate_commando() + + if("nanotrasen officer") + + M.equip_or_collect(new /obj/item/clothing/shoes/centcom(M), slot_shoes) + M.equip_or_collect(new /obj/item/clothing/gloves/color/white(M), slot_gloves) + M.equip_or_collect(new /obj/item/device/radio/headset/heads/captain/alt(M), slot_l_ear) + M.equip_or_collect(new /obj/item/clothing/head/beret/centcom/officer(M), slot_head) + + var/obj/item/device/pda/centcom/pda = new(M) + pda.owner = M.real_name + pda.ownjob = "Nanotrasen Navy Officer" + pda.name = "PDA-[M.real_name] ([pda.ownjob])" + + M.equip_or_collect(pda, slot_r_store) + M.equip_or_collect(new /obj/item/clothing/glasses/sunglasses(M), slot_l_store) + M.equip_or_collect(new /obj/item/weapon/gun/energy/pulse_rifle/pistol(M), slot_belt) + + var/obj/item/weapon/card/id/centcom/W = new(M) + W.name = "[M.real_name]'s ID Card (Nanotrasen Navy Officer)" + W.assignment = "Nanotrasen Navy Officer" + W.access = get_centcom_access(W.assignment) + W.registered_name = M.real_name + M.equip_or_collect(W, slot_wear_id) + + if("nanotrasen captain") + M.equip_or_collect(new /obj/item/clothing/under/rank/centcom/captain(M), slot_w_uniform) + M.equip_or_collect(new /obj/item/clothing/shoes/centcom(M), slot_shoes) + M.equip_or_collect(new /obj/item/clothing/gloves/color/white(M), slot_gloves) + M.equip_or_collect(new /obj/item/device/radio/headset/heads/captain/alt(M), slot_l_ear) + M.equip_or_collect(new /obj/item/clothing/head/beret/centcom/captain(M), slot_head) + + var/obj/item/device/pda/centcom/pda = new(M) + pda.owner = M.real_name + pda.ownjob = "Nanotrasen Navy Captain" + pda.name = "PDA-[M.real_name] ([pda.ownjob])" + + M.equip_or_collect(pda, slot_r_store) + M.equip_or_collect(new /obj/item/clothing/glasses/sunglasses(M), slot_l_store) + M.equip_or_collect(new /obj/item/weapon/gun/energy/pulse_rifle/pistol(M), slot_belt) + + var/obj/item/weapon/card/id/centcom/W = new(M) + W.name = "[M.real_name]'s ID Card (Nanotrasen Navy Captain)" + W.access = get_all_accesses() + W.assignment = "Nanotrasen Navy Captain" + W.access = get_centcom_access(W.assignment) + W.registered_name = M.real_name + M.equip_or_collect(W, slot_wear_id) + + if("emergency response team member") + M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset/ert/alt(M), slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_belt) + M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/ert(M), slot_back) + + var/obj/item/weapon/card/id/W = new(M) + W.name = "[M.real_name]'s ID Card (Emergency Response Team - Member)" + W.icon_state = "ERT_empty" + W.assignment = "Emergency Response Team Member" + W.access = get_centcom_access(W.assignment) + W.registered_name = M.real_name + M.equip_to_slot_or_del(W, slot_wear_id) + + var/obj/item/device/pda/centcom/pda = new(M) + pda.owner = M.real_name + pda.ownjob = "Emergency Response Team" + pda.name = "PDA-[M.real_name] ([pda.ownjob])" + + if("emergency response team leader") + M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset/ert/alt(M), slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_belt) + M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/ert/commander(M), slot_back) + + var/obj/item/weapon/card/id/W = new(M) + W.name = "[M.real_name]'s ID Card (Emergency Response Team - Leader)" + W.icon_state = "ERT_leader" + W.assignment = "Emergency Response Team Leader" + W.access = get_centcom_access(W.assignment) + W.registered_name = M.real_name + M.equip_to_slot_or_del(W, slot_wear_id) + + var/obj/item/device/pda/centcom/pda = new(M) + pda.owner = M.real_name + pda.ownjob = "Emergency Response Team Leader" + pda.name = "PDA-[M.real_name] ([pda.ownjob])" + + if("special ops officer") + M.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate/combat(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/deathsquad/officer(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset/ert/alt(src), slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/cyber(M), slot_glasses) + M.equip_to_slot_or_del(new /obj/item/clothing/mask/cigarette/cigar/cohiba(M), slot_wear_mask) + M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/deathsquad/beret(M), slot_head) + M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle/pistol/m1911(M), slot_belt) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/matches(M), slot_r_store) + M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/dualsaber/red(M), slot_l_store) + + M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back) + M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer/swat(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/combat/nanites(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/flashbangs(src), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/zipties(src), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/syndie/advance(src), slot_in_backpack) + + + var/obj/item/weapon/card/id/W = new(M) + W.name = "[M.real_name]'s ID Card" + W.icon_state = "commander" + W.assignment = "Special Operations Officer" + W.access = get_centcom_access(W.assignment) + W.registered_name = M.real_name + M.equip_to_slot_or_del(W, slot_wear_id) + + if("special ops formal") + M.equip_or_collect(new /obj/item/clothing/under/rank/centcom/captain(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset/ert/alt(src), slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/deathsquad/beret(M), slot_head) + M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/cyber(M), slot_glasses) + M.equip_to_slot_or_del(new /obj/item/clothing/mask/cigarette/cigar/cohiba(M), slot_wear_mask) + M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle/pistol/m1911(M), slot_belt) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/matches(M), slot_r_store) + M.equip_or_collect(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_l_store) + + var/obj/item/device/pda/centcom/pda = new(M) + pda.owner = M.real_name + pda.ownjob = "Special Operations Officer" + pda.icon_state = "pda-syndi" + pda.name = "PDA-[M.real_name] ([pda.ownjob])" + pda.desc = "A portable microcomputer by Thinktronic Systems, LTD. This is model is a special edition designed for military field work." + + M.equip_or_collect(pda, slot_wear_pda) + + M.equip_or_collect(new /obj/item/clothing/glasses/sunglasses(M), slot_l_store) + M.equip_or_collect(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_r_store) + + var/obj/item/weapon/card/id/W = new(M) + W.name = "[M.real_name]'s ID Card (Special Operations Officer)" + W.icon_state = "commander" + W.assignment = "Special Operations Officer" + W.access = get_centcom_access(W.assignment) + W.registered_name = M.real_name + M.equip_to_slot_or_del(W, slot_wear_id) + + if("singuloth knight") + M.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate/combat(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/singuloth(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset/ert(src), slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/clothing/glasses/meson/cyber(M), slot_glasses) + M.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(M), slot_wear_mask) + M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/singuloth(M), slot_head) + M.equip_to_slot_or_del(new /obj/item/weapon/claymore/ceremonial(M), slot_belt) + M.equip_to_slot_or_del(new /obj/item/weapon/tank/oxygen(M), slot_s_store) + M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/knighthammer(M), slot_back) + + + var/obj/item/weapon/card/id/W = new(M) + W.name = "[M.real_name]'s ID Card (Singuloth Knight)" + W.icon_state = "syndie" + W.access = get_all_accesses() + W.access += get_all_centcom_access() + W.assignment = "Singuloth Knight" + W.registered_name = M.real_name + M.equip_to_slot_or_del(W, slot_wear_id) + + if("blue wizard") + M.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(M), slot_head) + M.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll(M), slot_r_store) + M.equip_to_slot_or_del(new /obj/item/weapon/spellbook(M), slot_r_hand) + M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/staff(M), slot_l_hand) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack) + + if("red wizard") + M.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/red(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/red(M), slot_head) + M.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll(M), slot_r_store) + M.equip_to_slot_or_del(new /obj/item/weapon/spellbook(M), slot_r_hand) + M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/staff(M), slot_l_hand) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack) + + if("marisa wizard") + M.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/marisa(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/marisa(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/marisa(M), slot_head) + M.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll(M), slot_r_store) + M.equip_to_slot_or_del(new /obj/item/weapon/spellbook(M), slot_r_hand) + M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/staff(M), slot_l_hand) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack) + + if("soviet admiral") + M.equip_to_slot_or_del(new /obj/item/clothing/head/hgpiratecap(M), slot_head) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(M), slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/eyepatch(M), slot_glasses) + M.equip_to_slot_or_del(new /obj/item/clothing/suit/hgpirate(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back) + M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/revolver/mateba(M), slot_belt) + M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform) + var/obj/item/weapon/card/id/W = new(M) + W.name = "[M.real_name]'s ID Card" + W.icon_state = "commander" + W.access = get_all_accesses() + W.access += get_all_centcom_access() + W.assignment = "Admiral" + W.registered_name = M.real_name + M.equip_to_slot_or_del(W, slot_wear_id) + + if("chrono legionnaire") + M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/chronos(M), slot_head) + M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/syndicate(src), slot_wear_mask) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) + M.equip_to_slot_or_del(new /obj/item/clothing/glasses/night(M), slot_glasses) + M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/chronos(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/weapon/chrono_eraser(M), slot_back) + M.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(src), slot_s_store) + var/obj/item/weapon/card/id/W = new(M) + W.name = "[M.real_name]'s ID Card" + W.icon_state = "syndie" + W.assignment = "Chrono Legionnaire" + W.registered_name = M.real_name + M.equip_to_slot_or_del(W, slot_wear_id) + + M.regenerate_icons() + + log_admin("[key_name(usr)] changed the equipment of [key_name(M)] to [dresscode].") + message_admins("\blue [key_name_admin(usr)] changed the equipment of [key_name_admin(M)] to [dresscode].", 1) + return + +/client/proc/startSinglo() + set category = "Debug" + set name = "Start Singularity" + set desc = "Sets up the singularity and all machines to get power flowing through the station" + + if(!check_rights(R_DEBUG)) + return + + if(alert("Are you sure? This will start up the engine. Should only be used during debug!",,"Yes","No") != "Yes") + return + + for(var/obj/machinery/power/emitter/E in world) + if(E.anchored) + E.active = 1 + + for(var/obj/machinery/field/generator/F in world) + if(F.anchored) + F.Varedit_start = 1 + spawn(30) + for(var/obj/machinery/the_singularitygen/G in world) + if(G.anchored) + var/obj/singularity/S = new /obj/singularity(get_turf(G), 50) + spawn(0) + qdel(G) + S.energy = 1750 + S.current_size = 7 + S.icon = 'icons/effects/224x224.dmi' + S.icon_state = "singularity_s7" + S.pixel_x = -96 + S.pixel_y = -96 + S.grav_pull = 0 + //S.consume_range = 3 + S.dissipate = 0 + //S.dissipate_delay = 10 + //S.dissipate_track = 0 + //S.dissipate_strength = 10 + + for(var/obj/machinery/power/rad_collector/Rad in world) + if(Rad.anchored) + if(!Rad.P) + var/obj/item/weapon/tank/plasma/Plasma = new/obj/item/weapon/tank/plasma(Rad) + Plasma.air_contents.toxins = 70 + Rad.drainratio = 0 + Rad.P = Plasma + Plasma.loc = Rad + + if(!Rad.active) + Rad.toggle_power() + + for(var/obj/machinery/power/smes/SMES in world) + if(SMES.anchored) + SMES.input_attempt = 1 + +/client/proc/cmd_debug_mob_lists() + set category = "Debug" + set name = "Debug Mob Lists" + set desc = "For when you just gotta know" + + if(!check_rights(R_DEBUG)) + return + + switch(input("Which list?") in list("Players","Admins","Mobs","Living Mobs","Dead Mobs","Silicons","Clients","Respawnable Mobs")) + if("Players") + usr << list2text(player_list,",") + if("Admins") + usr << list2text(admins,",") + if("Mobs") + usr << list2text(mob_list,",") + if("Living Mobs") + usr << list2text(living_mob_list,",") + if("Dead Mobs") + usr << list2text(dead_mob_list,",") + if("Silicons") + usr << list2text(silicon_mob_list,",") + if("Clients") + usr << list2text(clients,",") + if("Respawnable Mobs") + usr << list2text(respawnable_list,",") + + +/client/proc/cmd_admin_toggle_block(var/mob/M,var/block) + if(!check_rights(R_SPAWN)) + return + + if(!ticker) + alert("Wait until the game starts") + return + if(istype(M, /mob/living/carbon)) + M.dna.SetSEState(block,!M.dna.GetSEState(block)) + genemutcheck(M,block,null,MUTCHK_FORCED) + M.update_mutations() + var/state="[M.dna.GetSEState(block)?"on":"off"]" + var/blockname=assigned_blocks[block] + message_admins("[key_name_admin(src)] has toggled [M.key]'s [blockname] block [state]!") + log_admin("[key_name(src)] has toggled [M.key]'s [blockname] block [state]!") + else + alert("Invalid mob") + +/client/proc/reload_nanoui_resources() + set category = "Debug" + set name = "Reload NanoUI Resources" + set desc = "Force the client to redownload NanoUI Resources" + + // Close open NanoUIs. + nanomanager.close_user_uis(usr) + + // Re-load the assets. + var/datum/asset/assets = get_asset_datum(/datum/asset/nanoui) + assets.register() + + // Clear the user's cache so they get resent. + usr.client.cache = list() \ No newline at end of file diff --git a/code/modules/admin/verbs/transform.dm b/code/modules/admin/verbs/transform.dm new file mode 100644 index 00000000000..e69de29bb2d diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_misc.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_misc.dm index ff544e9129a..6d89c5a8e9c 100644 --- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_misc.dm +++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_misc.dm @@ -1,207 +1,147 @@ -/datum/chemical_reaction/ // foam and foam precursor - surfactant - name = "Foam surfactant" - id = "foam surfactant" - result = "fluorosurfactant" - required_reagents = list("fluorine" = 2, "carbon" = 2, "sacid" = 1) - result_amount = 5 - mix_message = "A head of foam results from the mixture's constant fizzing." +/datum/chemical_reaction/surfactant + name = "Foam surfactant" + id = "foam surfactant" + result = "fluorosurfactant" + required_reagents = list("fluorine" = 2, "carbon" = 2, "sacid" = 1) + result_amount = 5 + mix_message = "A head of foam results from the mixture's constant fizzing." + +/datum/chemical_reaction/foam + name = "Foam" + id = "foam" + result = null + required_reagents = list("fluorosurfactant" = 1, "water" = 1) + result_amount = 2 + +/datum/chemical_reaction/foam/on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + holder.my_atom.visible_message("The solution spews out foam!") + + var/datum/effect/system/foam_spread/s = new() + s.set_up(created_volume, location, holder, 0) + s.start() + holder.clear_reagents() - foam - name = "Foam" - id = "foam" - result = null - required_reagents = list("fluorosurfactant" = 1, "water" = 1) - result_amount = 2 +/datum/chemical_reaction/metalfoam + name = "Metal Foam" + id = "metalfoam" + result = null + required_reagents = list("aluminum" = 3, "fluorosurfactant" = 1, "sacid" = 1) + result_amount = 5 - on_reaction(var/datum/reagents/holder, var/created_volume) +/datum/chemical_reaction/metalfoam/on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + + holder.my_atom.visible_message("The solution spews out a metalic foam!") + + var/datum/effect/system/foam_spread/s = new() + s.set_up(created_volume, location, holder, MFOAM_ALUMINUM) + s.start() - var/location = get_turf(holder.my_atom) - for(var/mob/M in viewers(5, location)) - M << "\red The solution violently bubbles!" +/datum/chemical_reaction/ironfoam + name = "Iron Foam" + id = "ironlfoam" + result = null + required_reagents = list("iron" = 3, "fluorosurfactant" = 1, "sacid" = 1) + result_amount = 5 - location = get_turf(holder.my_atom) +/datum/chemical_reaction/ironfoam/on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) - for(var/mob/M in viewers(5, location)) - M << "\red The solution spews out foam!" + holder.my_atom.visible_message("The blood writhes and wriggles and sizzles away from the container!", 1, "You hear bubbling and sizzling.", 2) - else - for(var/mob/M in viewers(get_turf(holder.my_atom), null)) - M.show_message( "The blood seems to break apart in the fuel.", 1) - holder.del_reagent("blood") - return -*/ +/datum/chemical_reaction/plastication + name = "Plastic" + id = "solidplastic" + result = null + required_reagents = list("facid" = 10, "plasticide" = 20) + result_amount = 1 - plastication - name = "Plastic" - id = "solidplastic" - result = null - required_reagents = list("facid" = 10, "plasticide" = 20) - result_amount = 1 - on_reaction(var/datum/reagents/holder) - var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/mineral/plastic - M.amount = 10 - M.loc = get_turf(holder.my_atom) - return +/datum/chemical_reaction/plastication/on_reaction(var/datum/reagents/holder) + var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/mineral/plastic + M.amount = 10 + M.forceMove(get_turf(holder.my_atom)) +/datum/chemical_reaction/space_drugs + name = "Space Drugs" + id = "space_drugs" + result = "space_drugs" + required_reagents = list("mercury" = 1, "sugar" = 1, "lithium" = 1) + result_amount = 3 + mix_message = "Slightly dizzying fumes drift from the solution." + mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' -//Not really misc chems, but not enough to deserve their own file -/* - silicate - name = "Silicate" - id = "silicate" - result = "silicate" - required_reagents = list("aluminum" = 1, "silicon" = 1, "oxygen" = 1) - result_amount = 3 -*/ +/datum/chemical_reaction/lube + name = "Space Lube" + id = "lube" + result = "lube" + required_reagents = list("water" = 1, "silicon" = 1, "oxygen" = 1) + result_amount = 3 + mix_message = "The substance turns a striking cyan and becomes oily." - space_drugs - name = "Space Drugs" - id = "space_drugs" - result = "space_drugs" - required_reagents = list("mercury" = 1, "sugar" = 1, "lithium" = 1) - result_amount = 3 - mix_message = "Slightly dizzying fumes drift from the solution." - mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' +/datum/chemical_reaction/holy_water + name = "Holy Water" + id = "holywater" + result = "holywater" + required_reagents = list("water" = 1, "mercury" = 1, "wine" = 1) + result_amount = 3 + mix_message = "The water somehow seems purified. Or maybe defiled." - lube - name = "Space Lube" - id = "lube" - result = "lube" - required_reagents = list("water" = 1, "silicon" = 1, "oxygen" = 1) - result_amount = 3 - mix_message = "The substance turns a striking cyan and becomes oily." +/datum/chemical_reaction/lsd + name = "Lysergic acid diethylamide" + id = "lsd" + result = "lsd" + required_reagents = list("diethylamine" = 1, "fungus" = 1) + result_amount = 3 + mix_message = "The mixture turns a rather unassuming color and settles." - holy_water - name = "Holy Water" - id = "holywater" - result = "holywater" - required_reagents = list("water" = 1, "mercury" = 1, "wine" = 1) - result_amount = 3 - mix_message = "The water somehow seems purified. Or maybe defiled." - - - lsd - name = "Lysergic acid diethylamide" - id = "lsd" - result = "lsd" - required_reagents = list("diethylamine" = 1, "fungus" = 1) - result_amount = 3 - mix_message = "The mixture turns a rather unassuming color and settles." - - drying_agent - name = "Drying agent" - id = "drying_agent" - result = "drying_agent" - required_reagents = list("plasma" = 2, "ethanol" = 1, "sodium" = 1) - result_amount = 3 \ No newline at end of file +/datum/chemical_reaction/drying_agent + name = "Drying agent" + id = "drying_agent" + result = "drying_agent" + required_reagents = list("plasma" = 2, "ethanol" = 1, "sodium" = 1) + result_amount = 3 \ No newline at end of file From d113fc63e9b70bad35dfcb2290c9a1deee7fc39e Mon Sep 17 00:00:00 2001 From: Crazylemon64 Date: Mon, 28 Mar 2016 23:41:24 -0700 Subject: [PATCH 206/328] Removes dumbness --- code/modules/admin/verbs/VV/datumvars.dm | 1085 ------------------- code/modules/admin/verbs/VV/debug.dm | 1220 ---------------------- code/modules/admin/verbs/transform.dm | 0 3 files changed, 2305 deletions(-) delete mode 100644 code/modules/admin/verbs/VV/datumvars.dm delete mode 100644 code/modules/admin/verbs/VV/debug.dm delete mode 100644 code/modules/admin/verbs/transform.dm diff --git a/code/modules/admin/verbs/VV/datumvars.dm b/code/modules/admin/verbs/VV/datumvars.dm deleted file mode 100644 index 91582a136e1..00000000000 --- a/code/modules/admin/verbs/VV/datumvars.dm +++ /dev/null @@ -1,1085 +0,0 @@ -// reference: /client/proc/modify_variables(var/atom/O, var/param_var_name = null, var/autodetect_class = 0) - -/client/proc/debug_variables(datum/D in world) - set category = "Debug" - set name = "View Variables" - //set src in world - - - if(!usr.client || !usr.client.holder) - usr << "\red You need to be an administrator to access this." - return - - - var/title = "" - var/body = "" - - if(!D) return - if(istype(D, /atom)) - var/atom/A = D - title = "[A.name] (\ref[A]) = [A.type]" - - #ifdef VARSICON - if (A.icon) - body += debug_variable("icon", new/icon(A.icon, A.icon_state, A.dir), 0) - #endif - - var/icon/sprite - - if(istype(D,/atom)) - var/atom/AT = D - if(AT.icon && AT.icon_state) - sprite = new /icon(AT.icon, AT.icon_state) - usr << browse_rsc(sprite, "view_vars_sprite.png") - - title = "[D] (\ref[D]) = [D.type]" - - body += {" "} - - body += "" - - body += "
    " - - if(sprite) - body += "" - - body += "
    " - else - body += "
    " - - body += "
    " - - if(istype(D,/atom)) - var/atom/A = D - if(isliving(A)) - body += "[D]" - if(A.dir) - body += "
    << [dir2text(A.dir)] >>" - var/mob/living/M = A - body += "
    [M.ckey ? M.ckey : "No ckey"] / [M.real_name ? M.real_name : "No real name"]" - body += {" -
    - BRUTE:[M.getBruteLoss()] - FIRE:[M.getFireLoss()] - TOXIN:[M.getToxLoss()] - OXY:[M.getOxyLoss()] - CLONE:[M.getCloneLoss()] - BRAIN:[M.getBrainLoss()] - - - - "} - else - body += "[D]" - if(A.dir) - body += "
    << [dir2text(A.dir)] >>" - else - body += "[D]" - - body += "
    " - - body += "
    " - - var/formatted_type = text("[D.type]") - if(length(formatted_type) > 25) - var/middle_point = length(formatted_type) / 2 - var/splitpoint = findtext(formatted_type,"/",middle_point) - if(splitpoint) - formatted_type = "[copytext(formatted_type,1,splitpoint)]
    [copytext(formatted_type,splitpoint)]" - else - formatted_type = "Type too long" //No suitable splitpoint (/) found. - - body += "
    [formatted_type]" - - if(src.holder && src.holder.marked_datum && src.holder.marked_datum == D) - body += "
    Marked Object" - - body += "
    " - - body += "
    Refresh" - - //if(ismob(D)) - // body += "
    Show player panel

    " - - body += {"
    -
    " - - body += "

    " - - body += "E - Edit, tries to determine the variable type by itself.
    " - body += "C - Change, asks you for the var type first.
    " - body += "M - Mass modify: changes this variable for all objects of this type.

    " - - body += "
    Search:

    " - - body += "
      " - - var/list/names = list() - for (var/V in D.vars) - names += V - - names = sortList(names) - - for (var/V in names) - body += debug_variable(V, D.vars[V], 0, D) - - body += "
    " - - var/html = "" - if (title) - html += "[title]" - html += {""} - html += "" - html += body - - html += {" - - "} - - html += "" - - usr << browse(html, "window=variables\ref[D];size=475x650") - - return - -/client/proc/debug_variable(name, value, level, var/datum/DA = null) - var/html = "" - - if(DA) - html += "
  • (E) (C) (M) " - else - html += "
  • " - - if (isnull(value)) - html += "[name] = null" - - else if (istext(value)) - html += "[name] = \"[value]\"" - - else if (isicon(value)) - #ifdef VARSICON - var/icon/I = new/icon(value) - var/rnd = rand(1,10000) - var/rname = "tmp\ref[I][rnd].png" - usr << browse_rsc(I, rname) - html += "[name] = ([value]) " - #else - html += "[name] = /icon ([value])" - #endif - -/* else if (istype(value, /image)) - #ifdef VARSICON - var/rnd = rand(1, 10000) - var/image/I = value - - src << browse_rsc(I.icon, "tmp\ref[value][rnd].png") - html += "[name] = " - #else - html += "[name] = /image ([value])" - #endif -*/ - else if (isfile(value)) - html += "[name] = '[value]'" - - else if (istype(value, /datum)) - var/datum/D = value - html += "[name] \ref[value] = [D.type]" - - else if (istype(value, /client)) - var/client/C = value - html += "[name] \ref[value] = [C] [C.type]" -// - else if (istype(value, /list)) - var/list/L = value - html += "[name] = /list ([L.len])" - - if (L.len > 0 && !(name == "underlays" || name == "overlays" || name == "vars" || L.len > 500)) - // not sure if this is completely right... - if(0) //(L.vars.len > 0) - html += "
      " - html += "
    " - else - html += "
      " - var/index = 1 - for (var/entry in L) - if(istext(entry)) - html += debug_variable(entry, L[entry], level + 1) - //html += debug_variable("[index]", L[index], level + 1) - else - html += debug_variable(index, L[index], level + 1) - index++ - html += "
    " - - else - html += "[name] = [value]" - /* - // Bitfield stuff - if(round(value)==value) // Require integers. - var/idx=0 - var/bit=0 - var/bv=0 - html += "
    " - for(var/block=0;block<8;block++) - html += " " - for(var/i=0;i<4;i++) - idx=(block*4)+i - bit=1 << idx - bv=value & bit - html += "[bv?1:0]" - html += "" - html += "
    " - */ - html += "
  • " - - return html - -/client/proc/view_var_Topic(href, href_list, hsrc) - //This should all be moved over to datum/admins/Topic() or something ~Carn - if(!check_rights(R_ADMIN|R_MOD)) - return - if(href_list["Vars"]) - debug_variables(locate(href_list["Vars"])) - - //~CARN: for renaming mobs (updates their name, real_name, mind.name, their ID/PDA and datacore records). - else if(href_list["rename"]) - if(!check_rights(R_ADMIN)) return - - var/mob/M = locate(href_list["rename"]) - if(!istype(M)) - usr << "This can only be used on instances of type /mob" - return - - var/new_name = sanitize(copytext(input(usr,"What would you like to name this mob?","Input a name",M.real_name) as text|null,1,MAX_NAME_LEN)) - if( !new_name || !M ) return - - message_admins("Admin [key_name_admin(usr)] renamed [key_name_admin(M)] to [new_name].") - M.rename_character(M.real_name, new_name) - href_list["datumrefresh"] = href_list["rename"] - - else if(href_list["varnameedit"] && href_list["datumedit"]) - if(!check_rights(R_VAREDIT)) return - - var/D = locate(href_list["datumedit"]) - if(!istype(D,/datum) && !istype(D,/client)) - usr << "This can only be used on instances of types /client or /datum" - return - - modify_variables(D, href_list["varnameedit"], 1) - - else if(href_list["togbit"]) - if(!check_rights(R_VAREDIT)) return - - var/atom/D = locate(href_list["subject"]) - if(!istype(D,/datum) && !istype(D,/client)) - usr << "This can only be used on instances of types /client or /datum" - return - if(!(href_list["var"] in D.vars)) - usr << "Unable to find variable specified." - return - var/value = D.vars[href_list["var"]] - value ^= 1 << text2num(href_list["togbit"]) - D.vars[href_list["var"]] = value - - else if(href_list["varnamechange"] && href_list["datumchange"]) - if(!check_rights(R_VAREDIT)) return - - var/D = locate(href_list["datumchange"]) - if(!istype(D,/datum) && !istype(D,/client)) - usr << "This can only be used on instances of types /client or /datum" - return - - modify_variables(D, href_list["varnamechange"], 0) - - else if(href_list["varnamemass"] && href_list["datummass"]) - if(!check_rights(R_VAREDIT)) return - - var/atom/A = locate(href_list["datummass"]) - if(!istype(A)) - usr << "This can only be used on instances of type /atom" - return - - cmd_mass_modify_object_variables(A, href_list["varnamemass"]) - - else if(href_list["mob_player_panel"]) - if(!check_rights(R_ADMIN|R_MOD)) return - - var/mob/M = locate(href_list["mob_player_panel"]) - if(!istype(M)) - usr << "This can only be used on instances of type /mob" - return - - src.holder.show_player_panel(M) - href_list["datumrefresh"] = href_list["mob_player_panel"] - - else if(href_list["give_spell"]) - if(!check_rights(R_SERVER|R_EVENT)) return - - var/mob/M = locate(href_list["give_spell"]) - if(!istype(M)) - usr << "This can only be used on instances of type /mob" - return - - src.give_spell(M) - href_list["datumrefresh"] = href_list["give_spell"] - - - else if(href_list["give_disease2"]) - if(!check_rights(R_SERVER|R_EVENT)) return - - var/mob/M = locate(href_list["give_disease2"]) - if(!istype(M)) - usr << "This can only be used on instances of type /mob" - return - - src.give_disease2(M) - href_list["datumrefresh"] = href_list["give_spell"] - - else if(href_list["godmode"]) - if(!check_rights(R_REJUVINATE)) return - - var/mob/M = locate(href_list["godmode"]) - if(!istype(M)) - usr << "This can only be used on instances of type /mob" - return - - src.cmd_admin_godmode(M) - href_list["datumrefresh"] = href_list["godmode"] - - else if(href_list["gib"]) - if(!check_rights(R_ADMIN|R_EVENT)) return - - var/mob/M = locate(href_list["gib"]) - if(!istype(M)) - usr << "This can only be used on instances of type /mob" - return - - src.cmd_admin_gib(M) - - else if(href_list["build_mode"]) - if(!check_rights(R_BUILDMODE)) return - - var/mob/M = locate(href_list["build_mode"]) - if(!istype(M)) - usr << "This can only be used on instances of type /mob" - return - - togglebuildmode(M) - href_list["datumrefresh"] = href_list["build_mode"] - - else if(href_list["drop_everything"]) - if(!check_rights(R_DEBUG|R_ADMIN)) return - - var/mob/M = locate(href_list["drop_everything"]) - if(!istype(M)) - usr << "This can only be used on instances of type /mob" - return - - if(usr.client) - usr.client.cmd_admin_drop_everything(M) - - else if(href_list["direct_control"]) - if(!check_rights(R_DEBUG|R_ADMIN)) return - - var/mob/M = locate(href_list["direct_control"]) - if(!istype(M)) - usr << "This can only be used on instances of type /mob" - return - - if(usr.client) - usr.client.cmd_assume_direct_control(M) - - else if(href_list["make_skeleton"]) - if(!check_rights(R_SERVER|R_EVENT)) return - - var/mob/living/carbon/human/H = locate(href_list["make_skeleton"]) - if(!istype(H)) - usr << "This can only be used on instances of type /mob/living/carbon/human" - return - - var/confirm = alert("Are you sure you want to turn this mob into a skeleton?","Confirm Skeleton Transformation","Yes","No") - if(confirm != "Yes") - return - - H.makeSkeleton() - message_admins("[key_name(usr)] has turned [key_name(H)] into a skeleton") - log_admin("[key_name_admin(usr)] has turned [key_name_admin(H)] into a skeleton") - href_list["datumrefresh"] = href_list["make_skeleton"] - - else if(href_list["offer_control"]) - if(!check_rights(R_ADMIN)) return - - var/mob/M = locate(href_list["offer_control"]) - if(!istype(M)) - usr << "This can only be used on instances of type /mob" - return - M << "Control of your mob has been offered to dead players." - log_admin("[key_name(usr)] has offered control of ([key_name(M)]) to ghosts.") - message_admins("[key_name_admin(usr)] has offered control of ([key_name_admin(M)]) to ghosts") - var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as [M.real_name]?", poll_time = 100) - var/mob/dead/observer/theghost = null - - if(candidates.len) - theghost = pick(candidates) - M << "Your mob has been taken over by a ghost!" - message_admins("[key_name_admin(theghost)] has taken control of ([key_name_admin(M)])") - M.ghostize() - M.key = theghost.key - else - M << "There were no ghosts willing to take control." - message_admins("No ghosts were willing to take control of [key_name_admin(M)])") - - else if(href_list["delall"]) - if(!check_rights(R_DEBUG|R_SERVER)) return - - var/obj/O = locate(href_list["delall"]) - if(!isobj(O)) - usr << "This can only be used on instances of type /obj" - return - - var/action_type = alert("Strict type ([O.type]) or type and all subtypes?",,"Strict type","Type and subtypes","Cancel") - if(action_type == "Cancel" || !action_type) - return - - if(alert("Are you really sure you want to delete all objects of type [O.type]?",,"Yes","No") != "Yes") - return - - if(alert("Second confirmation required. Delete?",,"Yes","No") != "Yes") - return - - var/O_type = O.type - switch(action_type) - if("Strict type") - var/i = 0 - for(var/obj/Obj in world) - if(Obj.type == O_type) - i++ - qdel(Obj) - if(!i) - usr << "No objects of this type exist" - return - log_admin("[key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted)") - message_admins("[key_name_admin(usr)] deleted all objects of type [O_type] ([i] objects deleted)") - if("Type and subtypes") - var/i = 0 - for(var/obj/Obj in world) - if(istype(Obj,O_type)) - i++ - qdel(Obj) - if(!i) - usr << "No objects of this type exist" - return - log_admin("[key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted)") - message_admins("[key_name_admin(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted)") - - else if(href_list["addreagent"]) /* Made on /TG/, credit to them. */ - if(!check_rights(R_DEBUG|R_ADMIN)) return - - var/atom/A = locate(href_list["addreagent"]) - - if(!A.reagents) - var/amount = input(usr, "Specify the reagent size of [A]", "Set Reagent Size", 50) as num - if(amount) - A.create_reagents(amount) - - if(A.reagents) - var/list/reagent_options = list() - for(var/r_id in chemical_reagents_list) - var/datum/reagent/R = chemical_reagents_list[r_id] - reagent_options[R.name] = r_id - - if(reagent_options.len) - reagent_options = sortAssoc(reagent_options) - reagent_options.Insert(1, "CANCEL") - - var/chosen = input(usr, "Choose a reagent to add.", "Choose a reagent.") in reagent_options - var/chosen_id = reagent_options[chosen] - - if(chosen_id) - var/amount = input(usr, "Choose the amount to add.", "Choose the amount.", A.reagents.maximum_volume) as num - if(amount) - A.reagents.add_reagent(chosen_id, amount) - log_admin("[key_name(usr)] has added [amount] units of [chosen] to \the [A]") - message_admins("[key_name_admin(usr)] has added [amount] units of [chosen] to \the [A]") - - else if(href_list["explode"]) - if(!check_rights(R_DEBUG|R_EVENT)) return - - var/atom/A = locate(href_list["explode"]) - if(!isobj(A) && !ismob(A) && !isturf(A)) - usr << "This can only be done to instances of type /obj, /mob and /turf" - return - - src.cmd_admin_explosion(A) - href_list["datumrefresh"] = href_list["explode"] - - else if(href_list["emp"]) - if(!check_rights(R_DEBUG|R_EVENT)) return - - var/atom/A = locate(href_list["emp"]) - if(!isobj(A) && !ismob(A) && !isturf(A)) - usr << "This can only be done to instances of type /obj, /mob and /turf" - return - - src.cmd_admin_emp(A) - href_list["datumrefresh"] = href_list["emp"] - - else if(href_list["mark_object"]) - if(!check_rights(0)) return - - var/datum/D = locate(href_list["mark_object"]) - if(!istype(D)) - usr << "This can only be done to instances of type /datum" - return - - src.holder.marked_datum = D - href_list["datumrefresh"] = href_list["mark_object"] - - else if(href_list["proc_call"]) - if(!check_rights(R_PROCCALL)) - return - - var/T = locate(href_list["proc_call"]) - - if(T) - callproc_datum(T) - - else if(href_list["rotatedatum"]) - if(!check_rights(R_DEBUG|R_ADMIN)) return - - var/atom/A = locate(href_list["rotatedatum"]) - if(!istype(A)) - usr << "This can only be done to instances of type /atom" - return - - switch(href_list["rotatedir"]) - if("right") A.dir = turn(A.dir, -45) - if("left") A.dir = turn(A.dir, 45) - - message_admins("[key_name_admin(usr)] has rotated \the [A]") - log_admin("[key_name(usr)] has rotated \the [A]") - href_list["datumrefresh"] = href_list["rotatedatum"] - - else if(href_list["makemonkey"]) - if(!check_rights(R_SPAWN)) return - - var/mob/living/carbon/human/H = locate(href_list["makemonkey"]) - if(!istype(H)) - usr << "This can only be done to instances of type /mob/living/carbon/human" - return - - if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return - if(!H) - usr << "Mob doesn't exist anymore" - return - holder.Topic(href, list("monkeyone"=href_list["makemonkey"])) - - else if(href_list["makerobot"]) - if(!check_rights(R_SPAWN)) return - - var/mob/living/carbon/human/H = locate(href_list["makerobot"]) - if(!istype(H)) - usr << "This can only be done to instances of type /mob/living/carbon/human" - return - - if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return - if(!H) - usr << "Mob doesn't exist anymore" - return - holder.Topic(href, list("makerobot"=href_list["makerobot"])) - - else if(href_list["makealien"]) - if(!check_rights(R_SPAWN)) return - - var/mob/living/carbon/human/H = locate(href_list["makealien"]) - if(!istype(H)) - usr << "This can only be done to instances of type /mob/living/carbon/human" - return - - if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return - if(!H) - usr << "Mob doesn't exist anymore" - return - holder.Topic(href, list("makealien"=href_list["makealien"])) - - else if(href_list["makeslime"]) - if(!check_rights(R_SPAWN)) return - - var/mob/living/carbon/human/H = locate(href_list["makeslime"]) - if(!istype(H)) - usr << "This can only be done to instances of type /mob/living/carbon/human" - return - - if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return - if(!H) - usr << "Mob doesn't exist anymore" - return - holder.Topic(href, list("makeslime"=href_list["makeslime"])) - - else if(href_list["makesuper"]) - if(!check_rights(R_SPAWN)) return - - var/mob/living/carbon/human/H = locate(href_list["makesuper"]) - if(!istype(H)) - usr << "This can only be done to instances of type /mob/living/carbon/human" - return - - if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return - if(!H) - usr << "Mob doesn't exist anymore" - return - holder.Topic(href, list("makesuper"=href_list["makesuper"])) - - else if(href_list["makeai"]) - if(!check_rights(R_SPAWN)) return - - var/mob/living/carbon/human/H = locate(href_list["makeai"]) - if(!istype(H)) - usr << "This can only be done to instances of type /mob/living/carbon/human" - return - - if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return - if(!H) - usr << "Mob doesn't exist anymore" - return - holder.Topic(href, list("makeai"=href_list["makeai"])) - - else if(href_list["makemask"]) - if(!check_rights(R_SPAWN)) return - var/mob/currentMob = locate(href_list["makemask"]) - if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return - if(!currentMob) - usr << "Mob doesn't exist anymore" - return - holder.Topic(href, list("makemask"=href_list["makemask"])) - - - else if(href_list["setspecies"]) - if(!check_rights(R_SPAWN)) return - - var/mob/living/carbon/human/H = locate(href_list["setspecies"]) - if(!istype(H)) - usr << "This can only be done to instances of type /mob/living/carbon/human" - return - - var/new_species = input("Please choose a new species.","Species",null) as null|anything in all_species - - if(!H) - usr << "Mob doesn't exist anymore" - return - - if(H.set_species(new_species)) - usr << "Set species of [H] to [H.species]." - H.regenerate_icons() - message_admins("[key_name_admin(usr)] has changed the species of [key_name_admin(H)] to [new_species]") - log_admin("[key_name(usr)] has changed the species of [key_name(H)] to [new_species]") - else - usr << "Failed! Something went wrong." - - else if(href_list["addlanguage"]) - if(!check_rights(R_SPAWN)) return - - var/mob/H = locate(href_list["addlanguage"]) - if(!istype(H)) - usr << "This can only be done to instances of type /mob" - return - - var/new_language = input("Please choose a language to add.","Language",null) as null|anything in all_languages - - if(!new_language) - return - - if(!H) - usr << "Mob doesn't exist anymore" - return - - if(H.add_language(new_language)) - usr << "Added [new_language] to [H]." - message_admins("[key_name_admin(usr)] has given [key_name_admin(H)] the language [new_language]") - log_admin("[key_name(usr)] has given [key_name(H)] the language [new_language]") - else - usr << "Mob already knows that language." - - else if(href_list["remlanguage"]) - if(!check_rights(R_SPAWN)) return - - var/mob/H = locate(href_list["remlanguage"]) - if(!istype(H)) - usr << "This can only be done to instances of type /mob" - return - - if(!H.languages.len) - usr << "This mob knows no languages." - return - - var/datum/language/rem_language = input("Please choose a language to remove.","Language",null) as null|anything in H.languages - - if(!rem_language) - return - - if(!H) - usr << "Mob doesn't exist anymore" - return - - if(H.remove_language(rem_language.name)) - usr << "Removed [rem_language] from [H]." - message_admins("[key_name_admin(usr)] has removed language [rem_language] from [key_name_admin(H)]") - log_admin("[key_name(usr)] has removed language [rem_language] from [key_name(H)]") - else - usr << "Mob doesn't know that language." - - else if(href_list["addverb"]) - if(!check_rights(R_DEBUG)) return - - var/mob/living/H = locate(href_list["addverb"]) - - if(!istype(H)) - usr << "This can only be done to instances of type /mob/living" - return - var/list/possibleverbs = list() - possibleverbs += "Cancel" // One for the top... - possibleverbs += typesof(/mob/proc,/mob/verb,/mob/living/proc,/mob/living/verb) - switch(H.type) - if(/mob/living/carbon/human) - possibleverbs += typesof(/mob/living/carbon/proc,/mob/living/carbon/verb,/mob/living/carbon/human/verb,/mob/living/carbon/human/proc) - if(/mob/living/silicon/robot) - possibleverbs += typesof(/mob/living/silicon/proc,/mob/living/silicon/robot/proc,/mob/living/silicon/robot/verb) - if(/mob/living/silicon/ai) - possibleverbs += typesof(/mob/living/silicon/proc,/mob/living/silicon/ai/proc,/mob/living/silicon/ai/verb) - possibleverbs -= H.verbs - possibleverbs += "Cancel" // ...And one for the bottom - - var/verb = input("Select a verb!", "Verbs",null) as anything in possibleverbs - if(!H) - usr << "Mob doesn't exist anymore" - return - if(!verb || verb == "Cancel") - return - else - H.verbs += verb - message_admins("[key_name_admin(usr)] has given [key_name_admin(H)] the verb [verb]") - log_admin("[key_name(usr)] has given [key_name(H)] the verb [verb]") - - else if(href_list["remverb"]) - if(!check_rights(R_DEBUG)) return - - var/mob/H = locate(href_list["remverb"]) - - if(!istype(H)) - usr << "This can only be done to instances of type /mob" - return - var/verb = input("Please choose a verb to remove.","Verbs",null) as null|anything in H.verbs - if(!H) - usr << "Mob doesn't exist anymore" - return - if(!verb) - return - else - H.verbs -= verb - message_admins("[key_name_admin(usr)] has removed verb [verb] from [key_name_admin(H)]") - log_admin("[key_name(usr)] has removed verb [verb] from [key_name(H)]") - - else if(href_list["addorgan"]) - if(!check_rights(R_SPAWN)) return - - var/mob/living/carbon/M = locate(href_list["addorgan"]) - if(!istype(M)) - usr << "This can only be done to instances of type /mob/living/carbon" - return - - var/new_organ = input("Please choose an organ to add.","Organ",null) as null|anything in subtypesof(/obj/item/organ)-/obj/item/organ - if(!new_organ) return - - if(!M) - usr << "Mob doesn't exist anymore" - return - - if(locate(new_organ) in M.internal_organs) - usr << "Mob already has that organ." - return - var/obj/item/organ/internal/organ = new new_organ - organ.insert(M) - message_admins("[key_name_admin(usr)] has given [key_name_admin(M)] the organ [new_organ]") - log_admin("[key_name(usr)] has given [key_name(M)] the organ [new_organ]") - - else if(href_list["remorgan"]) - if(!check_rights(R_SPAWN)) return - - var/mob/living/carbon/M = locate(href_list["remorgan"]) - if(!istype(M)) - usr << "This can only be done to instances of type /mob/living/carbon" - return - - var/obj/item/organ/internal/rem_organ = input("Please choose an organ to remove.","Organ",null) as null|anything in M.internal_organs - - if(!M) - usr << "Mob doesn't exist anymore" - return - - if(!(locate(rem_organ) in M.internal_organs)) - usr << "Mob does not have that organ." - return - - usr << "Removed [rem_organ] from [M]." - rem_organ.remove(M) - message_admins("[key_name_admin(usr)] has removed the organ [rem_organ] from [key_name_admin(M)]") - log_admin("[key_name(usr)] has removed the organ [rem_organ] from [key_name(M)]") - qdel(rem_organ) - - else if(href_list["fix_nano"]) - if(!check_rights(R_DEBUG)) return - - var/mob/H = locate(href_list["fix_nano"]) - - if(!istype(H) || !H.client) - usr << "This can only be done on mobs with clients" - return - - H.client.reload_nanoui_resources() - - usr << "Resource files sent" - H << "Your NanoUI Resource files have been refreshed" - - log_admin("[key_name(usr)] resent the NanoUI resource files to [key_name(H)]") - - else if(href_list["regenerateicons"]) - if(!check_rights(0)) return - - var/mob/M = locate(href_list["regenerateicons"]) - if(!ismob(M)) - usr << "This can only be done to instances of type /mob" - return - M.regenerate_icons() - - else if(href_list["adjustDamage"] && href_list["mobToDamage"]) - if(!check_rights(R_DEBUG|R_ADMIN|R_EVENT)) return - - var/mob/living/L = locate(href_list["mobToDamage"]) - if(!istype(L)) return - - var/Text = href_list["adjustDamage"] - - var/amount = input("Deal how much damage to mob? (Negative values here heal)","Adjust [Text]loss",0) as num - - if(!L) - usr << "Mob doesn't exist anymore" - return - - switch(Text) - if("brute") L.adjustBruteLoss(amount) - if("fire") L.adjustFireLoss(amount) - if("toxin") L.adjustToxLoss(amount) - if("oxygen")L.adjustOxyLoss(amount) - if("brain") L.adjustBrainLoss(amount) - if("clone") L.adjustCloneLoss(amount) - else - usr << "You caused an error. DEBUG: Text:[Text] Mob:[L]" - return - - if(amount != 0) - log_admin("[key_name(usr)] dealt [amount] amount of [Text] damage to [L]") - message_admins("[key_name_admin(usr)] dealt [amount] amount of [Text] damage to [L]") - href_list["datumrefresh"] = href_list["mobToDamage"] - - if(href_list["datumrefresh"]) - var/datum/DAT = locate(href_list["datumrefresh"]) - if(!istype(DAT, /datum)) - return - src.debug_variables(DAT) - - return - diff --git a/code/modules/admin/verbs/VV/debug.dm b/code/modules/admin/verbs/VV/debug.dm deleted file mode 100644 index 8654c0b50fc..00000000000 --- a/code/modules/admin/verbs/VV/debug.dm +++ /dev/null @@ -1,1220 +0,0 @@ -/client/proc/Debug2() - set category = "Debug" - set name = "Debug-Game" - - if(!check_rights(R_DEBUG)) - return - - if(Debug2) - Debug2 = 0 - message_admins("[key_name_admin(src)] toggled debugging off.") - log_admin("[key_name(src)] toggled debugging off.") - else - Debug2 = 1 - message_admins("[key_name_admin(src)] toggled debugging on.") - log_admin("[key_name(src)] toggled debugging on.") - - feedback_add_details("admin_verb","DG2") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - - -/proc/create_arbitrary_var(var/client/var_creator) - var/datum/admins/adm = var_creator.holder - if(adm && adm.marked_datum) - class = input("What kind of variable?","Variable Type") in list("text","num","type","reference","mob reference","icon","file","client","mob's area","Marked datum ([holder.marked_datum.type])","CANCEL") - if(holder.marked_datum && class == "Marked datum ([adm.marked_datum.type])") - class = "Marked datum" - else - class = input("What kind of variable?","Variable Type") in list("text","num","type","reference","mob reference","icon","file","client","mob's area","CANCEL") - switch(class) - if("CANCEL") - return null - - if("text") - lst += input("Enter new text:","Text",null) as text - - if("num") - lst += input("Enter new number:","Num",0) as num - - if("type") - lst += input("Enter type:","Type") in typesof(/obj,/mob,/area,/turf) - - if("reference") - lst += input("Select reference:","Reference",src) as mob|obj|turf|area in world - - if("mob reference") - lst += input("Select reference:","Reference",usr) as mob in world - - if("file") - lst += input("Pick file:","File") as file - - if("icon") - lst += input("Pick icon:","Icon") as icon - - if("client") - var/list/keys = list() - for(var/mob/M in world) - keys += M.client - lst += input("Please, select a player!", "Selection", null, null) as null|anything in keys - - if("mob's area") - var/mob/temp = input("Select mob", "Selection", usr) as mob in world - lst += temp.loc - - if("Marked datum") - lst += holder.marked_datum - -/* 21st Sept 2010 -Updated by Skie -- Still not perfect but better! -Stuff you can't do: -Call proc /mob/proc/Dizzy() for some player -Because if you select a player mob as owner it tries to do the proc for -/mob/living/carbon/human/ instead. And that gives a run-time error. -But you can call procs that are of type /mob/living/carbon/human/proc/ for that player. -*/ - -/client/proc/callproc() - set category = "Debug" - set name = "Advanced ProcCall" - - if(!check_rights(R_PROCCALL)) - return - - spawn(0) - var/target = null - var/targetselected = 0 - var/returnval = null - var/class = null - - switch(alert("Proc owned by something?",,"Yes","No")) - if("Yes") - targetselected = 1 - if(src.holder && src.holder.marked_datum) - class = input("Proc owned by...","Owner",null) as null|anything in list("Obj","Mob","Area or Turf","Client","Marked datum ([holder.marked_datum.type])") - if(class == "Marked datum ([holder.marked_datum.type])") - class = "Marked datum" - else - class = input("Proc owned by...","Owner",null) as null|anything in list("Obj","Mob","Area or Turf","Client") - switch(class) - if("Obj") - target = input("Enter target:","Target",usr) as obj in world - if("Mob") - target = input("Enter target:","Target",usr) as mob in world - if("Area or Turf") - target = input("Enter target:","Target",usr.loc) as area|turf in world - if("Client") - var/list/keys = list() - for(var/client/C) - keys += C - target = input("Please, select a player!", "Selection", null, null) as null|anything in keys - if("Marked datum") - target = holder.marked_datum - else - return - if("No") - target = null - targetselected = 0 - - var/procname = input("Proc path, eg: /proc/fake_blood","Path:", null) as text|null - if(!procname) return - - if(targetselected && !hascall(target,procname)) - usr << "Error: callproc(): target has no such call [procname]." - return - - var/list/lst = get_callproc_args() - if(!lst) - return - - if(targetselected) - if(!target) - usr << "Error: callproc(): owner of proc no longer exists." - return - message_admins("[key_name_admin(src)] called [target]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].") - log_admin("[key_name(src)] called [target]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].") - returnval = call(target,procname)(arglist(lst)) // Pass the lst as an argument list to the proc - else - //this currently has no hascall protection. wasn't able to get it working. - message_admins("[key_name_admin(src)] called [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]") - log_admin("[key_name(src)] called [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]") - returnval = call(procname)(arglist(lst)) // Pass the lst as an argument list to the proc - - usr << "[procname] returned: [returnval ? returnval : "null"]" - feedback_add_details("admin_verb","APC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -/client/proc/callproc_datum(var/A as null|area|mob|obj|turf) - set category = "Debug" - set name = "Atom ProcCall" - - if(!check_rights(R_PROCCALL)) - return - - var/procname = input("Proc name, eg: fake_blood","Proc:", null) as text|null - if(!procname) - return - - if(!hascall(A,procname)) - usr << "Error: callproc_datum(): target has no such call [procname]." - return - - var/list/lst = get_callproc_args() - if(!lst) - return - - if(!A || !IsValidSrc(A)) - usr << "Error: callproc_datum(): owner of proc no longer exists." - return - message_admins("[key_name_admin(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]") - log_admin("[key_name(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]") - - spawn() - var/returnval = call(A,procname)(arglist(lst)) // Pass the lst as an argument list to the proc - usr << "[procname] returned: [returnval ? returnval : "null"]" - - feedback_add_details("admin_verb","DPC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -/client/proc/get_callproc_args() - var/argnum = input("Number of arguments","Number:",0) as num|null - if(!argnum && (argnum!=0)) return - - var/list/lst = list() - //TODO: make a list to store whether each argument was initialised as null. - //Reason: So we can abort the proccall if say, one of our arguments was a mob which no longer exists - //this will protect us from a fair few errors ~Carn - - while(argnum--) - var/class = null - // Make a list with each index containing one variable, to be given to the proc - return lst - -/client/proc/Cell() - set category = "Debug" - set name = "Air Status in Location" - - if(!check_rights(R_DEBUG)) - return - - if(!mob) - return - var/turf/T = mob.loc - - if (!( istype(T, /turf) )) - return - - var/datum/gas_mixture/env = T.return_air() - - var/t = "" - t+= "Nitrogen : [env.nitrogen]\n" - t+= "Oxygen : [env.oxygen]\n" - t+= "Plasma : [env.toxins]\n" - t+= "CO2: [env.carbon_dioxide]\n" - - usr.show_message(t, 1) - feedback_add_details("admin_verb","ASL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -/client/proc/cmd_admin_robotize(var/mob/M in mob_list) - set category = "Event" - set name = "Make Robot" - - if(!check_rights(R_SPAWN)) - return - - if(!ticker) - alert("Wait until the game starts") - return - if(istype(M, /mob/living/carbon/human)) - log_admin("[key_name(src)] has robotized [M.key].") - spawn(10) - M:Robotize() - - else - alert("Invalid mob") - -/client/proc/cmd_admin_animalize(var/mob/M in mob_list) - set category = "Event" - set name = "Make Simple Animal" - - if(!check_rights(R_SPAWN)) - return - - if(!ticker) - alert("Wait until the game starts") - return - - if(!M) - alert("That mob doesn't seem to exist, close the panel and try again.") - return - - if(istype(M, /mob/new_player)) - alert("The mob must not be a new_player.") - return - - log_admin("[key_name(src)] has animalized [M.key].") - spawn(10) - M.Animalize() - - -/client/proc/makepAI(var/turf/T in mob_list) - set category = "Event" - set name = "Make pAI" - set desc = "Specify a location to spawn a pAI device, then specify a key to play that pAI" - - if(!check_rights(R_SPAWN)) - return - - var/list/available = list() - for(var/mob/C in mob_list) - if(C.key) - available.Add(C) - var/mob/choice = input("Choose a player to play the pAI", "Spawn pAI") in available - if(!choice) - return 0 - if(!istype(choice, /mob/dead/observer)) - var/confirm = input("[choice.key] isn't ghosting right now. Are you sure you want to yank him out of them out of their body and place them in this pAI?", "Spawn pAI Confirmation", "No") in list("Yes", "No") - if(confirm != "Yes") - return 0 - var/obj/item/device/paicard/card = new(T) - var/mob/living/silicon/pai/pai = new(card) - pai.name = input(choice, "Enter your pAI name:", "pAI Name", "Personal AI") as text - pai.real_name = pai.name - pai.key = choice.key - card.setPersonality(pai) - for(var/datum/paiCandidate/candidate in paiController.pai_candidates) - if(candidate.key == choice.key) - paiController.pai_candidates.Remove(candidate) - feedback_add_details("admin_verb","MPAI") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -/client/proc/cmd_admin_alienize(var/mob/M in mob_list) - set category = "Event" - set name = "Make Alien" - - if(!check_rights(R_SPAWN)) - return - - if(!ticker) - alert("Wait until the game starts") - return - if(ishuman(M)) - log_admin("[key_name(src)] has alienized [M.key].") - spawn(10) - M:Alienize() - feedback_add_details("admin_verb","MKAL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - log_admin("[key_name(usr)] made [key_name(M)] into an alien.") - message_admins("\blue [key_name_admin(usr)] made [key_name(M)] into an alien.", 1) - else - alert("Invalid mob") - -/client/proc/cmd_admin_slimeize(var/mob/M in mob_list) - set category = "Event" - set name = "Make slime" - - if(!check_rights(R_SPAWN)) - return - - if(!ticker) - alert("Wait until the game starts") - return - if(ishuman(M)) - log_admin("[key_name(src)] has slimeized [M.key].") - spawn(10) - M:slimeize() - feedback_add_details("admin_verb","MKMET") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - log_admin("[key_name(usr)] made [key_name(M)] into a slime.") - message_admins("\blue [key_name_admin(usr)] made [key_name(M)] into a slime.", 1) - else - alert("Invalid mob") - -/client/proc/cmd_admin_super(var/mob/M in mob_list) - set category = "Event" - set name = "Make Superhero" - - if(!check_rights(R_SPAWN)) - return - - if(!ticker) - alert("Wait until the game starts") - return - if(ishuman(M)) - var/type = input("Pick the Superhero","Superhero") as null|anything in all_superheroes - var/datum/superheroes/S = all_superheroes[type] - if(S) - S.create(M) - log_admin("[key_name(src)] has turned [M.key] into a Superhero.") - message_admins("\blue [key_name_admin(usr)] made [key_name(M)] into a Superhero.", 1) - else - alert("Invalid mob") - -//TODO: merge the vievars version into this or something maybe mayhaps -/client/proc/cmd_debug_del_all() - set category = "Debug" - set name = "Del-All" - - if(!check_rights(R_DEBUG)) - return - - // to prevent REALLY stupid deletions - var/blocked = list(/mob/living, /mob/living/carbon, /mob/living/carbon/human, /mob/dead, /mob/dead/observer, /mob/living/silicon, /mob/living/silicon/robot, /mob/living/silicon/ai) - var/hsbitem = input(usr, "Choose an object to delete.", "Delete:") as null|anything in subtypesof(/obj) + subtypesof(/mob) - blocked - if(hsbitem) - for(var/atom/O in world) - if(istype(O, hsbitem)) - qdel(O) - log_admin("[key_name(src)] has deleted all instances of [hsbitem].") - message_admins("[key_name_admin(src)] has deleted all instances of [hsbitem].", 0) - feedback_add_details("admin_verb","DELA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -/client/proc/cmd_debug_make_powernets() - set category = "Debug" - set name = "Make Powernets" - - if(!check_rights(R_DEBUG)) - return - - makepowernets() - log_admin("[key_name(src)] has remade the powernet. makepowernets() called.") - message_admins("[key_name_admin(src)] has remade the powernets. makepowernets() called.", 0) - feedback_add_details("admin_verb","MPWN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -/client/proc/cmd_admin_grantfullaccess(var/mob/M in mob_list) - set category = "Admin" - set name = "Grant Full Access" - - if(!check_rights(R_EVENT)) - return - - if (!ticker) - alert("Wait until the game starts") - return - if (istype(M, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - if (H.wear_id) - var/obj/item/weapon/card/id/id = H.wear_id - if(istype(H.wear_id, /obj/item/device/pda)) - var/obj/item/device/pda/pda = H.wear_id - id = pda.id - id.icon_state = "gold" - id:access = get_all_accesses()+get_all_centcom_access()+get_all_syndicate_access() - else - var/obj/item/weapon/card/id/id = new/obj/item/weapon/card/id(M); - id.icon_state = "gold" - id:access = get_all_accesses()+get_all_centcom_access()+get_all_syndicate_access() - id.registered_name = H.real_name - id.assignment = "Captain" - id.name = "[id.registered_name]'s ID Card ([id.assignment])" - H.equip_to_slot_or_del(id, slot_wear_id) - H.update_inv_wear_id() - else - alert("Invalid mob") - feedback_add_details("admin_verb","GFA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - log_admin("[key_name(src)] has granted [M.key] full access.") - message_admins("\blue [key_name_admin(usr)] has granted [M.key] full access.", 1) - -/client/proc/cmd_assume_direct_control(var/mob/M in mob_list) - set category = "Admin" - set name = "Assume direct control" - set desc = "Direct intervention" - - if(!check_rights(R_DEBUG|R_ADMIN)) - return - - if(M.ckey) - if(alert("This mob is being controlled by [M.ckey]. Are you sure you wish to assume control of it? [M.ckey] will be made a ghost.",,"Yes","No") != "Yes") - return - else - var/mob/dead/observer/ghost = new/mob/dead/observer(M,1) - ghost.ckey = M.ckey - message_admins("\blue [key_name_admin(usr)] assumed direct control of [M].", 1) - log_admin("[key_name(usr)] assumed direct control of [M].") - var/mob/adminmob = src.mob - M.ckey = src.ckey - if( isobserver(adminmob) ) - qdel(adminmob) - feedback_add_details("admin_verb","ADC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - - -/client/proc/cmd_admin_areatest() - set category = "Mapping" - set name = "Test areas" - - if(!check_rights(R_DEBUG)) - return - - var/list/areas_all = list() - var/list/areas_with_APC = list() - var/list/areas_with_air_alarm = list() - var/list/areas_with_RC = list() - var/list/areas_with_light = list() - var/list/areas_with_LS = list() - var/list/areas_with_intercom = list() - var/list/areas_with_camera = list() - - var/list/areas_with_multiple_APCs = list() - var/list/areas_with_multiple_air_alarms = list() - - for(var/area/A in world) - areas_all |= A.type - - for(var/obj/machinery/power/apc/APC in world) - var/area/A = get_area(APC) - if(!A) - continue - if(!(A.type in areas_with_APC)) - areas_with_APC |= A.type - else - areas_with_multiple_APCs |= A.type - - for(var/obj/machinery/alarm/alarm in world) - var/area/A = get_area(alarm) - if(!A) - continue - if(!(A.type in areas_with_air_alarm)) - areas_with_air_alarm |= A.type - else - areas_with_multiple_air_alarms |= A.type - - for(var/obj/machinery/requests_console/RC in world) - var/area/A = get_area(RC) - if(!A) - continue - areas_with_RC |= A.type - - for(var/obj/machinery/light/L in world) - var/area/A = get_area(L) - if(!A) - continue - areas_with_light |= A.type - - for(var/obj/machinery/light_switch/LS in world) - var/area/A = get_area(LS) - if(!A) - continue - areas_with_LS |= A.type - - for(var/obj/item/device/radio/intercom/I in world) - var/area/A = get_area(I) - if(!A) - continue - areas_with_intercom |= A.type - - for(var/obj/machinery/camera/C in world) - var/area/A = get_area(C) - if(!A) - continue - areas_with_camera |= A.type - - var/list/areas_without_APC = areas_all - areas_with_APC - var/list/areas_without_air_alarm = areas_all - areas_with_air_alarm - var/list/areas_without_RC = areas_all - areas_with_RC - var/list/areas_without_light = areas_all - areas_with_light - var/list/areas_without_LS = areas_all - areas_with_LS - var/list/areas_without_intercom = areas_all - areas_with_intercom - var/list/areas_without_camera = areas_all - areas_with_camera - - world << "AREAS WITHOUT AN APC:" - for(var/areatype in areas_without_APC) - world << "* [areatype]" - - world << "AREAS WITHOUT AN AIR ALARM:" - for(var/areatype in areas_without_air_alarm) - world << "* [areatype]" - - world << "AREAS WITH TOO MANY APCS:" - for(var/areatype in areas_with_multiple_APCs) - world << "* [areatype]" - - world << "AREAS WITH TOO MANY AIR ALARMS:" - for(var/areatype in areas_with_multiple_air_alarms) - world << "* [areatype]" - - world << "AREAS WITHOUT A REQUEST CONSOLE:" - for(var/areatype in areas_without_RC) - world << "* [areatype]" - - world << "AREAS WITHOUT ANY LIGHTS:" - for(var/areatype in areas_without_light) - world << "* [areatype]" - - world << "AREAS WITHOUT A LIGHT SWITCH:" - for(var/areatype in areas_without_LS) - world << "* [areatype]" - - world << "AREAS WITHOUT ANY INTERCOMS:" - for(var/areatype in areas_without_intercom) - world << "* [areatype]" - - world << "AREAS WITHOUT ANY CAMERAS:" - for(var/areatype in areas_without_camera) - world << "* [areatype]" - -/client/proc/cmd_admin_dress(var/mob/living/carbon/human/M in mob_list) - set category = "Event" - set name = "Select equipment" - - if(!check_rights(R_EVENT)) - return - - if(!ishuman(M)) - alert("Invalid mob") - return - - //log_admin("[key_name(src)] has alienized [M.key].") - var/list/dresspacks = list( - "strip", - "as job...", - "Engineer RIG", - "CE RIG", - "Mining RIG", - "Syndi RIG", - "Wizard RIG", - "Medical RIG", - "Atmos RIG", - "standard space gear", - "tournament standard red", - "tournament standard green", - "tournament gangster", - "tournament chef", - "tournament janitor", - "pirate", - "space pirate", - "soviet admiral", - "tunnel clown", - "masked killer", - "singuloth knight", - "dark lord", - "assassin", - "death commando", - "syndicate commando", - "chrono legionnaire", - "special ops officer", - "special ops formal", - "blue wizard", - "red wizard", - "marisa wizard", - "emergency response team member", - "emergency response team leader", - "nanotrasen officer", - "nanotrasen captain", - ) - var/dostrip = input("Do you want to strip [M] before equipping them? (0=no, 1=yes)", "STRIPTEASE") as null|anything in list(0,1) - if(isnull(dostrip)) - return - var/dresscode = input("Select dress for [M]", "Robust quick dress shop") as null|anything in dresspacks - if (isnull(dresscode)) - return - - var/datum/job/jobdatum - if (dresscode == "as job...") - var/jobname = input("Select job", "Robust quick dress shop") as null|anything in get_all_jobs() - jobdatum = job_master.GetJob(jobname) - - feedback_add_details("admin_verb","SEQ") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - if(dostrip) - for (var/obj/item/I in M) - if (istype(I, /obj/item/weapon/implant)) - continue - if(istype(I, /obj/item/organ)) - continue - qdel(I) - switch(dresscode) - if ("strip") - //do nothing - - if ("as job...") - if(jobdatum) - dresscode = "[jobdatum.title]" - jobdatum.equip(M) - - if ("standard space gear") - M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes) - - M.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(M), slot_w_uniform) - M.equip_to_slot_or_del(new /obj/item/clothing/suit/space(M), slot_wear_suit) - M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space(M), slot_head) - var /obj/item/weapon/tank/jetpack/J = new /obj/item/weapon/tank/jetpack/oxygen(M) - M.equip_to_slot_or_del(J, slot_back) - J.toggle() - M.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(M), slot_wear_mask) - J.Topic(null, list("stat" = 1)) - if ("Engineer RIG","CE RIG","Mining RIG","Syndi RIG","Wizard RIG","Medical RIG","Atmos RIG") - if(dresscode=="Engineer RIG") - M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig(M), slot_wear_suit) - M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig(M), slot_head) - else if(dresscode=="CE RIG") - M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/elite(M), slot_wear_suit) - M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/elite(M), slot_head) - else if(dresscode=="Mining RIG") - M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/mining(M), slot_wear_suit) - M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/mining(M), slot_head) - else if(dresscode=="Syndi RIG") - M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/syndi(M), slot_wear_suit) - M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/syndi(M), slot_head) - else if(dresscode=="Wizard RIG") - M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/wizard(M), slot_wear_suit) - M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/wizard(M), slot_head) - else if(dresscode=="Medical RIG") - M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/medical(M), slot_wear_suit) - M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/medical(M), slot_head) - else if(dresscode=="Atmos RIG") - M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/atmos(M), slot_wear_suit) - M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/atmos(M), slot_head) - var /obj/item/weapon/tank/jetpack/J = new /obj/item/weapon/tank/jetpack/oxygen(M) - M.equip_to_slot_or_del(J, slot_back) - J.toggle() - M.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(M), slot_wear_mask) - J.Topic(null, list("stat" = 1)) - - if ("tournament standard red","tournament standard green") //we think stunning weapon is too overpowered to use it on tournaments. --rastaf0 - if (dresscode=="tournament standard red") - M.equip_to_slot_or_del(new /obj/item/clothing/under/color/red(M), slot_w_uniform) - else - M.equip_to_slot_or_del(new /obj/item/clothing/under/color/green(M), slot_w_uniform) - M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes) - - M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest(M), slot_wear_suit) - M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/thunderdome(M), slot_head) - - M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle/destroyer(M), slot_r_hand) - M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_hand) - M.equip_to_slot_or_del(new /obj/item/weapon/grenade/smokebomb(M), slot_r_store) - - - if ("tournament gangster") //gangster are supposed to fight each other. --rastaf0 - M.equip_to_slot_or_del(new /obj/item/clothing/under/det(M), slot_w_uniform) - M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes) - - M.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/det_suit(M), slot_wear_suit) - M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(M), slot_glasses) - M.equip_to_slot_or_del(new /obj/item/clothing/head/det_hat(M), slot_head) - - M.equip_to_slot_or_del(new /obj/item/weapon/cloaking_device(M), slot_r_store) - - M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/proto(M), slot_r_hand) - M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_l_store) - - if ("tournament chef") //Steven Seagal FTW - M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chef(M), slot_w_uniform) - M.equip_to_slot_or_del(new /obj/item/clothing/suit/chef(M), slot_wear_suit) - M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes) - M.equip_to_slot_or_del(new /obj/item/clothing/head/chefhat(M), slot_head) - - M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/rollingpin(M), slot_r_hand) - M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_hand) - M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_r_store) - M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_s_store) - - if ("tournament janitor") - M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/janitor(M), slot_w_uniform) - M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes) - var/obj/item/weapon/storage/backpack/backpack = new(M) - for(var/obj/item/I in backpack) - del(I) - M.equip_to_slot_or_del(backpack, slot_back) - - M.equip_to_slot_or_del(new /obj/item/weapon/mop(M), slot_r_hand) - var/obj/item/weapon/reagent_containers/glass/bucket/bucket = new(M) - bucket.reagents.add_reagent("water", 70) - M.equip_to_slot_or_del(bucket, slot_l_hand) - - M.equip_to_slot_or_del(new /obj/item/weapon/grenade/chem_grenade/cleaner(M), slot_r_store) - M.equip_to_slot_or_del(new /obj/item/weapon/grenade/chem_grenade/cleaner(M), slot_l_store) - M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack) - M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack) - M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack) - M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack) - M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack) - M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack) - M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack) - - if ("pirate") - M.equip_to_slot_or_del(new /obj/item/clothing/under/pirate(M), slot_w_uniform) - M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes) - M.equip_to_slot_or_del(new /obj/item/clothing/head/bandana(M), slot_head) - M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), slot_glasses) - M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/pirate(M), slot_r_hand) - - if ("space pirate") - M.equip_to_slot_or_del(new /obj/item/clothing/under/pirate(M), slot_w_uniform) - M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes) - M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/pirate(M), slot_wear_suit) - M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/pirate(M), slot_head) - M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), slot_glasses) - - M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/pirate(M), slot_r_hand) - - if ("soviet soldier") - M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform) - M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes) - M.equip_to_slot_or_del(new /obj/item/clothing/head/ushanka(M), slot_head) - - if("tunnel clown")//Tunnel clowns rule! - M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/clown(M), slot_w_uniform) - M.equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes(M), slot_shoes) - M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves) - M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(M), slot_wear_mask) - M.equip_to_slot_or_del(new /obj/item/clothing/head/chaplain_hood(M), slot_head) - M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) - M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(M), slot_glasses) - M.equip_to_slot_or_del(new /obj/item/clothing/suit/chaplain_hoodie(M), slot_wear_suit) - M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/snacks/grown/banana(M), slot_l_store) - M.equip_to_slot_or_del(new /obj/item/weapon/bikehorn(M), slot_r_store) - - var/obj/item/weapon/card/id/W = new(M) - W.name = "[M.real_name]'s ID Card (Tunnel Clown!)" - W.access = get_all_accesses() - W.assignment = "Tunnel Clown!" - W.registered_name = M.real_name - M.equip_to_slot_or_del(W, slot_wear_id) - - var/obj/item/weapon/twohanded/fireaxe/fire_axe = new(M) - M.equip_to_slot_or_del(fire_axe, slot_r_hand) - - if("masked killer") - M.equip_to_slot_or_del(new /obj/item/clothing/under/overalls(M), slot_w_uniform) - M.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(M), slot_shoes) - M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/latex(M), slot_gloves) - M.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(M), slot_wear_mask) - M.equip_to_slot_or_del(new /obj/item/clothing/head/welding(M), slot_head) - M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) - M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(M), slot_glasses) - M.equip_to_slot_or_del(new /obj/item/clothing/suit/apron(M), slot_wear_suit) - M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_store) - M.equip_to_slot_or_del(new /obj/item/weapon/scalpel(M), slot_r_store) - - var/obj/item/weapon/twohanded/fireaxe/fire_axe = new(M) - M.equip_to_slot_or_del(fire_axe, slot_r_hand) - - for(var/obj/item/carried_item in M.contents) - if(!istype(carried_item, /obj/item/weapon/implant))//If it's not an implant. - carried_item.add_blood(M)//Oh yes, there will be blood... - - if("dark lord") - M.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(M), slot_w_uniform) - M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes) - M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves) - M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) - M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/dualsaber/red(M), slot_l_hand) - - var/obj/item/clothing/head/chaplain_hood/hood = new(M) - hood.name = "dark lord hood" - M.equip_to_slot_or_del(hood, slot_head) - - var/obj/item/clothing/suit/chaplain_hoodie/robe = new(M) - robe.name = "dark lord robes" - M.equip_to_slot_or_del(robe, slot_wear_suit) - - var/obj/item/weapon/card/id/syndicate/W = new(M) - W.name = "[M.real_name]'s ID Card (Dark Lord)" - W.icon_state = "syndie" - W.access = get_all_accesses() - W.assignment = "Dark Lord" - W.registered_name = M.real_name - M.equip_to_slot_or_del(W, slot_wear_id) - - if("assassin") - M.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket(M), slot_w_uniform) - M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes) - M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves) - M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) - M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses) - M.equip_to_slot_or_del(new /obj/item/clothing/suit/wcoat(M), slot_wear_suit) - M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/saber(M), slot_l_store) - M.equip_to_slot_or_del(new /obj/item/weapon/cloaking_device(M), slot_r_store) - - var/obj/item/weapon/storage/secure/briefcase/sec_briefcase = new(M) - for(var/obj/item/briefcase_item in sec_briefcase) - qdel(briefcase_item) - for(var/i=3, i>0, i--) - sec_briefcase.contents += new /obj/item/weapon/spacecash/c1000 - sec_briefcase.contents += new /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow - sec_briefcase.contents += new /obj/item/weapon/gun/projectile/revolver/mateba - sec_briefcase.contents += new /obj/item/ammo_box/a357 - sec_briefcase.contents += new /obj/item/weapon/c4 - M.equip_to_slot_or_del(sec_briefcase, slot_l_hand) - - var/obj/item/device/pda/heads/pda = new(M) - pda.owner = M.real_name - pda.ownjob = "Reaper" - pda.name = "PDA-[M.real_name] ([pda.ownjob])" - - M.equip_to_slot_or_del(pda, slot_belt) - - var/obj/item/weapon/card/id/syndicate/W = new(M) - W.name = "[M.real_name]'s ID Card (Reaper)" - W.icon_state = "syndie" - W.access = get_all_accesses() - W.assignment = "Reaper" - W.registered_name = M.real_name - M.equip_to_slot_or_del(W, slot_wear_id) - - if("death commando")//Was looking to add this for a while. - M.equip_death_commando() - - if("syndicate commando") - M.equip_syndicate_commando() - - if("nanotrasen officer") - - M.equip_or_collect(new /obj/item/clothing/shoes/centcom(M), slot_shoes) - M.equip_or_collect(new /obj/item/clothing/gloves/color/white(M), slot_gloves) - M.equip_or_collect(new /obj/item/device/radio/headset/heads/captain/alt(M), slot_l_ear) - M.equip_or_collect(new /obj/item/clothing/head/beret/centcom/officer(M), slot_head) - - var/obj/item/device/pda/centcom/pda = new(M) - pda.owner = M.real_name - pda.ownjob = "Nanotrasen Navy Officer" - pda.name = "PDA-[M.real_name] ([pda.ownjob])" - - M.equip_or_collect(pda, slot_r_store) - M.equip_or_collect(new /obj/item/clothing/glasses/sunglasses(M), slot_l_store) - M.equip_or_collect(new /obj/item/weapon/gun/energy/pulse_rifle/pistol(M), slot_belt) - - var/obj/item/weapon/card/id/centcom/W = new(M) - W.name = "[M.real_name]'s ID Card (Nanotrasen Navy Officer)" - W.assignment = "Nanotrasen Navy Officer" - W.access = get_centcom_access(W.assignment) - W.registered_name = M.real_name - M.equip_or_collect(W, slot_wear_id) - - if("nanotrasen captain") - M.equip_or_collect(new /obj/item/clothing/under/rank/centcom/captain(M), slot_w_uniform) - M.equip_or_collect(new /obj/item/clothing/shoes/centcom(M), slot_shoes) - M.equip_or_collect(new /obj/item/clothing/gloves/color/white(M), slot_gloves) - M.equip_or_collect(new /obj/item/device/radio/headset/heads/captain/alt(M), slot_l_ear) - M.equip_or_collect(new /obj/item/clothing/head/beret/centcom/captain(M), slot_head) - - var/obj/item/device/pda/centcom/pda = new(M) - pda.owner = M.real_name - pda.ownjob = "Nanotrasen Navy Captain" - pda.name = "PDA-[M.real_name] ([pda.ownjob])" - - M.equip_or_collect(pda, slot_r_store) - M.equip_or_collect(new /obj/item/clothing/glasses/sunglasses(M), slot_l_store) - M.equip_or_collect(new /obj/item/weapon/gun/energy/pulse_rifle/pistol(M), slot_belt) - - var/obj/item/weapon/card/id/centcom/W = new(M) - W.name = "[M.real_name]'s ID Card (Nanotrasen Navy Captain)" - W.access = get_all_accesses() - W.assignment = "Nanotrasen Navy Captain" - W.access = get_centcom_access(W.assignment) - W.registered_name = M.real_name - M.equip_or_collect(W, slot_wear_id) - - if("emergency response team member") - M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform) - M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes) - M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) - M.equip_to_slot_or_del(new /obj/item/device/radio/headset/ert/alt(M), slot_l_ear) - M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_belt) - M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses) - M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/ert(M), slot_back) - - var/obj/item/weapon/card/id/W = new(M) - W.name = "[M.real_name]'s ID Card (Emergency Response Team - Member)" - W.icon_state = "ERT_empty" - W.assignment = "Emergency Response Team Member" - W.access = get_centcom_access(W.assignment) - W.registered_name = M.real_name - M.equip_to_slot_or_del(W, slot_wear_id) - - var/obj/item/device/pda/centcom/pda = new(M) - pda.owner = M.real_name - pda.ownjob = "Emergency Response Team" - pda.name = "PDA-[M.real_name] ([pda.ownjob])" - - if("emergency response team leader") - M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform) - M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes) - M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) - M.equip_to_slot_or_del(new /obj/item/device/radio/headset/ert/alt(M), slot_l_ear) - M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_belt) - M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses) - M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/ert/commander(M), slot_back) - - var/obj/item/weapon/card/id/W = new(M) - W.name = "[M.real_name]'s ID Card (Emergency Response Team - Leader)" - W.icon_state = "ERT_leader" - W.assignment = "Emergency Response Team Leader" - W.access = get_centcom_access(W.assignment) - W.registered_name = M.real_name - M.equip_to_slot_or_del(W, slot_wear_id) - - var/obj/item/device/pda/centcom/pda = new(M) - pda.owner = M.real_name - pda.ownjob = "Emergency Response Team Leader" - pda.name = "PDA-[M.real_name] ([pda.ownjob])" - - if("special ops officer") - M.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate/combat(M), slot_w_uniform) - M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/deathsquad/officer(M), slot_wear_suit) - M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes) - M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) - M.equip_to_slot_or_del(new /obj/item/device/radio/headset/ert/alt(src), slot_l_ear) - M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/cyber(M), slot_glasses) - M.equip_to_slot_or_del(new /obj/item/clothing/mask/cigarette/cigar/cohiba(M), slot_wear_mask) - M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/deathsquad/beret(M), slot_head) - M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle/pistol/m1911(M), slot_belt) - M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/matches(M), slot_r_store) - M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/dualsaber/red(M), slot_l_store) - - M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back) - M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer/swat(M), slot_in_backpack) - M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_in_backpack) - M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/combat/nanites(M), slot_in_backpack) - M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/flashbangs(src), slot_in_backpack) - M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/zipties(src), slot_in_backpack) - M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/syndie/advance(src), slot_in_backpack) - - - var/obj/item/weapon/card/id/W = new(M) - W.name = "[M.real_name]'s ID Card" - W.icon_state = "commander" - W.assignment = "Special Operations Officer" - W.access = get_centcom_access(W.assignment) - W.registered_name = M.real_name - M.equip_to_slot_or_del(W, slot_wear_id) - - if("special ops formal") - M.equip_or_collect(new /obj/item/clothing/under/rank/centcom/captain(M), slot_w_uniform) - M.equip_to_slot_or_del(new /obj/item/device/radio/headset/ert/alt(src), slot_l_ear) - M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) - M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes) - M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/deathsquad/beret(M), slot_head) - M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/cyber(M), slot_glasses) - M.equip_to_slot_or_del(new /obj/item/clothing/mask/cigarette/cigar/cohiba(M), slot_wear_mask) - M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle/pistol/m1911(M), slot_belt) - M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back) - M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/matches(M), slot_r_store) - M.equip_or_collect(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_l_store) - - var/obj/item/device/pda/centcom/pda = new(M) - pda.owner = M.real_name - pda.ownjob = "Special Operations Officer" - pda.icon_state = "pda-syndi" - pda.name = "PDA-[M.real_name] ([pda.ownjob])" - pda.desc = "A portable microcomputer by Thinktronic Systems, LTD. This is model is a special edition designed for military field work." - - M.equip_or_collect(pda, slot_wear_pda) - - M.equip_or_collect(new /obj/item/clothing/glasses/sunglasses(M), slot_l_store) - M.equip_or_collect(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_r_store) - - var/obj/item/weapon/card/id/W = new(M) - W.name = "[M.real_name]'s ID Card (Special Operations Officer)" - W.icon_state = "commander" - W.assignment = "Special Operations Officer" - W.access = get_centcom_access(W.assignment) - W.registered_name = M.real_name - M.equip_to_slot_or_del(W, slot_wear_id) - - if("singuloth knight") - M.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate/combat(M), slot_w_uniform) - M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/singuloth(M), slot_wear_suit) - M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots(M), slot_shoes) - M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) - M.equip_to_slot_or_del(new /obj/item/device/radio/headset/ert(src), slot_l_ear) - M.equip_to_slot_or_del(new /obj/item/clothing/glasses/meson/cyber(M), slot_glasses) - M.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(M), slot_wear_mask) - M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/singuloth(M), slot_head) - M.equip_to_slot_or_del(new /obj/item/weapon/claymore/ceremonial(M), slot_belt) - M.equip_to_slot_or_del(new /obj/item/weapon/tank/oxygen(M), slot_s_store) - M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/knighthammer(M), slot_back) - - - var/obj/item/weapon/card/id/W = new(M) - W.name = "[M.real_name]'s ID Card (Singuloth Knight)" - W.icon_state = "syndie" - W.access = get_all_accesses() - W.access += get_all_centcom_access() - W.assignment = "Singuloth Knight" - W.registered_name = M.real_name - M.equip_to_slot_or_del(W, slot_wear_id) - - if("blue wizard") - M.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(M), slot_w_uniform) - M.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(M), slot_wear_suit) - M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(M), slot_shoes) - M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) - M.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(M), slot_head) - M.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll(M), slot_r_store) - M.equip_to_slot_or_del(new /obj/item/weapon/spellbook(M), slot_r_hand) - M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/staff(M), slot_l_hand) - M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back) - M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack) - - if("red wizard") - M.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(M), slot_w_uniform) - M.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/red(M), slot_wear_suit) - M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(M), slot_shoes) - M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) - M.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/red(M), slot_head) - M.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll(M), slot_r_store) - M.equip_to_slot_or_del(new /obj/item/weapon/spellbook(M), slot_r_hand) - M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/staff(M), slot_l_hand) - M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back) - M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack) - - if("marisa wizard") - M.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(M), slot_w_uniform) - M.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/marisa(M), slot_wear_suit) - M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/marisa(M), slot_shoes) - M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) - M.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/marisa(M), slot_head) - M.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll(M), slot_r_store) - M.equip_to_slot_or_del(new /obj/item/weapon/spellbook(M), slot_r_hand) - M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/staff(M), slot_l_hand) - M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back) - M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack) - - if("soviet admiral") - M.equip_to_slot_or_del(new /obj/item/clothing/head/hgpiratecap(M), slot_head) - M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes) - M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) - M.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(M), slot_l_ear) - M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/eyepatch(M), slot_glasses) - M.equip_to_slot_or_del(new /obj/item/clothing/suit/hgpirate(M), slot_wear_suit) - M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back) - M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/revolver/mateba(M), slot_belt) - M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform) - var/obj/item/weapon/card/id/W = new(M) - W.name = "[M.real_name]'s ID Card" - W.icon_state = "commander" - W.access = get_all_accesses() - W.access += get_all_centcom_access() - W.assignment = "Admiral" - W.registered_name = M.real_name - M.equip_to_slot_or_del(W, slot_wear_id) - - if("chrono legionnaire") - M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/chronos(M), slot_head) - M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/syndicate(src), slot_wear_mask) - M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes) - M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) - M.equip_to_slot_or_del(new /obj/item/clothing/glasses/night(M), slot_glasses) - M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/chronos(M), slot_wear_suit) - M.equip_to_slot_or_del(new /obj/item/weapon/chrono_eraser(M), slot_back) - M.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(M), slot_w_uniform) - M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(src), slot_s_store) - var/obj/item/weapon/card/id/W = new(M) - W.name = "[M.real_name]'s ID Card" - W.icon_state = "syndie" - W.assignment = "Chrono Legionnaire" - W.registered_name = M.real_name - M.equip_to_slot_or_del(W, slot_wear_id) - - M.regenerate_icons() - - log_admin("[key_name(usr)] changed the equipment of [key_name(M)] to [dresscode].") - message_admins("\blue [key_name_admin(usr)] changed the equipment of [key_name_admin(M)] to [dresscode].", 1) - return - -/client/proc/startSinglo() - set category = "Debug" - set name = "Start Singularity" - set desc = "Sets up the singularity and all machines to get power flowing through the station" - - if(!check_rights(R_DEBUG)) - return - - if(alert("Are you sure? This will start up the engine. Should only be used during debug!",,"Yes","No") != "Yes") - return - - for(var/obj/machinery/power/emitter/E in world) - if(E.anchored) - E.active = 1 - - for(var/obj/machinery/field/generator/F in world) - if(F.anchored) - F.Varedit_start = 1 - spawn(30) - for(var/obj/machinery/the_singularitygen/G in world) - if(G.anchored) - var/obj/singularity/S = new /obj/singularity(get_turf(G), 50) - spawn(0) - qdel(G) - S.energy = 1750 - S.current_size = 7 - S.icon = 'icons/effects/224x224.dmi' - S.icon_state = "singularity_s7" - S.pixel_x = -96 - S.pixel_y = -96 - S.grav_pull = 0 - //S.consume_range = 3 - S.dissipate = 0 - //S.dissipate_delay = 10 - //S.dissipate_track = 0 - //S.dissipate_strength = 10 - - for(var/obj/machinery/power/rad_collector/Rad in world) - if(Rad.anchored) - if(!Rad.P) - var/obj/item/weapon/tank/plasma/Plasma = new/obj/item/weapon/tank/plasma(Rad) - Plasma.air_contents.toxins = 70 - Rad.drainratio = 0 - Rad.P = Plasma - Plasma.loc = Rad - - if(!Rad.active) - Rad.toggle_power() - - for(var/obj/machinery/power/smes/SMES in world) - if(SMES.anchored) - SMES.input_attempt = 1 - -/client/proc/cmd_debug_mob_lists() - set category = "Debug" - set name = "Debug Mob Lists" - set desc = "For when you just gotta know" - - if(!check_rights(R_DEBUG)) - return - - switch(input("Which list?") in list("Players","Admins","Mobs","Living Mobs","Dead Mobs","Silicons","Clients","Respawnable Mobs")) - if("Players") - usr << list2text(player_list,",") - if("Admins") - usr << list2text(admins,",") - if("Mobs") - usr << list2text(mob_list,",") - if("Living Mobs") - usr << list2text(living_mob_list,",") - if("Dead Mobs") - usr << list2text(dead_mob_list,",") - if("Silicons") - usr << list2text(silicon_mob_list,",") - if("Clients") - usr << list2text(clients,",") - if("Respawnable Mobs") - usr << list2text(respawnable_list,",") - - -/client/proc/cmd_admin_toggle_block(var/mob/M,var/block) - if(!check_rights(R_SPAWN)) - return - - if(!ticker) - alert("Wait until the game starts") - return - if(istype(M, /mob/living/carbon)) - M.dna.SetSEState(block,!M.dna.GetSEState(block)) - genemutcheck(M,block,null,MUTCHK_FORCED) - M.update_mutations() - var/state="[M.dna.GetSEState(block)?"on":"off"]" - var/blockname=assigned_blocks[block] - message_admins("[key_name_admin(src)] has toggled [M.key]'s [blockname] block [state]!") - log_admin("[key_name(src)] has toggled [M.key]'s [blockname] block [state]!") - else - alert("Invalid mob") - -/client/proc/reload_nanoui_resources() - set category = "Debug" - set name = "Reload NanoUI Resources" - set desc = "Force the client to redownload NanoUI Resources" - - // Close open NanoUIs. - nanomanager.close_user_uis(usr) - - // Re-load the assets. - var/datum/asset/assets = get_asset_datum(/datum/asset/nanoui) - assets.register() - - // Clear the user's cache so they get resent. - usr.client.cache = list() \ No newline at end of file diff --git a/code/modules/admin/verbs/transform.dm b/code/modules/admin/verbs/transform.dm deleted file mode 100644 index e69de29bb2d..00000000000 From 1caf39230ad7503ecdc135dfb768caf160cd8da4 Mon Sep 17 00:00:00 2001 From: FalseIncarnate Date: Tue, 29 Mar 2016 03:11:42 -0400 Subject: [PATCH 207/328] Logic Gates WIP 3 Allows mass driver buttons to send logic signals - They send LOGIC_FLICKER, since they are only on when pressed, then turn off when released - Can send logic signals to a different ID tag than their associated driver/door ID tag, configurable from the multitool menu Allows light switches to send logic signals - Will send LOGIC_ON or LOGIC_OFF signals to match their current state - Send both when toggled and on the process() cycle - Light control can be toggled via the multitool menu, so you can use them as purely light switches, purely logic switches, or as dual switches Allows light switches to be made from metal sheets, just like mass driver buttons (1 sheet per button) - Fixes a resource duplication bug where driver buttons can be disassembled for more metal than it takes to build them Begins to move some code for various button types into the buttons.dm file, rather than being scattered across multiple files - Driver buttons code moved from door_control.dm - Ignition switch code moved from igniter.dm Renames driver_button.dm to buttons_switches.dm - This is the file that contained the mountable frames for driver buttons, and now also contains the frame for light switches. --- code/game/machinery/buttons.dm | 164 ++++++++++++++++++ code/game/machinery/door_control.dm | 115 ------------ code/game/machinery/igniter.dm | 36 ---- code/game/machinery/lightswitch.dm | 119 ++++++++++++- .../mountable_frames/buttons_switches.dm | 23 +++ .../items/mountable_frames/driver_button.dm | 10 -- .../items/stacks/sheets/sheet_types.dm | 1 + code/modules/logic/logic_base.dm | 7 + paradise.dme | 2 +- 9 files changed, 306 insertions(+), 171 deletions(-) create mode 100644 code/game/objects/items/mountable_frames/buttons_switches.dm delete mode 100644 code/game/objects/items/mountable_frames/driver_button.dm diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index 8dcb8a9ce63..0934959d20f 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -1,3 +1,8 @@ + +////////////////////////////////////// +// Driver Button // +////////////////////////////////////// + /obj/machinery/driver_button name = "mass driver button" icon = 'icons/obj/objects.dmi' @@ -31,6 +36,121 @@ if(radio_controller) set_frequency(frequency) +/obj/machinery/driver_button/initialize() + ..() + set_frequency(frequency) + +/obj/machinery/driver_button/proc/set_frequency(new_frequency) + radio_controller.remove_object(src, frequency) + frequency = new_frequency + radio_connection = radio_controller.add_object(src, frequency, RADIO_LOGIC) + return + +/obj/machinery/driver_button/Destroy() + if(radio_controller) + radio_controller.remove_object(src,frequency) + return ..() + + +/obj/machinery/driver_button/attack_ai(mob/user as mob) + return src.attack_hand(user) + +/obj/machinery/driver_button/attackby(obj/item/weapon/W, mob/user as mob, params) + + if(istype(W, /obj/item/device/detective_scanner)) + return + + if(istype(W, /obj/item/device/multitool)) + update_multitool_menu(user) + return 1 + + if(istype(W, /obj/item/weapon/wrench)) + playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1) + if(do_after(user, 30, target = src)) + user << "You detach \the [src] from the wall." + new/obj/item/mounted/frame/driver_button(get_turf(src)) + qdel(src) + return 1 + + return src.attack_hand(user) + +/obj/machinery/driver_button/multitool_menu(var/mob/user, var/obj/item/device/multitool/P) + return {" +
      +
    • ID Tag: [format_tag("ID Tag","id_tag")]
    • +
    • Logic Connection: [logic_connect ? "On" : "Off"]
    • +
    • Logic ID Tag: [format_tag("Logic ID Tag", "logic_id_tag")]
    • +
    "} + +/obj/machinery/driver_button/attack_hand(mob/user as mob) + + src.add_fingerprint(usr) + if(stat & (NOPOWER|BROKEN)) + return + if(active) + return + add_fingerprint(user) + + use_power(5) + + launch_sequence() + + return + +/obj/machinery/driver_button/proc/launch_sequence() + active = 1 + icon_state = "launcheract" + + if(logic_connect) + if(!radio_connection) //can't output without this + return + + if(logic_id_tag == null) //Don't output to an undefined id_tag + return + + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.source = src + + signal.data = list( + "tag" = logic_id_tag, + "sigtype" = "logic", + "state" = LOGIC_FLICKER, //Buttons are a FLICKER source, since they only register as ON when you press it, then turn OFF after you release + ) + + radio_connection.post_signal(src, signal, filter = RADIO_LOGIC) + + for(var/obj/machinery/door/poddoor/M in range(src,range)) + if (M.id_tag == src.id_tag && !M.protected) + spawn() + M.open() + + sleep(20) + + for(var/obj/machinery/mass_driver/M in range(src,range)) + if(M.id_tag == src.id_tag) + M.drive() + + sleep(50) + + for(var/obj/machinery/door/poddoor/M in range(src,range)) + if (M.id_tag == src.id_tag && !M.protected) + spawn() + M.close() + return + + icon_state = "launcherbtt" + active = 0 + +/obj/machinery/driver_button/multitool_topic(var/mob/user,var/list/href_list,var/obj/O) + ..() + if("toggle_logic" in href_list) + logic_connect = !logic_connect + +////////////////////////////////////// +// Ignition Switch // +////////////////////////////////////// + /obj/machinery/ignition_switch name = "ignition switch" icon = 'icons/obj/objects.dmi' @@ -43,6 +163,46 @@ idle_power_usage = 2 active_power_usage = 4 +/obj/machinery/ignition_switch/attack_ai(mob/user as mob) + return src.attack_hand(user) + +/obj/machinery/ignition_switch/attackby(obj/item/weapon/W, mob/user as mob, params) + return src.attack_hand(user) + +/obj/machinery/ignition_switch/attack_hand(mob/user as mob) + + if(stat & (NOPOWER|BROKEN)) + return + if(active) + return + + use_power(5) + + active = 1 + icon_state = "launcheract" + + for(var/obj/machinery/sparker/M in world) + if (M.id == src.id) + spawn( 0 ) + M.spark() + + for(var/obj/machinery/igniter/M in world) + if(M.id == src.id) + use_power(50) + M.on = !( M.on ) + M.icon_state = text("igniter[]", M.on) + + sleep(50) + + icon_state = "launcherbtt" + active = 0 + + return + +////////////////////////////////////// +// Flasher Button // +////////////////////////////////////// + /obj/machinery/flasher_button name = "flasher button" desc = "A remote control switch for a mounted flasher." @@ -55,6 +215,10 @@ idle_power_usage = 2 active_power_usage = 4 +////////////////////////////////////// +// Crematorium Switch // +////////////////////////////////////// + /obj/machinery/crema_switch desc = "Burn baby burn!" name = "crematorium igniter" diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm index d8e7060d09a..0e6834a3229 100644 --- a/code/game/machinery/door_control.dm +++ b/code/game/machinery/door_control.dm @@ -131,118 +131,3 @@ icon_state = "doorctrl-p" else icon_state = "doorctrl0" - -////////////////////////////////////// -// Driver Button // -////////////////////////////////////// - -/obj/machinery/driver_button/initialize() - ..() - set_frequency(frequency) - -/obj/machinery/driver_button/proc/set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) - frequency = new_frequency - radio_connection = radio_controller.add_object(src, frequency, RADIO_LOGIC) - return - -/obj/machinery/driver_button/Destroy() - if(radio_controller) - radio_controller.remove_object(src,frequency) - return ..() - - -/obj/machinery/driver_button/attack_ai(mob/user as mob) - return src.attack_hand(user) - -/obj/machinery/driver_button/attackby(obj/item/weapon/W, mob/user as mob, params) - - if(istype(W, /obj/item/device/detective_scanner)) - return - - if(istype(W, /obj/item/device/multitool)) - update_multitool_menu(user) - return 1 - - if(istype(W, /obj/item/weapon/wrench)) - playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1) - if(do_after(user, 30, target = src)) - user << "You detach \the [src] from the wall." - new/obj/item/mounted/frame/driver_button(get_turf(src)) - qdel(src) - return 1 - - return src.attack_hand(user) - -/obj/machinery/driver_button/multitool_menu(var/mob/user, var/obj/item/device/multitool/P) - return {" -
      -
    • ID Tag: [format_tag("ID Tag","id_tag")]
    • -
    • Logic Connection: [logic_connect ? "On" : "Off"]
    • -
    • Logic ID Tag: [format_tag("Logic ID Tag", "logic_id_tag")]
    • -
    "} - -/obj/machinery/driver_button/attack_hand(mob/user as mob) - - src.add_fingerprint(usr) - if(stat & (NOPOWER|BROKEN)) - return - if(active) - return - add_fingerprint(user) - - use_power(5) - - launch_sequence() - - return - -/obj/machinery/driver_button/proc/launch_sequence() - active = 1 - icon_state = "launcheract" - - if(logic_connect) - if(!radio_connection) //can't output without this - return - - if(logic_id_tag == null) //Don't output to an undefined id_tag - return - - var/datum/signal/signal = new - signal.transmission_method = 1 //radio signal - signal.source = src - - signal.data = list( - "tag" = logic_id_tag, - "sigtype" = "logic", - "state" = LOGIC_FLICKER, //Buttons are a FLICKER source, since they only register as ON when you press it, then turn OFF after you release - ) - - radio_connection.post_signal(src, signal, filter = RADIO_LOGIC) - - for(var/obj/machinery/door/poddoor/M in range(src,range)) - if (M.id_tag == src.id_tag && !M.protected) - spawn() - M.open() - - sleep(20) - - for(var/obj/machinery/mass_driver/M in range(src,range)) - if(M.id_tag == src.id_tag) - M.drive() - - sleep(50) - - for(var/obj/machinery/door/poddoor/M in range(src,range)) - if (M.id_tag == src.id_tag && !M.protected) - spawn() - M.close() - return - - icon_state = "launcherbtt" - active = 0 - -/obj/machinery/driver_button/multitool_topic(var/mob/user,var/list/href_list,var/obj/O) - ..() - if("toggle_logic" in href_list) - logic_connect = !logic_connect \ No newline at end of file diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index 25989db9e0f..d6e41d29fa2 100755 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -114,39 +114,3 @@ return spark() ..(severity) - -/obj/machinery/ignition_switch/attack_ai(mob/user as mob) - return src.attack_hand(user) - -/obj/machinery/ignition_switch/attackby(obj/item/weapon/W, mob/user as mob, params) - return src.attack_hand(user) - -/obj/machinery/ignition_switch/attack_hand(mob/user as mob) - - if(stat & (NOPOWER|BROKEN)) - return - if(active) - return - - use_power(5) - - active = 1 - icon_state = "launcheract" - - for(var/obj/machinery/sparker/M in world) - if (M.id == src.id) - spawn( 0 ) - M.spark() - - for(var/obj/machinery/igniter/M in world) - if(M.id == src.id) - use_power(50) - M.on = !( M.on ) - M.icon_state = text("igniter[]", M.on) - - sleep(50) - - icon_state = "launcherbtt" - active = 0 - - return \ No newline at end of file diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index 839c63a6bc9..47a3d48e19c 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -11,9 +11,27 @@ var/area/area = null var/otherarea = null // luminosity = 1 + settagwhitelist = list("logic_id_tag") + var/light_connect = 1 //Allows the switch to control lights in its associated areas. When set to 0, using the switch won't affect the lights. + var/datum/radio_frequency/radio_connection + var/frequency = 0 + var/logic_id_tag = "default" //Defines the ID tag to send logic signals to. + var/logic_connect = 0 //Set this to allow the switch to send out logic signals. -/obj/machinery/light_switch/New() + +/obj/machinery/light_switch/New(turf/loc, var/w_dir=null) ..() + switch(w_dir) + if(NORTH) + pixel_y = 25 + if(SOUTH) + pixel_y = -25 + if(EAST) + pixel_x = 25 + if(WEST) + pixel_x = -25 + if(radio_controller) + set_frequency(frequency) spawn(5) src.area = src.loc.loc @@ -26,7 +44,20 @@ src.on = src.area.lightswitch updateicon() +/obj/machinery/light_switch/initialize() + ..() + set_frequency(frequency) +/obj/machinery/light_switch/proc/set_frequency(new_frequency) + radio_controller.remove_object(src, frequency) + frequency = new_frequency + radio_connection = radio_controller.add_object(src, frequency, RADIO_LOGIC) + return + +/obj/machinery/light_switch/Destroy() + if(radio_controller) + radio_controller.remove_object(src,frequency) + return ..() /obj/machinery/light_switch/proc/updateicon() if(stat & NOPOWER) @@ -41,22 +72,55 @@ if(..(user, 1)) user << "A light switch. It is [on? "on" : "off"]." - /obj/machinery/light_switch/attack_hand(mob/user) on = !on + updateicon() - area.lightswitch = on - area.updateicon() + if(light_connect) + area.lightswitch = on + area.updateicon() - for(var/obj/machinery/light_switch/L in area) - L.on = on - L.updateicon() + if(logic_connect && powered(LIGHT)) //Don't bother sending a signal if we aren't set to send them or we have no power to send with. + handle_output() - area.power_change() + if(light_connect) + for(var/obj/machinery/light_switch/L in area) + L.on = on + L.updateicon() + + area.power_change() + +/obj/machinery/light_switch/proc/handle_output() + if(!radio_connection) //can't output without this + return + + if(logic_id_tag == null) //Don't output to an undefined id_tag + return + + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.source = src + + //Light switches are continuous signal sources, since they register as ON or OFF and stay that way until adjusted again + if(on) + signal.data = list( + "tag" = logic_id_tag, + "sigtype" = "logic", + "state" = LOGIC_ON, + ) + else + signal.data = list( + "tag" = logic_id_tag, + "sigtype" = "logic", + "state" = LOGIC_OFF, + ) + + radio_connection.post_signal(src, signal, filter = RADIO_LOGIC) + if(on) + use_power(5, LIGHT) //Use a tiny bit of power every time we send an ON signal. Draws from the local APC's lighting circuit, since this is a LIGHT switch. /obj/machinery/light_switch/power_change() - if(!otherarea) if(powered(LIGHT)) stat &= ~NOPOWER @@ -71,3 +135,40 @@ return power_change() ..(severity) + +/obj/machinery/light_switch/process() + if(logic_connect && powered(LIGHT)) //We won't send signals while unpowered, but the last signal will remain valid for anything that received it before we went dark + handle_output() + +/obj/machinery/light_switch/attackby(obj/item/weapon/W as obj, mob/user as mob, params) + if(istype(W, /obj/item/device/detective_scanner)) + return + + if(istype(W, /obj/item/device/multitool)) + update_multitool_menu(user) + return 1 + + if(istype(W, /obj/item/weapon/wrench)) + playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1) + if(do_after(user, 30, target = src)) + user << "You detach \the [src] from the wall." + new/obj/item/mounted/frame/light_switch(get_turf(src)) + qdel(src) + return 1 + + return src.attack_hand(user) + +/obj/machinery/light_switch/multitool_menu(var/mob/user, var/obj/item/device/multitool/P) + return {" + "} + +/obj/machinery/light_switch/multitool_topic(var/mob/user,var/list/href_list,var/obj/O) + ..() + if("toggle_light_connect" in href_list) + light_connect = !light_connect + if("toggle_logic" in href_list) + logic_connect = !logic_connect diff --git a/code/game/objects/items/mountable_frames/buttons_switches.dm b/code/game/objects/items/mountable_frames/buttons_switches.dm new file mode 100644 index 00000000000..b1e3fabbb86 --- /dev/null +++ b/code/game/objects/items/mountable_frames/buttons_switches.dm @@ -0,0 +1,23 @@ +/obj/item/mounted/frame/driver_button + name = "mass driver button frame" + desc = "Used for repairing or building mass driver buttons" + icon = 'icons/obj/objects.dmi' + icon_state = "launcherbtt_frame" + mount_reqs = list("simfloor") + sheets_refunded = 1 + +/obj/item/mounted/frame/driver_button/do_build(turf/on_wall, mob/user) + new /obj/machinery/driver_button(get_turf(user), get_dir(user, on_wall)) + qdel(src) + +/obj/item/mounted/frame/light_switch + name = "light switch frame" + desc = "Used for repairing or building light switches" + icon = 'icons/obj/power.dmi' + icon_state = "light-p" + mount_reqs = list("simfloor", "nospace") + sheets_refunded = 1 + +/obj/item/mounted/frame/light_switch/do_build(turf/on_wall, mob/user) + new /obj/machinery/light_switch(get_turf(user), get_dir(user, on_wall)) + qdel(src) \ No newline at end of file diff --git a/code/game/objects/items/mountable_frames/driver_button.dm b/code/game/objects/items/mountable_frames/driver_button.dm deleted file mode 100644 index 7c888b48c95..00000000000 --- a/code/game/objects/items/mountable_frames/driver_button.dm +++ /dev/null @@ -1,10 +0,0 @@ -/obj/item/mounted/frame/driver_button - name = "mass driver button frame" - desc = "Used for repairing or building mass driver buttons" - icon = 'icons/obj/objects.dmi' - icon_state = "launcherbtt_frame" - mount_reqs = list("simfloor") - -/obj/item/mounted/frame/driver_button/do_build(turf/on_wall, mob/user) - new /obj/machinery/driver_button(get_turf(user), get_dir(user, on_wall)) - qdel(src) \ No newline at end of file diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 11db68ec671..a5f7575a34a 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -72,6 +72,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \ ), 4), \ null, \ new/datum/stack_recipe("mass driver button frame", /obj/item/mounted/frame/driver_button, 1, time = 50, one_per_turf = 0, on_floor = 1), \ + new/datum/stack_recipe("light switch frame", /obj/item/mounted/frame/light_switch, 1, time = 50, one_per_turf = 0, on_floor = 1), \ null, \ new/datum/stack_recipe("grenade casing", /obj/item/weapon/grenade/chem_grenade), \ new/datum/stack_recipe("light fixture frame", /obj/item/mounted/frame/light_fixture, 2), \ diff --git a/code/modules/logic/logic_base.dm b/code/modules/logic/logic_base.dm index 9e93942935f..129a243c37b 100644 --- a/code/modules/logic/logic_base.dm +++ b/code/modules/logic/logic_base.dm @@ -265,8 +265,15 @@ if(tamperproof) //This is some top-level tamperproofing right here, that's for sure. It can even defy a singularity! return 0 + ..() /obj/machinery/logic_gate/bullet_act() if(tamperproof) return 0 + ..() + +/obj/machinery/logic_gate/tesla_act(var/power) + if(tamperproof) + tesla_zap(src, 3, power) //If we're tamperproof, we'll just bounce the full shock of the tesla zap we got hit by, so it continues on normally without diminishing + return 0 ..() \ No newline at end of file diff --git a/paradise.dme b/paradise.dme index c4c7bfc1545..2dea07e765d 100644 --- a/paradise.dme +++ b/paradise.dme @@ -684,7 +684,7 @@ #include "code\game\objects\items\devices\radio\radio.dm" #include "code\game\objects\items\mountable_frames\air_alarm.dm" #include "code\game\objects\items\mountable_frames\apc_frame.dm" -#include "code\game\objects\items\mountable_frames\driver_button.dm" +#include "code\game\objects\items\mountable_frames\buttons_switches.dm" #include "code\game\objects\items\mountable_frames\fire_alarm.dm" #include "code\game\objects\items\mountable_frames\frames.dm" #include "code\game\objects\items\mountable_frames\intercom.dm" From 6648175a634b110a48fe49e3218d123eb7c78615 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Tue, 29 Mar 2016 06:05:59 -0400 Subject: [PATCH 208/328] Ports Advanced Cameras --- code/game/area/Space Station 13 areas.dm | 4 +- .../machinery/computer/camera_advanced.dm | 161 +++++++++++++++++ code/game/objects/items/blueprints.dm | 2 +- code/modules/mob/living/carbon/human/life.dm | 3 + code/modules/mob/living/carbon/slime/slime.dm | 6 + code/modules/mob/living/life.dm | 2 +- code/modules/mob/mob_defines.dm | 2 + .../chemical_reaction_slime.dm | 14 ++ .../reagent_containers/food/snacks.dm | 6 + .../research/xenobiology/xenobio_camera.dm | 171 ++++++++++++++++++ .../research/xenobiology/xenobiology.dm | 12 ++ icons/mob/actions.dmi | Bin 60442 -> 62362 bytes icons/obj/abductor.dmi | Bin 0 -> 49431 bytes icons/obj/computer.dmi | Bin 35905 -> 38088 bytes paradise.dme | 2 + 15 files changed, 381 insertions(+), 4 deletions(-) create mode 100644 code/game/machinery/computer/camera_advanced.dm create mode 100644 code/modules/research/xenobiology/xenobio_camera.dm create mode 100644 icons/obj/abductor.dmi diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 7008f050337..1be91011a17 100644 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -1788,8 +1788,8 @@ area/security/podbay icon_state = "toxlab" /area/toxins/xenobiology - name = "\improper Xenobiology Lab" - icon_state = "toxlab" + name = "Xenobiology Lab" + icon_state = "toxmix" /area/toxins/xenobiology/xenoflora_storage name = "\improper Xenoflora Storage" diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm new file mode 100644 index 00000000000..0e6e77ec9ec --- /dev/null +++ b/code/game/machinery/computer/camera_advanced.dm @@ -0,0 +1,161 @@ +/obj/machinery/computer/camera_advanced + name = "advanced camera console" + desc = "Used to access the various cameras on the station." + icon_screen = "cameras" + icon_keyboard = "security_key" + var/mob/camera/aiEye/remote/eyeobj + var/mob/living/carbon/human/current_user = null + var/list/networks = list("SS13") + var/datum/action/camera_off/off_action = new + var/datum/action/camera_jump/jump_action = new + +/obj/machinery/computer/camera_advanced/proc/CreateEye() + eyeobj = new() + eyeobj.origin = src + +/obj/machinery/computer/camera_advanced/proc/GrantActions(mob/living/carbon/user) + off_action.target = user + off_action.Grant(user) + jump_action.target = user + jump_action.Grant(user) + +/obj/machinery/computer/camera_advanced/check_eye(mob/user) + if (get_dist(user, src) > 1 || user.eye_blind) + if(user == current_user) + off_action.Activate() + return 0 + return 1 + +/obj/machinery/computer/camera_advanced/attack_hand(mob/user) + if(..()) + return + if(!iscarbon(user)) + return + var/mob/living/carbon/L = user + + if(!current_user) + if(!eyeobj) + CreateEye() + GrantActions(user) + current_user = user + eyeobj.user = user + eyeobj.name = "Camera Eye ([user.name])" + L.remote_view = 1 + L.remote_control = eyeobj + L.client.perspective = EYE_PERSPECTIVE + if(!eyeobj.initialized) + for(var/obj/machinery/camera/C in cameranet.cameras) + if(!C.can_use()) + continue + if(C.network&networks) + eyeobj.setLoc(get_turf(C)) + break + eyeobj.initialized = 1 + else + eyeobj.setLoc(eyeobj.loc) + else + user << "The console is already in use!" + +/mob/camera/aiEye/remote + name = "Inactive Camera Eye" + var/sprint = 10 + var/cooldown = 0 + var/acceleration = 1 + var/mob/living/carbon/human/user = null + var/obj/machinery/computer/camera_advanced/origin + var/initialized = 0 + var/visible_icon = 0 + var/image/user_image = null + +/mob/camera/aiEye/remote/GetViewerClient() + if(user) + return user.client + return null + +/mob/camera/aiEye/remote/setLoc(T) + if(user) + if(!isturf(user.loc)) + return + T = get_turf(T) + loc = T + cameranet.visibility(src) + if(user.client) + if(visible_icon) + user.client.images -= user_image + user_image = image(icon,loc,icon_state,FLY_LAYER) + user.client.images += user_image + user.client.eye = src + +/mob/camera/aiEye/remote/relaymove(mob/user,direct) + var/initial = initial(sprint) + var/max_sprint = 50 + + if(cooldown && cooldown < world.timeofday) // 3 seconds + sprint = initial + + for(var/i = 0; i < max(sprint, initial); i += 20) + var/turf/step = get_turf(get_step(src, direct)) + if(step) + src.setLoc(step) + + cooldown = world.timeofday + 5 + if(acceleration) + sprint = min(sprint + 0.5, max_sprint) + else + sprint = initial + +/datum/action/camera_off + name = "End Camera View" + action_type = AB_INNATE + button_icon_state = "camera_off" + +/datum/action/camera_off/Activate() + if(!target || !iscarbon(target)) + return + var/mob/living/carbon/C = target + var/mob/camera/aiEye/remote/remote_eye = C.remote_control + C.remote_view = 0 + remote_eye.origin.current_user = null + remote_eye.origin.jump_action.Remove(C) + remote_eye.user = null + if(C.client) + C.client.perspective = MOB_PERSPECTIVE + C.client.eye = src + C.client.images -= remote_eye.user_image + for(var/datum/camerachunk/chunk in remote_eye.visibleCameraChunks) + C.client.images -= chunk.obscured + C.remote_control = null + C.unset_machine() + src.Remove(C) + +/datum/action/camera_jump + name = "Jump To Camera" + action_type = AB_INNATE + button_icon_state = "camera_jump" + +/datum/action/camera_jump/Activate() + if(!target || !iscarbon(target)) + return + var/mob/living/carbon/C = target + var/mob/camera/aiEye/remote/remote_eye = C.remote_control + var/obj/machinery/computer/camera_advanced/origin = remote_eye.origin + + var/list/L = list() + + for (var/obj/machinery/camera/cam in cameranet.cameras) + L.Add(cam) + + camera_sort(L) + + var/list/T = list() + + for (var/obj/machinery/camera/netcam in L) + var/list/tempnetwork = netcam.network&origin.networks + if (tempnetwork.len) + T[text("[][]", netcam.c_tag, (netcam.can_use() ? null : " (Deactivated)"))] = netcam + + + var/camera = input("Choose which camera you want to view", "Cameras") as null|anything in T + var/obj/machinery/camera/final = T[camera] + if(final) + remote_eye.setLoc(get_turf(final)) \ No newline at end of file diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index 71c6be4d154..99dbe5b366b 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -179,7 +179,7 @@ A.name = str usr << "You rename the '[prevname]' to '[str]'." interact() - return + return 1 /obj/item/areaeditor/proc/set_area_machinery_title(var/area/A,var/title,var/oldtitle) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index a3a9a2721e4..6fe1cae458d 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -939,6 +939,9 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc src << "Your psy-connection grows too faint to maintain!" isRemoteObserve = 0 + if(remote_view) + isRemoteObserve = 1 + if(!isRemoteObserve && client && !client.adminobs) remoteview_target = null reset_view(null) diff --git a/code/modules/mob/living/carbon/slime/slime.dm b/code/modules/mob/living/carbon/slime/slime.dm index 37c2e112c24..e2a7da1ae5e 100644 --- a/code/modules/mob/living/carbon/slime/slime.dm +++ b/code/modules/mob/living/carbon/slime/slime.dm @@ -66,6 +66,12 @@ coretype = text2path("/obj/item/slime_extract/[sanitizedcolour]") ..() +/mob/living/carbon/slime/Destroy() + for(var/obj/machinery/computer/camera_advanced/xenobio/X in machines) + if(src in X.stored_slimes) + X.stored_slimes -= src + return ..() + /mob/living/carbon/slime/regenerate_icons() icon_state = "[colour] [is_adult ? "adult" : "baby"] slime" overlays.len = 0 diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 7a325ca2385..f8dcf7a5d0d 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -212,7 +212,7 @@ if (!( machine.check_eye(src) )) reset_view(null) else - if(!client.adminobs) + if(!remote_view && !client.adminobs) reset_view(null) /mob/living/proc/update_sight() diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 4f7327180c6..a4142b41d49 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -211,6 +211,8 @@ var/atom/movable/remote_control //Calls relaymove() to whatever it is + var/remote_view = 0 // Set to 1 to prevent view resets on Life + var/obj/control_object //Used by admins to possess objects. All mobs should have this var var/datum/visibility_interface/visibility_interface = null // used by the visibility system to provide an interface for the visibility networks diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm index d6e1ed34ce4..bb069890392 100644 --- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm +++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm @@ -492,6 +492,20 @@ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") var/obj/item/weapon/slimesteroid2/P = new /obj/item/weapon/slimesteroid2 P.loc = get_turf(holder.my_atom) + + slime_territory + name = "Slime Territory" + id = "s_territory" + result = null + required_reagents = list("blood" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/cerulean + required_other = 1 + on_reaction(datum/reagents/holder) + feedback_add_details("slime_cores_used","[type]") + var/obj/item/areaeditor/blueprints/slime/P = new /obj/item/areaeditor/blueprints/slime + P.loc = get_turf(holder.my_atom) + //Sepia slimestop name = "Slime Stop" diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index eee8c78f9b0..df6edbaa03f 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -1597,6 +1597,12 @@ user.drop_item() forceMove(get_turf(O)) return Expand() + if(istype(O, /obj/machinery/computer/camera_advanced/xenobio)) + var/obj/machinery/computer/camera_advanced/xenobio/X = O + X.monkeys++ + user << "You feed [src] to the [X]. It now has [X.monkeys] monkey cubes stored." + qdel(src) + return ..() /obj/item/weapon/reagent_containers/food/snacks/monkeycube/attack_self(mob/user) diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm new file mode 100644 index 00000000000..129c97761d1 --- /dev/null +++ b/code/modules/research/xenobiology/xenobio_camera.dm @@ -0,0 +1,171 @@ +//Xenobio control console +/mob/camera/aiEye/remote/xenobio + visible_icon = 1 + icon = 'icons/obj/abductor.dmi' + icon_state = "camera_target" + + +/mob/camera/aiEye/remote/xenobio/setLoc(var/t) + var/area/new_area = get_area(t) + if(new_area && new_area.name == "Xenobiology Lab" || istype(new_area, /area/toxins/xenobiology )) + return ..() + else + return + +/obj/machinery/computer/camera_advanced/xenobio + name = "Slime management console" + desc = "A computer used for remotely handling slimes." + networks = list("SS13") + off_action = new/datum/action/camera_off/xenobio + var/datum/action/slime_place/slime_place_action = new + var/datum/action/slime_pick_up/slime_up_action = new + var/datum/action/feed_slime/feed_slime_action = new + var/datum/action/monkey_recycle/monkey_recycle_action = new + + var/list/stored_slimes = list() + var/max_slimes = 5 + var/monkeys = 0 + + icon_screen = "slime_comp" + icon_keyboard = "rd_key" + +/obj/machinery/computer/camera_advanced/xenobio/CreateEye() + eyeobj = new /mob/camera/aiEye/remote/xenobio() + eyeobj.loc = get_turf(src) + eyeobj.origin = src + eyeobj.visible_icon = 1 + eyeobj.icon = 'icons/obj/abductor.dmi' + eyeobj.icon_state = "camera_target" + +/obj/machinery/computer/camera_advanced/xenobio/GrantActions(mob/living/carbon/user) + off_action.target = user + off_action.Grant(user) + + jump_action.target = user + jump_action.Grant(user) + + slime_up_action.target = src + slime_up_action.Grant(user) + + slime_place_action.target = src + slime_place_action.Grant(user) + + feed_slime_action.target = src + feed_slime_action.Grant(user) + + monkey_recycle_action.target = src + monkey_recycle_action.Grant(user) + + +/obj/machinery/computer/camera_advanced/xenobio/attack_hand(mob/user) + if(!ishuman(user)) //AIs using it might be weird + return + return ..() + +/datum/action/camera_off/xenobio/Activate() + if(!target || !ishuman(target)) + return + var/mob/living/carbon/C = target + var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control + var/obj/machinery/computer/camera_advanced/xenobio/origin = remote_eye.origin + C.remote_view = 0 + origin.current_user = null + origin.jump_action.Remove(C) + origin.slime_place_action.Remove(C) + origin.slime_up_action.Remove(C) + origin.feed_slime_action.Remove(C) + origin.monkey_recycle_action.Remove(C) + //All of this stuff below could probably be a proc for all advanced cameras, only the action removal needs to be camera specific + remote_eye.user = null + if(C.client) + C.client.perspective = MOB_PERSPECTIVE + C.client.eye = src + C.client.images -= remote_eye.user_image + for(var/datum/camerachunk/chunk in remote_eye.visibleCameraChunks) + C.client.images -= chunk.obscured + C.remote_control = null + C.unset_machine() + src.Remove(C) + + +/datum/action/slime_place + name = "Place Slimes" + action_type = AB_INNATE + button_icon_state = "slime_down" + +/datum/action/slime_place/Activate() + if(!target || !ishuman(owner)) + return + var/mob/living/carbon/human/C = owner + var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control + var/obj/machinery/computer/camera_advanced/xenobio/X = target + + if(cameranet.checkTurfVis(remote_eye.loc)) + for(var/mob/living/carbon/slime/S in X.stored_slimes) + S.loc = remote_eye.loc + S.visible_message("[S] warps in!") + X.stored_slimes -= S + +/datum/action/slime_pick_up + name = "Pick up Slime" + action_type = AB_INNATE + button_icon_state = "slime_up" + +/datum/action/slime_pick_up/Activate() + if(!target || !ishuman(owner)) + return + var/mob/living/carbon/human/C = owner + var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control + var/obj/machinery/computer/camera_advanced/xenobio/X = target + + if(cameranet.checkTurfVis(remote_eye.loc)) + for(var/mob/living/carbon/slime/S in remote_eye.loc) + if(X.stored_slimes.len >= X.max_slimes) + break + if(!S.ckey) + if(S.buckled) + S.buckled.unbuckle_mob() + S.Feedstop() + S.visible_message("[S] vanishes in a flash of light!") + S.loc = X + X.stored_slimes += S + + +/datum/action/feed_slime + name = "Feed Slimes" + action_type = AB_INNATE + button_icon_state = "monkey_down" + +/datum/action/feed_slime/Activate() + if(!target || !ishuman(owner)) + return + var/mob/living/carbon/human/C = owner + var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control + var/obj/machinery/computer/camera_advanced/xenobio/X = target + + if(cameranet.checkTurfVis(remote_eye.loc)) + if(X.monkeys >= 1) + var/mob/living/carbon/human/monkey/food = new /mob/living/carbon/human/monkey(remote_eye.loc) + food.LAssailant = C + X.monkeys -- + owner << "[X] now has [X.monkeys] monkeys left." + + +/datum/action/monkey_recycle + name = "Recycle Monkeys" + action_type = AB_INNATE + button_icon_state = "monkey_up" + +/datum/action/monkey_recycle/Activate() + if(!target || !ishuman(owner)) + return + var/mob/living/carbon/human/C = owner + var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control + var/obj/machinery/computer/camera_advanced/xenobio/X = target + + if(cameranet.checkTurfVis(remote_eye.loc)) + for(var/mob/living/carbon/human/M in remote_eye.loc) + if(issmall(M) && M.stat) + M.visible_message("[M] vanishes as they are reclaimed for recycling!") + X.monkeys += 0.2 + qdel(M) \ No newline at end of file diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index a126db30def..154792c7b12 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -438,6 +438,18 @@ max_amount = 60 turf_type = /turf/simulated/floor/sepia +/obj/item/areaeditor/blueprints/slime + name = "cerulean prints" + desc = "A one use set of blueprints made of jelly like organic material. Renaming an area to 'Xenobiology Lab' will extend the reach of the management console." + color = "#2956B2" + +/obj/item/areaeditor/blueprints/slime/edit_area() + var/success = ..() + var/area/A = get_area(src) + if(success) + for(var/turf/T in A) + T.color = "#2956B2" + qdel(src) /turf/simulated/floor/sepia slowdown = 2 diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi index 75bbde4e4a30eeae60f814b226b40789d5cc09e4..a284732587528f8707bce7dfab8d80ad97766ac5 100644 GIT binary patch literal 62362 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 literal 60442 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 O0000U( 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%0Ary4ZjDskiTNj# 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 z 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 + +

    +
    + Receiver: +
    +
    + {{if data.receiver_off}} + {{:helper.link("On", '', {"stopic":"chatroom", "toggler":1})}} + {{:helper.link("Off", '', {"stopic":"chatroom", "toggler":2}, 'selected')}} + {{else}} + {{:helper.link("On", '', {"stopic":"chatroom", "toggler":1}, 'selected')}} + {{:helper.link("Off", '', {"stopic":"chatroom", "toggler":2})}} + {{/if}} +
    +
    + +
    +
    + Ringer: +
    +
    + {{if data.ringer_off}} + {{:helper.link("On", '', {"stopic":"chatroom", "ringer":1})}} + {{:helper.link("Off", '', {"stopic":"chatroom", "ringer":2}, 'selected')}} + {{else}} + {{:helper.link("On", '', {"stopic":"chatroom", "ringer":1}, 'selected')}} + {{:helper.link("Off", '', {"stopic":"chatroom", "ringer":2})}} + {{/if}} +
    +
    + +{{for data.rooms}} +
    + {{:helper.link(value.name, '', {"stopic":"chatroom", "select":value.ref})}} + {{:helper.link("Quick Message", '', {"stopic":"chatroom", "target":value.ref})}} +
    +{{/for}} +
    +{{if data.disconnected}} +

    Connection Lost

    + {{:helper.link("Reconnect", 'refresh', {"stopic":"chatroom", "reconnect":1})}} +{{else data.current_room}} +

    #{{:data.current_room_name}}

    +
    + Topic:
    +
    {{:helper.link(data.current_room_topic, '', {"stopic":"chatroom", "topic":1})}}
    + +
    +
    Users:
    +
    + {{var firstUser = true;}} + {{for data.users}} + {{:firstUser ? "" : ", "}}{{:value}} + {{firstUser = false;}} + {{/for}} +
    +
    + {{var prevName = "";}} + {{for data.messages}} +
    +
    {{:value.username!=prevName ? value.username : " "}}
    +
    + {{:value.message}} +
    +
    + {{prevName = value.username;}} + {{/for}} + {{:helper.link("Send Message", '', {"stopic":"chatroom", "target":data.current_room})}} +{{/if}} + +{{if data.current_name}} + {{:helper.link("Clear Screen", '', {"stopic":"chatroom", "select":"*NONE*"})}} +{{/if}} From 653e6738b8666dd0f8ed3d931566dcc9b6f8f1f7 Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Tue, 29 Mar 2016 21:53:56 -0400 Subject: [PATCH 218/328] Removes pAI insertion from named secbots --- code/modules/mob/living/simple_animal/bot/secbot.dm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 59c89580de5..f60ad0ebb48 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -35,11 +35,12 @@ var/prev_flashing_lights = 0 /mob/living/simple_animal/bot/secbot/beepsky - name = "Officer Beep O'sky" - desc = "It's Officer Beep O'sky! Powered by a potato and a shot of whiskey." + name = "Officer Beepsky" + desc = "It's Officer Beepsky! Powered by a potato and a shot of whiskey." idcheck = 0 weaponscheck = 0 auto_patrol = 1 + allow_pai = 0 /mob/living/simple_animal/bot/secbot/beepsky/explode() var/turf/Tsec = get_turf(src) @@ -53,6 +54,7 @@ name = "Officer Pingsky" desc = "It's Officer Pingsky! Delegated to satellite guard duty for harbouring anti-human sentiment." radio_channel = "AI Private" + allow_pai = 0 /mob/living/simple_animal/bot/secbot/ofitser name = "Prison Ofitser" @@ -60,6 +62,7 @@ idcheck = 0 weaponscheck = 1 auto_patrol = 1 + allow_pai = 0 /mob/living/simple_animal/bot/secbot/buzzsky name = "Officer Buzzsky" From cdea07d1fadbda034d220e1732e8bcbbb710b8a1 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 29 Mar 2016 21:54:25 -0400 Subject: [PATCH 219/328] Automatic changelog generation for PR #4037 --- html/changelogs/AutoChangeLog-pr-4037.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4037.yml diff --git a/html/changelogs/AutoChangeLog-pr-4037.yml b/html/changelogs/AutoChangeLog-pr-4037.yml new file mode 100644 index 00000000000..fd9f87f147f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4037.yml @@ -0,0 +1,5 @@ +author: ProperPants +delete-after: True +changes: + - rscadd: "Operating tables can be deconstructed with a wrench." + - spellcheck: "Fixed and shortened description of metal sheets." From d4c3e010302a2d90d476269cc06420bd7a1e000b Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 29 Mar 2016 21:55:19 -0400 Subject: [PATCH 220/328] Automatic changelog generation for PR #4028 --- html/changelogs/AutoChangeLog-pr-4028.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4028.yml diff --git a/html/changelogs/AutoChangeLog-pr-4028.yml b/html/changelogs/AutoChangeLog-pr-4028.yml new file mode 100644 index 00000000000..9bfee62bd8c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4028.yml @@ -0,0 +1,5 @@ +author: Tastyfish +delete-after: True +changes: + - rscadd: "Status displays now display the time when in Shuttle ETA mode and no shuttle activity is happening." + - tweak: "Shuttle ETA countdowns on status displays are now amber." From 25fa8ea2c919035e40a3fa186c24ae363cc48a30 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Tue, 29 Mar 2016 19:15:17 -0700 Subject: [PATCH 221/328] viro consoles --- code/modules/mining/equipment_locker.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index a1a4ff10d0f..8c073b6fb67 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -20,7 +20,7 @@ var/sheet_per_ore = 1 var/point_upgrade = 1 var/list/ore_values = list(("sand" = 1), ("iron" = 1), ("plasma" = 15), ("silver" = 16), ("gold" = 18), ("uranium" = 30), ("diamond" = 50), ("bananium" = 60), ("tranquillite" = 60)) - var/list/supply_consoles = list("Science", "Robotics", "Research Director's Desk", "Mechanic", "Engineering" = list("metal", "glass", "plasma"), "Chief Engineer's Desk" = list("metal", "glass", "plasma"), "Atmospherics" = list("metal", "glass", "plasma"), "Bar" = list("uranium", "plasma")) + var/list/supply_consoles = list("Science", "Robotics", "Research Director's Desk", "Mechanic", "Engineering" = list("metal", "glass", "plasma"), "Chief Engineer's Desk" = list("metal", "glass", "plasma"), "Atmospherics" = list("metal", "glass", "plasma"), "Bar" = list("uranium", "plasma"), "Virology" = list("uranium", "gold")) /obj/machinery/mineral/ore_redemption/New() ..() From b91740b19b127fc3d3225d5a7c21106993ba4da6 Mon Sep 17 00:00:00 2001 From: FalseIncarnate Date: Wed, 30 Mar 2016 02:21:10 -0400 Subject: [PATCH 222/328] Logic Gates Adds CONVERT Gates, for converting a signaler signal to logic or vice-versa. Restructured/renamed some of the new logic files - Split up the logic_gates.dm file into three files - mono_input.dm - dual_input.dm - converter.dm Made the logic_gate machines auto-update their multitool menu when you click the links Made the logic gate circuit boards a product of the autolathe - Take that science. Quit hogging all the boards, nerds. Removed relative pathing from signaler.dm --- code/game/machinery/constructable_frame.dm | 12 +- code/modules/assembly/signaler.dm | 274 +++++++++--------- code/modules/logic/converter.dm | 143 +++++++++ .../logic/{logic_gate.dm => dual_input.dm} | 66 +---- code/modules/logic/logic_base.dm | 4 + code/modules/logic/mono_input.dm | 62 ++++ .../research/designs/autolathe_designs.dm | 8 + icons/obj/computer3.dmi | Bin 37029 -> 39447 bytes paradise.dme | 4 +- 9 files changed, 374 insertions(+), 199 deletions(-) create mode 100644 code/modules/logic/converter.dm rename code/modules/logic/{logic_gate.dm => dual_input.dm} (53%) create mode 100644 code/modules/logic/mono_input.dm diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 9e65a9fc2ac..ba0145fbcd9 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -884,7 +884,7 @@ obj/item/weapon/circuitboard/rdserver //Selectable mode board, like vending machine boards /obj/item/weapon/circuitboard/logic_gate name = "circuit board (Logic Connector)" - build_path = /obj/machinery/logic + build_path = /obj/machinery/logic_gate board_type = "machine" origin_tech = "programming=1" //This stuff is pretty much the absolute basis of programming, so it's mostly useless for research req_components = list(/obj/item/stack/cable_coil = 1) @@ -896,9 +896,17 @@ obj/item/weapon/circuitboard/rdserver "NAND Gate" = /obj/machinery/logic_gate/nand, "NOR Gate" = /obj/machinery/logic_gate/nor, "XOR Gate" = /obj/machinery/logic_gate/xor, - "XNOR Gate" = /obj/machinery/logic_gate/xnor + "XNOR Gate" = /obj/machinery/logic_gate/xnor, + "STATUS Gate" = /obj/machinery/logic_gate/status, + "CONVERT Gate" = /obj/machinery/logic_gate/convert ) +/obj/item/weapon/circuitboard/logic_gate/New() + ..() + if(build_path == /obj/machinery/logic_gate) //If we spawn the base type board (determined by the base type machine as the build path), become a random gate board + var/new_path = names_paths[pick(names_paths)] + set_type(new_path) + /obj/item/weapon/circuitboard/logic_gate/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weapon/screwdriver)) set_type(null, user) diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index fe33be50f48..2902e3b59c2 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -18,149 +18,151 @@ var/datum/radio_frequency/radio_connection var/airlock_wire = null - New() - ..() - if(!radio_controller) - spawn(40) - set_frequency(frequency) - else - spawn(1) // For things that set the frequency directly - set_frequency(frequency) +/obj/item/device/assembly/signaler/New() + ..() + if(!radio_controller) + spawn(40) + set_frequency(frequency) + else + spawn(1) // For things that set the frequency directly + set_frequency(frequency) + return + +/obj/item/device/assembly/signaler/Destroy() + if(radio_controller) + radio_controller.remove_object(src,frequency) + return ..() + +/obj/item/device/assembly/signaler/describe() + return "\The [src]'s power light is [receiving?"on":"off"]" + +/obj/item/device/assembly/signaler/activate() + if(cooldown > 0) return 0 + cooldown = 2 + spawn(10) + process_cooldown() + + signal() + return 1 + +/obj/item/device/assembly/signaler/update_icon() + if(holder) + holder.update_icon() + return + +/obj/item/device/assembly/signaler/interact(mob/user as mob, flag1) + var/t1 = "-------" +// if ((src.b_stat && !( flag1 ))) +// t1 = text("-------
    \nGreen Wire: []
    \nRed Wire: []
    \nBlue Wire: []
    \n", (src.wires & 4 ? text("Cut Wire", src) : text("Mend Wire", src)), (src.wires & 2 ? text("Cut Wire", src) : text("Mend Wire", src)), (src.wires & 1 ? text("Cut Wire", src) : text("Mend Wire", src))) +// else +// t1 = "-------" Speaker: [src.listening ? "Engaged" : "Disengaged"]
    + var/dat = {" + + "} + if(!flag1) + dat += {" + Send Signal
    + Reciever is [receiving?"on":"off"]
    + "} + dat += {" + Frequency/Code for signaler:
    + Frequency: + - + - + [format_frequency(src.frequency)] + + + +
    + + Code: + - + - + [src.code] + + + +
    + [t1] +
    + "} + user << browse(dat, "window=radio") + onclose(user, "radio") + return + + +/obj/item/device/assembly/signaler/Topic(href, href_list) + ..() + + if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr)) + usr << browse(null, "window=radio") + onclose(usr, "radio") return - Destroy() - if(radio_controller) - radio_controller.remove_object(src,frequency) - return ..() + if (href_list["freq"]) + var/new_frequency = (frequency + text2num(href_list["freq"])) + if(new_frequency < RADIO_LOW_FREQ || new_frequency > RADIO_HIGH_FREQ) + new_frequency = sanitize_frequency(new_frequency, RADIO_LOW_FREQ, RADIO_HIGH_FREQ) + set_frequency(new_frequency) - describe() - return "\The [src]'s power light is [receiving?"on":"off"]" - - activate() - if(cooldown > 0) return 0 - cooldown = 2 - spawn(10) - process_cooldown() + if(href_list["code"]) + src.code += text2num(href_list["code"]) + src.code = round(src.code) + src.code = min(100, src.code) + src.code = max(1, src.code) + if(href_list["receive"]) + receiving = !receiving + if(href_list["send"]) + spawn( 0 ) signal() - return 1 - update_icon() - if(holder) - holder.update_icon() - return - - interact(mob/user as mob, flag1) - var/t1 = "-------" -// if ((src.b_stat && !( flag1 ))) -// t1 = text("-------
    \nGreen Wire: []
    \nRed Wire: []
    \nBlue Wire: []
    \n", (src.wires & 4 ? text("Cut Wire", src) : text("Mend Wire", src)), (src.wires & 2 ? text("Cut Wire", src) : text("Mend Wire", src)), (src.wires & 1 ? text("Cut Wire", src) : text("Mend Wire", src))) -// else -// t1 = "-------" Speaker: [src.listening ? "Engaged" : "Disengaged"]
    - var/dat = {" - - - Send Signal
    - Reciever is [receiving?"on":"off"]
    - Frequency/Code for signaler:
    - Frequency: - - - - - [format_frequency(src.frequency)] - + - +
    - - Code: - - - - - [src.code] - + - +
    - [t1] -
    "} - user << browse(dat, "window=radio") - onclose(user, "radio") - return - - - Topic(href, href_list) - ..() - - if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr)) - usr << browse(null, "window=radio") - onclose(usr, "radio") - return - - if (href_list["freq"]) - var/new_frequency = (frequency + text2num(href_list["freq"])) - if(new_frequency < RADIO_LOW_FREQ || new_frequency > RADIO_HIGH_FREQ) - new_frequency = sanitize_frequency(new_frequency, RADIO_LOW_FREQ, RADIO_HIGH_FREQ) - set_frequency(new_frequency) - - if(href_list["code"]) - src.code += text2num(href_list["code"]) - src.code = round(src.code) - src.code = min(100, src.code) - src.code = max(1, src.code) - if(href_list["receive"]) - receiving = !receiving - - if(href_list["send"]) - spawn( 0 ) - signal() - - if(usr) - attack_self(usr) - - return - - - proc/signal() - if(!radio_connection) return - - var/datum/signal/signal = new - signal.source = src - signal.encryption = code - signal.data["message"] = "ACTIVATE" - radio_connection.post_signal(src, signal) - - var/time = time2text(world.realtime,"hh:mm:ss") - var/turf/T = get_turf(src) - if(usr) - lastsignalers.Add("[time] : [usr.key] used [src] @ location ([T.x],[T.y],[T.z]) : [format_frequency(frequency)]/[code]") - - return - - - pulse(var/radio = 0) - if(src.connected && src.wires) - connected.Pulse(src) - else - return ..(radio) - - - receive_signal(datum/signal/signal) - if( !receiving || !signal ) - return 0 - - if(signal.encryption != code) - return 0 - if(!(src.wires & WIRE_RADIO_RECEIVE)) return 0 - - pulse(1) - for(var/mob/O in hearers(1, src.loc)) - O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2) - return - - - proc/set_frequency(new_frequency) - if(!radio_controller) - sleep(20) - if(!radio_controller) - return - radio_controller.remove_object(src, frequency) - frequency = new_frequency - radio_connection = radio_controller.add_object(src, frequency, RADIO_CHAT) + if(usr) + attack_self(usr) + + return + +/obj/item/device/assembly/signaler/proc/signal() + if(!radio_connection) return + + var/datum/signal/signal = new + signal.source = src + signal.encryption = code + signal.data["message"] = "ACTIVATE" + radio_connection.post_signal(src, signal) + + var/time = time2text(world.realtime,"hh:mm:ss") + var/turf/T = get_turf(src) + if(usr) + lastsignalers.Add("[time] : [usr.key] used [src] @ location ([T.x],[T.y],[T.z]) : [format_frequency(frequency)]/[code]") + + return + +/obj/item/device/assembly/signaler/pulse(var/radio = 0) + if(src.connected && src.wires) + connected.Pulse(src) + else + return ..(radio) + +/obj/item/device/assembly/signaler/receive_signal(datum/signal/signal) + if( !receiving || !signal ) + return 0 + + if(signal.encryption != code) + return 0 + + if(!(src.wires & WIRE_RADIO_RECEIVE)) return 0 + pulse(1) + + for(var/mob/O in hearers(1, src.loc)) + O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2) + return + +/obj/item/device/assembly/signaler/proc/set_frequency(new_frequency) + if(!radio_controller) + sleep(20) + if(!radio_controller) return + radio_controller.remove_object(src, frequency) + frequency = new_frequency + radio_connection = radio_controller.add_object(src, frequency, RADIO_CHAT) + return // Embedded signaller used in anomalies. /obj/item/device/assembly/signaler/anomaly diff --git a/code/modules/logic/converter.dm b/code/modules/logic/converter.dm new file mode 100644 index 00000000000..3c9266b6c88 --- /dev/null +++ b/code/modules/logic/converter.dm @@ -0,0 +1,143 @@ + +////////////////////////////////// +// Converter Gate // +////////////////////////////////// + +/* + This gate is special enough to warrant its own file, as it overrides a lot of the logic_gate procs as well as adds a new one. + - CONVERT Gates convert signaler and logic signals, to allow logic gates to actually be used in tandem with assemblies and station equipment like doors. + - While technically a mono-input device, the input and output are actually completely different types of signals, and thus incompatible without this gate. + - A signaler must be attached manually before the gate is fully functional, and will retain any frequency and code settings it had when attached. + - You can adjust these settings through a link in the multitool menu, but the receiving mode is automatically controlled by the converter. + - While attached, the ability to manually send the signal on the signaler through its menu is also disabled, to avoid messing up the logic system. +*/ + +//CONVERT Gate +/obj/machinery/logic_gate/convert + name = "CONVERT Gate" + desc = "Converts signals between radio and logic types, allowing for signaller input/output from logic systems." + icon_state = "logic_convert" + mono_input = 1 + + var/logic_output = 0 //When set to 1, the logic signal is the output. When set to 0, the logic signal is the input. + var/obj/item/device/assembly/signaler/attached_signaler = null + +/obj/machinery/logic_gate/convert/handle_logic() + output_state = input1_state + return + +/obj/machinery/logic_gate/convert/attackby(obj/item/O, mob/user, params) + if(tamperproof) //Extra precaution to avoid people attaching/removing signalers from tamperproofed converters + return + if(istype(O, /obj/item/device/assembly/signaler)) + var/obj/item/device/assembly/signaler/S = O + if(S.secured) + user << "The [S] is already secured." + return + if(attached_signaler) + user << "There is already a device attached, remove it first." + return + user.unEquip(S) + S.forceMove(src) + S.holder = src + S.toggle_secure() + if(logic_output) //Make sure we are set to receive if the converter is set to output logic, and send if the converter is set to accept logic input + S.receiving = 1 + else + S.receiving = 0 + attached_signaler = S + user << "You attach \the [S] to the I/O connection port and secure it." + return + if(attached_signaler && istype(O, /obj/item/weapon/screwdriver)) //Makes sure we remove the attached signaler before we can open up and deconstruct the machine + var/obj/item/device/assembly/signaler/S = attached_signaler + attached_signaler = null + S.forceMove(get_turf(src)) + S.holder = null + S.toggle_secure() + user << "You unsecure and detach \the [S] from the I/O connection port." + return + ..() + +/obj/machinery/logic_gate/convert/multitool_menu(var/mob/user, var/obj/item/device/multitool/P) + var/logic_state_string + var/menu_contents = {" +
    + "} + if(logic_output) + switch(output_state) + if(LOGIC_OFF) + logic_state_string = "OFF" + if(LOGIC_ON) + logic_state_string = "ON" + if(LOGIC_FLICKER) + logic_state_string = "FLICKER" + else + logic_state_string = "ERROR: UNKNOWN STATE" + menu_contents += {" +
    Output: [format_tag("ID Tag","output_id_tag")]
    +
    Output State: [logic_state_string]
    + "} + else + switch(input1_state) + if(LOGIC_OFF) + logic_state_string = "OFF" + if(LOGIC_ON) + logic_state_string = "ON" + if(LOGIC_FLICKER) + logic_state_string = "FLICKER" + else + logic_state_string = "ERROR: UNKNOWN STATE" + menu_contents += {" +
    Input: [format_tag("ID Tag","input1_id_tag")]
    +
    Input State: [logic_state_string]
    + "} + menu_contents += {" +
    Logic Signal Designation: [logic_output ? "Output" : "Input"]
    + "} + if(attached_signaler) + menu_contents += "
    Adjust Signaler Settings
    " + else + menu_contents += "
    NO SIGNALER ATTACHED!
    " + menu_contents += {" +
    + "} + return menu_contents + +/obj/machinery/logic_gate/convert/multitool_topic(var/mob/user,var/list/href_list,var/obj/O) + ..() + if("toggle_logic" in href_list) + logic_output = !logic_output + if(attached_signaler) //If we have a signaler attached, make sure we update it to send/receive when we change the logic signal desgination + if(logic_output) + attached_signaler.receiving = 1 + else + attached_signaler.receiving = 0 + if("adjust_signaler" in href_list && attached_signaler) //Make sure that we have a signaler attached to handle this one, otherwise ignore this command + attached_signaler.interact(user, 1) + update_multitool_menu(user) + +/obj/machinery/logic_gate/convert/receive_signal(datum/signal/signal, receive_method, receive_param) + if(logic_output) + if(attached_signaler) + attached_signaler.receive_signal(signal) + return + else + ..() + +/obj/machinery/logic_gate/convert/handle_output() + if(logic_output) + ..() + else + if(attached_signaler && (output_state == LOGIC_ON || output_state == LOGIC_FLICKER)) + attached_signaler.signal() + return + +/obj/machinery/logic_gate/convert/proc/process_activation(var/obj/item/device/D) + if(!logic_output) //Don't bother if our input is a logic signal + return + if(D == attached_signaler) //Ignore if we somehow got called by a device that isn't what we have attached + input1_state = LOGIC_FLICKER + spawn(LOGIC_FLICKER_TIME) + if(input1_state == LOGIC_FLICKER) + input1_state = LOGIC_OFF + return diff --git a/code/modules/logic/logic_gate.dm b/code/modules/logic/dual_input.dm similarity index 53% rename from code/modules/logic/logic_gate.dm rename to code/modules/logic/dual_input.dm index 5a4c8e2c221..03bfa4f1688 100644 --- a/code/modules/logic/logic_gate.dm +++ b/code/modules/logic/dual_input.dm @@ -1,64 +1,4 @@ -////////////////////////////////// -// Mono-Input Gates // -////////////////////////////////// - -//NOT Gate -/obj/machinery/logic_gate/not - name = "NOT Gate" - desc = "Accepts one input and outputs the reverse state." - mono_input = 1 //NOT Gates are the simplest logic gate because they only utilize one input. - output_state = LOGIC_ON //Starts with an active output, since the input will be OFF at start -/* - A quick note regarding NOT Gates: - - Connecting multiple things to the input of a NOT Gate can cause weird behaviour due to updating both when it receives a signal and when it calls process(). - - This means it will attempt to output once for every logic machine connected to its input's own process() call. - - It will then attempt to output an additional time based on the current state when it comes to its own process() call. - - For this reason, it is HIGHLY RECOMMENDED that you only connect a single signal source to the input of a NOT Gate to avoid signal spasms. - - Connecting multiple things to the output of a NOT Gate should not cause this unusual behavior. -*/ -/obj/machinery/logic_gate/not/handle_logic() //Our output will always be a continuous signal, even with a FLICKER, it just will update the output when the FLICKER ends - if(input1_state == LOGIC_ON) //Output is OFF while input is ON - output_state = LOGIC_OFF - else if(input1_state == LOGIC_FLICKER) //Output is OFF while input is FLICKER, then output returns to ON when input returns to OFF - output_state = LOGIC_OFF - spawn(LOGIC_FLICKER_TIME + 1) //Call handle_logic again after this delay (the input should update from the spawn(LOGIC_FLICKER_TIME) in receive_signal() by then) - handle_logic() - else //Output is ON while input is OFF - output_state = LOGIC_ON - handle_output() - return - -//STATUS Gate -/obj/machinery/logic_gate/status - name = "Status Gate" - desc = "Accepts one input and outputs the same state, showing a colored light based on current state." - mono_input = 1 //STATUS Gate doesn't actually perform logic operations, but instead acts as a testing conduit. - -/* - STATUS Gates are largely a diagnostics tool, but I'm sure someone will still make a logic gate rave with them anyways. - - There is no need to actually connect an output for these to work, they just need an input to sample from. - - STATUS Gates attempt to update their lights whenever they receive a signal. -*/ - -/obj/machinery/logic_gate/status/receive_signal(datum/signal/signal, receive_method, receive_params) - ..() - handle_logic() //STATUS Gate calls handle_logic() when it receives a signal to update its light and output_state - -/obj/machinery/logic_gate/status/handle_logic() - output_state = input1_state //Output is equal to input, since it is simply a connection with an attached light - if(output_state == LOGIC_OFF) //Red light when OFF - set_light(2,2,"#ff0000") - return - if(output_state == LOGIC_ON) //Green light when ON - set_light(2,2,"#009933") - return - if(output_state == LOGIC_FLICKER) //Orange light when FLICKER, then update after LOGIC_FLICKER_TIME + 1 to reflect the changed state - set_light(2,2,"#ff9900") - spawn(LOGIC_FLICKER_TIME + 1) - handle_logic() - return - ////////////////////////////////// // Dual-Input Gates // ////////////////////////////////// @@ -68,6 +8,7 @@ /obj/machinery/logic_gate/or name = "OR Gate" desc = "Outputs ON when at least one input is ON." + icon_state = "logic_or" /obj/machinery/logic_gate/or/handle_logic() if(input1_state == LOGIC_ON || input1_state == LOGIC_FLICKER || input2_state == LOGIC_ON || input2_state == LOGIC_FLICKER) @@ -83,6 +24,7 @@ /obj/machinery/logic_gate/and name = "AND Gate" desc = "Outputs ON only when both inputs are ON." + icon_state = "logic_and" /obj/machinery/logic_gate/and/handle_logic() if((input1_state == LOGIC_ON || input1_state == LOGIC_FLICKER) && (input2_state == LOGIC_ON || input2_state == LOGIC_FLICKER)) @@ -99,6 +41,7 @@ name = "NAND Gate" desc = "Outputs OFF only when both inputs are ON." output_state = LOGIC_ON + icon_state = "logic_nand" /obj/machinery/logic_gate/nand/handle_logic() if((input1_state == LOGIC_ON || input1_state == LOGIC_FLICKER) && (input2_state == LOGIC_ON || input2_state == LOGIC_FLICKER)) @@ -111,6 +54,7 @@ /obj/machinery/logic_gate/nor name = "NOR Gate" desc = "Outputs OFF when at least one input is ON." + icon_state = "logic_nor" output_state = LOGIC_ON /obj/machinery/logic_gate/nor/handle_logic() @@ -124,6 +68,7 @@ /obj/machinery/logic_gate/xor name = "XOR Gate" desc = "Outputs ON when only one input is ON." + icon_state = "logic_xor" /obj/machinery/logic_gate/xor/handle_logic() if((input1_state == LOGIC_ON || input1_state == LOGIC_FLICKER) || input2_state == LOGIC_OFF) //Only input1 is ON/FLICKER, so output matches input1 @@ -138,6 +83,7 @@ /obj/machinery/logic_gate/xnor name = "XNOR Gate" desc = "Outputs ON when both inputs are ON or OFF." + icon_state = "logic_xnor" output_state = LOGIC_ON /obj/machinery/logic_gate/xnor/handle_logic() diff --git a/code/modules/logic/logic_base.dm b/code/modules/logic/logic_base.dm index 129a243c37b..b126b1af214 100644 --- a/code/modules/logic/logic_base.dm +++ b/code/modules/logic/logic_base.dm @@ -193,6 +193,10 @@ "} return menu_contents +/obj/machinery/logic_gate/convert/multitool_topic(var/mob/user,var/list/href_list,var/obj/O) + ..() + update_multitool_menu(user) + /obj/machinery/logic_gate/attackby(obj/item/O, mob/user, params) if(tamperproof) user << "The [src] appears to be tamperproofed! You can't interact with it!" diff --git a/code/modules/logic/mono_input.dm b/code/modules/logic/mono_input.dm new file mode 100644 index 00000000000..58b76232fa0 --- /dev/null +++ b/code/modules/logic/mono_input.dm @@ -0,0 +1,62 @@ + +////////////////////////////////// +// Mono-Input Gates // +////////////////////////////////// + +//NOT Gate +/obj/machinery/logic_gate/not + name = "NOT Gate" + desc = "Accepts one input and outputs the reverse state." + icon_state = "logic_not" + mono_input = 1 //NOT Gates are the simplest logic gate because they only utilize one input. + output_state = LOGIC_ON //Starts with an active output, since the input will be OFF at start +/* + A quick note regarding NOT Gates: + - Connecting multiple things to the input of a NOT Gate can cause weird behaviour due to updating both when it receives a signal and when it calls process(). + - This means it will attempt to output once for every logic machine connected to its input's own process() call. + - It will then attempt to output an additional time based on the current state when it comes to its own process() call. + - For this reason, it is HIGHLY RECOMMENDED that you only connect a single signal source to the input of a NOT Gate to avoid signal spasms. + - Connecting multiple things to the output of a NOT Gate should not cause this unusual behavior. +*/ +/obj/machinery/logic_gate/not/handle_logic() //Our output will always be a continuous signal, even with a FLICKER, it just will update the output when the FLICKER ends + if(input1_state == LOGIC_ON) //Output is OFF while input is ON + output_state = LOGIC_OFF + else if(input1_state == LOGIC_FLICKER) //Output is OFF while input is FLICKER, then output returns to ON when input returns to OFF + output_state = LOGIC_OFF + spawn(LOGIC_FLICKER_TIME + 1) //Call handle_logic again after this delay (the input should update from the spawn(LOGIC_FLICKER_TIME) in receive_signal() by then) + handle_logic() + else //Output is ON while input is OFF + output_state = LOGIC_ON + handle_output() + return + +//STATUS Gate +/obj/machinery/logic_gate/status + name = "Status Gate" + desc = "Accepts one input and outputs the same state, showing a colored light based on current state." + icon_state = "logic_status" + mono_input = 1 //STATUS Gate doesn't actually perform logic operations, but instead acts as a testing conduit. + +/* + STATUS Gates are largely a diagnostics tool, but I'm sure someone will still make a logic gate rave with them anyways. + - There is no need to actually connect an output for these to work, they just need an input to sample from. + - STATUS Gates attempt to update their lights whenever they receive a signal. +*/ + +/obj/machinery/logic_gate/status/receive_signal(datum/signal/signal, receive_method, receive_params) + ..() + handle_logic() //STATUS Gate calls handle_logic() when it receives a signal to update its light and output_state + +/obj/machinery/logic_gate/status/handle_logic() + output_state = input1_state //Output is equal to input, since it is simply a connection with an attached light + if(output_state == LOGIC_OFF) //Red light when OFF + set_light(2,2,"#ff0000") + return + if(output_state == LOGIC_ON) //Green light when ON + set_light(2,2,"#009933") + return + if(output_state == LOGIC_FLICKER) //Orange light when FLICKER, then update after LOGIC_FLICKER_TIME + 1 to reflect the changed state + set_light(2,2,"#ff9900") + spawn(LOGIC_FLICKER_TIME + 1) + handle_logic() + return diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index aa9437d13e5..53f641a35e1 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -614,4 +614,12 @@ build_type = AUTOLATHE materials = list(MAT_METAL = 150, MAT_GLASS = 125) build_path = /obj/item/weapon/hand_labeler + category = list("initial", "Electronics") + +/datum/design/logic_board + name = "Logic Circuit" + id = "logic_board" + build_type = AUTOLATHE + materials = list(MAT_METAL = 50, MAT_GLASS = 50) + build_path = /obj/item/weapon/circuitboard/logic_gate category = list("initial", "Electronics") \ No newline at end of file diff --git a/icons/obj/computer3.dmi b/icons/obj/computer3.dmi index 7c87ec36102e2bbd7714d176a8cff49ac93531c7..30705076d62a5e2b2785b07a16ff1d103d3cc5f4 100644 GIT binary patch literal 39447 zcmce;XFyY1w>Ap$V%#cbyA@FoP(eXaqJjcaf&~;%P?TPxTWL}vT>>O1Dq9c{5Re+A z_b4q=qaxA?MF=E>AT6|jB#;nN)?Mh{@A=Mm&yV}#p7%#s$yzIO&CJoB@r*Hfe%H>1YcoWHiKs_zG`QQh=>`WZdv#B6<^e(N6pbNC?5*H&;HK;1lf0hnqyV2 z=WJUoN-4f~LxtXdEk!9xLrEfy7L#d{+j~*h>%H-wGp^iNuRi<9LsAoev@hnC_J^Hu z^s}^=O=u_#d@y{!CMAXk-JT~QKk?ApyL!+3P72=C{aJq5fb#R_&qH<}a@-`Ls&kw^ zaOT60S86qXp8d=Gb!@CyO~R*4Y*k0nA;e3YKU6!SW~2A29%iUz9drBG)(P2n>x?N) zg6TA~aQxzjDDlNhs_U@WEz)Z8C#5R}hE9e&zio>&%>5&pFbH5 zqxMEtUNSFBYIyQ{uCjsN!*(;`3Vvz^e-pbo;Ks@h(@VyxZIbyJQ68R$-;!y0SqCZ? zg^engklG|muM?-GN?e|%Sm#iP2SWpf_g&oY(fjJt+4fDlQsK_s``^=p?M0+=$~Su) z$jjX?J4S%V1|r%LPt9;Fv#nZ!m=dzqX0jKw0u^I34fIK-8N_Q>!X%9+20GuFi?6|1JZ z3cng!*v)O#5}^&}Ot~{}Ftg720phP?i7tJReYITa2hUV0FK6z7nU(eDlUi1mr?j}@ zy;R3+8M-Vo(WUdZ9;Pi&gVXl=r!N74T~`kr{H;c0+o#Nte<>EYq?f4lCVZcM zZgfRm)G0~lqnK7(t!SXb?>DYL-W;u(wtDc=HPgv0knYcqF8vWV{K5Y82RVI>3b^%l zm4bhHs~_0wb6E8BO#-}@aE4Y^Hdj_uWLCJ~X!vn`mNeQHFV3FAIILBO~buE$CyUWp4>95FIe z77@|kwrxT5Of&t-Z@bKY3u07}Rv1VOMdgC1h)7TE1=t1S;ov!Uao13(G&%ry*#9mJ;%NH`bPCsZ**lhM-Cu3n@ z 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

    F3%xw0@wfqX!HPJUtjTqZ_ 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 Yme_@ryNeybu{Y3JH0D(CiHp(y0Yz2-3;+NC literal 37029 zcmd42c{r5q`#(NJBGD$5W%8sH6)jT4Xis7)%VeEY60$E7!`xKzL{WswGCV@ok!|dw zgk;S&GR7pkF*CMV%yQ3n)brks@B4RrKF9I<$h169pS*m5iJC_SOrgD+?zEpG{{p$ep=AF?KQP zkNsbXrC51_D)ug$0L{@JzLC*C*K$8V39fPRWwo+nV)Tsq)E{jQOSe?~lvQyzxSLI^ z^&K3|G;(#e?Vajv9VvdO*R`g5-^-yz{~Na?OYKYW!QA8Z3(dO{uAa1*X`ivghva_< z`C}*=;rW+Utqg8#O?z}t-G)ZR!k!KLNV1wF#P!W(R#|kUpvQw-G4f{o?})kAOrO{_v3xm*IMn>alT&IJ)<>Rw&SitMZwjJo+B;( zw>Z~~D_F9Rx2o(7Z& z8{#?79xZ-<+dyZ^C!k<(zoF&MJXnfp5Ko$@GG zjC}E&fs&j0VUFATiM4dr)@eCSjI%^wIrHP52d&b}4|Y=ggNLnm2l)Q2gd3(${*oHW~s6gP5E|bQb>(M1*K=4KKQ6!@X>(J#B@qjC=DwG4g@#CMwe0*Z zL1(*XQC*#bNPQvcKKJe_tX^z{h^_wIwC2ZbfBuqBTZ|ERS~*{N^`6|CAEjMJ$*><` zYsUL2X=+kno1p@^&<=kgF88X*Itfvo_oa~cpRlu?Z*@%t$Z`D7o()|H0@v!hJFaeB zxTqY$+y+t5Bm2jbRrLMu9f<2l)*~%hs%=~?n$>|c?*Nx;Eq^^JOkXa{Z1e4dDdimDx17dE?@_EaP79$Q}ZROKu*nKGkz$Cki= zEXzQ7dJYF-1y?SQv9kZ@tCRxnv+QVu%=6Scmx6{1bxFY-T1K@UK=-I3#Uj8Gh3zyM+kYut&4T)n)K z$S8`#NYGSjUn9{A;MtML!^6sUoXbN{7tZCs1U@UGecY7^dF{`!tGNG0cE=I*#QBVU z_O`XH_;CG@dno16qZ@!1EQ81_GI)aDVqa4Ci7@+Q+o4T*>+S;;FcOy5#p=?5%+BlG zAJlPmb$tl~7h-*-i7C4^3E{Bdi*PEj^KUZ>C6SgR9Bk-e@F`Usw{!$mh|Its@;}2LRfQ5O! z*c#Pr2+1>D=)`@w*4S5s+5@F+~Y0gmz;N47u;~75M43i=3D+=P#0cK zjUc&STHiHKGVGlIGr9(-z!-^bt5@cIz^cSksP|vC(6`p`CWmgH3qTBG61ftuIY-{F zF|$U3oh;!cPa3^ty#Fl19kw?Rg)5Ey0R1#O*!pW(PJ$X+A*J>Ep}=k4io`T<)4Wu? z;qL{zFKiwJL-s2fH^284s_q7~YtpVF@w=VL3K3}I8z!M4JUbz7kd;?+OY+ygPjTQ7 ziRq=mh#7S7ly3mJ}s`|MJpV)t>##Q@KLfM7!6{fSa z-}@t4F<@t{JN#6%<^46^OA8>vEhVPw*vHPZ} ztCH%%8}qXK4G0p(BK`R%Qs}taVg`WE~jMDb_wir5+KIE?pp2hj0TMNSap2YW0)NwEwFul)On4n z9ijd%LFV-7oQ|(JA}|07viPIjgiA*K0_~@)F@`P!FyPa8EYieiF(AB7@U!o~YQr(m z?J`Xro8_uD1RcQ#b6&W5p5A@@t{@<>tfC?~29`rjF``kbXYbD3@Qygx=x)2^+5?DvZPAuqMYT(Ux@X#^n z$-f9+zAecRw90~KStav>?&3G6RhqAbUk^XGA$sQ(OU~@vT*1yy+!EoJHK?Q{+sM|g zE(2@K{3ki|V3+nv%9Sd?rtf|)6gF;QMQ*s}BT*l`kpHNqO`}tb#a1@%JAJn;@n9fg zyt`-FvoTY7xqY5!eIP9GhCp8;dlLWYQ4!(y^#o!R*D+00(>X{`Jk6gP@a~E3h3;8q zX0eDrQR~xPxmFM>p>q`o=n4^80WT|H)G^%AAGyX;&FIcx$Hf8O0T-3s0c zS$+%Q5D8!hy`B-udtg4c?UwBVsQj5>FqO3A+w*vf^GI8etLM%e@4wa$ z!<*r!zNsdaQ3@J@tOoO}rhgVd?oOcok~?ztiR_0OOryI%;u#c%;d4rt(2}s{J3x9J z+p(r*Cg{%O@Qf(F}yZwMbYJ6OS*i{yp z3QQab>XiWmfu5$r4B2a*;hIlhSjl4o8n*j|PJBEIy<H~F zJZ_G7I#Quqc4sy0DX-_DS3DQ_m zniAkV`$v^zaT$No8J^6%FDw(-K!Jei{6HMmW~EoHxXTI>@M9@oyqf$dac^h`VTP9K zJFj|jhCUnTY^quwnHutSyX!3R04cD}VG|@?G>ShLcR~@)hunehVlyv4WIcMmGUWH5 zU11}CW`&#^NS|=Ja&HKSC?fu6s?h^^Wn)J z8lG@g8=sv6b1w0AYj2bK5E8s$#dYhd$Sk;w#qQq4nw3fCJ{)cMm{Ztz)cf29HBKp0 zPv1mYXMU_D777S>b@h1dX-;~d17sL%q9x(^1$*YOb$Z>kYxrAth`?<&=}4dUUG>v1 zu(#TVaP|8gLvM#{mRQ*qEb3vb1^XN+uq06}vLD36a*ldu1rb9beIg7V<30lKdLo&T zf>GaJ6)Adr&(jC@bNkNjTD1nokX7##^4l@|?LF??4^j1N4df{Wu3Gy$BG_H*N6YPh zZXa;gG{$PRdUuO>I^E{Ot%$Pn@>Vk!e(nK@RqxXnx*<#>#rvUy*lMM)wbEhL;_F0L zkPVxE`OaaGU%x^PA@v}a+GM0EF7m`6_x^-bIyJ5xSS>TolxV0)6Dqr}5&cMi`M0}z z2{KMJ65W98JOC+Kjj|!X?b+|KhZ(6rkk}&=b|zm~sW4&9>FmbXU#hC~4Y$39^P+9c z9}nmE7BtWUZfl$UC7|sd!nGig;H0Jjf%++sMb#*DaJa@#$_wJvN&ngm7X_WEy z1RNYVwI-tB7N_#iQ^>6jlAgpUoX7}}9!$GO!BY+ae#;EXl56wfqS@rUd6Zk)>G*@I z`#sh|xe8wAC>_2cSM6CzJ*EwyLpi0w>J3DR4dKT<#HI}3cj%Tca|f2IT$|@}BYd*J zm=|qIpS-##u@ZtJ8mj0~1@}H-$}sG7;JiGgmM~T6a)=wPY=~>3BMk%4-;*`gt@aX2 zSSy4n3Svt^bTTrv4{5|9oCBvMRvKO1orf!ZNf1m3Vww9i9n=5RFs$ht#!ton-5{ovY(&a9IW1Qdcu$W7_V~rM zO{inLlB$z2!RK6Ca1pyeb_z4(ja`7yhd7$M(!rvj8Fh;*T|m7P3ERX1-V3jwQ}x_< zIb>l*l#`zZU#(vN&m1bcR4PDLPBlb1!C+(kPh1H@!jxD1SiJ{4^a=}gdpxpp^T{uV zyJa7A7Aqd+GapADpLso`=CPzK?dAyo%S1CwlBuE4@CP1t4q{p$5KFCxi=kRp0YAc}#02!IR3@d zomm2l>??Yeq*j(KXpWKUTDwGpwQhLGi7yCSyP#nscAF>VMW}+l`wr$Q6z>!j6M^dr zFLq%RKsn4Zv&6~OQ&>PkR>=A-eXur0pXIIZC#(dnOMw9xA0GQTODc4*v2b>(VBH1z zzrd^-^))v(0)HjlMBnC-2Tt2PhHM}I9Dhghz@LO6=@T1(a!BG`UI)|r))j@YViJrl zb8{mQr_eo8ETn$LD*248vGx#}=813p?DYgTC4HihjZCCrCw(!Mhnm>H0F4-eU&1Hw z0BtY8ivDJwZ}Tlm9?~ocD7^FSE)A*DH2-4`uK%Ax(HXFjwg2YQmaDpboken$clGG- z^#1P7Ei~shHu@Y9_$RTFscQKws>h3L;b*){VnvN(;)NlQwFc^rPRSwf$z=eYU+spd z6c3x91z`hzJe(c+@l>U#%Gqps>Qh)NtHy|&&n0@yr!{}?AN#`!8}+d%bJ$>O&|P@S-*5iqxzvUYHru3&2lMM?b|+;~-GksZPlR4Aa$LZGYhL&rKjEtlEs zH}bxfr}|#rfUKW}9|$||3VeYi-r%{{Np&;O(PseMwM+kmr6jABlJv%DORAUF<5*Xf zm={E~Zv^h1cd$i7t@<}mE~$ZZjX=YRBKI6OM?Gww@5Tie@5@VaM>hNoO!qKMQi1xi;z*!b+}U&iCVP!IoMRelpEe}n&j#vuR3R{Tekf2T42M)~?3kd`7PwCm;) z)+QQJ>W!QTrCA~~@lF*ItwEs1y|7tg8A|_bp?tw~RQil9`cx-rBh%I&HT*Sk1_{G3 zZ4g24seeIllas~zM$`916}6-jk11&cs5F=7&$CLN)v-&o7w z<&Ufx`~{t~lZxh4Z;6+=<=XyN3A3EF#S(%5A_gDOz0FB%QbA}gm2&*{4LfH}iUI!m zkq+C#Zk)0p6^_W-%}NL(jSKF4J6wKtX!4}FXS4LdT*$UQtR*CR7_1b(ac~v zF6#MDSSw^(mB7d0p&SY0^L_1-`r_G*ozk&NE@B&w9^mVB@(#&r)4 zlbT2=6s%NKWjSAJ7metJ6~t10N14r3QOwV(j_+81$og5hX4rW*z+S9ifMt-Rc4qCj z(=9lvg0I^KBjz;X1lfdxnj2JGBPG{9*AVv0&hsh=!ID>{6qlYnnCe)NUR#_Fz7xM; zMvGMoJMRfxksp=VfXtfkwygb1e-u5xwIGeqo0Lt-uk&pDxty;DBuc6Mw%K?=|C)5U zL;A)ic=2)~Rema2{GJv|-9K$R1nu2(@2G!OK)zM&S4VtPsj?$3ei0!uB{xzqOC2~a z^K`~0m{>1(pX9~uwbkzDyB4g60X=OS`>=hibz|^b4(AqHst*0d9kW#|=QJL8go4cJ z==XC;GNZR`BU?<0cK>YEdyI^$Y|2Yy8IXp*p-Ir!$N4^h_?5A9TRvm^HEs?ep|q}B zHuF+T8s(?zzCou-jztmvfaGEGuET5+Bu-=2u3yy%txw?ntHVD;E+q`CXLuD&oJ-is zSJ z@?ogT%&Ml{Xq zGyG;5jKpfGLK0`;?mPH=69!adMvJ0#K=pz1H-KU4A5pMQ=l4y}7H+y=ri|bw*^Ps> zSMHOpv<3>LQ&>6Z9y6Z0DGz;-w;+EdR5)!0swYYU{(y4ZSzfOz!5t#YE8XMs=pU;P z3p@EhX1i!I=^uZC>Hlu={{u4rhbI3M{B|p?`SA-jqZ0oOHh+oH9e#)7qKZM_pg^Q` zTgi+N+VLXWM-Pi6eyPo`t!!N})C!wyPdQq2{LrD_#%gulHOAPoVRuUk_5@v!{CmSi zq0SM|SfSxqy!O9#=8oW$q^xNA-8X;FVqKVIpYG(lwv_&ce@Tijq)%_>-SW-%z?a#Cge0BB1h?;}yXR3w;+ja?ItV|pl~{b%hi2F2tXF|O6C6?_xzx&g90)$ps* z>5ik*=D)S3bjhGGmPp+-nv?j;bhrWsY3A-c-a)vR$U}M(980w)jO?Ur3ES3wFQK*6 zz;x_bj=51I{gAzP>;f@U-4k%y!75F3y8Q;2DO4OJFDMSbt)wU`RtVBWhDfO@QSZ#v zUmFY@2P@Zz%pts#+_~CQFp1R_cQCoGWy5xz+FP}l!saS7Y#CDce1`k2(QY#nSNp*# zhEUmCS~#Vw_nCgk&X!EE$4Nnc$tWDMJ4|;Q>I$WcZZ7=RY^{oQV=|Dd*m*C(BD()#xvbC1BWp-%?;DJYv4G#f42JxcLkS)68@GMvDbKTZW%E)M zbnsDccIJq8m1Ms!^^cFM50VTzOE{g`p zRg@S6CMLUci^KQpRwrC^I}61tePe>;N49^jD($wK2G8g{knHTBO(IX`^mBoc_mBZP z+qY&V0nbGR3~!_zEN1_ZEHvIb8tWJ?JN2u9f!N=A zN%+9;{F+p+0YAL*eOBQ_M6kFuOyI`4xRC7G4_)4W69?*Ga_qXa%z<>7o87!?aa@U? zQ}EgSwIe;NFlhe$H>Us~yX>b3jiwmt0N?>arW;G4fVAWNzvT$D@;~R{2D0$e7!2 z06zRr0QNdS;O3U(GoYg2j z{LQuedz1eH0iG zP^8eHcDBx?rwUW2i+MG5qNB%7ySQddyR!fFEz5Mt4YSA-nO5eh2|r0vwFaCvV~CJSXFukf=>_>N*MzZbRJ9Cd zc|P&#^O&C~bNA}blb)9rde4@C2?P2k>MP}jhu+@drS@jcAcHdd>Cpy9m!!xa<5@0M zg4A9O8sT=e!g5*wQs{OgjsZ+q-y={!#VH=L#tg7+f%S%p^f*^lm_k3s2J}$2ErgR( zl{LNkpevy_bzlL$LLPSY00erI6gRI|E9V#Tqmt!r=D|D&He!}-8Ql1JqP^I$oc!d_7-ipI_h+cSZXYFu!~hyWX*09WuT`ZOgC7vBwHpu zEpQ@5PyiQGGHnf5Y-;;jM4?I~Uy$_v_*{d8=`V+UuoKLNy{k5{YG{|a@|LDufM)J( zPZ|JhX>6`U5v)r68^%R)cJyRn5fvs)@U5}BDI+zyD1dnq0;O^x%``o7{|LbCbxpzK zkY*4XyIdp>9U>$f6pmpLl6x;n>cp@KNvpqlaYzG-&{bJ@1@9-&2<7`#r}B_-EigSi zaY2JVhJ33~d;w>CTxvyPk|k|Se)KZAHy%W5LT+D{t~k=sj1;>r1zFnif;*mX&)rf? zhkwFR!X`C#F`ptrgRhZ4cFEfAytnnB{SZ0U2 zjYr>%8xoq~5t6o&FVfKSKbH*1jtp3UcubAJ(-Wr!nPBf4pc7kQc!7>+HIr(-#R8o& z{%>1g4hn5QIXUFJlE*|-nPKUJpX-ErJ%$f#5WA8at)2Lq5dA{^-uth|ZQBe*>7ov} z@oaqd>{~WuW_464R1v?tFPB9vvJo>W5mY}vT>%W!^i=xk;ik8Qe%3)f%QaRf{U!J5 z?Y1G<8T6h2z4>FDmIdvaG30LYqoe@IlJC^`M1(>&RrS=Ap>gN3?XDriUH$w7Y?vGS zVvvkxCrhfZVFv!g6B9}?vls1HQ4Uv>#89A%^FFPx6p7@Iod9C0P;(yq2-w+(NKroTlfuz;H5mcK*jFVVA;}%2?o(q`eee zET0N;FLdj$AyuuPvaPl8LGpjvgzLbn@r1J}|%b-4*#X5d`T6s!Icl`|D!F6Rs8my5hddkwgl0rtZ66R_~gP;r!Lmy_tC zDizyMYZN{(%l4)Er#+!`sLZLB4GA3S>DY#`MFa9_t&N6k{wwyyT;q$mVa(wrixFs` zaQ$^L)4v2xnm0|#2m>;f$}Lz?JQ)MjWeJ|o!Dl%LcbF|3e=wGgv5| znFcZNtnM$5^gOWTHIeULCv46aj~9`El6zeVNXfk>q6L=4coBlS;DbEiq4lnwVBxn_ zJDanz`Vd*H$hP+TG6lO&2^**`H&+c1@8HIN7~%!~Y|hs{c;XwRQYO!RWydi?#>h{- zy0_~5j%#|Bale8+QC+1jsQSLq*vPx9ta{j!hrf*0e=#lpQz-C1HTliT|GWKygdT-p zei@|~p{qve(UpJ1ZY`91;K0DZj0wlUz+j5Aw&B*8ORC7{I$+0rZFq$(@1e3sWVfEx zLI!F>5&wwQUpjaO<#*^`)+gd(YsJ^fZdbjhPeTS% zB^NUz@izqQJ3qUs1*>LK#2N9%`x{z>1tQ28%IEbiM?c#inAL~O7b-11=~{O^qAgee z4IC7aJG#blr{;~nSKNIr;2KjYZ*KwH-_~uj%o%YuZIZhcukEA-Uyl1Nld%a)^U*-k~E|T5bi?qUmzZ}m89`D$u z^1wud7;lA!f-NURqEGFGR`hHM6s5v~ zgg)|)nby17=wklZbW1Vi`<9#wijCka9fmP2Jus&|C||U+tz?x7SO$ zVEx3D;G$#+t_Y|Rf8C|%INeq+V|e9y$iLTzCoh$&PKKnO<1s_O4rNu(f~RtD+FYuW zU6&W9hL?W^xEnZ|oAXtdXurix>_Uw4jMAr1+>5pjO+yjuX)EXtfwUoG@MkNV ztA0F8*NYObgWsHaBg@xopUJd;pFuWf%T80(>ci>8fQlk6&NQIdT>YE8RGCEU?9jOxru^VXc#lY&1=W9xb4q zRmUv!@U6#F%kBje>m&59P#ouAUDHIInI~$;q_Xh(mrUkIIYc5zQW@)6cButPo$m2+ zR6?J?h5_t;k`TPqTfpYL&5fhJ-f0+GK-&17(c&s^wxG<;-!i2^#}i{8?a$c&Zvnc_ zy*#=NT@)V&lW-uDdsw-T?lg!vg7F!~_r|>;{?!LUhq!aY>PNu$IGeM+i!ee^2LF!V z)b7Rk!X(p9eJ2(4N8QD?(wGGD+nR|~RR876&A3V20~EqyuSmNYQ;2Cu+;f;VxhKJi zr$l1lg;i@C6diT$-hYx8K)qaNfTF)bAVaOzDkAg2Z#=%NqmTdCK@?(SFI@{n%r0L*^^$ z{8=nFoxhN*eZdpm?TnrJa7uT@z%R~yL*V2WMLn}l+ZShrOOF;UH_*IF%n#)|)|q98 z%w3+L{BdL@6Y=$Dj@OIc7W@6{)2fHK^JEIf@D5(uS#0hl)bZNemfd(qHLpT+b@7#x zChcBv5h76M@fxLGoDjIx?o6`cDUn5UjL3)VYz&a}wEIvJc=MH}-Jnc*H0-I&o%8*B z?nyQW^%!Yq#2*zAv$!MyJQ9|l40YJ?=c0!plXWwO-pUKOA^Pq1}$!x-uCKyQ6n;Ifx^inh)T~OY`0E9;u7q!Swxn%R=m5@Wa zqHG%qdoe>G6`KBmM42X0x)=^({xvCind8*~Su*y6=y`DjWDPg|z46+-&IcPr{#@Qx z41Ygo$zw^RFmj;^R*knHvKHs_AJlZ^%j$KeXI@P@X_aLfK}bSkPQJ9FFDD+1@2{`w zy`W)D_IEEO6<1zmLksQsuR?LxOnXgO#Zr#JXKcsSsT+sYwUD;%l%%rTEq0>SPsLMS zVu%dz^VX0d=ols0Nmx-Z)kKE0Qs}^1%ejXi=;;O z^c!%+#W$CeI`Wop#Udn3AyE44=zUaV1T3Hnt0IC5cmVAxLU{@yR!}Z8T>!Dp4{Nfa zT8KM05^$n;Jb3A`mJ~Z7EFkSkTotXtJaE0XU!MKtqy%W37__nQifdt zhCEGnbvM(2{Tf{^qp`hq&O$BHq-v)vJGy5L^a7`}M&&w7=Tf=M%|f;ALh&1g;@R4~ zy$%t6e!{5?uUCg^vTZ_-J#7O{n>x}N7>m8fnIR=N>_cb+{e!(;)VLhs*mavb8(@X5 zFUI$1M6*IH_S%f8uA7G4=_)+(fpXLR;_R%C9ZnJDp%sWvbadaVkfiIi;u0$O1I>3G zplHuxOzRI@!fSwCLgEvD6N{o&mXs^%qr;7X^IrGMN!kMxMs^~?tR^SzcnZZcCs2Qg zaUZ{!A7JD|Qmp`dd<6L{Xi3gvmbP?d9rMk-Yiw(@O*@ld=fm44{Jf4N${+2)*8%>b z*wwR6b(xC*O6`1x_K|?66pSYWN@jW237A|24gbi-$F^MH?g0eV)Z8byS>%$Nn7ARF zAefiW%6AUkWhtqHEbx6JeS~7Ma+$yXM;Q1yO`K(Lvc}3SL{pEmz}6?&tQ>W>Z_0rS zG{a0R>-i6_-v8KkFLH-lZ*W6X2;`jM##>8C$6L$y@UEIA1^9mGs7jlSz|aO#`@D*& zA@ovnqb#4Q>~&fVLa({*jHH%^QzxG|C+QN%W`v7~)MtJJPjwkLI-4%+`sRYOC~$?! zP;n)4duN%m^VDMXC*&Pz4@Iv(lS^+ea};-YmOC!9t~J(V-UpIcNmbEm?K1;FCiz+g z!K>!^X#a39k2nNI1tvX2#Ts~Bu^SvQ{NCCIEfT*c3#aYB2?cJ!#V9rt=XSCJhJP@4 zp#G3h^GwV_!ro4q^c4wjdp2b4h7cd5`0*t2_qF)rO$!Yd-%uXNRBl~sSCs#5;IU9US{9OF|#%ZqckY~y>4Rj zL^|w4PMG$>Gzy(6p>5@(8wVR>QhZDz?|j;`A5Uzp-f*E?%aWfbNl@p%>9OMSS*sJpT_&4ATub53z(L3=9p; z*1X7SD{RtsVMSY?#ylys7V3{h|5Z0h(?c>XY-Tk|<92=V`tY*_n+yEJV$v}s?MdHY zvMO<+*Aa@jxn;)SKAQZzU2R=Ala9c2@pDh10G27W&P|%<)c}13Yog0@GnuQ-H0XbC z+o}hBZ{Po&f&7ny82?j1{a<|N-%b8YLATzTALkVv)8J|SPE8#_Lv zh?It>T>eM0t!0LBOE89;ud#;IRM%wDETme)!q+&r_EJhC%{bHkHr!=pch_^xP^PZ? zC3A2}Py1CHJ>;BfJ=3?fae?GqTRjk8)f!(>i!184q{_+N2?rSaQj~0lwFfjp*cs4Nk=K8G+x?9{u%!Bi; zspS%@T2R;l1gdeyuJmKCQ^B zvs^^)oq(@>e&X_o5Of)zKvbVC47260guvZP=UvDcKf`X!0F0I+D8sUPF+F(*O->S-LFoj==PPvoSy4Pl<$Cg*U9HZiu(3A7?zc?qGBi{0@af_x!$m8Hz zFCc#8sZs#16m*5PKv&N?u-Fe-HESDwxd-bDzP@l%GhZ3#$|^56DXMm>IHs#>f@0UP znA61}>?hd7$z0Qvy`7^RYAftdW*0X{!1)ex7Kl}%34>@;$3%a^{w>L@7fsf9%fK?n z=mg_E6c2d>u76I^Mi5_s=}*u*cUNSY-wb*c&kd9p&g-3B4=fosD0qKKv!fA^!{y~I z9(C4BS24Qw1V?*c#hh|JT-cJun(uwP*2MAP=vAg3so*6~Y7y|bltc#IXon88RHOw` zUGcPQZbDbhr*>cydKMvY3y{O0cHL1lhQLkc%hUnE2{zb=+E1i{!bR)2m zhPO@721qV;Rd!~#%aJ@LE4Bwi?u;W1jug=VDx{M;eaulAf~uaiG9*w2Z(7sz zjb8hKTn3XFD_Eh?Cj(vaMq(2xyk}K{#tI-MGxRhm73aNN2789|5RxBxdWE*O9v0fN zgmIJ^)?k;`5UoTQ$&~UyMNpiD@;uP)dSORr;5K3@4^#~0A?zrfMI=$WWTC5^EVo#+ zgcEQOh2%6I@=6O~@pcuurj8}FjRo4)l-V(W5gy^3CjpsE=J&?{BA4WW3PPF2HUQ6i z5{MKI4QO7_cH^PgBzkxZU})+cRSq}YI?7>G3(<4HO4LMK!icGxtE!BxSf6R3(zP^y zEjZ}Bp%Yc}BypkR(Qc1tdGw#*-)0U4B)=W6cOac=e8rAY9CrB7s6^A|-FapDfozSa zg5?hcp*R8cwc9IFNIf020nuBmhF)N#s&Uhu;83e|D_I2;`IA8i8vShrkT4cS#7s`cRD-E4!uPb8TA}2L zqE{X+xZ5v3ta_K_fe5?A6BPsoh8}PwDnoD@k17v^x$(#`TBnD7?gIgQ=~}GRAZS`p zu`C}1ZWyAwtz0Z8*n++|5oS4?^ibbT%7z!^)(+CXUgY^w_tATfoZ}mLkU^8`xt*U? z{CK7r{Y{LiKzCs!=HTKbW481_SttBKJzbNA@Ced4$Lr_f3F5t@^0UWDxC$quajy1~ zR6tD`5V!DgcO2|5JDi{04kw{V+{4MuN2UV~1z}|_C=lEy+88&S3K(&)Ph12~7*#~e zNDPguKXr$D`ve%Fe?ebsi*5lxnT;nce7{c+jF?pj6sFeR7NR_bl_W-xV-G_pfhS;V z?(qp{mtVc*gwP;X=#-b($%;HFeBz0R^YT*xhc)T?obNq9TM<~u!vlZX z9Dbc%bUJ_8^~L?(&wZYRf@9iHbbKaSzD%#Fuw67??Ik zp~2Eem`olGyL2+xvXWVMlWXC=(CggzWxH_QcY z6*zgj6L5GA=3uCs-cSa`RIs}O_JVXRq3vXhi4zN0vIyCSzm0Zfb6y~fQ(6cOv_Q)U zT0GouwDHbsK^LE=L#-{VivkQXDm!bUs6fD%G33mHou6qprVJ67#f&aMa#>xx*o?lvd0dFK+ zQ4wm2r*m^RGUL_SqH!HCThC>-o+A~5ckM4$XcC>9{?rRr4$E(?$v?{#c|G^akbjgB zwy}LP1)F_-yExlcU7bKWaE%BQ(xsG_k|AODNYb94FrVJ?)7faz88%UZ zf}IKjVkpN*%`pP&IH}r?G#aJDZO6mPRYn$e5GW%_a7 z8q?+PT3)HDHHE@}fGOvJIcO5dN zJy_-F#{7SF<;nu)JU8zE`iKQ;Cs(kP+N+q7nx#!aoPoAIE~z@Pbw75lOxU!1_3R)o zcGk=m?BMTv4h44ewyXn!(~gRpyGIg2DVUm5$}9$Q7UtB6zAWgnUshZZ9WWy~M0^L@ z8*|#U;oS1HDZNKu`osI@xXeh|@Q?f)%RA4boB~GipD1zmML*AF)P&XxOjfA(g<1t+ zX&AwgqX5P<10jz-hS=0sXY}WC6pJ{vaPhPA0}s(l0)ux_hpp>^ldr4{CiD=_-&wqf zd({M|?8=F)y1wmHK)LMp?%(VkOWJ&aUbHu8JQDG0a^XuM;)@+Mt%B!Q<-I;)bsD-B zfOi?=*iwCcb)PWT4F8>MmVCT*1kG?baflI$QO6(US3U1l>yizhoWE^OaXa|q)XFd+ zioZzYNd%It3h!u!y%d~`oC1UA4L%_o%VFn%0UpwD#kp-8ny|E(d|Laf)TRL-STyF> zc)0^u!8G0!*KYz(m9YA!iyG8<0^8M^zUg8sk0N|l%fF0zACcEYpeFm#JPAsjZJ*&h zSD=uFT8}ziRXCx!!q1MLqpy$%7QG)&OX;i3TFz6IkG;QNyF;9(StTL2_<<8C>-vS2 z&(3)*xoK<>ze7I-hd#O`Dnri?ILz0z$ zeNU$`){|gvk~-3S@ie(`$D}ZX;8xd}JvtHrKGMz0mF<+2wW38(0Q(MZ3%U*M#z&rf z+qds(c#gb|o!j{39H|c=x(Zh4t(Yw{E&H(FF^QXFuCUUiEki~M^@~eK z4t+eAx)!L#sDM2zmpY-Dx8+#|TqooQjzMD__n1>?z-^d`+e7yH`Z?S1j?V|Js=ZW| zK@XIO;7WKZSWCk7lYCz4cBs4W>`$%qkblEuM$awO1bCEAp}wTu>KY3VTOaTxEnF*WTD&%H+Y#N zU{3DklnG?*RB}cIVFpDSnZ&qO5ay*#=4iNV1bCk8bzbB_SEn|EIe3B{PuGp-E;?+( zWXYF;x@(~NMATaqjgglRm|eA7=eEhFCPgthX6}GH3Zdc>VLT?bIc(qfk;>)Qx|6N2 zR-Wntkz)|UJ@ZmUrZ4Ac%dx7T-T@CS$EtUW#8s20LaxoskA!Qc z)mr72k*emb1}FL*@y4Z`?avM;O~|;}y`-nq;{)(Wfh<6(azd zNnfxe&-c09DFwN@yho0W53e(l!j?ER^v8D(P8N6JVT}T9WI^zR5*bHt**~&0v@a=4 zqjHYn!y^OI>Ilr{UI+Y^l%;Y%&R;*Jb)XB4c3biE*{_yr>W^QpMWGKq@&zisyP;61 z2L!l*V5m^bqAEK(4wh2+Vy79h+xZ*)OyKN7EPkLV>QAtkMsM}Ben3sUUS0%T0$vM- zX9flpKHb`L>VT7G7?p@)r`%;%3~7eFC8}7Ra#?qbAyu$Pc7U|!^(pXjPO!|eteh81 z8^EpmcofHooS0~};%gN`L5!0LhpZLG-JfqCPc=DsssA#&qron)yS_O2jL9u1k9kT5eqCYQDD32fCw0XDWXtT_tJk zZ&AF)j>z%Kz;vs1^EFQiwmxv(nWTNz1tz-#g7EjyPU$X)C)k|#vu0h^FuGWNR#<50 zu<%*0!u9Hp2>l|8YGA~kL+l4siQ1#*Ud&XOQ=*yr>t+Yq+$=Nac8NT{2(0}+Vbo4? zHF--xKvCXJ2er1?Ji*C}HV{HHG5azedk@W+i#V-ebF;iAq zm=d?3g>wCNZPb<9s$3Bx*eb8u*i)*SI zUSQ|%7I{_|zk@zi&~-H+eAu6MUY?eEsaR&wu3<-eFCA;rC!@Do9aKDIx(|lp=@}sXZLpr7w=cYpgl`|Pv)F%V|v&fGhb`<^-P zdC!dDFDF7dlGU4URx=akB|_KaS|cmCDdzU&h{Vwd`!{8L)|ks^X zf0Ro}`p^o~W9*}kpOp}H3O1$P79NfqczAfc*!NH zlj8$7BHa(6irf0KVTsBbv{CPwdZ~y##G!MY2_UDYl6GN)Bjh-XIr#N>gapW0_N%F1 zXg9#<1=^Wf>n80njkq6M5B@NfEUlftyJ?FZnbi(0j}_5xsoe=A&x7N+O?`gK2H-aL zKFV#8Fi?t*0wd|bb6kv{mo||NrlRQVcF}7%qU~%_4rlN5MxT{yLDEmuY%sE z!_@x;&7FNfDRTB;uIO&m(xW@~!_Q2)c!iwm!01<>dV`S{1{_pqRMZsIW4X^@sm6E5 z#y{=O-E>|mP$J`dj5*k5|J?v;iTCmw>oxIE==;Fkh#Z!~Dh#DN%{Ka!T^MS8k5+Hv zJ%F4k@W(PTo4+`eZiR1-HbknS38?j*{S}mdw(r)bC!MJkv@VVSiOq6vr2nTw#r5hM z+a!I{OiDRsq#XLHq|WxMXP>F4TPxFIQ*V8RZ31quK^l~=Vt(voFIuEusvlN!u|uTHs`hGxo+8(`g7xO*K>!33hu zv#B5waWH`wVL-+R|3uk?Sf6D*y<^vQ>g8pR7*)k25;fVOzD+PCr<2Z8zu z$_NZmpF%wtSmfS|+n9(q#ksxzT1KDCkgk2U?~t?Px1MI7lKkd^+vlnlh!^ukQU zU#3IKNMW;djRvm#F2Ro)C7!dri+tG>kZ03Hq)J8Z2C3R>kDt{XAz0JD9{CQZAykFGBfl{T^Q*UmrYT>My2C zi`wv)*QJGWn~wHTF<}%249i5Oa8nHWxP&>v7^pHK4+#tEL=?~u8%=<->HSEfz-X;u zt`R#qAX0<7wAS>!*pL3&;8ALEykGsRuzJvJ?=28cBg&7v<9z(Z?k#nui~5+eegviP z#Qid7OhknMf%3L~i*qwv#xdHm#WV#r1h-^I%pVMS(;eFte|KBCxWhP%S}h#3%PiXX zc+*u+1t|K;2aVBv<*tMlv)H*fArjVTX*BrMO)CqOGoo2l0A8&JVqpB4A0M>g&FX$E zEfd)&wu5y;bC_So0Z(;WIi}#JJ}hHtEn8<5cdKc|sPLzQd#u!-IMa#@)fSsSv<};- z&)}K(R9c*ob7{e=k2rlr^xm}FP<9Yi{pRsn(>MA|7c~Vx_%ZkyVDywf^^&_0RaYS}7`2k!{0drvxc7%aH2#}-6<#~!?-KRZT=1Pw}P z&+?g9mq+qDp+-D!R@N(xD0?}YdTz~oH&NN^!8TP0LN{=#x z1(oC5zwWE*fuOP(IK{7uj4Fp^PKaEVWhJgd<3kOhV#7X>&q$ftRZr*jq<)DZurR1r znaL;%8k_UV6Vs{RE9!e`xP`J8-K~8Eq{x0wxd1v-*BR} znJjFqg&3UhY}~B=@vQUX%8NtQ)Dk7Kjur_Z_D56?t*64w2J*y%cTe~NejTPeEqBaaC>gwPi-;Od_pMaDHpkpNERlXNsxjCR8!p%ZY zIrpkBJ^J$gz+S;jMnzLAn&BS1q6GXWm-ru)C5Cjt>@4;Bb~xK3_0JX1<){{bcff2M zOuaUIO33#I359OjBJzEtO@HDQ?!)~twnT9;jQ-IgA6*m3rZG(Yz8Rm6IO8G>3aSkT zJ>2g^%yA*3VHBKxgrCR$zzl;AWwi7_V`9QR{}ASFYz9kv%z1%I*aO*P>}i0d*;?l} z^*L4;aZaCtb9fP_0N0Rm_SpCL-KZBKAC)`2`EYx!e1J2RhNO|P-^GK6A+*-_!GC0( zG1fen3Xq1d-79@Po8~j;y*I)0+!&8sz#L+XZhyUQqmlucj5yd{{C+q?YA#0DB5&}@ zxn-gd#*K#~u#cPArQ;v~o@91y!1wBYT{th}Sfbhj4r43e$w?!3_iyZ(Ju-&t5kJcl zpw5hCnWN<|V?LBovt|ML8ol6tdj8!WbIYRibm7;y@2~tzpMDcja~{xdN{M%`##Nq= z6{OU^vQMeC@+XRQE}U@KcWTzi!f}h5UPnJSU*Zz}@hBr{;YX$qnnWXi;d#A;8b_e2Y^WEQcPdSyp0C>z z@gyYWPkZ*`VmiP`?nF?u+rI7{Rg)WotnS8={4$OPxxTgC8f=Gz9HM$yqe68zsJ#6x_Y$DVFP-cWS>kS!OGY;b=VS(_jBi z^Iw1AcL5vo)6bL?%r!8-gz&Ni(NM$34Ij9h4v~d<@*p(BiZ1Gi?&zGddFjL1-~ zTH!F#(VwNUsEr`S@Vm7MWz+%R8E-bj`esz)%zU#(qrcj6{v#M-`oU38moH>!e`}0q z(Rp{xWM?BaL7PWy*JU5LGJd!3y~{wI!?2j}okd4NsXlekNBWd{?jLb=p7TmbIb0n;$JB0(CP52QuG%l^f0jo|WHy!SY)jx+Z?}YPF03ScyF$cZ- zMm26(Q{W1GO3q!S0G%j!)y8sN-fdC)5vMdo%E_Z1%KrpRq71eBO<}xqGBekxdc&9z zAgWYhSRMpoVISdG$;>ILD8-q>|JUjM$++Nu<03B<5#yHN`+$hD$CO^&&pIOih^vrQ zy8lcH|DR$`6~ATJ)ps#<8|dW2V8ApC1bPw`a5yp3gP1)Di_VB4buQg^(f63~!xyz> zd_MK?sI)dno)r;toFndV0|Q&2&Z*eS(&OH*KprREJ8>BVeEC$Aws8fh@u>{e@D@qT zkzpZBleQIwNQu?>ySv|&;>{dv)?LB>t5p06IM@FyY@*~2JCBTJ%9Op&)XXyRndk7H z>OYT|cjjwB4D8W2hcOI=BR$33sQTTcDW#1cJKGagE~pbeI3b>x`|rw;~aU2i}wg-M)!J?u#9tYzrQ>P<@kS5+yxK6UJzbSx$VF)F4Fh#e0iKX`W+nuu(Zv|eIJbH)`PF|&Pa z{ZfndpAowz?K9h93pXY^1#%AE)z)pIZvAc=l-hN$l;7D95I87End#XZ4-3p{!oeiV zRM9&ZJ{1&m%30eam&;}A4U{h`JensGF4UyGTzi?KUQcPsU&FYz96M+W4{KB27@HE< ztwQ{`WSKU0MXc#~=)~y}%$2CX>K6~lNU>eKCr#-doE9$jedF|+9!1~SHB>WI{_#?G zvJnn`6qAmO0zcI)k)IcB?;_!(m4m?DF|{yO-iyGuH$L9fPaUwwk%g1d?JW;<8QQ?6Zo)%c9>}hj%#YK{(UUqhit#&q3Y2J8N|CETM z_7eu=XzMMzr}Ze{0D`seLbICH5-r8RkJe3IP<2~99wo-+{k3Jn1gLD-hNReW7ca)wDBau@*Uymzp@@rk!={Yb5;)Q{wZTXE`G5|i7n-1hCsn3JoswHVKRtN+!PM1=R^8&5RE z|8U=X+o9j)LbXC6gSXMvpQ+!!2gI8#Nk1YjFgLpgD;r-8t-VTo&IXgV&_nIB8Dp)x zZtKkUiv?w!rKTLZJWViv0;3lHEFVm-!&uuscpyU5Jg@DwPH6w@l)gkbbAmjg?& zm+v$o+5MCpvL&?M4Jb4rzxq>Wik{%h2K?VZiM8FgH_u&m@)|wVy15+KnpA9={pE21 zb(r79W0#V0?!%YfMu1_$Er5>4tDO37l^7%&TdS3LoK@19_@54<{yTHK`#)b z{8DfNKsiR*>_(z(T3&6>oGEQ7;5Bf4dj{REo~6Qz=*?oS+4-m*eIlu+-p>;VJ)1c* zhznn-J^oC~o8RcWy|rF(Ae`y0+3ou;2#Toaje(qJwZrA=94NYU+Vui5jtRNdWq>PH zO*f05FgbCcHWccgw7a~9_=Q8(G$w7v3}XtkM9)L$8j-Mn=kzFiX7099{VnqKXZsGQ z%AJC}q)TL=SlKuXESG&}W4 z2N|8PTr~C?v(7rCbjc(J%dT2G-y$oOEEa4h3dxR588Dbt;EWZGjXfO?yXJcGUXKgo zXU>?&+#(TgbGfJ7&Q6|7$Y!aPmwiq|J#{&U|21Pu^^5hY+7nG0^Q0EZp{H6=`KssZ zI>N;iCC8JV?~LV!n%GYdHHBOJdV9J?uVB2W*j_cGV4a~fObwTRuD~+`i^a+oxC^t6 zLA*TA+^Y5SdBN0XIk`F8q(r;=kqA?Ep%H0B6haB>V}hd@vQD86MBP^?BhDCJKd;fJ zG?ZUUEG6Tn7XLtn#=-e)mV9|)>Qo_zn>bXsz|^^FMs*kV0<|`4Ing;Cp0%}m9#!v_ zaAsFQ+OaSxy!Tj1fjhzgf;@#+EgAAudg0Hum+-u|bDgvwIN@SZQRSG@DbG1?a3+%i zbQ$2C@Egy^%u6Jq(%?$PtD6oVL@vND?DS39pUL+CKLx+IuT0FCdotzXNxU7?U#;|E zE7CWBco;lgb_s2e+v7yD*s7QxRknCj3OfsP@&4hZk=Z9 zKA}+Q!topFcOz;YYv6!pb(Gh3uNOgeAIn-4ZGue(Y=(eEiJ1Ml_ts~jD9rT&xas#P zS=MRKkyJ^WE(jne(o?=9J2upGlVa0pX>x1stineCLo|doaoGU-~1_u&;kJg61n&6^715#Khqbp)sT>wZ&g=S(VU+B>)+v_Fw zOM54Tp1|ZIFOg3lS-bJ^d*UP6AG&&-9ct8{oN2;7cskoF_5%kymsc^K`x@yNv`_(Y zj{n&UH?6$ji~2AoqcFUwc7zh_o)E5#D$v$Ia)%gG5l=OPDbMG7-Lf;~ITN*>4p!m$ zhQ6WVi~4&X4NaucU(X*OBAf0jm8L8!3PA5yf?eY%m$&HN_r#R-$Qvz0_=JFu;(7W{ zojcZDvM0^&d&BmZPL_7hhzH~ac}+M~jZu1>`QRu_JEI6W)g+)#hnD^7b9~}oK*aW_ z-@H{kz9(}Q?jWYQBT}7cawYfWai&CL7qI+!M!ErDr`!>F4|e>NjRn&%=i}tfHFT^Sl(S- z@je->9t!;nW>iuc@7`j(%1iy%s3#A73@hR<_5h$*uzJ{kTOBK`&1l|ncvW0RHHs|( zEMI{u`~Rp-4;r*Pc+qLC-sOGBT?Km&M${jo(1>4I>iejal69a^YKsd*hf^YV4>t*< z?Y$b4YJIG9qodF^*Y_~>&DMNxKTPq!1j~=E*-_^mm+v6D3|5;#hIP;ob8`K_Q7!p* z#}!Mj5jN>aB5VZ$q8|jGh0KKZo@FqWF-`jh91>p|)~-xLBU-?N&1?Y~-l-ro2#HT2{# zw-SDgDnw>f36j5`YDbLNTf;19K<4T(o?qL3Y(MIv>iYLIA`*vna8+7Alpwe>Fgrhyb`AozAQaDN3dz#eFvh zJM7|76tw&(f=`zE+Gq_vRa8Om{%eyi&O7GYj$R~k zTAe9BUcX^(`+u4`nA`QYHs1C){Its7F_zXVzssFQBqc*VW&v6m(i{>GRrwAr(FD zazJ-)vAQPIzd#^u_tnrAX^B+5L5J6+$_yi1w(%@)i>Y!Vf+uau;~ppLF|`?2mQ#9i z(({6>@mPU|W3!D>l$Q1B?O*DJthwhu=Yodjv^(*HoHb7e#JSEV;&^BzMO#mPJpm0{ zA=bFd#0d+ExH!g6e%O8)liQGcNRu+v77|Y=Me;)fEp5)GU)~62os(^~Udy59`?zE% zVsCB}#d6rNoaAt>9#A)Dg zDuY}NOAaWOw*uTB{+#6r(+-nBGs zC4^^2(>Ea1V7iWaPA5m5(~|pFSlm@e|ICN}wgbj$$vbjhpuv$+I>P|W|Kg8;O1}#M zCxS0}PkH8i;N4O8PYrnB{Ml)uvONJ_wpiN%bE13ufs|Jmhpf0P;{p^*j-lZBINYJy zGuAy4uc(riN%oKl>Lnnw7NOcv1^=KhYk)%0(^G>fHB;3rL8I@5iN*7^nX7vpe_EAY z!d1>v&qR54N9*0}qK!MCx?up2P}KY^ghG?-;lM-D_M$jKZfEV(U*$B6cw9~gpu#X- zfM6-#{>95y_F!Rho<>@f(k|4k^HaM%U9YkQdh%fMOD!{#@V=N~`9o9xIWJ!FD%N`9 z(_Tk{Q<=uB_>CUL9ZgPymPud|cN;YiZ`X!z#{?+7Q30N&o-w4e$OtpW8@q6bDOP8+bonGk7 zG!2+T`6NN|s_85UFQUeJECbao?ZVs7EOz$OxH~7$q8E_yR(#YRWxQyezF6;8D;Q=_ z{3e|~LFuo>X)f`S3hpgMPZl;i6~J>pw)kow9p_DbEdOF^h{=o|?2D1t7iP zh>7=wcuOE=_Ok@_nAtr42^<4Qg?fU`o(uJ%H%cGv4|HZ@SdPsxBYIBdhUayDKMLG; zK!X`M7C!WJ-78NcdwM+3F4|D?*C!kppNvK%8p`>ZIfT#i#cnOW|1c@Fkvo6^aQXKE zeEJdUj8d}k>_);VSGG1od8slk)1tj=ayf)AD5DdDom_k0PhFc*ucL4C0**p&c5{<4 zFYLYt5wRq7sSuw#U80jo0k zK~s0lIO&Q^o8nB1ADlqEPy+o7^aj>=@_+_d?1+4od|BJ^dZ%>bF&N643)WWzcy=Cq z0n!vncTJR5`2K_AlfNJ^jyNe0XCJT|i1ZM2WKo+v6#rlk=>L&3;0vas6@No0aLT~` zAQdEgkp2vGuK%)?zLtS^VD!rWl+OZoRalqZXnk__#8MB$+75qhgtx%;C!b7*_mw}b z;O75(&^t0$ibND5$O3dvZd%zbmh=$uMYHQC(_5Ge+2ST*HIrm9f=A zN5$=;n?yH*8v4Q;F(ZQbN%Nh@dH}P^5>{9{?Jo4k}&`XIbM4;L|8_sI@Dg; zUyxI=ugkVY_HYo{T2d;|DT}`yO#d`PV=)PI-%${G75E$GM4{1kdzc;;zM)R-s#~cb_NNT)ZP-9?PtwKB&~uliMJ`(Jt)J_onq>!<(tt5ic;I zkf-mX`lPDNi3sLf{M=u)<}Zp0>GZtim1I69>33J)q`w~?HdTe)T{F_F5~#}0#vZ!1 z6^#t)SJl=5T-tikJ5?|_X5&GU$6>sx6W#o71`;cn;{JD#53Wiqt zb;FCScO}RbPMfm}iI@jRB3?qN_g$&lp66BMtaVL-lk7v(lr}#PdKX}XgMXbB1tpO$=LR9v4y)Z_62h!_&}N>S9&-s)i5*V{*@ll}0vE?OS8Y@lN3IYVWBBJ1u3lX+ZTZ9(s-t%WP(;yH=hNOy^K*n6R{RQ+p5M zgbdJ9qO3k-S4NR{<j!^J~A0IY>cor%&7ag<;wSbRvI~+=RjX`U~g~#E|VJ0 z0j?ZTzpB|;c(t&%8}@}%t|b{fPC&eHsi{2V_1}Ng5~pk^tksE0PR6HW3&$zPA|KN*W?nav`fkYQ4ki2KAceBzn_y1ocZA$sle~Q z-EaDSIvsm3i@(Ul7>Ep*-%ty4In*NFMxJY2mecV}OV(3b_Y@dRJQuEHQYlOlN5$!%9upL==w2km#_gY422&LeN)b*~ahG zNY6N$f$}q5S}w6(88LRexdtfj3|R)Q(WL8B^?6}zjpf?2;W77yd*@ZeLRx26keX*& zntI#Cag6uw$snT6B@`UIzex93m4b34R{gL8+)sBn?kWw#G?~olTS0S9)7xTyhPs4l zNkh~0OU&sBWTuCpb|0P1pS^)@9T$0iVxl4by9Tp)2^hE#%eF{@*K^nuDm%m)s{W1W& zGs~{`o15sBAg!xUF0W;8egNkFG!xTRyh-?RA^$+yjg;p%1AoOJDQ`N5`eS>-`i_&? z6A~o07{flF*;4e;>wPlh8=Y?C{9`KiHh(5}Zn840Qa<>DKGHeZD{e1XJ#by^9_8s& z`};EvxZcByZ-%ff19{X6X5(_w95v^j0hQXW+_gdV)&#XXz0TIL41K{m;YlwMxOWCIzBFN?2gw#ulj4ghWt3VW z;geJn%ac_6jtOK1Rk5BkI7ihw|A_pKJAPU_S|cYvRm<^AzE0d9(@zn*)7F3 zwzob4nS}5?_}TDpgJ5-pJ@LRTe>N8{4l#3G>Fi9*N9Y-8W}~@;ufB2(q&h2iMWHR} zuPGn4=CP%(D%NksgTeyYUyO2b5Hg@i#HOq1>Laib#{8!Z<&fa9>1jiD0mwVl0hP_52jmYx{DX^+B^NB+3CB9XOhX3^NF`^-lXjPS>L;n#sq0$QcF z=zVl)u?zIii+H!~9Laz?ntw_(hU$Al$i_K*VbtZJoXaHwc$g(fkz%A?o-X;qGf)E>D5)q=X+{B3kdVy*EYq)z3P)34kkB`Y(O}vsC`2WQ=s&Y;9hZELXg8B2;g@Wsj~K zdGofN$N9GX(?FyzAcP$Q9RV;Ei|9MIm=iBZnpsuak*{X#iFb1mU#74=J;k=Qv0oke zo8>F_o0Wl_CcsGj2%xodg$wcW^Ox&Fhx@-)u-&OrCoB9W%Vi-hDrRtX^C7jGw#n(8 zbbnEtpw6?Fx8qGZ7uBk){X5k!Xs>&G_%cwtu=1?GNMCm)8N7qF>HD>Up%PJJXZ4LU zq(0XE&z^d(EVCu;^AF%YDZ{z~*+d=TYt!c&Pd%&a^dj5-FBm0BVTXDn9kN+Iu(}yD$ zn6#ESoIrF(ATy}edbTlib!r3dZLQdm_A|g_@J3V@GB@U2iZk6eHo?DREMc?1gQRtt z25dDya>G_>7W{T^#GjK0mI?YdnkGrg?1@lG*L%@V$^N{h;jV^)JCNy?SeLP{|F!VM zJKEem>0ITRu}UW+To=-D`W~0<#rAoQmX<2^f5`L0Z3U~$-{en1?=8WbS`re7e{IiY zN`HFKkZ|)qgna6jJO@L#&hfv%Smi<@=2oxbfGahE3o<%g?_c`uAAo)$zSO&B(&qvQ zWQV>#q@(+bs-Hj{$y*O9_i@c$w*2g}VPB}-X-dhI=AP6-*<`U|i=tfudfHPWM9_}` z5Z24VZVByn-}hf1e8Em?$8oVmi6R6atz8-^Jp7DYZ2gYTs_*}Wb#YSVAPk_Q=4VC+ zFof?Kyvfh_(iFUJOw{{(cS|DVX#u-`(1D_LXe;t~S?Bw!nr2Ox*kH0d6zI0tV@fjX z3Mv>KPA7^uxFAc|>?yMRasW2oBT!@N`wXLonE-m&O@XepanR@1|imLoQ0&Br^V zhPU41yxhjf#DoK?tWQ$I_k)_IbSmF+9goV_(w9~~>xEm6dktG1`+W^T(l93#I{|Ed zPnK7W??6){=T5oI8B+U7vINu`ooo5JrB*qoLL}iKx~QSn(C7u)ES6FfyAt{XLsWsj z2$X@0ss}cL)xx4uFLsUIIzc&u*QMXjCW1==33pweKoHqC79f=_i?IFKG&i?;PTb$$DqG#UfKM8Gy{M{(P}{i;Ted6j zY_06st}l`&3HN7i$cU|xgtHe(YV3+rPLVsIz7uc8PIC3bu6+T@4JKxhGAsHM8-dRR z2h5YBsV5=@zn|=Xbu;sD3~_ME|5_{OfbA6J`Irm|FW!M2I;LuUJ90Y3oXbW0`BJLn zr&6fOjBN8dV9wfp_T#eqH?_9<;M6W;U{|T;%tmJxY$vDbc#-9p#^U_=@z8m`$Mf^z z%&pD++7Es#Uw@W;w)P}?4@&69*If-#43tMqKV-Rb^@+t(VDUvc&>LH#6z~^vcEISD zvNpa1W!*tq8X^WdY=*~foykL6{W;gs64n(t;d3t=)p0wt55{vBs!3_uIL^T}5(l^^ znE2YTax^gnHj&s1sJ5ME0rw?%nh>$(A2HXSQ+UNxJ-CZD`k=(tuf44UnY5}2UIog5 zg`lrwKsNDu@Q&ZH^pQ(uWW|d%EgyJ;KfHBR{N?)l&8q<&$}QnHBwm%76tq8m+W z%9S3uXJd@mvQ<7`gBA{U?}r-l^Y+dtex=32zHnCOavETWd;NQU$IQNLVwrJCD$b(! zLWH!ruw&{m)-paUdeZ!YbRlTpz%07VUlHkp5ji?PzHnVjLcd%*g2L%3D&4k#UgXhh zj`&CQjF0q@tjl^zs(Q@)R}h)aTq??rcVV$XEm=qSHSUFxg7`ZM%F;}#OaIJu!GW9R zVFVKwA&2E~R9%ah8oW+lbjL()B4u-{!EUleDj(@Vi5d3(ggvGzbLk>EZUJo3H**^+ z^bgdz3NW`>^%~2ThApNa@q?zCTKJT6pOajY+Oa+k z#KCUs>UR9RKvlSJd!8m@-L)sHgbPZ3 zgYGqg(LbZZn_q5Mr>I0+e-_QiN?IZ+0T?;&%$28KE=Mr`VLz0y`b|Aw%Ess7eU<(A z3KKp{{Kokz_;m{4Lw%V}?4>DuDzJ1ABSXiE+OYm}Z(!cyb>mgDll5IW=7DNE*?D02 z`RdueHS(Y6hdK%scj0GndkW_TftgX5w+Lv9e{F&UxRmhg6OD`*Q zH86+NNiy+htn>B2>$+j%K%6lU?Mg7mCFrGS=)I)*@{|o6K42r%hBKd0Sd--#F!)JE$?5mnzuJ1s0mG zOmW_TK|*FJ?nO@i&kt6-jvqc=aFdI2D1WU(Ay@K?uwO240iQh9wd`;u$ihe}$F#(P z{&xS8rT}|fP#&RK=9R**R?(wBbA1pW$cM|gjY^u@IRA5wLrsvwD+d=_K{}&^68J|t zVjfuIyvkU#m7xZdU~$KXU$cscaG)dI;c9zBm>O?zeHM1F{k#yT#Pa!}oLxYC>dt;% zK)~i|hR5$O2Ql3bN7GQoGrfMA%ie%>@l;dv^}s1r^HYKKj8B3fPX-w(EkpIjbvd40 zF|kN46I|;}M;0o-ZEI-8QW$%mqFJndJU(&KN*VYsdgC~^8XLhf=3N2z<{M@%0+@Gx zPsHf0k7WkwiB&9y> zDm3N1=K&@B&fY!)WuG|Ee=@;z=mCoL)(&M4&Mi@&-*psX{drWT!0*(Lj=YZVNO#f1 z94A@ogIh7BImm3&2Kfiws~a0_e9Ns(w~qmQU(m0Imf~hlX#c1}=Fh{X4gV2<$9Q;n z%x>BClxskM!qmGj`IQ5B6!`va_tJb=bVvJTy45GlNuGc7q99Y|mdXFxSAD)N=pPaS zvA+JFCV4E=xh4LwjV-5^nOOgEh&PWB>9g7SjtVU1B?r}iF;6qU>4)Yl+6nm4G5lpN z1@A}S+_7ii$>wUyRFCO9$@AYyyw*IQc)QB9LC1?;=o=s>A+hc%{^K+`EvV!JFKsh9 z%D2zXY;~UN%LaWvr%R|ihU`lm|MtEfJif-p&OY9xWqqa`kXByl0{=TTPDUHnf17|n z$=025XTO<3u5{Gb*Yp0PQG>pG>b7~$4GVBxz^5vB7uP#G)0_WeRG(Te%do3hga`1=?`Cp{%79Q%Y?N!4}DRWsik>$f7HgN?Qo4bgP zC`3R`I;ipThKm|3tnQ@!_&OE;t^}3xpaB@Ya)ihI>pW z&q)}{7R3wP?r}vkP4aC`iyvX3K5Z>pZc z3Z0(RD@J@{T<^mws$6=DXBd^KE@PPH8{ChL&Wvo$$RKnxWpnt?m=4J{w;JhnAk^># zO_}>U+`E)sem@SWq8QEe4-V%WIJ~M#PrVAYox+SGqsOen!zUuegszu+_atE(xRz%Um!d(8>6AcJ6xcaaaW5?;wVq zkQNLx`#Kh+B3aWe7H=2rCp5rSv?gK&>TM~aaJYWgf)sB=GU6I^LAZ$E9i&k+)1I(J z?ZfSnkIO~_FDJ`^z5uBREXj)1Np+dF*{NJ<@vB@3y<6CEn@wM=YW7mriU!=2_grh9 zRD0&3M(UMm^0rs2Ii{LdQF)`wKU*(b3DE?{x;pHqclxL4-Lt0d*S0a{^W^wnjMM%x zSM9^O1ep@vNfm#S4*EHZ2tN%!m>3& zgQE4%$_|B~9SIArznAmE^ycBSD`4>Rte~$y-TByGJ1)2Fvpr5RkbeBjLGfcXp94^Ae7a0$1o z7@wrX*<4z-2hq0IqQ(}*Ta}zSc0TJSQYYuVti()9?|q`GfJy4O9ZZ&yD3kfP)kjRA z`M%vU7(&QE70^uDgPMzIMQ`vN6gwg^5U<;ncS)Fd?d)kb0WiBg$?6*!tNLUT(v~K?j64~*96mg9KbF)Ukq(=b4*-a-n_FBl4H6HclV#<` z1|EadLYO_IgAVRayEB;-nMmu4ZU@WRu`mQKL-NE?DB%}`eWU4PIWSzN2)dp;k`w({amWT8TLTCdFdv z_wGES*&WY83dX&z5ZL(;sf^Y3_Y-? z@aBuzH}pC^k4w?LM%$mC8;-9MVh(gY|G6JK5uFKd2PF;YUwP-jq@_P&x>jPB$Q{=u zW)k6FK9YZ&GGe4vz{+tso%Ud$J!1HXRDn=@H~Q;d#rT6duOPXvhvEp@TI7W@5{~q3 zpZvFRmxJJsGXngT9zDYgU}KBlLJUwUSMw|NwMeEDr^3+_GQYAm%Gq3T1(ib1fdfQu z%`?0OlcpKFa+;sYw=ju{4+x8y9Ka+(T^`P9MYlyEW(RKP3pBX#o@vz*)SRMfTNA$8 z9lxgfAli=+coz}Of34yRaLit0=-Vn*QXlv+30MMD0$vpRquv7#lsiSMz8g+)CB4zck(ejL_NyT&rVRm0;;(GNti+5 zfqr`D>%Vt1%5TsQ7a{cZ<6UA3brF7g6F&=3UMb*B=~uCyc+tIne{I?CG~3dudbafS zNXa9{>~FrUFA99&+w)%Hh_wCHQMiSoCAKFL-i#UV3=1y+(x8rG-{=0uRuG6&D7pLG zSm=9U8!`JEsrOc3mjJmxQb}urKU+)azkD0Bin_6e#>wQZVIfOCi+#1LuXb0*95<%x z|68x_x|C?!^7WQ^Bjd!r>wmdB&V>Uk()N~3SMH-_AKz(TY^h0IN}Y+fhertzlWK3M z?P#Uk){$oWmk1QR)0TdEAV(X;hrQyu+$ZGqlZm@zY01VvB^muqEz0jk&VPwR!8_M# z+%-TE?J!E+_0rGzx==^N1GkU7lmyV7$A69B`A0 zk^+MKQ8H5S%KsMm|NirF^vg?J*x{2rsVYaGLAbXEJJ<=O;6*~zqgv_J;hJxjcaHl5 zX?zDc_9AZziTFQ}`%Su+e@IBkZiy~06QM)ybr(4He=b5pw*lwBsBhK<#P?PY%6~Ea zzfS*`EDaKhGad+x)pL{-9jKZ8G-;!CaoME%o>hEuAM`M6+Ecz$+Nyh%cB$U)5ScJFJ!i z)^-{qY5Ht|RPQ^`AyP753wL0V``oVxM?l@^xVu`DwJ|n5wF=mqPIi+>}g+ z@T`4UPgmYO(+jWE@@E56a(BND*D5_WJ6LefiRduI?&-7$cME2u`cxsPY?Y;E(W5!%LWn7Mo< z`KN*YZxZHX=?~)Gf#%B;pX#X_@3cQEj>-V)siZ9yjl%#0Ri4DJHYGvAE1MQ|R;gxe zs3(xz12d@2>oR+!2kEqfUQyRn?U!jzt9*Q`zoMQtTvF?)%!yb5!`9WHdUN1l`i>`!6{Kr`)^H@ z(F@pEbJvuP^ymYTCAUkS8|%e4gJZ4r#oZLC=bj(ZSlfQFad1prvCOH_qTyU%=H97r z`);yB$n%tBF=xNpcSB*XcblKC_?JpGx+jLAPn$#*CU1BT%F>U-YUH~VLv;qe${^JE zyTM{=*Jr^rA5dg(JYA+o)PVT~6)%?ft^7e3y|rMOroxwWQ5cWySqML`@?&XnN$5$6 zP66yD;wBEuxW>oD6QaC#M@|EIB^@OR@MB22M5yz={d1&khp(yy4h!T=`}E z>V==*G$j#08KoIQILgHgX{8Y-ns+n!>(7{OQ=T3Dt&J(aP9kdh>0wnt$Oux?*wXTw z2~Kk)6=kb3&d((w7rd=WAHs9B7!nU;XxfcN86|Vk7wOo(fUeq6?c`pMAE!q$oBfvb zOQgpnS;d+!7QvdB1-1E~sWU>igz=|z=ohkj`3WzKNvCfa5(~P(ycusfCA0%IMD(fb z_sr=jxEKK%8}J7Mg8KSEBy5!CM&HH-)#GeC-HkM1C*SzIF~=r5*|1)N6)Ts1d!vs1kGWw+wyBZ}K%|A7IgCw<#v{#f||Pi*+(h6Toshn#K11<4zM@r*a( z82hi#Jr<^8wFgew9^Cd(aMK)AfVQ*REPfTSWAPBQ81wPA=?5R|{*X7$@Yx4-FgiB4Cf{fv16JX2GpG6goWBYXoT={}**xl7z#G zCwEbpl#HiihO3pRTY3*9aE#I8n_HCuN*sHBTKe6#h&>b?TY@`%#gpn2qj9JU*gg;c z6m+y~OAf3|=?=k!v(Ernv>6aCNg>K7x8@-oof!yO zlqSuJ%TAciL-h#7nQbzbkdFBY#fTtvrnpoN_VFVpwj(c8MsT&HX1jM>P!`@f@cF`g zM%H)Iu5Dhr@5TgIDms3vFcExj<_ewO(8$o+&^$ou^WhuybQ1Kn-?0$TF^Nm%429c0 z0#2Y?7OPdlo4(YWCE|VVFd)`m%mvL&DK%P7-Re0`n__zwD1?N5!9> z^*9_6A)ZWTtTen)^`zJ?0~7GTN%y?UO*+;X^68zC!S%@;7o1zljk`(+YgL|KXmCp8thk(Z7ze zd?^mRYQ5_G{af>5ntnA-J}&UvUi{&|a&LyIZU!#-@#=f>{-3gKcsl7kxAVUJAqT^r zy(`%zy3cyLrtkTmd&DOC&b?kT@xaRYr~Z^*jpMOUP3U9sTu`*eEB=q-Yn2HLg*VIz z$?s?GoO7ae?fx~|@jaDyfAQ}9pZG5*f#L7J4B5ILGZ(P4^s^kY0JX)0FMs!9@O9o> zEB@zq^{QoGGrllPJN;ny{?J!9rmge|pO-G{6Q}1OAZx;S#gpS}jQ(oBf1i}od{Rvo z`7PM7E@s!#_`b_LDh2DR3|~~gZQk(9px#sZ!2G{H`Mhd!Ou5TBINwWx7Dt_Y`2FD4 zz|+&^@BE2edC`L3=-Zs6znf40dH4R+s@|_$KPRS`oN9M?J;O}jSp3ABl^OC|%FCV| z`>#>-+S@X5cfx1NJ@}>!Ec#^s&U(waF#rGB9r7Ypg|BC?v6r-}%4R=*yR!M-jfdj@1Txl_X4klt18-@4-vnIVbl&QT;G4iH zsPMXy)19;UWLAYA0IqRibGxvm#gAfcm6bFg_w%t Date: Wed, 30 Mar 2016 11:28:21 -0400 Subject: [PATCH 223/328] weeeeee --- icons/obj/meteor.dmi | Bin 4228 -> 6350 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/meteor.dmi b/icons/obj/meteor.dmi index b852fbf7cf8b326a3a74f2dceed00f3b600d9c45..cd113fe5fa5d1b84fd325a685a5359e84da17e76 100644 GIT binary patch literal 6350 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 C`CUr@ literal 4228 zcmV-~5PR>5P)V=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+ z(=$pSoZ^zil2jm5DW$ZyM2U+tC9|j)$Tj5ROe;#vO@*-Giqditb2IbO393ua$uB2H zT~1r4^!2C4y?#+=3GVI3Wpku6Ayo{m*YccQA(dG7i1uL)O@y z@z`_D_nq(ZPcY7$IfEH{d{#UIL2mZ?>#v*g{GE5+F@8}5?Ao=V#q67bose`o-_UN4+ZCpTM_@7}#R1M=EyubKX6Jp!(F zAc`dT>mzH?;ysTpXBS*Cmp+yxM59sLi6Hn@RaN>y0!ReCefRF&CZ9`G6hwmd?b~M- z6%}Qrcl^wzO`9}WB_$>J;)^fLEnBu2xk!%3<3U4s6+*EtxP5NKVlgx*@IP{&gfHw> zApyAEZv9=6NJM{bYxp-f?fDAZwrw*{oH&se3CE5dGlz$VliqKYp1Qg^ELpNdgU_hQ z2BVA!P$x9ktXYHd@^ZZY{`=;uufCem7dRXaT)%!D3l}cb5kP=)@qC}phsK~E&9N4^ z*VmxEy&dbL4G1`c`WUa;9}JxXk0babfz}Z5X#yx$c96gbAkddCUDB`V{fq_yUkI`_ z0th&P=cB*BACr@l8K0aH)7RIhf9UMlv(eVpmi0x~L=#?p-W7m%txrn}A0by50rijI zhTUNm0A39~BSSmQ`R!<4dmi;cHzNLoWbN3o!~EovPmEl(pVvX}C(zZ^RXPfu@IQe- zAdozk$K*}G*|TSj4I4I?)bDlc)@hI9gI`Rq&eYy|>n(%PGden|L3{VzceA?qW4jKU z5l;+G1+3TaMJN=~4;nR}xqwkc04P!6a9Ho-dj!8V)QXr-y^-J~85y}+!qYoYJ--rV z6;5n;t`VJ`or%}3az)6Etk0R20D{jgy}h)wRD(Zn-aO5&HN+I4COw;;J~T80(=;(Y zK8`ouc*C%GPflS^>8XJ`30h6Sjq}m-$plNV{eJ&_;4=aUzE4F%Ybb!2$_q6iH@duu z$dKsB*88dPwBFtx^xVCJI?p0>b}9LDj-zj&8|I{es-gwz2-E&PfETrT^=hqg)bbZ! zd{F~>`0!zK#flZ0AOb>SNCLO}_wP3k9z2+r-V*pOL=X){HNef$mSpKENtS>nlCvMD zBhAUr24X=teNOCb-HPMxX8jpPPA>8z#_Q_nY=?jKa@-y6Ms0fzxVTs+T_z@yz&xyoi04xEh^PBq zenmu=23zEZpbHUAp$3GIAcPSiNqBRx0nMs2fJK6GHC|gsM?0#$mFkL2%$ltnbG#ew zEvoAIS5%!oj_9!3nlTu&4E%HBb0z9y6My>pOg!%hNUeBCNJB$|&INbx-UaoYo-bZD zckWyb94!~{1z<`FNm!*y%yv(EqVD&2k{TZj2GN8@_*JFzdChSRvPcX`XmPdz>z&yC z?PeVJHRq-O^nO07swxp38^HV}mAKXwLjRd6cz0ey`(GF791w>CWyN#x{qNR~#>a|q zd*0vh$}4{{Y;VL^3Gjk$-MXc{o)JJIm?s7X1~6;ZEEtA?x8Hu-eDlpWjcmPNNO&RG zgqHRH1KJbbtxY`-1OpmmzY_U9&Li-9{Th5BjSkQn3Beci;fU{)ew}MG#+p7+1yx~0 zou_ZG4~EKn#VApL$8hWKwJ37NF*w|V(yB5z;$s*c8bf{z6Fx`Md}zLc85#)y8-eIj|* z1kHpk;OE6d>TRLXIU)~48Gsm+6pG@+qZA) z*d+77jss?mzXr~(mXGj1`N?uTR zcX!%@DLu8dwOVor3OieZPU84ki30Wl{K1qV-Ki=dC@VtTR2EcaWUM`w^lC})0xZuZ zo-Ud%`}jUb5+X;tW7~1Wc^s#~aI&k2CNznOSwEdo)_≶eP2Rm#Jfd?w!2l$A33cF zx4wV8=5sh>&YYSsnkp%ap8N(C-~WF7pwVk$g?|~0fw*eGdQ@jzml#WT_97mu!Kx=z zk8mT5c+`RTn1U{Y8n8G`=a<$?UV7;z{XTX4&Ye4&fON+a;ENY8V%f4~+B2#D0zMNq zqbL(2_ym(){fBQGbx!bXPDGP{D~Wff^92MvLDe_AABdJ*fwvfIdbgu|5@nuQh{Qv1 zxW`n47sF*ZVct>7Va$fhF$bMjyHQnHh2gO3SK@@m$ew_yY^o$mQrIgnkux7qayZCi ztfGf2VUNPI_B(zrZN6 z4$QLgeySkV*(@1DNy8nC-Kc`2!l4>2C8gtWlvk81y)VLWB&x^K9c>*N{7hHH9!kKc zpMGjyxNt#($axPvo+ssiZK{(pQL_T7sHo7gB{_l8ap=&YDL*fB8{N@{8gW_y>Gr#m zIYGR7v$IL%ix7gU7xuV3$r(|Tvk^5xuacewe2j=(8?lR&-D$ZYsy>?Y*nOufONRM)Ef3cB>h%lm&1jCD(<5oO)16Gj1iv+MUS(&XRqbPk% zixw@?)e!fkGmf6wL9#2R3}pj8!6Jb{cL?E7Sm%PK*0nh9{yeGer!2!aA%);KMpRd< zqJTL=)ld5UT)SXaFc&8G<4WKvR;;Oq+w|c2$*Y)*PNFY1prX#DC!zFu%B*;OHmhRA z4;wzQ?tkW)XVBHvrOQ%=w)Ldk&oQ+%sWL$m92wf>bGrt~=ee3(jc5w^@sabiuBxc% zRymOwkvql#+?7G=^Bz{=&?wQIV2<;haLmy*LWks9#?owU{0wA1O3D3>FQGr>wN9; z()HT1B$-K~v@W^`X`GT$vY0ROC4n-uYuhgKl&WyT&ahtnlFG>H{d|y&P&9;)6Iyoc z0{@46cTmgeNPi5Am(-(=%aZ*!wC7tF>IM9~BOn)J-k>MaBbP5kJ42v z=lk4ddRwBc1l${EPb(Ag1Q2`zFVn}$%F5(j%e)nZQ_<=0eya@fH<5h)E^Z4UgI|96r9K~5 z0H*?6j(z_5=ckN_;#@9Rz~|NqzCPi-`$`Mtf!5!_akQ*L6FV)&fKJ0q8>5#!pfJ_$+=}5`D3ZkcpXQdLv zh#>d`o?DiJ1Vc!$8+^*oI8i5=j-Vl1QJxq z4Vg4*c@5*F3A1{k6@00LMEmWkKo|iMRs3$|A^y#RkRaesS0_G|=F8Z^mMSRK(s`lu z0|I^_Mggp7C_@CFWH9o$Wzx5TKV4JMsb)TzN>kPZh!@KL0VF2i+gbXF5mc74a&E~9 zavOc2!A~bCb|vHDT)a>`-0JaG@CyNi^_*5Rro-#AO|-U8L!}Z*y>RQ;*UqGy4H-W+ zlWAzCL=^v2yzs|r=}Jp^EkxM5Cj3hWJe}O+(^t&g7nBF!b|m5%0t(nE&k*nvuo(g# av;7}#_Are7G+EaG0000 Date: Wed, 30 Mar 2016 11:43:23 -0400 Subject: [PATCH 224/328] Make pai chatroom cost 5 --- code/modules/mob/living/silicon/pai/software_modules.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm index 813fc7a7fa5..1be45da5786 100644 --- a/code/modules/mob/living/silicon/pai/software_modules.dm +++ b/code/modules/mob/living/silicon/pai/software_modules.dm @@ -224,7 +224,7 @@ /datum/pai_software/chatroom name = "Digital Chatroom" - ram_cost = 3 + ram_cost = 5 id = "chatroom" toggle = 0 From 113c70a11b4d8b6f9f6c83cba2b458c454106f3d Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Wed, 30 Mar 2016 10:55:17 -0700 Subject: [PATCH 225/328] Fix Monkey-Transform disease --- code/datums/diseases/transformation.dm | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index 88f92c79074..e8ca3fa5f85 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -67,7 +67,7 @@ -/*/datum/disease/transformation/jungle_fever +/datum/disease/transformation/jungle_fever name = "Jungle Fever" cure_text = "Bananas" cures = list("banana") @@ -83,7 +83,7 @@ stage_prob = 4 visibility_flags = 0 agent = "Kongey Vibrion M-909" - new_form = /mob/living/carbon/monkey + new_form = /mob/living/carbon/human/monkey stage1 = null stage2 = null @@ -92,10 +92,9 @@ "You have a craving for bananas.", "Your mind feels clouded.") stage5 = list("You feel like monkeying around.") -/datum/disease/transformation/jungle_fever/do_disease_transformation(mob/living/carbon/affected_mob) - if(!ismonkey(affected_mob)) - ticker.mode.add_monkey(affected_mob.mind) - affected_mob.monkeyize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSE) +/datum/disease/transformation/jungle_fever/do_disease_transformation(mob/living/carbon/human/affected_mob) + if(!issmall(affected_mob)) + affected_mob.monkeyize() /datum/disease/transformation/jungle_fever/stage_act() ..() @@ -111,10 +110,6 @@ if(prob(3)) affected_mob.say(pick("Eeek, ook ook!", "Eee-eeek!", "Eeee!", "Ungh, ungh.")) -/datum/disease/transformation/jungle_fever/cure() - ticker.mode.remove_monkey(affected_mob.mind) - ..() -*/ /datum/disease/transformation/robot From 32c3cde6adb728919f25b7a444bd0bdb6fadf91c Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Wed, 30 Mar 2016 10:55:22 -0700 Subject: [PATCH 226/328] Fix advanced disease mixing (stupid fucking reagent code) --- code/modules/reagents/Chemistry-Colours.dm | 2 +- code/modules/reagents/Chemistry-Holder.dm | 34 ------------------- code/modules/reagents/newchem/disease.dm | 1 - .../oldchem/reagents/reagents_water.dm | 4 +-- code/modules/reagents/reagent_containers.dm | 2 +- 5 files changed, 4 insertions(+), 39 deletions(-) diff --git a/code/modules/reagents/Chemistry-Colours.dm b/code/modules/reagents/Chemistry-Colours.dm index 0fcc50b6f4d..176ec99c4d4 100644 --- a/code/modules/reagents/Chemistry-Colours.dm +++ b/code/modules/reagents/Chemistry-Colours.dm @@ -12,7 +12,7 @@ var/vol_temp // see libs/IconProcs/IconProcs.dm for(var/datum/reagent/reagent in reagent_list) - if(reagent.id == "blood" && reagent.data["blood_colour"]) + if(reagent.id == "blood" && reagent.data && reagent.data["blood_colour"]) reagent_color = reagent.data["blood_colour"] else reagent_color = reagent.color diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index bc76cccc978..5da35567af9 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -304,13 +304,6 @@ var/const/INGEST = 2 if(!C.no_message) M << "\blue \icon[my_atom] [C.mix_message]" - /* if(istype(my_atom, /obj/item/slime_core)) - var/obj/item/slime_core/ME = my_atom - ME.Uses-- - if(ME.Uses <= 0) // give the notification that the slime core is dead - for(var/mob/M in viewers(4, get_turf(my_atom)) ) - M << "\blue \icon[my_atom] The innards begin to boil!" - */ if(istype(my_atom, /obj/item/slime_extract)) var/obj/item/slime_extract/ME2 = my_atom ME2.Uses-- @@ -454,33 +447,6 @@ var/const/INGEST = 2 R.volume += amount update_total() my_atom.on_reagent_change() -/* - // mix dem viruses - if(R.id == "blood" && reagent == "blood") - if(R.data && data) - - if(R.data["viruses"] || data["viruses"]) - - var/list/mix1 = R.data["viruses"] - var/list/mix2 = data["viruses"] - - // Stop issues with the list changing during mixing. - var/list/to_mix = list() - - for(var/datum/disease/advance/AD in mix1) - to_mix += AD - for(var/datum/disease/advance/AD in mix2) - to_mix += AD - - var/datum/disease/advance/AD = Advance_Mix(to_mix) - if(AD) - var/list/preserve = list(AD) - for(var/D in R.data["viruses"]) - if(!istype(D, /datum/disease/advance)) - preserve += D - R.data["viruses"] = preserve -*/ - handle_reactions() return 0 diff --git a/code/modules/reagents/newchem/disease.dm b/code/modules/reagents/newchem/disease.dm index 2ba90751cfc..7039e7cb6ef 100644 --- a/code/modules/reagents/newchem/disease.dm +++ b/code/modules/reagents/newchem/disease.dm @@ -109,7 +109,6 @@ /datum/chemical_reaction/mix_virus name = "Mix Virus" id = "mixvirus" - result = "blood" required_reagents = list("virusfood" = 1) required_catalysts = list("blood" = 1) var/level_min = 0 diff --git a/code/modules/reagents/oldchem/reagents/reagents_water.dm b/code/modules/reagents/oldchem/reagents/reagents_water.dm index efb615f85f3..24cad5d5e64 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_water.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_water.dm @@ -190,8 +190,8 @@ preserve += D data["viruses"] = preserve - if(data["blood_colour"]) - color = data["blood_colour"] + if(mix_data["blood_colour"]) + color = mix_data["blood_colour"] return 1 /datum/reagent/blood/on_update(var/atom/A) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index ea481d34aaa..1c1ea684f26 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -35,7 +35,7 @@ processing_objects.Add(src) if(spawned_disease) var/datum/disease/F = new spawned_disease(0) - var/list/data = list("viruses"= list(F)) + var/list/data = list("viruses" = list(F), "blood_colour" = "#A10808") reagents.add_reagent("blood", disease_amount, data) if(list_reagents) reagents.add_reagent_list(list_reagents) From 917dc9ab543e51b3a1b9e9ad4e4ddeebbd4d56a9 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Wed, 30 Mar 2016 10:58:24 -0700 Subject: [PATCH 227/328] Add PanDEMIC design datum --- code/modules/research/designs/comp_board_designs.dm | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/code/modules/research/designs/comp_board_designs.dm b/code/modules/research/designs/comp_board_designs.dm index 67d7ca2b2fb..59328d31a5b 100644 --- a/code/modules/research/designs/comp_board_designs.dm +++ b/code/modules/research/designs/comp_board_designs.dm @@ -182,6 +182,16 @@ build_path = /obj/item/weapon/circuitboard/operating category = list("Computer Boards") +/datum/design/pandemic + name = "Computer Design (PanD.E.M.I.C. 2200)" + desc = "Allows for the construction of circuit boards used to build a PanD.E.M.I.C. 2200 console." + id = "pandemic" + req_tech = list("programming" = 2, "biotech" = 2) + build_type = IMPRINTER + materials = list(MAT_GLASS = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/pandemic + category = list("Computer Boards") + /datum/design/powermonitor name = "Console Board (Power Monitor)" desc = "Allows for the construction of circuit boards used to build a new power monitor" From 12efef6029319912b3460204e61637cde43eeffd Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Wed, 30 Mar 2016 11:02:09 -0700 Subject: [PATCH 228/328] Add wizarditis as contraband for the MagiVend --- code/game/machinery/vending.dm | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 9a6b551a843..4a40906dc7b 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -1008,7 +1008,13 @@ vend_delay = 15 vend_reply = "Have an enchanted evening!" product_ads = "FJKLFJSD;AJKFLBJAKL;1234 LOONIES LOL!;>MFW;Kill them fuckers!;GET DAT FUKKEN DISK;HONK!;EI NATH;Destroy the station!;Admin conspiracies since forever!;Space-time bending hardware!" - products = list(/obj/item/clothing/head/wizard = 1,/obj/item/clothing/suit/wizrobe = 1,/obj/item/clothing/head/wizard/red = 1,/obj/item/clothing/suit/wizrobe/red = 1,/obj/item/clothing/shoes/sandal = 1,/obj/item/weapon/twohanded/staff = 2) + products = list(/obj/item/clothing/head/wizard = 1, + /obj/item/clothing/suit/wizrobe = 1, + /obj/item/clothing/head/wizard/red = 1, + /obj/item/clothing/suit/wizrobe/red = 1, + /obj/item/clothing/shoes/sandal = 1, + /obj/item/weapon/twohanded/staff = 2) + contraband = list(/obj/item/weapon/reagent_containers/glass/bottle/wizarditis = 1) /obj/machinery/vending/autodrobe name = "\improper AutoDrobe" From 5fb19462010128539801a1886a425be73d69aa6e Mon Sep 17 00:00:00 2001 From: FalseIncarnate Date: Wed, 30 Mar 2016 15:42:35 -0400 Subject: [PATCH 229/328] Fixes "Adjust Signaler Settings" option not working Window does show up behind the multi-tool menu, but that's not a huge issue. --- code/modules/assembly/signaler.dm | 13 ++++++------- code/modules/logic/converter.dm | 2 +- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index 2902e3b59c2..d6d6352f333 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -20,13 +20,12 @@ /obj/item/device/assembly/signaler/New() ..() - if(!radio_controller) - spawn(40) - set_frequency(frequency) - else - spawn(1) // For things that set the frequency directly - set_frequency(frequency) - return + if(radio_controller) + set_frequency(frequency) + +/obj/item/device/assembly/signaler/initialize() + if(radio_controller) + set_frequency(frequency) /obj/item/device/assembly/signaler/Destroy() if(radio_controller) diff --git a/code/modules/logic/converter.dm b/code/modules/logic/converter.dm index 3c9266b6c88..635bbf87176 100644 --- a/code/modules/logic/converter.dm +++ b/code/modules/logic/converter.dm @@ -112,7 +112,7 @@ attached_signaler.receiving = 1 else attached_signaler.receiving = 0 - if("adjust_signaler" in href_list && attached_signaler) //Make sure that we have a signaler attached to handle this one, otherwise ignore this command + if(("adjust_signaler" in href_list) && attached_signaler) //Make sure that we have a signaler attached to handle this one, otherwise ignore this command attached_signaler.interact(user, 1) update_multitool_menu(user) From c22ef3ed1d65c9644e02ed5502018663da1a12c9 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Wed, 30 Mar 2016 16:26:58 -0400 Subject: [PATCH 230/328] Automatic changelog generation for PR #3927 --- html/changelogs/AutoChangeLog-pr-3927.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3927.yml diff --git a/html/changelogs/AutoChangeLog-pr-3927.yml b/html/changelogs/AutoChangeLog-pr-3927.yml new file mode 100644 index 00000000000..586ab4c9c09 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3927.yml @@ -0,0 +1,4 @@ +author: Crazylemon64 +delete-after: True +changes: + - rscadd: "Metal foam walls will now produce flooring on space tiles" From 6c1e2ac586a608e3e28ec9dc6f025539737e6d51 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Wed, 30 Mar 2016 16:34:23 -0400 Subject: [PATCH 231/328] Automatic changelog generation for PR #4038 --- html/changelogs/AutoChangeLog-pr-4038.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4038.yml diff --git a/html/changelogs/AutoChangeLog-pr-4038.yml b/html/changelogs/AutoChangeLog-pr-4038.yml new file mode 100644 index 00000000000..38a7c85f3bc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4038.yml @@ -0,0 +1,4 @@ +author: Fethas +delete-after: True +changes: + - bugfix: "Hell has recently remapped its blood transit system and you can now once again crawl through blood. We are sorry for the-GIVE US YOUR SOUL!" From 5b3d5b51d8df0ff6039c6a0564db9d23b0a740a4 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Wed, 30 Mar 2016 16:44:44 -0400 Subject: [PATCH 232/328] Automatic changelog generation for PR #4005 --- html/changelogs/AutoChangeLog-pr-4005.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4005.yml diff --git a/html/changelogs/AutoChangeLog-pr-4005.yml b/html/changelogs/AutoChangeLog-pr-4005.yml new file mode 100644 index 00000000000..66eee189c5b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4005.yml @@ -0,0 +1,4 @@ +author: FlattestGuitar +delete-after: True +changes: + - tweak: "Alcoholic beverages now have proper levels of ethanol in them. Good luck passing out after a beer." From 1fc692ba94513559bc72e3ee7be659aa262b6c29 Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Wed, 30 Mar 2016 17:08:04 -0400 Subject: [PATCH 233/328] Adds power-generating treadmills to brig cells. --- _maps/map_files/cyberiad/cyberiad.dmm | 61 ++++--- code/game/machinery/doors/brigdoors.dm | 20 ++- code/modules/power/treadmill.dm | 225 +++++++++++++++++++++++++ paradise.dme | 1 + 4 files changed, 279 insertions(+), 28 deletions(-) create mode 100644 code/modules/power/treadmill.dm diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index a4bdd72dbe3..9510120cdc0 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -66,8 +66,8 @@ "abn" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "abo" = (/obj/machinery/camera{c_tag = "Prison Recreation Room"; dir = 1; network = list("Prison","SS13"); pixel_x = 22},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "abp" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"abq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) -"abr" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"abq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) +"abr" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/power/treadmill,/obj/machinery/treadmill_monitor{on = 1; pixel_x = 32; redeem_immediately = 1},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig) "abs" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/security/permabrig) "abt" = (/obj/machinery/door/airlock{name = "Toilet"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig) "abu" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/plating,/area/security/permabrig) @@ -936,20 +936,20 @@ "arZ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/prisonershuttle) "asa" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/security/prisonershuttle) "asb" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/prisonershuttle) -"asc" = (/obj/structure/stool/bed,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prison/cell_block/B) -"asd" = (/obj/machinery/flasher{id = "Cell 6"; pixel_x = 0; pixel_y = -28},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/B) +"asc" = (/obj/structure/stool/bed,/obj/machinery/flasher{id = "Cell 6"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prison/cell_block/B) +"asd" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/power/treadmill{dir = 4},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/treadmill_monitor{id = "Cell 6"; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/B) "ase" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable,/turf/simulated/floor/plating,/area/security/prison/cell_block/B) "asf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/device/radio/intercom{pixel_x = -28},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B) "asg" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B) "ash" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable,/turf/simulated/floor/plating,/area/security/prison/cell_block/A) -"asi" = (/obj/structure/stool/bed,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prison/cell_block/A) -"asj" = (/obj/machinery/flasher{id = "Cell 3"; pixel_x = 0; pixel_y = -28},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A) +"asi" = (/obj/structure/stool/bed,/obj/machinery/flasher{id = "Cell 3"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prison/cell_block/A) +"asj" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/power/treadmill{dir = 4},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/treadmill_monitor{id = "Cell 3"; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A) "ask" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating,/area/security/prison/cell_block/A) "asl" = (/obj/item/device/radio/intercom{pixel_x = -28},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A) "asm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/device/radio/intercom{pixel_x = 28},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A) "asn" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plating,/area/security/prison/cell_block/A) -"aso" = (/obj/machinery/flasher{id = "Cell 1"; pixel_x = 0; pixel_y = -28},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A) -"asp" = (/obj/structure/stool/bed,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/prison/cell_block/A) +"aso" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/power/treadmill{dir = 8},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/treadmill_monitor{id = "Cell 1"; pixel_y = -32},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A) +"asp" = (/obj/structure/stool/bed,/obj/machinery/flasher{id = "Cell 1"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/prison/cell_block/A) "asq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/lobby) "asr" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable,/turf/simulated/floor/plating,/area/security/brig) "ass" = (/obj/machinery/computer/security{network = list("SS13","Research Outpost","Mining Outpost")},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/security/brig) @@ -1029,11 +1029,11 @@ "atO" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prisonershuttle) "atP" = (/obj/structure/closet/secure_closet/brig{id = "Cell 5"; name = "Cell 5 Locker"},/obj/machinery/camera{c_tag = "Brig Cell 5"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prison/cell_block/B) "atQ" = (/obj/structure/closet/secure_closet/brig{id = "Cell 4"; name = "Cell 4 Locker"},/obj/machinery/camera{c_tag = "Brig Cell 4"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prison/cell_block/A) -"atR" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/security/prison/cell_block/A) -"atS" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A) -"atT" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A) -"atU" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/prison/cell_block/A) -"atV" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; layer = 2.4; on = 1},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A) +"atR" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/wall,/area/security/prison/cell_block/B) +"atS" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/wall,/area/security/prison/cell_block/A) +"atT" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/security/prison/cell_block/B) +"atU" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/B) +"atV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B) "atW" = (/obj/structure/closet/secure_closet/brig{id = "Cell 2"; name = "Cell 2 Locker"},/obj/machinery/camera{c_tag = "Brig Cell 2"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/prison/cell_block/A) "atX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/lobby) "atY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/lobby) @@ -1062,18 +1062,18 @@ "auv" = (/turf/simulated/floor/plating/airless,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "solar_tool_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = -25; req_access_txt = "13"},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/auxport) "auw" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prisonershuttle) "aux" = (/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/prisonershuttle) -"auy" = (/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B) +"auy" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B) "auz" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/window/brigdoor{dir = 8; id = "Cell 5"; name = "Cell 5"; req_access_txt = "2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B) "auA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B) "auB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B) "auC" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/security/prison/cell_block/A) "auD" = (/obj/machinery/light/small{dir = 8},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prison/cell_block/A) -"auE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A) +"auE" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/security/prison/cell_block/A) "auF" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/window/brigdoor{dir = 8; id = "Cell 4"; name = "Cell 4"; req_access_txt = "2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A) "auG" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A) "auH" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A) "auI" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/window/brigdoor{dir = 4; id = "Cell 2"; name = "Cell 2"; req_access_txt = "2"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A) -"auJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A) +"auJ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A) "auK" = (/obj/machinery/light/small{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/prison/cell_block/A) "auL" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/security/prison/cell_block/A) "auM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/lobby) @@ -1083,7 +1083,7 @@ "auQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/lobby) "auR" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/prison/cell_block/C) "auS" = (/obj/structure/stool/bed/chair{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/C) -"auT" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/C) +"auT" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A) "auU" = (/obj/machinery/door/airlock{name = "Toilet"},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/C) "auV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/window/basic,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office) "auW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/window/southright,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office) @@ -1113,19 +1113,19 @@ "avu" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_tool_outer"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/auxsolarport) "avv" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/prisonershuttle) "avw" = (/obj/machinery/door_control{id = "laborexit"; name = "Exit Door"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = -25},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/prisonershuttle) -"avx" = (/obj/machinery/flasher{id = "Cell 5"; pixel_x = 0; pixel_y = -28},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/B) +"avx" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A) "avy" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plating,/area/security/prison/cell_block/B) "avz" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/door_timer/cell_5,/obj/item/device/radio/intercom{pixel_x = -28},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B) "avA" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable,/obj/machinery/power/apc{name = "Prison Cell Block B APC"; pixel_y = -24},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B) -"avB" = (/obj/machinery/flasher{id = "Cell 4"; pixel_x = 0; pixel_y = -28},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A) +"avB" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; layer = 2.4; on = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A) "avC" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_x = -28; pixel_y = -22},/obj/machinery/door_timer/cell_4{pixel_y = -30},/obj/item/device/radio/intercom{pixel_x = -28},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A) "avD" = (/obj/structure/cable,/obj/machinery/door_timer/cell_2{pixel_x = 0; pixel_y = -30},/obj/machinery/power/apc{dir = 2; name = "Prison Cell Block A APC"; pixel_x = 24; pixel_y = -24},/obj/item/device/radio/intercom{pixel_x = 28},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A) -"avE" = (/obj/machinery/flasher{id = "Cell 2"; pass_flags = 0; pixel_x = 0; pixel_y = -26},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A) +"avE" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/security/prison/cell_block/A) "avF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/lobby) "avG" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/lobby) "avH" = (/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/lobby) "avI" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/lobby) -"avJ" = (/turf/simulated/floor/plasteel,/area/security/prison/cell_block/C) +"avJ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B) "avK" = (/obj/structure/toilet{dir = 8},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/prison/cell_block/C) "avL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/closet{name = "Evidence Closet"},/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/security/detectives_office) "avM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/security/detectives_office) @@ -8719,6 +8719,17 @@ "dlI" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 8},/area/hydroponics) "dlJ" = (/obj/machinery/portable_atmospherics/hydroponics{closed_system = 1; name = "isolation tray"},/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics) "dlK" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/turf/simulated/floor/plasteel,/area/hydroponics) +"dlL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A) +"dlM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A) +"dlN" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/C) +"dlO" = (/obj/machinery/door/airlock/engineering{name = "Electrical Maintenance"; req_access_txt = "0"; req_one_access_txt = "1;11"},/turf/simulated/floor/plating,/area/security/prisonershuttle) +"dlP" = (/obj/structure/stool/bed,/obj/machinery/flasher{id = "Cell 5"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prison/cell_block/B) +"dlQ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/power/treadmill{dir = 4},/obj/structure/cable/yellow,/obj/machinery/treadmill_monitor{id = "Cell 5"; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/B) +"dlR" = (/obj/structure/stool/bed,/obj/machinery/flasher{id = "Cell 4"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prison/cell_block/A) +"dlS" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/power/treadmill{dir = 4},/obj/structure/cable/yellow,/obj/machinery/treadmill_monitor{id = "Cell 4"; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A) +"dlT" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/power/treadmill{dir = 8},/obj/structure/cable/yellow,/obj/machinery/treadmill_monitor{id = "Cell 2"; pixel_y = -32},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A) +"dlU" = (/obj/structure/stool/bed,/obj/machinery/flasher{id = "Cell 2"; pass_flags = 0; pixel_x = 0; pixel_y = -26},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/prison/cell_block/A) +"dlV" = (/obj/machinery/power/treadmill{dir = 4},/obj/machinery/treadmill_monitor{on = 1; pixel_y = -32; redeem_immediately = 1},/obj/structure/cable/yellow,/turf/simulated/floor/plasteel,/area/security/prison/cell_block/C) (1,1,1) = {" bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik @@ -8807,10 +8818,10 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikapsapsapsapsapsbikbikbikbikbikbikacGaqbamLamLamLamLamLbikamMbikamLamLamLamLamLaabacGbikbikbikaEEaoEaoCaoFamOamRamSamSamSaqgaqhaqiaqjaqkaqlaqmapBaqnaqoaqpaqqaqraqsaqtaquaqvaqwaqxaqyaqzaqAaqsaqBaqCaqDaqEaqFaqGaqHaqCapOaqIaqJaqKaqLapOaqMaqNaqOaqPaqQaqRapXapmaqSaqTaqUaqVaqWaqWaqXamKaqYamKaabaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmbikbikbikaabaloaabbikbikaqZbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikapsapsapsapsapsbikbikbikbikbikbikacGbikbikbikaabbikbikbikanvbikbikbikaabbikbikbikacGbikbikbikamOaoGaoCaoCaptanAapuanCanAapvanLarharianGanGarjapBarkarlarmarnaroarparqarrarsartaruarvarrarwarxaryarzarAarBarCarDarEarFarGarHarIarJarKapOarLarMarMarNarMarOapXapmaovaovaovaovarPaovarQarRarSamKakBarTakEbikbikaiIaabaabaabaabaiIaabaabaabaabaiIaabaabaabaabarUarVakEaabbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikapsapsapsapsapsbikbikbikbikbikbikacGaabalpalpalpalpalpbikamMbikalpalpalpalpalpaabacGbikbikbikamOaqcaqcaqcamOamRamSamSamSarXarYaoMarZasaanGasbapBascasdaseasfasgashasiasjaskaslasmasnasoaspashasqarFasrassastasrarEasuapOarGaswasxasyapOaszasAarMarNarMasBapXasCasDasEasFasEasGasHamKamKapnamKaloasIasJakCakCarTakCakCakCakCarTakCakCakCakCarTakCakCakCasKasLasIaloaabbikagQaabbikbikbikbikbikbikbikbikbikbikaabbikaabbikasMasMasNasNasNasNasNasNasMasMaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikapsapsapsapsapsbikbikbikbikbikbikacGbikalSalTalTalTalTalUalValWalXalXalXalXalYbikacGbikbikbikaqeaqdaqdaqdaqfbikbikbikapwapwapwapwapwasSanGasTasUapBapBapBasVasWapEapEapEapEasXasYapEapEapEasZataatbatcatdateatfatgathapOatiatjatkatlatmatnatoatpatqarMatrapXatsattatuatvatwatxatyatzatAatBamKatCarTatDaabaabbikaabbikbikbikbikbikbikbikbikaabaabaabaabaabatEatFatDaabaabaabaabaabbikbikbikbikbikbikbikbikbikaabbikaabasMasMatGatHatIatJatKatLatMatIasMasMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikapsapsapsapsapsbikbikbikbikbikbikaabatNamLamLamLamLamLbikamMbikamLamLamLamLamLaabacGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikapwatOanGasTasUatPaqoaqpaqqaqraqsatQaquatRatSatTatUatVatWaqsatXatYatZauaaubaubaucaudapOaueaufaugauhapOauiaujaukarNarMaulapXatsarPattattattaumaovaunauoaupamKbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabbikaabaabaabaabauqaabaabbikbikaabaabaabbikbikbikbikbikbikbikbikasMasMasMasMauratJausatJausautatJatJatJauuasMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikapsapsapsapsapsbikbikbikbikbikbikacGbikbikaabbikaabbikbikauvbikbikaabbikaabbikbikacGbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikapwauwanGauxasUarkauyauzauAauBauCauDauEauFauGauHauIauJauKauLauMauNauNauOauNauNauPauQauRauSauTapOauUapOauVauWauXauYauZavaapXatsavbavcavcavcavdaveavfavgavhamKbikbikbikbikbikaahbikbikbikbikbikbikbikaabaabbikbikbikaabaabaabaviaabaabbikbikaabbikaabaabbikbikbikbikbikbikbikasMavjavkavlavmavnavoavpatJatJavqavratJavsasMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikapsapsapsapsapsbikbikbikbikbikbikacGacGacGaabaabaabaabavtavuavtaabaabaabaabacGacGacGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikapwavvanGavwasUascavxavyavzavAashasiavBashavCavDashavEaspashavFavGavHavGavGavHavGavIapOatiavJapOavKapOavLavMavNavOavPavQavRavSavTavUavUavUavVavWavXavYavYavYbikbikbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikaabaabavZawaavZaabaabbikaabbikbikaabaabbikbikbikbikbikbikasMawbawcawdaweawfawgatJatJatJawhawiatJawjasMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikapsapsapsapsapsbikbikbikbikbikbikacGbikalSalTalTalTalTalUalValWalXalXalXalXalYbikacGbikbikbikaqeaqdaqdaqdaqfbikbikbikapwapwapwapwapwasSanGasTasUapBatRapBasVasWapEapEatSapEasXasYapEatSapEasZataatbatcatdateatfatgathapOatiatjatkatlatmatnatoatpatqarMatrapXatsattatuatvatwatxatyatzatAatBamKatCarTatDaabaabbikaabbikbikbikbikbikbikbikbikaabaabaabaabaabatEatFatDaabaabaabaabaabbikbikbikbikbikbikbikbikbikaabbikaabasMasMatGatHatIatJatKatLatMatIasMasMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikapsapsapsapsapsbikbikbikbikbikbikaabatNamLamLamLamLamLbikamMbikamLamLamLamLamLaabacGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikapwatOanGasTasUatPatUatTauyatVaqsatQauJauEavxauTavEavBatWaqsatXatYatZauaaubaubaucaudapOaueaufaugauhapOauiaujaukarNarMaulapXatsarPattattattaumaovaunauoaupamKbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabbikaabaabaabaabauqaabaabbikbikaabaabaabbikbikbikbikbikbikbikbikasMasMasMasMauratJausatJausautatJatJatJauuasMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikapsapsapsapsapsbikbikbikbikbikbikacGbikbikaabbikaabbikbikauvbikbikaabbikaabbikbikacGbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikapwauwanGauxasUarkavJauzauAauBauCauDdlLauFauGauHauIdlMauKauLauMauNauNauOauNauNauPauQauRauSdlNapOauUapOauVauWauXauYauZavaapXatsavbavcavcavcavdaveavfavgavhamKbikbikbikbikbikaahbikbikbikbikbikbikbikaabaabbikbikbikaabaabaabaviaabaabbikbikaabbikaabaabbikbikbikbikbikbikbikasMavjavkavlavmavnavoavpatJatJavqavratJavsasMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikapsapsapsapsapsbikbikbikbikbikbikacGacGacGaabaabaabaabavtavuavtaabaabaabaabacGacGacGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdlOavvanGavwasUdlPdlQavyavzavAashdlRdlSashavCavDashdlTdlUashavFavGavHavGavGavHavGavIapOatidlVapOavKapOavLavMavNavOavPavQavRavSavTavUavUavUavVavWavXavYavYavYbikbikbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikaabaabavZawaavZaabaabbikaabbikbikaabaabbikbikbikbikbikbikasMawbawcawdaweawfawgatJatJatJawhawiatJawjasMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikapsapsapsapsapsbikaahbikbikbikbikaabbikaabbikbikaabbikavtawkawlbikbikaabbikbikaabbikbikbikbikbikbikbikbikbikbikawmawmawmawmawmawmapwapwawnapwasUasUasUawoawpawqawrawrawsawrawsawrawrawtasZasZasvawvawwawuawvawwawuawyawzawzawzawzawzapOawAawBawCawCawDawCawEawFavUawGawHawIavVawJawKawLawMavWbikbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikaabbikavZawNavZbikaabbikaabbikbikbikaabaabbikbikbikbikbikasMawOawPavlawQawRawSawTatJawUawVawWawXasMawYaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikapsapsapsapsapsbikbikbikbikbikbikaabbikaabbikbikaabavtavtawZaxaavtbikaabbikbikaabbikbikbikbikbikbikbikbikbikbikawmaxbaxcaxdaxeaxfaxgaxhaxiaxhaxjaxhaxhaxkaxlaxlaxlaxlaxlaxmaxnaxoaxlaxlaxlaxlaxpaxlaxlaxlaxlaxqaxraxsaxtaxuaxvaxwaxxapWaxyaxzaxAaxBaxCaxDaxEaxFavUaxGaxHaxIavVaxKaxLaxJaAZavWbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikbikaabavZavZaxMavZavZaabbikaabbikbikbikbikaabaabbikbikbikbikasMaxNaxOavlasMavlavlaxPaxQasMasMasMasMasMasMaabaabbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikapsapsapsbikbikbikbikbikbikaabaabbikaabbikbikaabaxRaxSaxTaxUaxRaxVaxVbikbikaabbikbikbikbikbikbikbikbikbikbikawmaxWaxXaxYaxZayaaybaycaydayeayfaxqaxqaygaxqaxqaxqaxqaxqayhaxqaxqaxqaxqaxqaxqayiaxqaxqaxqaxqayjaxqaykaxqaylaxqaymaynapWayoaypayqayraysaytaxEayuavUayvaywayxayyayzayAayBawMavWbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikbikbikaabayCayDayEayFayCaabbikaabbikbikaabbikbikaabaabbikbikayGasMavlasMavlayHayIayHayJayHayHayHayKayGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index d3893e5cbaa..3e611b8dea4 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -43,16 +43,20 @@ spawn(20) for(var/obj/machinery/door/window/brigdoor/M in airlocks) - if (M.id == src.id) + if (M.id == id) targets += M for(var/obj/machinery/flasher/F in machines) - if(F.id == src.id) + if(F.id == id) targets += F for(var/obj/structure/closet/secure_closet/brig/C in world) - if(C.id == src.id) + if(C.id == id) targets += C + + for(var/obj/machinery/treadmill_monitor/T in machines) + if(T.id == id) + targets += T if(targets.len==0) stat |= BROKEN @@ -108,6 +112,11 @@ if(C.opened && !C.close()) continue C.locked = 1 C.icon_state = C.icon_locked + + for(var/obj/machinery/treadmill_monitor/T in targets) + T.total_joules = 0 + T.on = 1 + return 1 @@ -129,6 +138,11 @@ C.locked = 0 C.icon_state = C.icon_closed + for(var/obj/machinery/treadmill_monitor/T in targets) + if(!T.stat) + T.redeem() + T.on = 0 + return 1 diff --git a/code/modules/power/treadmill.dm b/code/modules/power/treadmill.dm new file mode 100644 index 00000000000..84437c672c3 --- /dev/null +++ b/code/modules/power/treadmill.dm @@ -0,0 +1,225 @@ +#define BASE_MOVE_DELAY 8 +#define MAX_SPEED 2 + +/obj/machinery/power/treadmill + icon = 'icons/obj/recycling.dmi' + icon_state = "conveyor0" + name = "treadmill" + desc = "A power-generating treadmill." + layer = 2.2 + anchored = 1 + use_power = 0 + + var/speed = 0 + var/friction = 0.15 // lose this much speed every ptick + var/inertia = 0.25 // multiplier to mob speed, when increasing treadmill speed + var/throw_dist = 2 // distance to throw the person, worst case + var/power_gen = 4000 // amount of power output at max speed + var/list/mobs_running[0] + var/id = null // for linking to monitor + +/obj/machinery/power/treadmill/initialize() + ..() + if(anchored) + connect_to_network() + +/obj/machinery/power/treadmill/update_icon() + icon_state = speed ? "conveyor-1" : "conveyor0" + +/obj/machinery/power/treadmill/Crossed(mob/living/M) + if(anchored && !M.anchored) + if(!istype(M) || M.dir != dir) + throw_off(M) + else + mobs_running[M] = M.last_movement + . = ..() + +/obj/machinery/power/treadmill/Uncrossed(mob/living/M) + if(anchored && istype(M)) + mobs_running -= M + . = ..() + +/obj/machinery/power/treadmill/proc/throw_off(atom/movable/A) + // if 2fast, throw the person, otherwise they just slide off, if there's reasonable speed at all + if(speed) + var/dist = max(throw_dist * speed / MAX_SPEED, 1) + A.throw_at(get_distant_turf(get_turf(src), reverse_direction(dir), dist), A.throw_range, A.throw_speed, src, 1) + +/obj/machinery/power/treadmill/process() + if(!anchored) + speed = 0 + update_icon() + return + + speed = Clamp(speed - friction, 0, MAX_SPEED) + for(var/A in (loc.contents - src)) + var/atom/movable/AM = A + if(AM.anchored) + continue + if(istype(A, /mob/living)) + var/mob/living/M = A + var/last_move + // get/update old step count + if(mobs_running[M]) + last_move = mobs_running[M] + else + last_move = M.last_movement + mobs_running[M] = M.last_movement + // if we "stepped" in right direction, add to speed, else throw the person off like a common obj + if(last_move != M.last_movement && dir == M.dir) + // a reasonable approximation of movement speed + var/mob_speed = M.movement_delay() + switch(M.m_intent) + if("run") + if(M.drowsyness > 0) + mob_speed += 6 + mob_speed += config.run_speed - 1 + if("walk") + mob_speed += config.walk_speed - 1 + mob_speed = BASE_MOVE_DELAY / max(1, BASE_MOVE_DELAY + mob_speed) + speed = min(speed + inertia * mob_speed, mob_speed) + continue + throw_off(A) + + var/output = get_power_output() + if(output) + add_avail(output) + update_icon() + +/obj/machinery/power/treadmill/proc/get_power_output() + if(speed && !stat && anchored && powernet) + return power_gen * speed / MAX_SPEED + return 0 + +/obj/machinery/power/treadmill/emp_act(severity) + ..() + if(!(stat & BROKEN)) + stat |= BROKEN + spawn(100) + stat &= ~BROKEN + +/obj/machinery/power/treadmill/attackby(obj/item/W, mob/user) + if(default_unfasten_wrench(user, W, time = 60)) + if(anchored) + connect_to_network() + else + disconnect_from_network() + speed = 0 + update_icon() + return + ..() + +#undef BASE_MOVE_DELAY +#undef MAX_SPEED + +#define CHARS_PER_LINE 5 +#define FONT_SIZE "5pt" +#define FONT_COLOR "#09f" +#define FONT_STYLE "Arial Black" + +/obj/machinery/treadmill_monitor + name = "Treadmill Monitor" + icon = 'icons/obj/status_display.dmi' + icon_state = "frame" + desc = "Monitors treadmill use." + anchored = 1 + density = 0 + maptext_height = 26 + maptext_width = 32 + + var/on = 0 // if we should be metering or not + var/id = null // id of treadmill + var/obj/machinery/power/treadmill/treadmill = null + var/total_joules = 0 // total power from prisoner + var/J_per_ticket = 45000 // amt of power charged for a ticket + var/line1 = "" + var/line2 = "" + var/frame = 0 // on 0, show labels, on 1 show numbers + var/redeem_immediately = 0 // redeem immediately for holding cell + +/obj/machinery/treadmill_monitor/initialize() + if(id) + for(var/obj/machinery/power/treadmill/T in machines) + if(T.id == id) + treadmill = T + break + if(!treadmill) + // also simply check if treadmill at loc + for(var/obj/machinery/power/treadmill/T in loc) + treadmill = T + break + +/obj/machinery/treadmill_monitor/process() + if(stat & (NOPOWER|BROKEN)) + return + if(treadmill && on) + var/output = treadmill.get_power_output() + if(output) + total_joules += output + if(redeem_immediately && total_joules > J_per_ticket) + redeem() + total_joules = 1 + update_icon() + frame = !frame + +/obj/machinery/treadmill_monitor/power_change() + ..() + update_icon() + +/obj/machinery/treadmill_monitor/examine(mob/user) + ..() + user << "The display reads:

    [line1]
    [line2]
    " + +/obj/machinery/treadmill_monitor/update_icon() + overlays.Cut() + if(stat & NOPOWER || !total_joules || !on) + line1 = "" + line2 = "" + else if(stat & BROKEN) + overlays += image('icons/obj/status_display.dmi', icon_state = "ai_bsod") + line1 = "A@#$A" + line2 = "729%!" + else + if(!frame) + line1 = "-W/S-" + line2 = "-TIX-" + else + if(!treadmill || treadmill.stat) + line1 = "???" + else + line1 = "[add_zero(num2text(round(treadmill.get_power_output())), 4)]" + if(length(line1) > CHARS_PER_LINE) + line1 = "Error" + if(J_per_ticket) + line2 = "[round(total_joules / J_per_ticket)]" + if(length(line2) > CHARS_PER_LINE) + line2 = "Error" + update_display(line1, line2) + +//Checks to see if there's 1 line or 2, adds text-icons-numbers/letters over display +// Stolen from status_display +/obj/machinery/treadmill_monitor/proc/update_display(var/line1, var/line2) + var/new_text = {"
    [line1]
    [line2]
    "} + if(maptext != new_text) + maptext = new_text + +// called by brig timer when prisoner released +/obj/machinery/treadmill_monitor/proc/redeem() + if(total_joules >= J_per_ticket && J_per_ticket) + playsound(loc, 'sound/machines/chime.ogg', 50, 1) + new /obj/item/stack/tickets(get_turf(src), round(total_joules / J_per_ticket)) + total_joules = 0 + +/obj/machinery/treadmill_monitor/emp_act(severity) + ..() + if(!(stat & BROKEN)) + stat |= BROKEN + update_icon() + spawn(100) + stat &= ~BROKEN + update_icon() + +#undef FONT_SIZE +#undef FONT_COLOR +#undef FONT_STYLE +#undef CHARS_PER_LINE \ No newline at end of file diff --git a/paradise.dme b/paradise.dme index 4a673c9da4a..43b62719f0c 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1615,6 +1615,7 @@ #include "code\modules\power\switch.dm" #include "code\modules\power\terminal.dm" #include "code\modules\power\tracker.dm" +#include "code\modules\power\treadmill.dm" #include "code\modules\power\turbine.dm" #include "code\modules\power\singularity\collector.dm" #include "code\modules\power\singularity\containment_field.dm" From fb9c883b90a4f4cfa30fae98cfd4b9774b8b0b20 Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Wed, 30 Mar 2016 17:55:31 -0400 Subject: [PATCH 234/328] Makes medibots ignore IPC's --- code/modules/mob/living/simple_animal/bot/medbot.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm index b1504fdb109..588588a1e3f 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -353,6 +353,12 @@ if(C.suiciding) return 0 //Kevorkian school of robotic medical assistants. + // is secretly a silicon + if(ishuman(C)) + var/mob/living/carbon/human/H = C + if(H.species && H.species.reagent_tag == PROCESS_SYN) + return 0 + if(emagged == 2) //Everyone needs our medicine. (Our medicine is toxins) return 1 From 9127c357e988101068353eab0dbbbdf6d8aa3a83 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Wed, 30 Mar 2016 18:17:55 -0400 Subject: [PATCH 235/328] further thingssssssssssssssssssssssss --- code/game/area/Space Station 13 areas.dm | 2 +- code/modules/research/xenobiology/xenobiology.dm | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 1be91011a17..238485e5b35 100644 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -1788,7 +1788,7 @@ area/security/podbay icon_state = "toxlab" /area/toxins/xenobiology - name = "Xenobiology Lab" + name = "\improper Xenobiology Lab" icon_state = "toxmix" /area/toxins/xenobiology/xenoflora_storage diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 154792c7b12..e92f52f6c59 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -444,9 +444,9 @@ color = "#2956B2" /obj/item/areaeditor/blueprints/slime/edit_area() - var/success = ..() + . = ..() var/area/A = get_area(src) - if(success) + if(.) for(var/turf/T in A) T.color = "#2956B2" qdel(src) From caab2eb398e4231ec53f4b8b45c3fe69912fd15f Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Wed, 30 Mar 2016 18:48:18 -0400 Subject: [PATCH 236/328] Automatic changelog generation for PR #4030 --- html/changelogs/AutoChangeLog-pr-4030.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4030.yml diff --git a/html/changelogs/AutoChangeLog-pr-4030.yml b/html/changelogs/AutoChangeLog-pr-4030.yml new file mode 100644 index 00000000000..d9a5b9784a0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4030.yml @@ -0,0 +1,6 @@ +author: Fox McCloud +delete-after: True +changes: + - rscadd: "Implements Advanced Camera Consoles. A type of camera console that function like AI's vision style. Non-buildable/accessible." + - rscadd: "Adds in Xenobiology Advance Cameras. A type of camera console that functions like advanced cameras, but only works in Xenobiology areas; can move around slimes and feed them with the console as well. Also non-buildable/accessible (for now)." + - rscadd: "Adds in cerulean slime reaction that generates a single use blueprint. On use it colors turfs a lavender color" From bca3c683e2f68b46657ba8ba70b53ab2c8007a0f Mon Sep 17 00:00:00 2001 From: ProperPants Date: Wed, 30 Mar 2016 20:55:57 -0400 Subject: [PATCH 237/328] Cyborg versions of stacks that didn't already have them. Increased cyborg starting rods to one full stack (60 rods). --- code/game/objects/items/stacks/rods.dm | 21 ++++++++++++++-- .../objects/items/stacks/tiles/tile_types.dm | 25 ++++++++++++++++++- .../mob/living/silicon/robot/robot_modules.dm | 10 ++++---- 3 files changed, 48 insertions(+), 8 deletions(-) diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 75432a86da2..49f737a29db 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -15,6 +15,23 @@ attack_verb = list("hit", "bludgeoned", "whacked") hitsound = 'sound/weapons/grenadelaunch.ogg' +/obj/item/stack/rods/cyborg + name = "metal rod" + desc = "Some rods. Can be used for building, or something." + singular_name = "metal rod" + icon_state = "rods" + item_state = "rods" + flags = CONDUCT + w_class = 3.0 + force = 9.0 + throwforce = 10.0 + throw_speed = 3 + throw_range = 7 + materials = list() + max_amount = 60 + attack_verb = list("hit", "bludgeoned", "whacked") + hitsound = 'sound/weapons/grenadelaunch.ogg' + /obj/item/stack/rods/New(var/loc, var/amount=null) ..() @@ -41,11 +58,11 @@ if(new_item.get_amount() <= 0) // stack was moved into another one on the pile new_item = locate() in user.loc - + user.visible_message("[user.name] shaped [src] into metal with the weldingtool.", \ "You shaped [src] into metal with the weldingtool.", \ "You hear welding.") - + var/replace = user.get_inactive_hand() == src use(2) if (get_amount() <= 0 && replace) diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index da5d36327f0..c6af5c5beee 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -49,6 +49,14 @@ icon_state = "tile-wood" turf_type = /turf/simulated/floor/wood +/obj/item/stack/tile/wood/cyborg + name = "wood floor tiles" + gender = PLURAL + singular_name = "wood floor tile" + desc = "an easy to fit wood floor tile" + icon_state = "tile-wood" + turf_type = /turf/simulated/floor/wood + /* * Carpets */ @@ -77,6 +85,21 @@ turf_type = /turf/simulated/floor/plasteel mineralType = "metal" +/obj/item/stack/tile/plasteel/cyborg + name = "floor tiles" + gender = PLURAL + singular_name = "floor tile" + desc = "Those could work as a pretty decent throwing weapon." + icon_state = "tile" + force = 6 + materials = list(MAT_METAL=500) + throwforce = 10 + throw_speed = 3 + throw_range = 7 + flags = CONDUCT + turf_type = /turf/simulated/floor/plasteel + mineralType = "metal" + /* * Light */ @@ -124,4 +147,4 @@ origin_tech = "materials=1" turf_type = /turf/simulated/floor/silent mineralType = "tranquillite" - materials = list(MAT_TRANQUILLITE=500) \ No newline at end of file + materials = list(MAT_TRANQUILLITE=500) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 104ef75a0dc..2e69b38c18b 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -175,8 +175,8 @@ /obj/item/stack/sheet/glass/cyborg = 50, /obj/item/stack/sheet/rglass/cyborg = 50, /obj/item/stack/cable_coil/cyborg = 50, - /obj/item/stack/rods = 30, - /obj/item/stack/tile/plasteel = 20 + /obj/item/stack/rods/cyborg = 60, + /obj/item/stack/tile/plasteel/cyborg = 20 ) /obj/item/weapon/robot_module/engineering/New() @@ -462,9 +462,9 @@ stacktypes = list( /obj/item/stack/sheet/wood/cyborg = 10, /obj/item/stack/sheet/rglass/cyborg = 50, - /obj/item/stack/tile/wood = 20, - /obj/item/stack/rods = 30, - /obj/item/stack/tile/plasteel = 20, + /obj/item/stack/tile/wood/cyborg = 20, + /obj/item/stack/rods/cyborg/ = 60, + /obj/item/stack/tile/plasteel/cyborg = 20, /obj/item/stack/sheet/metal/cyborg = 50, /obj/item/stack/sheet/glass/cyborg = 50, /obj/item/stack/cable_coil/cyborg = 30 From ec3502af38039244bf4356153ba4e0850141a884 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Wed, 30 Mar 2016 18:12:03 -0700 Subject: [PATCH 238/328] Fix the last of fox's noted bugs, runtime prevention --- code/datums/diseases/beesease.dm | 2 +- code/game/machinery/computer/medical.dm | 20 +++++++++++++------ code/modules/reagents/Chemistry-Holder.dm | 1 + .../oldchem/reagents/reagents_water.dm | 4 ++-- code/modules/surgery/organs/blood.dm | 4 +++- 5 files changed, 21 insertions(+), 10 deletions(-) diff --git a/code/datums/diseases/beesease.dm b/code/datums/diseases/beesease.dm index 3ca2f86503a..8e7331cbab8 100644 --- a/code/datums/diseases/beesease.dm +++ b/code/datums/diseases/beesease.dm @@ -14,7 +14,7 @@ /datum/disease/beesease/stage_act() ..() switch(stage) - if(2) //also changes say, see say.dm + if(2) //also changes say, see say.dm // no it doesn't, that's horrifyingly snowflakey if(prob(2)) affected_mob << "You taste honey in your mouth." if(3) diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 9659b28e970..7fa351e72be 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -200,12 +200,20 @@ src.active2 = null if(href_list["vir"]) - var/datum/data/record/v = locate(href_list["vir"]) - src.temp = "
    GNAv2 based virus lifeform V-[v.fields["id"]]
    " - src.temp += "
    Name: [v.fields["name"]]" - src.temp += "
    Antigen: [v.fields["antigen"]]" - src.temp += "
    Spread: [v.fields["spread type"]] " - src.temp += "
    Details:
    [v.fields["description"]]" + var/type = href_list["vir"] + var/datum/disease/Dis = new type(0) + var/AfS = "" + for(var/mob/M in Dis.viable_mobtypes) + AfS += " [initial(M.name)];" + src.temp = {"Name: [Dis.name] +
    Number of stages: [Dis.max_stages] +
    Spread: [Dis.spread_text] Transmission +
    Possible Cure: [(Dis.cure_text||"none")] +
    Affected Lifeforms:[AfS] +
    +
    Notes: [Dis.desc] +
    +
    Severity: [Dis.severity]"} if (href_list["del_all"]) src.temp = text("Are you sure you wish to delete all records?
    \n\tYes
    \n\tNo
    ", src, src) diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 5da35567af9..b1fb226a209 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -447,6 +447,7 @@ var/const/INGEST = 2 R.volume += amount update_total() my_atom.on_reagent_change() + R.on_merge(data) handle_reactions() return 0 diff --git a/code/modules/reagents/oldchem/reagents/reagents_water.dm b/code/modules/reagents/oldchem/reagents/reagents_water.dm index 24cad5d5e64..df9cdd6ade6 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_water.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_water.dm @@ -190,8 +190,8 @@ preserve += D data["viruses"] = preserve - if(mix_data["blood_colour"]) - color = mix_data["blood_colour"] + if(mix_data["blood_colour"]) + color = mix_data["blood_colour"] return 1 /datum/reagent/blood/on_update(var/atom/A) diff --git a/code/modules/surgery/organs/blood.dm b/code/modules/surgery/organs/blood.dm index c8787097bb3..35c38d1b99b 100644 --- a/code/modules/surgery/organs/blood.dm +++ b/code/modules/surgery/organs/blood.dm @@ -213,8 +213,10 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 B.data["donor"] = src B.data["viruses"] = list() - for(var/datum/disease/D in src.viruses) + for(var/datum/disease/D in viruses) B.data["viruses"] += D.Copy() + if(resistances && resistances.len) + B.data["resistances"] = resistances.Copy() B.data["blood_DNA"] = copytext(src.dna.unique_enzymes,1,0) B.data["blood_type"] = copytext(src.dna.b_type,1,0) From df30c7430ae727202a5bf0bed8ea9c7dab5da6ea Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Wed, 30 Mar 2016 21:30:01 -0400 Subject: [PATCH 239/328] Automatic changelog generation for PR #4019 --- html/changelogs/AutoChangeLog-pr-4019.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4019.yml diff --git a/html/changelogs/AutoChangeLog-pr-4019.yml b/html/changelogs/AutoChangeLog-pr-4019.yml new file mode 100644 index 00000000000..783ca3279fc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4019.yml @@ -0,0 +1,5 @@ +author: tigercat2000 +delete-after: True +changes: + - rscdel: "Virus2 has been removed." + - rscadd: "Virus1 is back. Viva la revolution." From 065f3c8a9dbff720d16892000438006796f5c7fe Mon Sep 17 00:00:00 2001 From: ProperPants Date: Wed, 30 Mar 2016 21:32:41 -0400 Subject: [PATCH 240/328] Removed the tiles because apparently they're pointless. --- code/game/objects/items/stacks/rods.dm | 12 +++++----- .../objects/items/stacks/tiles/tile_types.dm | 23 ------------------- 2 files changed, 6 insertions(+), 29 deletions(-) diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 49f737a29db..c0eebb4871b 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -22,13 +22,13 @@ icon_state = "rods" item_state = "rods" flags = CONDUCT - w_class = 3.0 - force = 9.0 - throwforce = 10.0 - throw_speed = 3 - throw_range = 7 + w_class = + force = + throwforce = + throw_speed = + throw_range = materials = list() - max_amount = 60 + max_amount = attack_verb = list("hit", "bludgeoned", "whacked") hitsound = 'sound/weapons/grenadelaunch.ogg' diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index c6af5c5beee..d7fcf1bcb53 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -49,14 +49,6 @@ icon_state = "tile-wood" turf_type = /turf/simulated/floor/wood -/obj/item/stack/tile/wood/cyborg - name = "wood floor tiles" - gender = PLURAL - singular_name = "wood floor tile" - desc = "an easy to fit wood floor tile" - icon_state = "tile-wood" - turf_type = /turf/simulated/floor/wood - /* * Carpets */ @@ -85,21 +77,6 @@ turf_type = /turf/simulated/floor/plasteel mineralType = "metal" -/obj/item/stack/tile/plasteel/cyborg - name = "floor tiles" - gender = PLURAL - singular_name = "floor tile" - desc = "Those could work as a pretty decent throwing weapon." - icon_state = "tile" - force = 6 - materials = list(MAT_METAL=500) - throwforce = 10 - throw_speed = 3 - throw_range = 7 - flags = CONDUCT - turf_type = /turf/simulated/floor/plasteel - mineralType = "metal" - /* * Light */ From 2b4456c12f8c45daf021f28bf4fc1aa57e902fb7 Mon Sep 17 00:00:00 2001 From: ProperPants Date: Wed, 30 Mar 2016 22:13:28 -0400 Subject: [PATCH 241/328] Cleaned up some cyborg stacks to take almost everything from the parent. --- code/game/objects/items/stacks/rods.dm | 14 -------------- code/game/objects/items/stacks/sheets/glass.dm | 9 --------- .../objects/items/stacks/sheets/sheet_types.dm | 11 ----------- 3 files changed, 34 deletions(-) diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index c0eebb4871b..431e74209d8 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -16,21 +16,7 @@ hitsound = 'sound/weapons/grenadelaunch.ogg' /obj/item/stack/rods/cyborg - name = "metal rod" - desc = "Some rods. Can be used for building, or something." - singular_name = "metal rod" - icon_state = "rods" - item_state = "rods" - flags = CONDUCT - w_class = - force = - throwforce = - throw_speed = - throw_range = materials = list() - max_amount = - attack_verb = list("hit", "bludgeoned", "whacked") - hitsound = 'sound/weapons/grenadelaunch.ogg' /obj/item/stack/rods/New(var/loc, var/amount=null) ..() diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index d0477eead0d..09c8b51ded9 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -24,12 +24,7 @@ var/full_window = /obj/structure/window/full/basic /obj/item/stack/sheet/glass/cyborg - name = "glass" - desc = "HOLY SHEET! That is a lot of glass." - singular_name = "glass sheet" - icon_state = "sheet-glass" materials = list() - created_window = /obj/structure/window/basic /obj/item/stack/sheet/glass/attack_self(mob/user as mob) construct_window(user) @@ -159,10 +154,6 @@ var/full_window = /obj/structure/window/full/reinforced /obj/item/stack/sheet/rglass/cyborg - name = "reinforced glass" - desc = "Glass which seems to have rods or something stuck in them." - singular_name = "reinforced glass sheet" - icon_state = "sheet-rglass" materials = list() /obj/item/stack/sheet/rglass/attack_self(mob/user as mob) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 5bc05d970fe..ada50c6b2aa 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -96,13 +96,6 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \ origin_tech = "materials=1" /obj/item/stack/sheet/metal/cyborg - name = "metal" - desc = "Sheets made out of metal." - singular_name = "metal sheet" - icon_state = "sheet-metal" - materials = list() - throwforce = 10.0 - flags = CONDUCT /obj/item/stack/sheet/metal/New(var/loc, var/amount=null) recipes = metal_recipes @@ -162,10 +155,6 @@ var/global/list/datum/stack_recipe/wood_recipes = list ( \ origin_tech = "materials=1;biotech=1" /obj/item/stack/sheet/wood/cyborg - name = "wooden plank" - desc = "One can only guess that this is a bunch of wood." - singular_name = "wood plank" - icon_state = "sheet-wood" /obj/item/stack/sheet/wood/New(var/loc, var/amount=null) recipes = wood_recipes From b764f188409fa8a572a6c6ca45f8eb5cfc0d2650 Mon Sep 17 00:00:00 2001 From: ProperPants Date: Wed, 30 Mar 2016 22:16:09 -0400 Subject: [PATCH 242/328] I forgot to change the cyborg modules back to normal for the tiles. --- code/game/objects/items/stacks/sheets/sheet_types.dm | 1 + code/modules/mob/living/silicon/robot/robot_modules.dm | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index ada50c6b2aa..197a11eeb4a 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -96,6 +96,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \ origin_tech = "materials=1" /obj/item/stack/sheet/metal/cyborg + materials = list() /obj/item/stack/sheet/metal/New(var/loc, var/amount=null) recipes = metal_recipes diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 2e69b38c18b..194f76770e9 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -176,7 +176,7 @@ /obj/item/stack/sheet/rglass/cyborg = 50, /obj/item/stack/cable_coil/cyborg = 50, /obj/item/stack/rods/cyborg = 60, - /obj/item/stack/tile/plasteel/cyborg = 20 + /obj/item/stack/tile/plasteel = 20 ) /obj/item/weapon/robot_module/engineering/New() @@ -462,9 +462,9 @@ stacktypes = list( /obj/item/stack/sheet/wood/cyborg = 10, /obj/item/stack/sheet/rglass/cyborg = 50, - /obj/item/stack/tile/wood/cyborg = 20, - /obj/item/stack/rods/cyborg/ = 60, - /obj/item/stack/tile/plasteel/cyborg = 20, + /obj/item/stack/tile/wood = 20, + /obj/item/stack/rods/cyborg = 60, + /obj/item/stack/tile/plasteel = 20, /obj/item/stack/sheet/metal/cyborg = 50, /obj/item/stack/sheet/glass/cyborg = 50, /obj/item/stack/cable_coil/cyborg = 30 From 560eb17f9dfc24e20813f13301ebd76b30269038 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Wed, 30 Mar 2016 22:31:59 -0400 Subject: [PATCH 243/328] Fully Re-Activates Disease1 --- code/modules/events/disease_outbreak.dm | 35 +++++++++++ code/modules/events/event_container.dm | 4 +- .../events/spontaneous_appendicitis.dm | 13 ++++ code/modules/events/viral_infection.dm | 29 --------- code/modules/events/viral_outbreak.dm | 28 --------- code/modules/reagents/newchem/disease.dm | 63 +++++++++++++++++++ .../oldchem/reagents/reagents_toxin.dm | 54 ---------------- .../reagent_containers/food/snacks.dm | 3 +- code/modules/research/experimentor.dm | 2 +- paradise.dme | 2 + 10 files changed, 119 insertions(+), 114 deletions(-) create mode 100644 code/modules/events/disease_outbreak.dm create mode 100644 code/modules/events/spontaneous_appendicitis.dm delete mode 100644 code/modules/events/viral_infection.dm delete mode 100644 code/modules/events/viral_outbreak.dm diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm new file mode 100644 index 00000000000..e810b76819c --- /dev/null +++ b/code/modules/events/disease_outbreak.dm @@ -0,0 +1,35 @@ +/datum/event/disease_outbreak + announceWhen = 15 + + var/virus_type + +/datum/event/disease_outbreak/setup() + announceWhen = rand(15, 30) + +/datum/event/disease_outbreak/announce() + command_announcement.Announce("Confirmed outbreak of level 7 major viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg') + +/datum/event/disease_outbreak/start() + if(!virus_type) + virus_type = pick(/datum/disease/advance/flu, /datum/disease/advance/cold, /datum/disease/brainrot, /datum/disease/magnitis) + + for(var/mob/living/carbon/human/H in shuffle(living_mob_list)) + if(issmall(H)) //don't infect monkies; that's a waste + continue + var/turf/T = get_turf(H) + if(!T) + continue + if(T.z != 1) + continue + var/foundAlready = 0 // don't infect someone that already has the virus + for(var/datum/disease/D in H.viruses) + foundAlready = 1 + break + if(H.stat == DEAD || foundAlready) + continue + + var/datum/disease/D + D = new virus_type() + D.carrier = 1 + H.AddDisease(D) + break \ No newline at end of file diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index 448f8588b8c..8d16fd5a4cb 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -139,6 +139,7 @@ var/list/event_last_fired = list() severity = EVENT_LEVEL_MODERATE available_events = list( new /datum/event_meta(EVENT_LEVEL_MODERATE, "Nothing", /datum/event/nothing, 1230), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Appendicitis", /datum/event/spontaneous_appendicitis, 0, list(ASSIGNMENT_MEDICAL = 10), 1), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Carp School", /datum/event/carp_migration, 200, list(ASSIGNMENT_ENGINEER = 10, ASSIGNMENT_SECURITY = 20), 1), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Rogue Drones", /datum/event/rogue_drone, 40, list(ASSIGNMENT_SECURITY = 20)), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Space Vines", /datum/event/spacevine, 250, list(ASSIGNMENT_ENGINEER = 10)), @@ -169,7 +170,8 @@ var/list/event_last_fired = list() new /datum/event_meta(EVENT_LEVEL_MODERATE, "Gravitational Anomaly", /datum/event/anomaly/anomaly_grav, 200), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Revenant", /datum/event/revenant, 150), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Swarmer Spawn", /datum/event/spawn_swarmer, 150, is_one_shot = 1), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Morph Spawn", /datum/event/spawn_morph, 0, is_one_shot = 1) + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Morph Spawn", /datum/event/spawn_morph, 0, is_one_shot = 1), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Disease Outbreak", /datum/event/disease_outbreak, 0, list(ASSIGNMENT_MEDICAL = 150), 1) ) /datum/event_container/major diff --git a/code/modules/events/spontaneous_appendicitis.dm b/code/modules/events/spontaneous_appendicitis.dm new file mode 100644 index 00000000000..57b860159ca --- /dev/null +++ b/code/modules/events/spontaneous_appendicitis.dm @@ -0,0 +1,13 @@ +/datum/event/spontaneous_appendicitis/start() + for(var/mob/living/carbon/human/H in shuffle(living_mob_list)) + if(issmall(H)) //don't infect monkies; that's a waste + continue + var/foundAlready = 0 //don't infect someone that already has the virus + for(var/datum/disease/D in H.viruses) + foundAlready = 1 + if(H.stat == 2 || foundAlready) + continue + + var/datum/disease/D = new /datum/disease/appendicitis + H.ForceContractDisease(D) + break \ No newline at end of file diff --git a/code/modules/events/viral_infection.dm b/code/modules/events/viral_infection.dm deleted file mode 100644 index 362093b62ee..00000000000 --- a/code/modules/events/viral_infection.dm +++ /dev/null @@ -1,29 +0,0 @@ -/datum/event/viral_infection - severity = 1 - -/datum/event/viral_infection/setup() - announceWhen = rand(0, 3000) - endWhen = announceWhen + 1 - severity = rand(1, 3) - -/datum/event/viral_infection/announce() - command_announcement.Announce("Confirmed outbreak of level 7 viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg') - -/datum/event/viral_infection/start() - var/list/candidates = list() //list of candidate keys - for(var/mob/living/carbon/human/G in player_list) - if(G.client && G.stat != DEAD) - candidates += G - if(!candidates.len) return - candidates = shuffle(candidates)//Incorporating Donkie's list shuffle - - var/datum/disease2/disease/D = new /datum/disease2/disease - D.makerandom() - D.infectionchance = 1 - message_admins("Viral Infection: releasing strain [D.uniqueID]") - - while(severity > 0 && candidates.len) - var/mob/living/carbon/human/H = candidates[1] - H.virus2["[D.uniqueID]"] = D - candidates.Remove(candidates[1]) - severity-- diff --git a/code/modules/events/viral_outbreak.dm b/code/modules/events/viral_outbreak.dm deleted file mode 100644 index 6c24c37137e..00000000000 --- a/code/modules/events/viral_outbreak.dm +++ /dev/null @@ -1,28 +0,0 @@ -/datum/event/viral_outbreak - severity = 1 - -/datum/event/viral_outbreak/setup() - announceWhen = rand(0, 3000) - endWhen = announceWhen + 1 - severity = rand(2, 4) - -/datum/event/viral_outbreak/announce() - command_announcement.Announce("Confirmed outbreak of level 7 major viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg') - -/datum/event/viral_outbreak/start() - var/list/candidates = list() //list of candidate keys - for(var/mob/living/carbon/human/G in player_list) - if(G.client && G.stat != DEAD) - candidates += G - if(!candidates.len) return - candidates = shuffle(candidates)//Incorporating Donkie's list shuffle - - var/datum/disease2/disease/D = new /datum/disease2/disease - D.makerandom() - message_admins("Viral Outbreak: releasing strain [D.uniqueID]") - - while(severity > 0 && candidates.len) - var/mob/living/carbon/human/H = candidates[1] - H.virus2["[D.uniqueID]"] = D - candidates.Remove(candidates[1]) - severity-- diff --git a/code/modules/reagents/newchem/disease.dm b/code/modules/reagents/newchem/disease.dm index 7039e7cb6ef..132859d530a 100644 --- a/code/modules/reagents/newchem/disease.dm +++ b/code/modules/reagents/newchem/disease.dm @@ -13,6 +13,69 @@ ..() +/datum/reagent/nanomachines + name = "Nanomachines" + id = "nanomachines" + description = "Microscopic construction robots." + color = "#535E66" // rgb: 83, 94, 102 + +/datum/reagent/nanomachines/on_mob_life(var/mob/living/carbon/M as mob) + if(!M) M = holder.my_atom + if(volume > 1.5) + M.ForceContractDisease(new /datum/disease/transformation/robot(0)) + ..() + + +/datum/reagent/xenomicrobes + name = "Xenomicrobes" + id = "xenomicrobes" + description = "Microbes with an entirely alien cellular structure." + color = "#535E66" // rgb: 83, 94, 102 + +/datum/reagent/xenomicrobes/on_mob_life(var/mob/living/carbon/M as mob) + if(!M) M = holder.my_atom + if(volume > 1.5) + M.ContractDisease(new /datum/disease/transformation/xeno(0)) + ..() + +/datum/reagent/fungalspores + name = "Tubercle bacillus Cosmosis microbes" + id = "fungalspores" + description = "Active fungal spores." + color = "#92D17D" // rgb: 146, 209, 125 + +/datum/reagent/fungalspores/on_mob_life(var/mob/living/carbon/M as mob) + if(!M) M = holder.my_atom + if(volume > 2.5) + M.ForceContractDisease(new /datum/disease/tuberculosis(0)) + ..() + +/datum/reagent/spore + name = "Blob Spores" + id = "spore" + description = "Spores of some blob creature thingy." + reagent_state = LIQUID + color = "#CE760A" // rgb: 206, 118, 10 + var/client/blob_client = null + var/blob_point_rate = 3 + +/datum/reagent/spore/on_mob_life(var/mob/living/M) + if(!M) M = holder.my_atom + if(holder.has_reagent("atrazine",45)) + holder.del_reagent("spore") //apparently this never metabolizes and stays in forever unless you have 45 units of atrazine in you or some stupid thing like that. + if(prob(1)) + M << "Your mouth tastes funny." + if(prob(1) && prob(25)) + if(iscarbon(M)) + var/mob/living/carbon/C = M + if(directory[ckey(C.key)]) + blob_client = directory[ckey(C.key)] + C.gib() + if(blob_client) + var/obj/effect/blob/core/core = new(get_turf(C), 200, blob_client, blob_point_rate) + if(core.overmind && core.overmind.mind) + core.overmind.mind.name = C.name + //virus food /datum/reagent/virus_food name = "Virus Food" diff --git a/code/modules/reagents/oldchem/reagents/reagents_toxin.dm b/code/modules/reagents/oldchem/reagents/reagents_toxin.dm index 6c3b4fa5002..852fb861bb8 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_toxin.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_toxin.dm @@ -396,60 +396,6 @@ /////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* -/datum/reagent/nanomachines - name = "Nanomachines" - id = "nanomachines" - description = "Microscopic construction robots." - reagent_state = LIQUID - color = "#535E66" // rgb: 83, 94, 102 - -/datum/reagent/nanomachines/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) - src = null - if( (prob(10) && method==TOUCH) || method==INGEST) - M.contract_disease(new /datum/disease/robotic_transformation(0),1) - -/datum/reagent/xenomicrobes - name = "Xenomicrobes" - id = "xenomicrobes" - description = "Microbes with an entirely alien cellular structure." - reagent_state = LIQUID - color = "#535E66" // rgb: 83, 94, 102 - -/datum/reagent/xenomicrobes/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) - src = null - if( (prob(10) && method==TOUCH) || method==INGEST) - M.contract_disease(new /datum/disease/xeno_transformation(0),1) -*/ - -/datum/reagent/spore - name = "Blob Spores" - id = "spore" - description = "Spores of some blob creature thingy." - reagent_state = LIQUID - color = "#CE760A" // rgb: 206, 118, 10 - var/client/blob_client = null - var/blob_point_rate = 3 - -/datum/reagent/spore/on_mob_life(var/mob/living/M) - if(!M) M = holder.my_atom - if (holder.has_reagent("atrazine",45)) - holder.del_reagent("spore") - if (prob(1)) - M << "\red Your mouth tastes funny." - if (prob(1) && prob(25)) - if(iscarbon(M)) - var/mob/living/carbon/C = M - if(directory[ckey(C.key)]) - blob_client = directory[ckey(C.key)] - C.gib() - if(blob_client) - var/obj/effect/blob/core/core = new(get_turf(C), 200, blob_client, blob_point_rate) - if(core.overmind && core.overmind.mind) - core.overmind.mind.name = C.name - - return - /datum/reagent/condensedcapsaicin name = "Condensed Capsaicin" id = "condensedcapsaicin" diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index df6edbaa03f..e2a79caa340 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -846,6 +846,7 @@ New() ..() reagents.add_reagent("nutriment", 2) + reagents.add_reagent("nanomachines", 10) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/roburgerbig @@ -857,7 +858,7 @@ New() ..() - reagents.add_reagent("nanites", 100) + reagents.add_reagent("nanomachines", 100) bitesize = 0.1 /obj/item/weapon/reagent_containers/food/snacks/xenoburger diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index 62784d8c8ca..d7955228168 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -326,7 +326,7 @@ ejectItem(TRUE) if(prob(EFFECT_PROB_VERYLOW-badThingCoeff)) visible_message("[src]'s chemical chamber has sprung a leak!") - chosenchem = pick("mutationtoxin","itching_powder","sacid") + chosenchem = pick("mutationtoxin","nanomachines","sacid") var/datum/reagents/R = new/datum/reagents(15) R.my_atom = src R.add_reagent(chosenchem , 15) diff --git a/paradise.dme b/paradise.dme index 5828f4e1f83..91820aff812 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1226,6 +1226,7 @@ #include "code\modules\events\brand_intelligence.dm" #include "code\modules\events\carp_migration.dm" #include "code\modules\events\communications_blackout.dm" +#include "code\modules\events\disease_outbreak.dm" #include "code\modules\events\dust.dm" #include "code\modules\events\electrical_storm.dm" #include "code\modules\events\event.dm" @@ -1248,6 +1249,7 @@ #include "code\modules\events\slaughterevent.dm" #include "code\modules\events\spacevine.dm" #include "code\modules\events\spider_infestation.dm" +#include "code\modules\events\spontaneous_appendicitis.dm" #include "code\modules\events\tear.dm" #include "code\modules\events\undead.dm" #include "code\modules\events\vent_clog.dm" From d2907e3631ae2bb5ed2e0d4018470e334cb83139 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Wed, 30 Mar 2016 22:52:36 -0400 Subject: [PATCH 244/328] oh hell --- code/modules/events/disease_outbreak.dm | 2 ++ code/modules/events/spontaneous_appendicitis.dm | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index e810b76819c..ce6e214053d 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -16,6 +16,8 @@ for(var/mob/living/carbon/human/H in shuffle(living_mob_list)) if(issmall(H)) //don't infect monkies; that's a waste continue + if(H.species.virus_immune) //don't let virus immune things get diseases they're not supposed to get. + continue var/turf/T = get_turf(H) if(!T) continue diff --git a/code/modules/events/spontaneous_appendicitis.dm b/code/modules/events/spontaneous_appendicitis.dm index 57b860159ca..964b3c9e50d 100644 --- a/code/modules/events/spontaneous_appendicitis.dm +++ b/code/modules/events/spontaneous_appendicitis.dm @@ -1,6 +1,8 @@ /datum/event/spontaneous_appendicitis/start() for(var/mob/living/carbon/human/H in shuffle(living_mob_list)) - if(issmall(H)) //don't infect monkies; that's a waste + if(issmall(H)) //don't infect monkies; that's a waste. + continue + if(H.species.virus_immune) //don't count things that are virus immune; they'll just get picked and auto-cure continue var/foundAlready = 0 //don't infect someone that already has the virus for(var/datum/disease/D in H.viruses) From 221cbc82a94032b53eb7c283bbdf97b8245fc1f2 Mon Sep 17 00:00:00 2001 From: Crazylemon64 Date: Wed, 30 Mar 2016 21:16:42 -0700 Subject: [PATCH 245/328] I tested this, and IPCs should go blind upon losing their head I think the cause of this bug was organs not being removed on decap, which has since been fixed --- code/modules/surgery/organs/subtypes/diona.dm | 8 -------- code/modules/surgery/organs/subtypes/machine.dm | 6 +----- 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/code/modules/surgery/organs/subtypes/diona.dm b/code/modules/surgery/organs/subtypes/diona.dm index 0447cbff139..407f2187842 100644 --- a/code/modules/surgery/organs/subtypes/diona.dm +++ b/code/modules/surgery/organs/subtypes/diona.dm @@ -195,14 +195,6 @@ slot = "eyes" -/obj/item/organ/internal/diona_receptor/remove(var/mob/living/user,special = 0) - if(!special) - owner.disabilities |= NEARSIGHTED - owner.sdisabilities |= BLIND - owner.eye_blind = 20 - owner.eye_blurry = 40 - ..() - /obj/item/organ/internal/diona_receptor/surgeryize() if(!owner) return diff --git a/code/modules/surgery/organs/subtypes/machine.dm b/code/modules/surgery/organs/subtypes/machine.dm index 12b3d8aded1..77b590a2f4d 100644 --- a/code/modules/surgery/organs/subtypes/machine.dm +++ b/code/modules/surgery/organs/subtypes/machine.dm @@ -132,13 +132,9 @@ /obj/item/organ/internal/optical_sensor/remove(var/mob/living/user,special = 0) if(!special) - owner.disabilities |= NEARSIGHTED - owner.sdisabilities |= BLIND - owner.eye_blind = 20 - owner.eye_blurry = 40 owner << "Error 404:Optical Sensors not found." - ..() + . = ..() /obj/item/organ/internal/optical_sensor/surgeryize() if(!owner) From 0feac81bba85755f5adbf676ec98fffafa0d01be Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Thu, 31 Mar 2016 02:10:27 -0400 Subject: [PATCH 246/328] TeeHee --- code/modules/events/meaty_gore.dm | 47 +++++++++++++++++++++++++++++ code/modules/events/meaty_ops.dm | 48 ++++++++++++++++++++++++++++++ icons/obj/meteor.dmi | Bin 6350 -> 4771 bytes paradise.dme | 2 ++ 4 files changed, 97 insertions(+) create mode 100644 code/modules/events/meaty_gore.dm create mode 100644 code/modules/events/meaty_ops.dm diff --git a/code/modules/events/meaty_gore.dm b/code/modules/events/meaty_gore.dm new file mode 100644 index 00000000000..2306e13dbd0 --- /dev/null +++ b/code/modules/events/meaty_gore.dm @@ -0,0 +1,47 @@ +/datum/event/dust/gore/announce() + command_announcement.Announce("Unknown biological debris have been detected near [station_name()], please stand-by.", "Debris Alert") + +/datum/event/dust/gore/setup() + qnty = rand(45,125) + +/datum/event/dust/gore/start() + while(qnty-- > 0) + new /obj/effect/space_dust/gore() + if(prob(10)) + sleep(rand(10,15)) + +/obj/effect/space_dust/gore + icon = 'icons/mob/human.dmi' + icon_state = "body_m_s" + + strength = 1 + life = 1 + +/obj/effect/space_dust/gore/Bump(atom/A) + if(prob(20)) + spawn(1) + for(var/mob/M in range(10, src)) + if(!M.stat && !istype(M, /mob/living/silicon/ai)) + shake_camera(M, 3, 1) + if (A) + playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1) + walk(src,0) + invisibility = 101 + new /obj/effect/decal/cleanable/blood(get_turf(A)) + if(ismob(A)) + A.ex_act(strength) + else + spawn(0) + if(A) + A.ex_act(strength) + if(src) + walk_towards(src,goal,1) + life-- + if(!life) + if(prob(80)) + gibs(loc) + if(prob(45)) + new /obj/item/weapon/reagent_containers/food/snacks/meat(loc) + new /obj/effect/decal/cleanable/blood/gibs(loc) + + qdel(src) \ No newline at end of file diff --git a/code/modules/events/meaty_ops.dm b/code/modules/events/meaty_ops.dm new file mode 100644 index 00000000000..569b65413e9 --- /dev/null +++ b/code/modules/events/meaty_ops.dm @@ -0,0 +1,48 @@ +/datum/event/dust/goreop/announce() + var/meteor_declaration = "MeteorOps have declared thier intent to utterly destroy [station_name()] with thier own bodies, and dares the crew to try and stop them." + command_announcement.Announce(meteor_declaration, "Declaration of 'War'", 'sound/effects/siren.ogg') + +/datum/event/dust/goreop/setup() + qnty = rand(45,125) + +/datum/event/dust/goreop/start() + while(qnty-- > 0) + new /obj/effect/space_dust/gore() + if(prob(10)) + sleep(rand(10,15)) + +/obj/effect/space_dust/goreop + icon = 'icons/mob/animal.dmi' + icon_state = "syndicaterangedpsace" + + strength = 1 + life = 1 + +/obj/effect/space_dust/goreop/Bump(atom/A) + if(prob(20)) + spawn(1) + for(var/mob/M in range(10, src)) + if(!M.stat && !istype(M, /mob/living/silicon/ai)) + shake_camera(M, 3, 1) + if (A) + playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1) + walk(src,0) + invisibility = 101 + new /obj/effect/decal/cleanable/blood(get_turf(A)) + if(ismob(A)) + A.ex_act(strength) + else + spawn(0) + if(A) + A.ex_act(strength) + if(src) + walk_towards(src,goal,1) + life-- + if(!life) + if(prob(80)) + gibs(loc) + if(prob(45)) + new /obj/item/weapon/reagent_containers/food/snacks/meat(loc) + new /obj/effect/decal/cleanable/blood/gibs(loc) + + qdel(src) \ No newline at end of file diff --git a/icons/obj/meteor.dmi b/icons/obj/meteor.dmi index cd113fe5fa5d1b84fd325a685a5359e84da17e76..83a0a98a49a10e4049c64ab8bc6c60f76f503855 100644 GIT binary patch literal 4771 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 literal 6350 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 C`CUr@ diff --git a/paradise.dme b/paradise.dme index 4a673c9da4a..486223637e0 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1186,6 +1186,8 @@ #include "code\modules\events\infestation.dm" #include "code\modules\events\ion_storm.dm" #include "code\modules\events\mass_hallucination.dm" +#include "code\modules\events\meaty_gore.dm" +#include "code\modules\events\meaty_ops.dm" #include "code\modules\events\meaty_ores.dm" #include "code\modules\events\meteors.dm" #include "code\modules\events\money_hacker.dm" From ebea66f7dd0c5b9577bea190d51d32fdf78b8871 Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Thu, 31 Mar 2016 02:12:57 -0400 Subject: [PATCH 247/328] heeeeeheeee --- code/modules/events/meaty_ops.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/events/meaty_ops.dm b/code/modules/events/meaty_ops.dm index 569b65413e9..5bc32c32640 100644 --- a/code/modules/events/meaty_ops.dm +++ b/code/modules/events/meaty_ops.dm @@ -27,7 +27,6 @@ if (A) playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1) walk(src,0) - invisibility = 101 new /obj/effect/decal/cleanable/blood(get_turf(A)) if(ismob(A)) A.ex_act(strength) From 38692feb951fdb95ff8ace8340bb070a3f4f9515 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 31 Mar 2016 04:16:01 -0400 Subject: [PATCH 248/328] Automatic changelog generation for PR #4040 --- html/changelogs/AutoChangeLog-pr-4040.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4040.yml diff --git a/html/changelogs/AutoChangeLog-pr-4040.yml b/html/changelogs/AutoChangeLog-pr-4040.yml new file mode 100644 index 00000000000..08de280db07 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4040.yml @@ -0,0 +1,4 @@ +author: Tastyfish +delete-after: True +changes: + - rscadd: "pAI's can now use the PDA chatrooms." From 24139b8a843e995b34dbb2f52cb48f3aa99f7586 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Thu, 31 Mar 2016 07:15:46 -0400 Subject: [PATCH 249/328] Refactor of Simple Animal Eating --- .../mob/living/carbon/human/species/species.dm | 2 ++ .../mob/living/carbon/human/species/station.dm | 11 +++++++++++ code/modules/mob/living/carbon/life.dm | 2 +- code/modules/mob/mob_grab.dm | 14 ++++++-------- 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 6d04526d84e..8b3110248bc 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -63,6 +63,8 @@ var/ventcrawler = 0 //Determines if the mob can go through the vents. var/has_fine_manipulation = 1 // Can use small items. + var/can_consume_mobs = 0 //can it consume mobs? + var/list/allowed_consumed_mobs = list() var/flags = 0 // Various specific features. var/clothing_flags = 0 // Underwear and socks. diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 65e4684c64f..69fc186c56c 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -55,6 +55,9 @@ flesh_color = "#34AF10" reagent_tag = PROCESS_ORG base_color = "#066000" + can_consume_mobs = 1 + allowed_consumed_mobs = list(/mob/living/simple_animal/mouse, /mob/living/simple_animal/lizard, /mob/living/simple_animal/chick, /mob/living/simple_animal/chicken, + /mob/living/simple_animal/crab, /mob/living/simple_animal/butterfly, /mob/living/simple_animal/parrot, /mob/living/simple_animal/tribble) suicide_messages = list( "is attempting to bite their tongue off!", @@ -106,6 +109,9 @@ reagent_tag = PROCESS_ORG flesh_color = "#AFA59E" base_color = "#333333" + can_consume_mobs = 1 + allowed_consumed_mobs = list(/mob/living/simple_animal/mouse, /mob/living/simple_animal/chick, /mob/living/simple_animal/butterfly, /mob/living/simple_animal/parrot, + /mob/living/simple_animal/tribble) suicide_messages = list( "is attempting to bite their tongue off!", @@ -147,6 +153,9 @@ reagent_tag = PROCESS_ORG flesh_color = "#966464" base_color = "#B43214" + can_consume_mobs = 1 + allowed_consumed_mobs = list(/mob/living/simple_animal/mouse, /mob/living/simple_animal/lizard, /mob/living/simple_animal/chick, /mob/living/simple_animal/chicken, + /mob/living/simple_animal/crab, /mob/living/simple_animal/butterfly, /mob/living/simple_animal/parrot, /mob/living/simple_animal/tribble) suicide_messages = list( "is attempting to bite their tongue off!", @@ -354,6 +363,8 @@ dietflags = DIET_HERB blood_color = "#FB9800" reagent_tag = PROCESS_ORG + can_consume_mobs = 1 + allowed_consumed_mobs = list(/mob/living/simple_animal/diona) suicide_messages = list( "is attempting to bite their antenna off!", diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index ef68dd1a97b..df357e66db2 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -245,7 +245,7 @@ if(M.loc != src) stomach_contents.Remove(M) continue - if(istype(M, /mob/living/carbon) && stat != 2) + if(istype(M, /mob/living) && stat != 2) if(M.stat == 2) M.death(1) stomach_contents.Remove(M) diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index 79fc66d2408..aaee2c1b985 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -6,7 +6,7 @@ #define EAT_TIME_FAT 100 //time it takes for a mob to be eaten (in deciseconds) (overrides mob eat time) -#define EAT_TIME_MOUSE 30 +#define EAT_TIME_ANIMAL 30 /obj/item/weapon/grab name = "grab" @@ -413,10 +413,8 @@ if(isalien(attacker) && iscarbon(prey)) //Xenomorphs eating carbon mobs return 1 - if(ishuman(attacker) && attacker.get_species() == "Kidan" && istype(prey,/mob/living/simple_animal/diona)) //Kidan eating nymphs - return 1 - - if(ishuman(attacker) && attacker.get_species() == "Tajaran" && istype(prey,/mob/living/simple_animal/mouse)) //Tajaran eating mice. Meow! + var/mob/living/carbon/human/H = attacker + if(ishuman(H) && H.species.can_consume_mobs && is_type_in_list(prey, H.species.allowed_consumed_mobs)) //species eating of other mobs return 1 return 0 @@ -425,8 +423,8 @@ if(isalien(attacker)) return EAT_TIME_XENO //xenos get a speed boost - if(istype(prey,/mob/living/simple_animal/mouse)) //mice get eaten at xeno-eating-speed regardless - return EAT_TIME_MOUSE + if(istype(prey,/mob/living/simple_animal)) //simple animals get eaten at xeno-eating-speed regardless + return EAT_TIME_ANIMAL return EAT_TIME_FAT //if it doesn't fit into the above, it's probably a fat guy, take EAT_TIME_FAT to do it @@ -447,4 +445,4 @@ #undef EAT_TIME_XENO #undef EAT_TIME_FAT -#undef EAT_TIME_MOUSE +#undef EAT_TIME_ANIMAL From 0f9797a7c20263283c38c9194ca54d10ab0449dc Mon Sep 17 00:00:00 2001 From: ProperPants Date: Thu, 31 Mar 2016 08:18:39 -0400 Subject: [PATCH 250/328] Cyborg wood is gone. I don't know why it was there in the first place. --- code/game/objects/items/stacks/sheets/sheet_types.dm | 2 -- code/modules/mob/living/silicon/robot/robot_modules.dm | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 197a11eeb4a..21680521d34 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -155,8 +155,6 @@ var/global/list/datum/stack_recipe/wood_recipes = list ( \ icon_state = "sheet-wood" origin_tech = "materials=1;biotech=1" -/obj/item/stack/sheet/wood/cyborg - /obj/item/stack/sheet/wood/New(var/loc, var/amount=null) recipes = wood_recipes return ..() diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 194f76770e9..3a9a3fcc2c4 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -460,7 +460,7 @@ name = "drone module" module_type = "Engineer" stacktypes = list( - /obj/item/stack/sheet/wood/cyborg = 10, + /obj/item/stack/sheet/wood = 10, /obj/item/stack/sheet/rglass/cyborg = 50, /obj/item/stack/tile/wood = 20, /obj/item/stack/rods/cyborg = 60, From bd4230f469824208e0c002bc4b6ed806682805e2 Mon Sep 17 00:00:00 2001 From: ProperPants Date: Thu, 31 Mar 2016 08:25:03 -0400 Subject: [PATCH 251/328] Cyborg wood was being used by drones. No longer. --- code/modules/mob/living/silicon/robot/drone/drone.dm | 2 +- code/modules/mob/living/silicon/robot/drone/drone_items.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index 6868765250b..fe6bd4c158c 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -20,7 +20,7 @@ // We need to keep track of a few module items so we don't need to do list operations // every time we need them. These get set in New() after the module is chosen. var/obj/item/stack/sheet/metal/cyborg/stack_metal = null - var/obj/item/stack/sheet/wood/cyborg/stack_wood = null + var/obj/item/stack/sheet/wood/stack_wood = null var/obj/item/stack/sheet/glass/cyborg/stack_glass = null var/obj/item/stack/sheet/mineral/plastic/cyborg/stack_plastic = null var/obj/item/weapon/matter_decompiler/decompiler = null diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index 9eaf627858b..2bd7a29f815 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -364,7 +364,7 @@ stack = stack_glass if("wood") if(!stack_wood) - stack_wood = new /obj/item/stack/sheet/wood/cyborg(src.module) + stack_wood = new /obj/item/stack/sheet/wood(src.module) stack_wood.amount = 1 stack = stack_wood if("plastic") From f91b5ee332a96a2e9c5df148afedd3f3695066b6 Mon Sep 17 00:00:00 2001 From: ProperPants Date: Thu, 31 Mar 2016 08:31:35 -0400 Subject: [PATCH 252/328] Never make commits literally five minutes after waking up. --- code/modules/mob/living/silicon/robot/drone/drone.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index fe6bd4c158c..d7a2a659be4 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -61,7 +61,7 @@ //Grab stacks. stack_metal = locate(/obj/item/stack/sheet/metal/cyborg) in src.module - stack_wood = locate(/obj/item/stack/sheet/wood/cyborg) in src.module + stack_wood = locate(/obj/item/stack/sheet/wood) in src.module stack_glass = locate(/obj/item/stack/sheet/glass/cyborg) in src.module stack_plastic = locate(/obj/item/stack/sheet/mineral/plastic/cyborg) in src.module From 2fe3b359820b8e5d911bb1bf41d864484772890d Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Thu, 31 Mar 2016 08:45:31 -0400 Subject: [PATCH 253/328] Shadowling Fix --- code/game/gamemodes/shadowling/shadowling.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm index 47479f42cb4..4a11d2415f7 100644 --- a/code/game/gamemodes/shadowling/shadowling.dm +++ b/code/game/gamemodes/shadowling/shadowling.dm @@ -69,6 +69,7 @@ Made by Xhuis name = "shadowling" config_tag = "shadowling" required_players = 30 + required_players_secret = 30 required_enemies = 2 recommended_enemies = 2 restricted_jobs = list("AI", "Cyborg") From a278328312983bf54ec3fa916e80adcfaf2bf5ca Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Thu, 31 Mar 2016 14:03:05 -0400 Subject: [PATCH 254/328] reworked the event --- code/game/gamemodes/meteor/meteors.dm | 55 +++++++++++++++++++++++++++ code/modules/events/meaty_gore.dm | 52 ++++++------------------- code/modules/events/meaty_ops.dm | 50 ++++++------------------ 3 files changed, 77 insertions(+), 80 deletions(-) diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index c7b55472b1c..0daab05e340 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -10,6 +10,10 @@ /var/list/meteors_dust = list(/obj/effect/meteor/dust) //for space dust event +/var/list/meteors_gore = list(/obj/effect/meteor/gore) //Meaty Gore + +/var/list/meteors_ops = list(/obj/effect/meteor/goreops) //Meaty Ops + /////////////////////////////// //Meteor spawning global procs @@ -256,3 +260,54 @@ ..() if(prob(20)) explosion(src.loc,2,4,6,8) + + +//Gore +/obj/effect/meteor/gore + name = "Oraganic Debris" + icon = 'icons/mob/human.dmi' + icon_state = "body_m_s" + hits = 1 + hitpwr = 0 + meteorsound = 'sound/effects/blobattack.ogg' + meteordrop = /obj/item/weapon/reagent_containers/food/snacks/meat + var/meteorgibs = /obj/effect/gibspawner/generic + +/obj/effect/meteor/gore/make_debris() + ..() + new meteorgibs(get_turf(src)) + + +/obj/effect/meteor/gore/ram_turf(turf/T) + if(!istype(T, /turf/space)) + new /obj/effect/decal/cleanable/blood (T) + +/obj/effect/meteor/gore/Bump(atom/A) + A.ex_act(hitpwr) + get_hit() + +//Meteor Ops +/obj/effect/meteor/goreops + name = "MeteorOps" + icon = 'icons/mob/animal.dmi' + icon_state = "syndicaterangedpsace" + hits = 3 + hitpwr = 3 + meteorsound = 'sound/effects/blobattack.ogg' + meteordrop = /obj/item/weapon/reagent_containers/food/snacks/meat + var/meteorgibs = /obj/effect/gibspawner/generic + +/obj/effect/meteor/goreops/make_debris() + ..() + new meteorgibs(get_turf(src)) + + +/obj/effect/meteor/goreops/ram_turf(turf/T) + if(!istype(T, /turf/space)) + new /obj/effect/decal/cleanable/blood (T) + +/obj/effect/meteor/goreops/Bump(atom/A) + A.ex_act(hitpwr) + get_hit() + + diff --git a/code/modules/events/meaty_gore.dm b/code/modules/events/meaty_gore.dm index 2306e13dbd0..729f5182344 100644 --- a/code/modules/events/meaty_gore.dm +++ b/code/modules/events/meaty_gore.dm @@ -1,47 +1,17 @@ -/datum/event/dust/gore/announce() +/datum/event/meteor_wave/gore/announce() command_announcement.Announce("Unknown biological debris have been detected near [station_name()], please stand-by.", "Debris Alert") -/datum/event/dust/gore/setup() - qnty = rand(45,125) +/datum/event/meteor_wave/gore/setup() + waves = 3 -/datum/event/dust/gore/start() - while(qnty-- > 0) - new /obj/effect/space_dust/gore() - if(prob(10)) - sleep(rand(10,15)) -/obj/effect/space_dust/gore - icon = 'icons/mob/human.dmi' - icon_state = "body_m_s" +/datum/event/meteor_wave/gore/tick() + if(waves && activeFor >= next_meteor) + spawn() spawn_meteors(rand(5,8), meteors_gore) + next_meteor += rand(15, 30) + waves-- + endWhen = (waves ? next_meteor + 1 : activeFor + 15) - strength = 1 - life = 1 -/obj/effect/space_dust/gore/Bump(atom/A) - if(prob(20)) - spawn(1) - for(var/mob/M in range(10, src)) - if(!M.stat && !istype(M, /mob/living/silicon/ai)) - shake_camera(M, 3, 1) - if (A) - playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1) - walk(src,0) - invisibility = 101 - new /obj/effect/decal/cleanable/blood(get_turf(A)) - if(ismob(A)) - A.ex_act(strength) - else - spawn(0) - if(A) - A.ex_act(strength) - if(src) - walk_towards(src,goal,1) - life-- - if(!life) - if(prob(80)) - gibs(loc) - if(prob(45)) - new /obj/item/weapon/reagent_containers/food/snacks/meat(loc) - new /obj/effect/decal/cleanable/blood/gibs(loc) - - qdel(src) \ No newline at end of file +/datum/event/meteor_wave/gore/end() + command_announcement.Announce("The station has cleared the debris.", "Debris Alert") diff --git a/code/modules/events/meaty_ops.dm b/code/modules/events/meaty_ops.dm index 5bc32c32640..0c9b95cfc5a 100644 --- a/code/modules/events/meaty_ops.dm +++ b/code/modules/events/meaty_ops.dm @@ -1,47 +1,19 @@ -/datum/event/dust/goreop/announce() +/datum/event/meteor_wave/goreop/announce() var/meteor_declaration = "MeteorOps have declared thier intent to utterly destroy [station_name()] with thier own bodies, and dares the crew to try and stop them." command_announcement.Announce(meteor_declaration, "Declaration of 'War'", 'sound/effects/siren.ogg') -/datum/event/dust/goreop/setup() - qnty = rand(45,125) +/datum/event/meteor_wave/goreop/setup() + waves = 3 -/datum/event/dust/goreop/start() - while(qnty-- > 0) - new /obj/effect/space_dust/gore() - if(prob(10)) - sleep(rand(10,15)) -/obj/effect/space_dust/goreop - icon = 'icons/mob/animal.dmi' - icon_state = "syndicaterangedpsace" +/datum/event/meteor_wave/goreop/tick() + if(waves && activeFor >= next_meteor) + spawn() spawn_meteors(5, meteors_ops) + next_meteor += rand(15, 30) + waves-- + endWhen = (waves ? next_meteor + 1 : activeFor + 15) - strength = 1 - life = 1 -/obj/effect/space_dust/goreop/Bump(atom/A) - if(prob(20)) - spawn(1) - for(var/mob/M in range(10, src)) - if(!M.stat && !istype(M, /mob/living/silicon/ai)) - shake_camera(M, 3, 1) - if (A) - playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1) - walk(src,0) - new /obj/effect/decal/cleanable/blood(get_turf(A)) - if(ismob(A)) - A.ex_act(strength) - else - spawn(0) - if(A) - A.ex_act(strength) - if(src) - walk_towards(src,goal,1) - life-- - if(!life) - if(prob(80)) - gibs(loc) - if(prob(45)) - new /obj/item/weapon/reagent_containers/food/snacks/meat(loc) - new /obj/effect/decal/cleanable/blood/gibs(loc) - qdel(src) \ No newline at end of file +/datum/event/meteor_wave/end() + command_announcement.Announce("All MeteorOps are dead. Major Station Victory.", "MeteorOps") \ No newline at end of file From bd76a0b3fb8e01265de7c11e80bed84dddf7e9d8 Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Thu, 31 Mar 2016 16:58:27 -0400 Subject: [PATCH 255/328] Fixes paper limit bugs --- code/_compile_options.dm | 1 + code/modules/paperwork/paper.dm | 9 ++++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 62459bf70b3..662ec34ceac 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -8,6 +8,7 @@ //Don't set this very much higher then 1024 unless you like inviting people in to dos your server with message spam #define MAX_MESSAGE_LEN 1024 #define MAX_PAPER_MESSAGE_LEN 3072 +#define MAX_PAPER_FIELDS 50 #define MAX_BOOK_MESSAGE_LEN 9216 #define MAX_NAME_LEN 26 diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 635d8f1bd8e..a07303bee43 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -140,10 +140,13 @@ ..() /obj/item/weapon/paper/proc/addtofield(var/id, var/text, var/links = 0) + if(id > MAX_PAPER_FIELDS) + return + var/locid = 0 var/laststart = 1 var/textindex = 1 - while(1) // I know this can cause infinite loops and fuck up the whole server, but the if(istart==0) should be safe as fuck + while(locid <= MAX_PAPER_FIELDS) var/istart = 0 if(links) istart = findtext(info_links, "", laststart) @@ -248,11 +251,11 @@ t = "[t]" -// t = replacetext(t, "#", "") // Junk converted to nothing! + t = copytext(t, 1, MAX_PAPER_MESSAGE_LEN) //Count the fields var/laststart = 1 - while(1) + while(fields < MAX_PAPER_FIELDS) var/i = findtext(t, "", laststart) if(i==0) break From b35299079fd82b0caeef6d4cc7e0c61f0515f87a Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Thu, 31 Mar 2016 17:01:23 -0400 Subject: [PATCH 256/328] Fixes bloated human head --- code/modules/clothing/head/misc.dm | 8 +++++++- code/modules/clothing/suits/miscellaneous.dm | 7 ------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index f0585fb3953..a44225b2d34 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -360,4 +360,10 @@ name = "Lord Admiral's Hat" desc = "A hat suitable for any man of high and exalted rank." icon_state = "lordadmiralhat" - item_state = "lordadmiralhat" \ No newline at end of file + item_state = "lordadmiralhat" + +/obj/item/clothing/head/human_head + name = "bloated human head" + desc = "A horribly bloated and mismatched human head." + icon_state = "lingspacehelmet" + item_state = "lingspacehelmet" \ No newline at end of file diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 85dae45750b..5cf32d35a12 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -231,13 +231,6 @@ item_state = "lingspacesuit" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS -/obj/item/clothing/head/human_head - name = "bloated human head" - desc = "A horribly bloated and mismatched human head." - icon_state = "lingspacehelmet" - item_state = "lingspacehelmet" - body_parts_covered = HEAD - /* * Misc From fbad81f2575cbc4df1b113b61de2767b7bea98b3 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 31 Mar 2016 20:07:47 -0400 Subject: [PATCH 257/328] Automatic changelog generation for PR #4018 --- html/changelogs/AutoChangeLog-pr-4018.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4018.yml diff --git a/html/changelogs/AutoChangeLog-pr-4018.yml b/html/changelogs/AutoChangeLog-pr-4018.yml new file mode 100644 index 00000000000..354bfb190d2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4018.yml @@ -0,0 +1,10 @@ +author: Tastyfish +delete-after: True +changes: + - rscadd: "Bots can now be controlled by players, by opening them up and inserting a pAI. *beep" + - bugfix: "MULEbots can now access the engineering destination." + - bugfix: "All MULEbot destinations should now have the correct load/unload direction, meaning the crates won't be dumped inside the flaps." + - rscadd: "Diagnostic HUD's now give health and status information about bots." + - bugfix: "MULEbot rampage blood tracks are now rendered correctly and handle UE traces as appropriate." + - experiment: "Bots should (hopefully) lag the game less now." + - tweak: "Beepsky contains 30% more potato." From 53584b0b20d86939b2c8eb756d604273ff157a4a Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 31 Mar 2016 20:27:11 -0400 Subject: [PATCH 258/328] Automatic changelog generation for PR #4039 --- html/changelogs/AutoChangeLog-pr-4039.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4039.yml diff --git a/html/changelogs/AutoChangeLog-pr-4039.yml b/html/changelogs/AutoChangeLog-pr-4039.yml new file mode 100644 index 00000000000..c0c6335d6be --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4039.yml @@ -0,0 +1,5 @@ +author: TheDZD +delete-after: True +changes: + - rscdel: "A lot of the guns and armor in the station collision, space hotel, academy, and wild west away missions have been removed/replaced." + - rscdel: "Removes that fucking facehugger from station collision." From c7125a4070c63ed9e684e71d2c7bfe97b5fad687 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 31 Mar 2016 20:27:44 -0400 Subject: [PATCH 259/328] Automatic changelog generation for PR #4044 --- html/changelogs/AutoChangeLog-pr-4044.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4044.yml diff --git a/html/changelogs/AutoChangeLog-pr-4044.yml b/html/changelogs/AutoChangeLog-pr-4044.yml new file mode 100644 index 00000000000..9fc834e42c2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4044.yml @@ -0,0 +1,4 @@ +author: Tastyfish +delete-after: True +changes: + - rscadd: "Adds treadmills to brig cells, to give the prisoners something productive to do." From 0c74d7bc29ac6c55cb7bfd942ea4112623494595 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Thu, 31 Mar 2016 20:38:15 -0400 Subject: [PATCH 260/328] nanomachines traitor bottle --- code/modules/reagents/reagent_containers/glass/bottle.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/reagent_containers/glass/bottle.dm b/code/modules/reagents/reagent_containers/glass/bottle.dm index 88b3f251507..de13b500f33 100644 --- a/code/modules/reagents/reagent_containers/glass/bottle.dm +++ b/code/modules/reagents/reagent_containers/glass/bottle.dm @@ -299,7 +299,7 @@ New() ..() - reagents.add_reagent(pick("polonium","initropidril","concentrated_initro","pancuronium","sodium_thiopental","ketamine","sulfonal","amanitin","coniine","curare","sarin","histamine","venom","cyanide","spidereggs"), 40) + reagents.add_reagent(pick("polonium","initropidril","concentrated_initro","pancuronium","sodium_thiopental","ketamine","sulfonal","amanitin","coniine","curare","sarin","histamine","venom","cyanide","spidereggs","nanomachines"), 40) /obj/item/weapon/reagent_containers/glass/bottle/plasma From 0d440f088ab1825db458b31488bb5494e283e8e7 Mon Sep 17 00:00:00 2001 From: FalseIncarnate Date: Thu, 31 Mar 2016 21:12:46 -0400 Subject: [PATCH 261/328] Notify player when filling full container from sink --- code/modules/reagents/reagent_containers.dm | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 1c1ea684f26..b78c54bb4ef 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -79,7 +79,11 @@ /obj/item/weapon/reagent_containers/wash(mob/user, atom/source) if(is_open_container()) - reagents.add_reagent("water", min(volume - reagents.total_volume, amount_per_transfer_from_this)) - user << "You fill [src] from [source]." - return + if(reagents.total_volume >= volume) + user << "span class='warning'>\The [src] is full." + return + else + reagents.add_reagent("water", min(volume - reagents.total_volume, amount_per_transfer_from_this)) + user << "You fill [src] from [source]." + return ..() \ No newline at end of file From ce18b58e205711d7293d3aa160367a2c3a85e4f2 Mon Sep 17 00:00:00 2001 From: FalseIncarnate Date: Thu, 31 Mar 2016 21:36:38 -0400 Subject: [PATCH 262/328] Prevents splashing onto closed beakers Also removes relative pathing and replaces color macros in glass_containers.dm --- .../reagent_containers/glass_containers.dm | 337 +++++++++--------- 1 file changed, 169 insertions(+), 168 deletions(-) diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm index b5071cda21f..5627e85c0b2 100644 --- a/code/modules/reagents/reagent_containers/glass_containers.dm +++ b/code/modules/reagents/reagent_containers/glass_containers.dm @@ -42,133 +42,137 @@ /obj/machinery/portable_atmospherics/hydroponics, /obj/machinery/constructable_frame) - New() - ..() - base_name = name +/obj/item/weapon/reagent_containers/glass/New() + ..() + base_name = name - examine(mob/user) - if(!..(user, 2)) +/obj/item/weapon/reagent_containers/glass/examine(mob/user) + if(!..(user, 2)) + return + if (!is_open_container()) + user << "Airtight lid seals it completely." + +/obj/item/weapon/reagent_containers/glass/attack_self() + ..() + if (is_open_container()) + usr << "You put the lid on \the [src]." + flags ^= OPENCONTAINER + else + usr << "You take the lid off \the [src]." + flags |= OPENCONTAINER + update_icon() + +/obj/item/weapon/reagent_containers/glass/afterattack(obj/target, mob/user, proximity) + if(!proximity) return + if (!is_open_container()) + return + + for(var/type in can_be_placed_into) + if(istype(target, type)) return - if (!is_open_container()) - user << "\blue Airtight lid seals it completely." - attack_self() - ..() - if (is_open_container()) - usr << "You put the lid on \the [src]." - flags ^= OPENCONTAINER + if(ismob(target) && target.reagents && reagents.total_volume) + user << "You splash the solution onto [target]." + + var/mob/living/M = target + var/list/injected = list() + for(var/datum/reagent/R in reagents.reagent_list) + injected += R.name + var/contained = english_list(injected) + M.attack_log += text("\[[time_stamp()]\] Has been splashed with [name] by [key_name(user)]. Reagents: [contained]") + user.attack_log += text("\[[time_stamp()]\] Used the [name] to splash [key_name(M)]. Reagents: [contained]") + if(M.ckey) + msg_admin_attack("[key_name_admin(user)] splashed [key_name_admin(M)] with [name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)])") + if(!iscarbon(user)) + M.LAssailant = null else - usr << "You take the lid off \the [src]." - flags |= OPENCONTAINER - update_icon() + M.LAssailant = user - afterattack(obj/target, mob/user, proximity) - if(!proximity) return - if (!is_open_container()) + for(var/mob/O in viewers(world.view, user)) + O.show_message(text("[] has been splashed with something by []!", target, user), 1) + reagents.reaction(target, TOUCH) + spawn(5) reagents.clear_reagents() + return + else if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us. + + if(!target.reagents.total_volume && target.reagents) + user << "[target] is empty." return - for(var/type in src.can_be_placed_into) - if(istype(target, type)) - return - - if(ismob(target) && target.reagents && reagents.total_volume) - user << "\blue You splash the solution onto [target]." - - var/mob/living/M = target - var/list/injected = list() - for(var/datum/reagent/R in src.reagents.reagent_list) - injected += R.name - var/contained = english_list(injected) - M.attack_log += text("\[[time_stamp()]\] Has been splashed with [src.name] by [key_name(user)]. Reagents: [contained]") - user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to splash [key_name(M)]. Reagents: [contained]") - if(M.ckey) - msg_admin_attack("[key_name_admin(user)] splashed [key_name_admin(M)] with [src.name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)])") - if(!iscarbon(user)) - M.LAssailant = null - else - M.LAssailant = user - - for(var/mob/O in viewers(world.view, user)) - O.show_message(text("\red [] has been splashed with something by []!", target, user), 1) - src.reagents.reaction(target, TOUCH) - spawn(5) src.reagents.clear_reagents() - return - else if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us. - - if(!target.reagents.total_volume && target.reagents) - user << "\red [target] is empty." - return - - if(reagents.total_volume >= reagents.maximum_volume) - user << "\red [src] is full." - return - - var/trans = target.reagents.trans_to(src, target:amount_per_transfer_from_this) - user << "\blue You fill [src] with [trans] units of the contents of [target]." - - else if(target.is_open_container() && target.reagents) //Something like a glass. Player probably wants to transfer TO it. - if(!reagents.total_volume) - user << "\red [src] is empty." - return - - if(target.reagents.total_volume >= target.reagents.maximum_volume) - user << "\red [target] is full." - return - - // /vg/: Logging transfers of bad things - if(target.reagents_to_log.len) - var/list/badshit=list() - for(var/bad_reagent in target.reagents_to_log) - if(reagents.has_reagent(bad_reagent)) - badshit += reagents_to_log[bad_reagent] - if(badshit.len) - var/hl="\red ([english_list(badshit)]) \black" - message_admins("[key_name_admin(user)] added [reagents.get_reagent_ids(1)] to \a [target] with [src].[hl]") - log_game("[key_name(user)] added [reagents.get_reagent_ids(1)] to \a [target] with [src].") - - var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this) - user << "\blue You transfer [trans] units of the solution to [target]." - - /*else if(istype(target, /obj/machinery/bunsen_burner)) + if(reagents.total_volume >= reagents.maximum_volume) + user << "[src] is full." return - else if(istype(target, /obj/machinery/radiocarbon_spectrometer)) - return*/ + var/trans = target.reagents.trans_to(src, target:amount_per_transfer_from_this) + user << "You fill [src] with [trans] units of the contents of [target]." - else if(istype(target, /obj/effect/decal/cleanable)) //stops splashing while scooping up fluids + else if(target.is_open_container() && target.reagents) //Something like a glass. Player probably wants to transfer TO it. + if(!reagents.total_volume) + user << "[src] is empty." return - else if(reagents.total_volume) - user << "\blue You splash the solution onto [target]." - src.reagents.reaction(target, TOUCH) - spawn(5) src.reagents.clear_reagents() + if(target.reagents.total_volume >= target.reagents.maximum_volume) + user << "[target] is full." return + // /vg/: Logging transfers of bad things + if(target.reagents_to_log.len) + var/list/badshit=list() + for(var/bad_reagent in target.reagents_to_log) + if(reagents.has_reagent(bad_reagent)) + badshit += reagents_to_log[bad_reagent] + if(badshit.len) + var/hl="\red ([english_list(badshit)]) \black" + message_admins("[key_name_admin(user)] added [reagents.get_reagent_ids(1)] to \a [target] with [src].[hl]") + log_game("[key_name(user)] added [reagents.get_reagent_ids(1)] to \a [target] with [src].") - attackby(var/obj/item/I, mob/user as mob, params) - if(istype(I, /obj/item/clothing/mask/cigarette)) //ciggies are weird - return - if(is_hot(I)) - if(src.reagents) - src.reagents.chem_temp += 15 - user << "You heat [src] with [I]." - src.reagents.handle_reactions() - if(istype(I, /obj/item/weapon/pen) || istype(I, /obj/item/device/flashlight/pen)) - var/tmp_label = sanitize(input(user, "Enter a label for [src.name]","Label",src.label_text)) - if(length(tmp_label) > 10) - user << "\red The label can be at most 10 characters long." - else - user << "\blue You set the label to \"[tmp_label]\"." - src.label_text = tmp_label - src.update_name_label() - if(istype(I,/obj/item/weapon/storage/bag)) - ..() + var/trans = reagents.trans_to(target, amount_per_transfer_from_this) + user << "You transfer [trans] units of the solution to [target]." - proc/update_name_label() - if(src.label_text == "") - src.name = src.base_name + else if(istype(target, /obj/item/weapon/reagent_containers/glass) && !target.is_open_container()) + user << "You cannot fill [target] while it is sealed." + return + + /*else if(istype(target, /obj/machinery/bunsen_burner)) + return + + else if(istype(target, /obj/machinery/radiocarbon_spectrometer)) + return*/ + + else if(istype(target, /obj/effect/decal/cleanable)) //stops splashing while scooping up fluids + return + + else if(reagents.total_volume) + user << "You splash the solution onto [target]." + reagents.reaction(target, TOUCH) + spawn(5) reagents.clear_reagents() + return + + +/obj/item/weapon/reagent_containers/glass/attackby(var/obj/item/I, mob/user as mob, params) + if(istype(I, /obj/item/clothing/mask/cigarette)) //ciggies are weird + return + if(is_hot(I)) + if(reagents) + reagents.chem_temp += 15 + user << "You heat [src] with [I]." + reagents.handle_reactions() + if(istype(I, /obj/item/weapon/pen) || istype(I, /obj/item/device/flashlight/pen)) + var/tmp_label = sanitize(input(user, "Enter a label for [name]","Label",label_text)) + if(length(tmp_label) > 10) + user << "\red The label can be at most 10 characters long." else - src.name = "[src.base_name] ([src.label_text])" + user << "You set the label to \"[tmp_label]\"." + label_text = tmp_label + update_name_label() + if(istype(I,/obj/item/weapon/storage/bag)) + ..() + +/obj/item/weapon/reagent_containers/glass/proc/update_name_label() + if(label_text == "") + name = base_name + else + name = "[base_name] ([label_text])" /obj/item/weapon/reagent_containers/glass/beaker name = "beaker" @@ -179,45 +183,45 @@ materials = list(MAT_GLASS=500) var/obj/item/device/assembly_holder/assembly = null - on_reagent_change() - update_icon() - - pickup(mob/user) - ..() - update_icon() - - dropped(mob/user) - ..() - update_icon() - - attack_hand() - ..() - update_icon() - +/obj/item/weapon/reagent_containers/glass/beaker/on_reagent_change() update_icon() - overlays.Cut() - if(reagents.total_volume) - var/image/filling = image('icons/obj/reagentfillings.dmi', src, "[icon_state]10") +/obj/item/weapon/reagent_containers/glass/beaker/pickup(mob/user) + ..() + update_icon() - var/percent = round((reagents.total_volume / volume) * 100) - switch(percent) - if(0 to 9) filling.icon_state = "[icon_state]-10" - if(10 to 24) filling.icon_state = "[icon_state]10" - if(25 to 49) filling.icon_state = "[icon_state]25" - if(50 to 74) filling.icon_state = "[icon_state]50" - if(75 to 79) filling.icon_state = "[icon_state]75" - if(80 to 90) filling.icon_state = "[icon_state]80" - if(91 to INFINITY) filling.icon_state = "[icon_state]100" +/obj/item/weapon/reagent_containers/glass/beaker/dropped(mob/user) + ..() + update_icon() - filling.icon += mix_color_from_reagents(reagents.reagent_list) - overlays += filling +/obj/item/weapon/reagent_containers/glass/beaker/attack_hand() + ..() + update_icon() - if (!is_open_container()) - var/image/lid = image(icon, src, "lid_[initial(icon_state)]") - overlays += lid - if(assembly) - overlays += "assembly" +/obj/item/weapon/reagent_containers/glass/beaker/update_icon() + overlays.Cut() + + if(reagents.total_volume) + var/image/filling = image('icons/obj/reagentfillings.dmi', src, "[icon_state]10") + + var/percent = round((reagents.total_volume / volume) * 100) + switch(percent) + if(0 to 9) filling.icon_state = "[icon_state]-10" + if(10 to 24) filling.icon_state = "[icon_state]10" + if(25 to 49) filling.icon_state = "[icon_state]25" + if(50 to 74) filling.icon_state = "[icon_state]50" + if(75 to 79) filling.icon_state = "[icon_state]75" + if(80 to 90) filling.icon_state = "[icon_state]80" + if(91 to INFINITY) filling.icon_state = "[icon_state]100" + + filling.icon += mix_color_from_reagents(reagents.reagent_list) + overlays += filling + + if (!is_open_container()) + var/image/lid = image(icon, src, "lid_[initial(icon_state)]") + overlays += lid + if(assembly) + overlays += "assembly" /obj/item/weapon/reagent_containers/glass/beaker/verb/remove_assembly() set name = "Remove Assembly" @@ -309,23 +313,20 @@ possible_transfer_amounts = list(5,10,15,25,30,50,100,300) flags = OPENCONTAINER -/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone - New() - ..() - reagents.add_reagent("cryoxadone", 30) - update_icon() +/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone/New() + ..() + reagents.add_reagent("cryoxadone", 30) + update_icon() -/obj/item/weapon/reagent_containers/glass/beaker/sulphuric - New() - ..() - reagents.add_reagent("sacid", 50) - update_icon() +/obj/item/weapon/reagent_containers/glass/beaker/sulphuric/New() + ..() + reagents.add_reagent("sacid", 50) + update_icon() -/obj/item/weapon/reagent_containers/glass/beaker/slime - New() - ..() - reagents.add_reagent("slimejelly", 50) - update_icon() +/obj/item/weapon/reagent_containers/glass/beaker/slime/New() + ..() + reagents.add_reagent("slimejelly", 50) + update_icon() /obj/item/weapon/reagent_containers/glass/bucket desc = "It's a bucket." @@ -340,15 +341,15 @@ volume = 120 flags = OPENCONTAINER - attackby(var/obj/D, mob/user as mob, params) - if(isprox(D)) - user << "You add [D] to [src]." - qdel(D) - user.put_in_hands(new /obj/item/weapon/bucket_sensor) - user.unEquip(src) - qdel(src) - else - ..() +/obj/item/weapon/reagent_containers/glass/bucket/attackby(var/obj/D, mob/user as mob, params) + if(isprox(D)) + user << "You add [D] to [src]." + qdel(D) + user.put_in_hands(new /obj/item/weapon/bucket_sensor) + user.unEquip(src) + qdel(src) + else + ..() /obj/item/weapon/reagent_containers/glass/beaker/vial name = "vial" From 2338cfecfea08c491446486291c0faa06f9e0006 Mon Sep 17 00:00:00 2001 From: FalseIncarnate Date: Thu, 31 Mar 2016 21:43:04 -0400 Subject: [PATCH 263/328] One more color macro --- code/modules/reagents/reagent_containers/glass_containers.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm index 5627e85c0b2..440d68eb02f 100644 --- a/code/modules/reagents/reagent_containers/glass_containers.dm +++ b/code/modules/reagents/reagent_containers/glass_containers.dm @@ -160,7 +160,7 @@ if(istype(I, /obj/item/weapon/pen) || istype(I, /obj/item/device/flashlight/pen)) var/tmp_label = sanitize(input(user, "Enter a label for [name]","Label",label_text)) if(length(tmp_label) > 10) - user << "\red The label can be at most 10 characters long." + user << "The label can be at most 10 characters long." else user << "You set the label to \"[tmp_label]\"." label_text = tmp_label From 1db93aae1fbcfdd5d4b09b7ad89b6409967de785 Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Thu, 31 Mar 2016 22:33:29 -0400 Subject: [PATCH 264/328] Iseeytou --- code/__DEFINES/hud.dm | 7 +++-- code/datums/hud.dm | 8 ++++-- code/game/gamemodes/antag_hud.dm | 26 +++++-------------- .../game/gamemodes/autotraitor/autotraitor.dm | 4 +-- code/game/gamemodes/changeling/changeling.dm | 6 ++--- code/game/gamemodes/traitor/traitor.dm | 6 ++--- code/game/gamemodes/vampire/vampire.dm | 6 ++--- code/modules/mob/dead/observer/observer.dm | 14 ---------- 8 files changed, 29 insertions(+), 48 deletions(-) diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm index ab41a74ecd3..354fee068cc 100644 --- a/code/__DEFINES/hud.dm +++ b/code/__DEFINES/hud.dm @@ -35,5 +35,8 @@ #define ANTAG_HUD_OPS 9 #define ANTAG_HUD_WIZ 10 #define ANTAG_HUD_SHADOW 11 -#define ANTAG_HUD_SOLO 12 - +#define ANTAG_HUD_TRAITOR 12 +#define ANTAG_HUD_NINJA 13 //For Daves Rework +#define ANTAG_HUD_CHANGELING 14 +#define ANTAG_HUD_VAMPIRE 15 +#define ANTAG_HUD_ABDUCTOR 16 //For Fox diff --git a/code/datums/hud.dm b/code/datums/hud.dm index 70a97f648f8..28781979b77 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -13,7 +13,11 @@ var/datum/atom_hud/huds = list( \ ANTAG_HUD_OPS = new/datum/atom_hud/antag(), \ ANTAG_HUD_WIZ = new/datum/atom_hud/antag(), \ ANTAG_HUD_SHADOW = new/datum/atom_hud/antag(), \ - ANTAG_HUD_SOLO = new/datum/atom_hud/antag(), \ + ANTAG_HUD_TRAITOR = new/datum/atom_hud/antag/hidden(),\ + ANTAG_HUD_NINJA = new/datum/atom_hud/antag/hidden(),\ + ANTAG_HUD_CHANGELING = new/datum/atom_hud/antag/hidden(),\ + ANTAG_HUD_VAMPIRE = new/datum/atom_hud/antag/hidden(),\ + ANTAG_HUD_ABDUCTOR = new/datum/atom_hud/antag/hidden(),\ ) /datum/atom_hud @@ -24,7 +28,7 @@ var/datum/atom_hud/huds = list( \ /datum/atom_hud/proc/remove_hud_from(mob/M) if(!M) return - if(src in M.permanent_huds)//I will deal with you later -Fethas + if(src in M.permanent_huds) return for(var/atom/A in hudatoms) remove_from_single_hud(M, A) diff --git a/code/game/gamemodes/antag_hud.dm b/code/game/gamemodes/antag_hud.dm index 0b2ee9320de..172c2c1e54c 100644 --- a/code/game/gamemodes/antag_hud.dm +++ b/code/game/gamemodes/antag_hud.dm @@ -1,5 +1,9 @@ /datum/atom_hud/antag hud_icons = list(SPECIALROLE_HUD,NATIONS_HUD) + var/self_visible = 1 + +/datum/atom_hud/antag/hidden + self_visible = 0 /datum/atom_hud/antag/proc/join_hud(mob/M,var/slave) if(!istype(M)) @@ -8,15 +12,8 @@ M.mind.antag_hud.leave_hud(M) if(!ismask(M))//FUCK YOU MASK OF NARNAR! add_to_hud(M) - add_hud_to(M) - M.mind.antag_hud = src - -/datum/atom_hud/antag/proc/join_solo_hud(mob/M,var/slave)//for non team antags and for observer huds - if(!istype(M)) - CRASH("join_hud(): [M] ([M.type]) is not a mob!") - if(M.mind.antag_hud && !slave) //note: please let this runtime if a mob has no mind, as mindless mobs shouldn't be getting antagged - M.mind.antag_hud.leave_hud(M) - add_to_hud(M) + if(self_visible) + add_hud_to(M) M.mind.antag_hud = src /datum/atom_hud/antag/proc/leave_hud(mob/M) @@ -49,22 +46,13 @@ if(M.mind || new_icon_state) //in mindless mobs, only null is acceptable, otherwise we're antagging a mindless mob, meaning we should runtime M.mind.antag_hud_icon_state = new_icon_state -/datum/atom_hud/antag/proc/is_solo_antag(mob/M) - if(M.mind.special_role == "traitor" || M.mind.special_role == "vampire" || M.mind.special_role == "Changeling") - return 1 - return 0 - - //MIND PROCS //these are called by mind.transfer_to() /datum/mind/proc/transfer_antag_huds(var/datum/atom_hud/antag/newhud) leave_all_huds() ticker.mode.set_antag_hud(current, antag_hud_icon_state) if(newhud) - if(newhud.is_solo_antag(current)) - newhud.join_solo_hud(current) - else - newhud.join_hud(current) + newhud.join_hud(current) /datum/mind/proc/leave_all_huds() for(var/datum/atom_hud/antag/hud in huds) diff --git a/code/game/gamemodes/autotraitor/autotraitor.dm b/code/game/gamemodes/autotraitor/autotraitor.dm index a0059416276..6c01d6197a7 100644 --- a/code/game/gamemodes/autotraitor/autotraitor.dm +++ b/code/game/gamemodes/autotraitor/autotraitor.dm @@ -136,8 +136,8 @@ newtraitor << "\red ATTENTION: \black It is time to pay your debt to the Syndicate..." newtraitor << "You are now a traitor." newtraitor.mind.special_role = "traitor" - var/datum/atom_hud/antag/tatorhud = huds[SPECIALROLE_HUD] - tatorhud.join_solo_hud(newtraitor) + var/datum/atom_hud/antag/tatorhud = huds[ANTAG_HUD_TRAITOR] + tatorhud.join_hud(newtraitor) set_antag_hud(src, "hudsyndicate") var/obj_count = 1 diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 324fa636740..67190e351f4 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -164,12 +164,12 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" update_change_icons_removed(changeling_mind) /datum/game_mode/proc/update_change_icons_added(datum/mind/changeling) - var/datum/atom_hud/antag/linghud = huds[ANTAG_HUD_SOLO] - linghud.join_solo_hud(changeling.current) + var/datum/atom_hud/antag/linghud = huds[ANTAG_HUD_CHANGELING] + linghud.join_hud(changeling.current) set_antag_hud(changeling.current, "hudchangeling") /datum/game_mode/proc/update_change_icons_removed(datum/mind/changeling) - var/datum/atom_hud/antag/linghud = huds[ANTAG_HUD_SOLO] + var/datum/atom_hud/antag/linghud = huds[ANTAG_HUD_CHANGELING] linghud.leave_hud(changeling.current) set_antag_hud(changeling.current, null) diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 7fe0121090e..bfb5a38e319 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -340,13 +340,13 @@ traitor_mob.mind.store_memory("Potential Collaborator: [M.real_name]") /datum/game_mode/proc/update_traitor_icons_added(datum/mind/traitor_mind) - var/datum/atom_hud/antag/tatorhud = huds[ANTAG_HUD_SOLO] + var/datum/atom_hud/antag/tatorhud = huds[ANTAG_HUD_TRAITOR] //var/ref = "\ref[traitor_mind]" - tatorhud.join_solo_hud(traitor_mind.current) + tatorhud.join_hud(traitor_mind.current) set_antag_hud(traitor_mind.current, "hudsyndicate") /datum/game_mode/proc/update_traitor_icons_removed(datum/mind/traitor_mind) - var/datum/atom_hud/antag/tatorhud = huds[ANTAG_HUD_SOLO] + var/datum/atom_hud/antag/tatorhud = huds[ANTAG_HUD_TRAITOR] tatorhud.leave_hud(traitor_mind.current) set_antag_hud(traitor_mind.current, null) diff --git a/code/game/gamemodes/vampire/vampire.dm b/code/game/gamemodes/vampire/vampire.dm index f10227cc6c3..edb240eb1cd 100644 --- a/code/game/gamemodes/vampire/vampire.dm +++ b/code/game/gamemodes/vampire/vampire.dm @@ -328,12 +328,12 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha //prepare for copypaste /datum/game_mode/proc/update_vampire_icons_added(datum/mind/vampire_mind) - var/datum/atom_hud/antag/vamp_hud = huds[ANTAG_HUD_SOLO] - vamp_hud.join_solo_hud(vampire_mind.current) + var/datum/atom_hud/antag/vamp_hud = huds[ANTAG_HUD_VAMPIRE] + vamp_hud.join_hud(vampire_mind.current) set_antag_hud(vampire_mind.current, ((vampire_mind in vampires) ? "hudvampire" : "hudvampirethrall")) /datum/game_mode/proc/update_vampire_icons_removed(datum/mind/vampire_mind) - var/datum/atom_hud/antag/vampire_hud = huds[ANTAG_HUD_SOLO] + var/datum/atom_hud/antag/vampire_hud = huds[ANTAG_HUD_VAMPIRE] vampire_hud.leave_hud(vampire_mind.current) set_antag_hud(vampire_mind.current, null) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 16d826b55f5..46a40f6a1bf 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -110,18 +110,6 @@ Works together with spawning an observer, noted above. if(!loc) return if(!client) return 0 - //regular_hud_updates() - //if(client.images.len) - // for(var/image/hud in client.images) - // if(copytext(hud.icon_state,1,4) == "hud") - // client.images.Remove(hud) - //if(antagHUD) - // var/list/target_list = list() - // for(var/mob/living/target in oview(src, 14)) - // if(target.mind && (target.mind.special_role || issilicon(target) || target.mind.nation)) - // target_list += target - // if(target_list.len) - // assess_targets(target_list, src) /mob/dead/proc/assess_targets(list/target_list, mob/dead/observer/U) @@ -320,9 +308,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp //var/adding_hud = (usr in A.hudusers) ? 0 : 1 for(var/datum/atom_hud/antag/H in (huds)) - //if(istype(H, /datum/atom_hud/antag))// || istype(H, /datum/atom_hud/data/human/security/advanced)) if(!M.antagHUD) - //(adding_hud) ? H.add_hud_to(usr) : H.remove_hud_from(usr) H.add_hud_to(usr) else H.remove_hud_from(usr) From 5d8b02b37ad05ef6bd008b971f775a4304ca16fc Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Fri, 1 Apr 2016 00:39:48 -0400 Subject: [PATCH 265/328] cleanup --- code/modules/mob/living/carbon/human/species/species.dm | 4 ++-- code/modules/mob/living/carbon/human/species/station.dm | 8 ++++---- code/modules/mob/mob_grab.dm | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 8b3110248bc..097a91810da 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -63,8 +63,8 @@ var/ventcrawler = 0 //Determines if the mob can go through the vents. var/has_fine_manipulation = 1 // Can use small items. - var/can_consume_mobs = 0 //can it consume mobs? - var/list/allowed_consumed_mobs = list() + + var/list/allowed_consumed_mobs = list() //If a species can consume mobs, put the type of mobs it can consume here. var/flags = 0 // Various specific features. var/clothing_flags = 0 // Underwear and socks. diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 69fc186c56c..8e0b9f5d2b7 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -55,7 +55,7 @@ flesh_color = "#34AF10" reagent_tag = PROCESS_ORG base_color = "#066000" - can_consume_mobs = 1 + allowed_consumed_mobs = list(/mob/living/simple_animal/mouse, /mob/living/simple_animal/lizard, /mob/living/simple_animal/chick, /mob/living/simple_animal/chicken, /mob/living/simple_animal/crab, /mob/living/simple_animal/butterfly, /mob/living/simple_animal/parrot, /mob/living/simple_animal/tribble) @@ -109,7 +109,7 @@ reagent_tag = PROCESS_ORG flesh_color = "#AFA59E" base_color = "#333333" - can_consume_mobs = 1 + allowed_consumed_mobs = list(/mob/living/simple_animal/mouse, /mob/living/simple_animal/chick, /mob/living/simple_animal/butterfly, /mob/living/simple_animal/parrot, /mob/living/simple_animal/tribble) @@ -153,7 +153,7 @@ reagent_tag = PROCESS_ORG flesh_color = "#966464" base_color = "#B43214" - can_consume_mobs = 1 + allowed_consumed_mobs = list(/mob/living/simple_animal/mouse, /mob/living/simple_animal/lizard, /mob/living/simple_animal/chick, /mob/living/simple_animal/chicken, /mob/living/simple_animal/crab, /mob/living/simple_animal/butterfly, /mob/living/simple_animal/parrot, /mob/living/simple_animal/tribble) @@ -363,7 +363,7 @@ dietflags = DIET_HERB blood_color = "#FB9800" reagent_tag = PROCESS_ORG - can_consume_mobs = 1 + allowed_consumed_mobs = list(/mob/living/simple_animal/diona) suicide_messages = list( diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index aaee2c1b985..f5a61359a01 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -414,7 +414,7 @@ return 1 var/mob/living/carbon/human/H = attacker - if(ishuman(H) && H.species.can_consume_mobs && is_type_in_list(prey, H.species.allowed_consumed_mobs)) //species eating of other mobs + if(ishuman(H) && is_type_in_list(prey, H.species.allowed_consumed_mobs)) //species eating of other mobs return 1 return 0 From e277cf292b3acd3e1c27d2868f4a60ed53eb5273 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Fri, 1 Apr 2016 01:11:11 -0400 Subject: [PATCH 266/328] Headcrab Fix --- code/modules/mob/living/simple_animal/hostile/headcrab.dm | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm index 4dd8862b4a9..b470f0506ff 100644 --- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm +++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm @@ -80,8 +80,12 @@ if(origin && origin.current && (origin.current.stat == DEAD)) origin.transfer_to(M) - if(origin.changeling) - origin.changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/humanform(null) + if(!origin.changeling) + M.make_changeling() + if(origin.changeling.can_absorb_dna(M, owner)) + origin.changeling.absorb_dna(owner, M) + + origin.changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/humanform(null) M.key = origin.key owner.gib() From 48ba721b91028641e113242ba5040a382feb01ea Mon Sep 17 00:00:00 2001 From: VampyrBytes Date: Fri, 1 Apr 2016 08:05:57 +0100 Subject: [PATCH 267/328] Fixes forks producing trash/not leaving trash Fixes #4059 Forks now don't produce trash when eaten off Forks now do leave trash when taking the last bit of food from the original item --- code/modules/reagents/reagent_containers/food/snacks.dm | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index df6edbaa03f..2d44b5aa96e 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -98,10 +98,18 @@ var/obj/item/weapon/reagent_containers/food/snacks/collected = new type collected.loc = U collected.reagents.remove_any(collected.reagents.total_volume) + collected.trash = null if(reagents.total_volume > bitesize) reagents.trans_to(collected, bitesize) else reagents.trans_to(collected, reagents.total_volume) + if(trash) + var/obj/item/TrashItem + if(ispath(trash,/obj/item)) + TrashItem = new trash(src) + else if(istype(trash,/obj/item)) + TrashItem = trash + TrashItem.forceMove(loc) qdel(src) return 1 From 777f8cbfb6c59cb1b23126482ca284f5bd90fc7f Mon Sep 17 00:00:00 2001 From: FalseIncarnate Date: Fri, 1 Apr 2016 15:17:47 -0400 Subject: [PATCH 268/328] Beaker and Pill Bottle Labeling Can now label Pill Bottles with pens, just like Beakers Beakers (and pill bottles) can now accept 26 character labels from pens. --- .../objects/items/weapons/storage/firstaid.dm | 25 ++++++++++++++++++- .../reagent_containers/glass_containers.dm | 4 +-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index 6429d83c73b..b751481bfe0 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -215,9 +215,14 @@ use_to_pickup = 1 storage_slots = 14 display_contents_with_number = 1 + var/base_name = "" + var/label_text = "" + +/obj/item/weapon/storage/pill_bottle/New() + ..() + base_name = name /obj/item/weapon/storage/pill_bottle/MouseDrop(obj/over_object as obj) //Quick pillbottle fix. -Agouri - if (ishuman(usr)) //Can monkeys even place items in the pocket slots? Leaving this in just in case~ var/mob/M = usr if (!( istype(over_object, /obj/screen) )) @@ -239,6 +244,24 @@ return return +/obj/item/weapon/storage/pill_bottle/attackby(var/obj/item/I, mob/user as mob, params) + if(istype(I, /obj/item/weapon/pen) || istype(I, /obj/item/device/flashlight/pen)) + var/tmp_label = sanitize(input(user, "Enter a label for [name]","Label",label_text)) + if(length(tmp_label) > MAX_NAME_LEN) + user << "The label can be at most [MAX_NAME_LEN] characters long." + else + user << "You set the label to \"[tmp_label]\"." + label_text = tmp_label + update_name_label() + else + ..() + +/obj/item/weapon/storage/pill_bottle/proc/update_name_label() + if(label_text == "") + name = base_name + else + name = "[base_name] ([label_text])" + /obj/item/weapon/storage/pill_bottle/charcoal name = "Pill bottle (Charcoal)" desc = "Contains pills used to counter toxins." diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm index 440d68eb02f..ade673d6ec4 100644 --- a/code/modules/reagents/reagent_containers/glass_containers.dm +++ b/code/modules/reagents/reagent_containers/glass_containers.dm @@ -159,8 +159,8 @@ reagents.handle_reactions() if(istype(I, /obj/item/weapon/pen) || istype(I, /obj/item/device/flashlight/pen)) var/tmp_label = sanitize(input(user, "Enter a label for [name]","Label",label_text)) - if(length(tmp_label) > 10) - user << "The label can be at most 10 characters long." + if(length(tmp_label) > MAX_NAME_LEN) + user << "The label can be at most [MAX_NAME_LEN] characters long." else user << "You set the label to \"[tmp_label]\"." label_text = tmp_label From d55523d931d828d5357a1556469bde1493a7ae62 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 1 Apr 2016 15:22:42 -0400 Subject: [PATCH 269/328] Automatic changelog generation for PR #4063 --- html/changelogs/AutoChangeLog-pr-4063.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4063.yml diff --git a/html/changelogs/AutoChangeLog-pr-4063.yml b/html/changelogs/AutoChangeLog-pr-4063.yml new file mode 100644 index 00000000000..a80e8190a8e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4063.yml @@ -0,0 +1,4 @@ +author: Fox McCloud +delete-after: True +changes: + - bugfix: "fixes spawned changeling headcrab behavior" From d47e3387e7d78ad8968e7360394e609725dd8052 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 1 Apr 2016 15:42:04 -0400 Subject: [PATCH 270/328] Automatic changelog generation for PR #4046 --- html/changelogs/AutoChangeLog-pr-4046.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4046.yml diff --git a/html/changelogs/AutoChangeLog-pr-4046.yml b/html/changelogs/AutoChangeLog-pr-4046.yml new file mode 100644 index 00000000000..fb20500c274 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4046.yml @@ -0,0 +1,10 @@ +author: Fox McCloud +delete-after: True +changes: + - rscadd: "Adds disease1 outbreak event" + - rscadd: "Adds appendecitis event" + - rscadd: "Roburgers now properly have nanomachines in them" + - rscadd: "Re-adds nanomachines" + - tweak: "Experimentor properly generates nanomachines instead of itching powder" + - bugfix: "Fixes big roburgers having a healing reagent in them" + - rscadd: "Adds nanomachines to poison traitor bottles" From 02a21a845cfecf5a14709f713e54916a9785e4a0 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 1 Apr 2016 15:43:18 -0400 Subject: [PATCH 271/328] Automatic changelog generation for PR #4052 --- html/changelogs/AutoChangeLog-pr-4052.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4052.yml diff --git a/html/changelogs/AutoChangeLog-pr-4052.yml b/html/changelogs/AutoChangeLog-pr-4052.yml new file mode 100644 index 00000000000..25220aa97ce --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4052.yml @@ -0,0 +1,5 @@ +author: Fox McCloud +delete-after: True +changes: + - rscadd: "Tajarans can now eat mice, chicks, parrots, and tribbles" + - rscadd: "Vulpkanin and Unathi can now eat mice, chicks, lizards, chickens, crabs, parrtos, and tribbles" From a36ec06fc2cb037870ef680fe99eee31fea6efbe Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Fri, 1 Apr 2016 14:20:17 -0700 Subject: [PATCH 272/328] First 510 merge fixes --- code/modules/mob/living/life.dm | 2 +- paradise.dme | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 1b71e7eddd2..ebbda839e52 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -193,7 +193,7 @@ return if(blinded || eye_blind) overlay_fullscreen("blind", /obj/screen/fullscreen/blind) - //throw_laert("blind", /obj/screen/alert/blind) + //throw_alert("blind", /obj/screen/alert/blind) else clear_fullscreen("blind") //clear_alert("blind") diff --git a/paradise.dme b/paradise.dme index 765fb6f0b93..3770d786f1a 100644 --- a/paradise.dme +++ b/paradise.dme @@ -174,7 +174,6 @@ #include "code\controllers\Processes\ticker.dm" #include "code\controllers\Processes\timer.dm" #include "code\controllers\Processes\vote.dm" -#include "code\controllers\ProcessScheduler\core\_stubs.dm" #include "code\controllers\ProcessScheduler\core\process.dm" #include "code\controllers\ProcessScheduler\core\processScheduler.dm" #include "code\datums\ai_law_sets.dm" From 7a41efd1da50c78339c5ec11d6513f79ddb84d26 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Fri, 1 Apr 2016 16:09:43 -0700 Subject: [PATCH 273/328] Last staging fixes --- code/__HELPERS/type2type.dm | 4 +- code/_onclick/hud/bot.dm | 17 +------- code/_onclick/hud/fullscreen.dm | 22 +++++----- code/_onclick/hud/hud.dm | 2 - code/datums/diseases/advance/advance.dm | 2 +- code/game/machinery/vending.dm | 14 +------ .../items/weapons/grenades/flashbang.dm | 2 +- code/modules/mob/living/carbon/carbon.dm | 30 ++++++++------ .../mob/living/carbon/human/human_damage.dm | 40 ------------------- code/modules/mob/living/simple_animal/bees.dm | 1 - code/modules/surgery/organs/augments_eyes.dm | 2 +- 11 files changed, 39 insertions(+), 97 deletions(-) diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index e18bfaa1e64..ced289358e0 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -281,7 +281,7 @@ //Argument: Give this a space-separated string consisting of 6 numbers. Returns null if you don't /proc/text2matrix(var/matrixtext) - var/list/matrixtext_list = text2list(matrixtext, " ") + var/list/matrixtext_list = splittext(matrixtext, " ") var/list/matrix_list = list() for(var/item in matrixtext_list) var/entry = text2num(item) @@ -296,4 +296,4 @@ var/d = matrix_list[4] var/e = matrix_list[5] var/f = matrix_list[6] - return matrix(a, b, c, d, e, f) + return matrix(a, b, c, d, e, f) diff --git a/code/_onclick/hud/bot.dm b/code/_onclick/hud/bot.dm index ee8d1e49e2b..c4488376309 100644 --- a/code/_onclick/hud/bot.dm +++ b/code/_onclick/hud/bot.dm @@ -47,24 +47,9 @@ mymob.pullin.update_icon(mymob) mymob.pullin.screen_loc = ui_bot_pull - mymob.blind = new /obj/screen() - mymob.blind.icon = 'icons/mob/screen1_full.dmi' - mymob.blind.icon_state = "blackimageoverlay" - mymob.blind.name = " " - mymob.blind.screen_loc = "CENTER-7,CENTER-7" - mymob.blind.layer = 0 - mymob.blind.mouse_opacity = 0 - - mymob.flash = new /obj/screen() - mymob.flash.icon = 'icons/mob/screen1_bot.dmi' - mymob.flash.icon_state = "blank" - mymob.flash.name = "flash" - mymob.flash.screen_loc = "WEST,SOUTH to EAST,NORTH" - mymob.flash.layer = 17 - mymob.client.screen = list() - mymob.client.screen += list(mymob.oxygen, mymob.fire, mymob.healths, mymob.pullin, mymob.blind, mymob.flash) + mymob.client.screen += list(mymob.oxygen, mymob.fire, mymob.healths, mymob.pullin) mymob.client.screen += adding + other mymob.client.screen += mymob.client.void return \ No newline at end of file diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm index 5b0088e69aa..8ab49788e5b 100644 --- a/code/_onclick/hud/fullscreen.dm +++ b/code/_onclick/hud/fullscreen.dm @@ -26,20 +26,24 @@ client.screen += screen return screen -/mob/proc/clear_fullscreen(category, animate = 10) - set waitfor = 0 +/mob/proc/clear_fullscreen(category, animated = 10) var/obj/screen/fullscreen/screen = screens[category] if(!screen) return - if(animate) - animate(screen, alpha = 0, time = animate) - sleep(animate) - screens -= category - if(client) - client.screen -= screen - qdel(screen) + + if(animated) + spawn(0) + animate(screen, alpha = 0, time = animated) + sleep(animated) + if(client) + client.screen -= screen + qdel(screen) + else + if(client) + client.screen -= screen + qdel(screen) /mob/proc/clear_fullscreens() for(var/category in screens) diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 5573e0db2ad..6d5da0da58e 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -125,8 +125,6 @@ datum/hud/New(mob/owner) guardian_hud() else if(ispet(mymob)) corgi_hud() - else - reload_fullscreen() diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index 905f604ec02..c0f19b552b6 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -294,7 +294,7 @@ var/list/advance_cures = list( for(var/datum/symptom/S in symptoms) L += S.id L = sortList(L) // Sort the list so it doesn't matter which order the symptoms are in. - var/result = list2text(L, ":") + var/result = jointext(L, ":") id = result return id diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index c3472a4a075..1265eb8da78 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -101,26 +101,16 @@ ..() wires = new(src) spawn(50) -<<<<<<< HEAD if(product_slogans) - slogan_list += text2list(product_slogans, ";") -======= - if(src.product_slogans) - src.slogan_list += splittext(src.product_slogans, ";") ->>>>>>> byond510 + slogan_list += splittext(product_slogans, ";") // So not all machines speak at the exact same time. // The first time this machine says something will be at slogantime + this random value, // so if slogantime is 10 minutes, it will say it at somewhere between 10 and 20 minutes after the machine is crated. last_slogan = world.time + rand(0, slogan_delay) -<<<<<<< HEAD if(product_ads) - ads_list += text2list(product_ads, ";") -======= - if(src.product_ads) - src.ads_list += splittext(src.product_ads, ";") ->>>>>>> byond510 + ads_list += splittext(product_ads, ";") build_inventory() power_change() diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index 77c39440d46..271f9bdb763 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -31,7 +31,7 @@ var/mob/living/carbon/human/H = M var/obj/item/organ/internal/eyes/E = H.get_int_organ(/obj/item/organ/internal/eyes) if(E) - E.damage += eye_damage + E.damage += rand(1, 3) M.Stun(max(10/distance, 3)) M.Weaken(max(10/distance, 3)) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 084fbb67b95..5befe1114ba 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -315,33 +315,39 @@ if(.) if(visual) return + var/obj/item/organ/internal/eyes/E = get_int_organ(/obj/item/organ/internal/eyes) + if(!E) + return + switch(damage) if(1) src << "Your eyes sting a little." - /*if(prob(40)) //waiting on carbon organs - eye_stat += 1*/ + if(prob(40)) //waiting on carbon organs + E.damage += 1 if(2) src << "Your eyes burn." - //eye_stat += rand(2, 4) + E.damage += rand(2, 4) else src << "Your eyes itch and burn severely!" - //eye_stat += rand(12, 16) + E.damage += rand(12, 16) - /*if(eye_stat > 10) + if(E.damage > E.min_bruised_damage) eye_blind += damage eye_blurry += damage * rand(3, 6) - if(eye_stat > 20) - if (prob(eye_stat - 20)) + if(E.damage > (E.min_bruised_damage + E.min_broken_damage) / 2) + if(!(E.status & ORGAN_ROBOT)) src << "Your eyes start to burn badly!" - disabilities |= NEARSIGHTED - else if(prob(eye_stat - 25)) - src << "You can't see anything!" - sdisabilities |= BLIND + else //snowflake conditions piss me off for the record + src << "The flash blinds you!" + + else if(E.damage >= E.min_broken_damage) + src << "You can't see anything!" + else - src << "Your eyes are really starting to hurt. This can't be good for you!"*/ + src << "Your eyes are really starting to hurt. This can't be good for you!" return 1 else if(damage == 0) // just enough protection diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 676edd988ef..1b6d62c72a0 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -401,43 +401,3 @@ This function restores all organs. // Will set our damageoverlay icon to the next level, which will then be set back to the normal level the next mob.Life(). updatehealth() return 1 - -// CARBON ORGANS: REMOVE THIS SHIT -/mob/living/carbon/human/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0) - . = ..() - var/obj/item/organ/eyes/E = internal_organs_by_name["eyes"] - if(!E) - return - - var/damage = intensity - check_eye_prot() - if(.) - if(visual) - return - switch(damage) - if(1) - if(prob(40)) - E.damage += 1 - if(2) - E.damage += rand(2, 4) - else - E.damage += rand(12, 16) - - if(E.damage > 10) - eye_blind += damage - eye_blurry += damage * rand(3, 6) - - if(E.damage > 20) - if (prob(E.damage - 20)) - src << "Your eyes start to burn badly!" - disabilities |= NEARSIGHTED - else if(prob(E.damage - 25)) - src << "You can't see anything!" - sdisabilities |= BLIND - else - src << "Your eyes are really starting to hurt. This can't be good for you!" - return 1 - - else if(damage == 0) // just enough protection - if(prob(20)) - src << "Something bright flashes in the corner of your vision!" - diff --git a/code/modules/mob/living/simple_animal/bees.dm b/code/modules/mob/living/simple_animal/bees.dm index c5fcf9fc938..687041617be 100644 --- a/code/modules/mob/living/simple_animal/bees.dm +++ b/code/modules/mob/living/simple_animal/bees.dm @@ -49,7 +49,6 @@ //if we're chasing someone, get a little bit angry if(target_mob && prob(10)) feral++ - M.flash_pain() //calm down a little bit if(feral > 0) diff --git a/code/modules/surgery/organs/augments_eyes.dm b/code/modules/surgery/organs/augments_eyes.dm index 622891a4b70..a6fdf24d715 100644 --- a/code/modules/surgery/organs/augments_eyes.dm +++ b/code/modules/surgery/organs/augments_eyes.dm @@ -60,7 +60,7 @@ if(prob(10 * severity)) return owner << "Static obfuscates your vision!" - flick("e_flash", owner.flash) + owner.flash_eyes(visual = 1) From d1ae725fa25a8d54521dfca035a7d122fce1d100 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Fri, 1 Apr 2016 16:36:39 -0700 Subject: [PATCH 274/328] fix tile_bound --- code/game/atoms_movable.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 8a9a892123a..831e7004ad6 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -1,5 +1,6 @@ /atom/movable layer = 3 + appearance_flags = TILE_BOUND var/last_move = null var/anchored = 0 // var/elevation = 2 - not used anywhere From 849c472ae19636239a979bae929421a86fd29dd5 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Sat, 2 Apr 2016 04:12:25 -0400 Subject: [PATCH 275/328] Automatic changelog generation for PR #4058 --- html/changelogs/AutoChangeLog-pr-4058.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4058.yml diff --git a/html/changelogs/AutoChangeLog-pr-4058.yml b/html/changelogs/AutoChangeLog-pr-4058.yml new file mode 100644 index 00000000000..0ea4cbfc8d8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4058.yml @@ -0,0 +1,7 @@ +author: FalseIncarnate +delete-after: True +changes: + - tweak: "Let's you know when your container is full when filling from sinks." + - tweak: "Prevents splashing containers onto beakers and buckets that have a lid on them." + - rscadd: "Pill bottles can now be labeled with a simple pen." + - tweak: "Beakers/buckets (and pill bottles) now accept 26 character labels from pens." From a5045d0c333f9c8859a07ae3cf07a676486a70e7 Mon Sep 17 00:00:00 2001 From: Crazylemon64 Date: Sat, 2 Apr 2016 15:38:43 -0700 Subject: [PATCH 276/328] Fixes virus stealth to work as reported --- code/datums/diseases/advance/advance.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index 905f604ec02..b0046781d41 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -182,7 +182,7 @@ var/list/advance_cures = list( CRASH("We did not have any symptoms before generating properties.") return - var/list/properties = list("resistance" = 1, "stealth" = 1, "stage_rate" = 1, "transmittable" = 1, "severity" = 0) + var/list/properties = list("resistance" = 1, "stealth" = 0, "stage_rate" = 1, "transmittable" = 1, "severity" = 0) for(var/datum/symptom/S in symptoms) From 824019ff6cfc4043558990c97c40b91adb88d768 Mon Sep 17 00:00:00 2001 From: Crazylemon64 Date: Sat, 2 Apr 2016 16:01:03 -0700 Subject: [PATCH 277/328] Makes it so that at 3 steath you are invisible to pandemic, instead of 4 --- code/datums/diseases/advance/advance.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index b0046781d41..acdbfc03af3 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -199,7 +199,7 @@ var/list/advance_cures = list( if(properties && properties.len) switch(properties["stealth"]) - if(2 to 3) + if(2) visibility_flags = HIDDEN_SCANNER if(3 to INFINITY) visibility_flags = HIDDEN_SCANNER|HIDDEN_PANDEMIC From 93aa9c688ab6daacfe60125b09ddeb3166284caf Mon Sep 17 00:00:00 2001 From: Crazylemon64 Date: Sat, 2 Apr 2016 16:59:53 -0700 Subject: [PATCH 278/328] Using a syringe on slime people will now get water out of them --- code/modules/reagents/reagent_containers/syringes.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index a7a0f1bba7a..5978c615942 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -120,8 +120,8 @@ var/datum/reagent/B if(istype(T,/mob/living/carbon/human)) var/mob/living/carbon/human/H = T - if(H.species && H.species.exotic_blood && H.reagents.total_volume) - H.reagents.trans_to(src,amount) + if(H.species && H.species.exotic_blood && H.vessel.total_volume) + H.vessel.trans_to(src,amount) else B = T.take_blood(src,amount) else @@ -136,6 +136,8 @@ user << "\blue You take a blood sample from [target]" for(var/mob/O in viewers(4, user)) O.show_message("\red [user] takes a blood sample from [target].", 1) + else + user.visible_message("[user] takes a sample from [target].", "You take a sample from [target].") else //if not mob if(!target.reagents.total_volume) From 8e7c447646fb764caf2a7520e73d1b16e9013626 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Sat, 2 Apr 2016 17:38:49 -0700 Subject: [PATCH 279/328] Ports tgstation/-tg-station#16569, World Topic() changes Full changes: - World Topic() is now standardized to use if("parameter" in topic_list) instead of an amalgamation of findtext() and if(topic == "parameter"). - Comms password is now verified at the top of world/Topic() and sets a variable to true if it is present and correct. - "status" now returns extra information if the comms_password is provided and correct. Misc changes: - Shuttle text has been standardized as a proc on mobile docking ports. This is used by status/supply displays and mob/Stat() for the -ETA- etc stuff. --- .gitignore | 1 + code/__DEFINES/stat.dm | 12 ++-- code/game/machinery/status_display.dm | 31 ++-------- code/game/machinery/supply_display.dm | 2 +- code/modules/mob/mob.dm | 25 +------- code/modules/shuttle/shuttle.dm | 26 +++++++++ code/world.dm | 84 +++++++++++++-------------- 7 files changed, 85 insertions(+), 96 deletions(-) diff --git a/.gitignore b/.gitignore index f784b30d80e..8c7388a42d2 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ data/ /_maps/map_files/**/*.dmm.backup /nano/debug.html *.db +.atom-build.json \ No newline at end of file diff --git a/code/__DEFINES/stat.dm b/code/__DEFINES/stat.dm index 756ae54765f..4ab2ba43203 100644 --- a/code/__DEFINES/stat.dm +++ b/code/__DEFINES/stat.dm @@ -34,10 +34,10 @@ #define WAIT_FINISH 3 //shuttle mode defines -#define SHUTTLE_IDLE 0 -#define SHUTTLE_RECALL 1 -#define SHUTTLE_CALL 2 -#define SHUTTLE_DOCKED 3 +#define SHUTTLE_IDLE 0 +#define SHUTTLE_RECALL 1 +#define SHUTTLE_CALL 2 +#define SHUTTLE_DOCKED 3 #define SHUTTLE_STRANDED 4 -#define SHUTTLE_ESCAPE 5 -#define SHUTTLE_ENDGAME 6 \ No newline at end of file +#define SHUTTLE_ESCAPE 5 +#define SHUTTLE_ENDGAME 6 \ No newline at end of file diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index 7c43e3c8e62..824d38df94c 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -88,25 +88,18 @@ remove_display() return 1 if(STATUS_DISPLAY_TRANSFER_SHUTTLE_TIME) //emergency shuttle timer + var/use_warn = 0 if(shuttle_master.emergency.timer) - message2 = get_shuttle_timer() - switch(shuttle_master.emergency.mode) - if(SHUTTLE_RECALL, SHUTTLE_ESCAPE) - message1 = "-ETR-" - if(SHUTTLE_CALL) - message1 = "-ETA-" - if(SHUTTLE_DOCKED) - message1 = "-ETD-" - else - message1 = "-ERR-" - message2 = "??:??" + use_warn = 1 + message1 = "-[shuttle_master.emergency.getModeStr()]" + message2 = shuttle_master.emergency.getTimerStr() + if(length(message2) > CHARS_PER_LINE) message2 = "Error!" - update_display(message1, message2, 1) else message1 = "TIME" message2 = worldtime2text() - update_display(message1, message2) + update_display(message1, message2, use_warn) return 1 if(STATUS_DISPLAY_MESSAGE) //custom messages var/line1 @@ -168,18 +161,6 @@ if(maptext != new_text) maptext = new_text -/obj/machinery/status_display/proc/get_shuttle_timer() - var/timeleft = shuttle_master.emergency.timeLeft() - if(timeleft > 0) - return "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]" - return "00:00" - -/obj/machinery/status_display/proc/get_supply_shuttle_timer() - var/timeleft = shuttle_master.supply.timeLeft() - if(timeleft > 0) - return "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]" - return "00:00" - /obj/machinery/status_display/proc/remove_display() if(overlays.len) overlays.Cut() diff --git a/code/game/machinery/supply_display.dm b/code/game/machinery/supply_display.dm index 2bc51b495f3..ebe6459b996 100644 --- a/code/game/machinery/supply_display.dm +++ b/code/game/machinery/supply_display.dm @@ -13,7 +13,7 @@ message2 = worldtime2text() else message1 = "CARGO" - message2 = get_supply_shuttle_timer() + shuttle_master.supply.getTimerStr() if(lentext(message2) > CHARS_PER_LINE) message2 = "Error" diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 2fcd5406946..57dfec1d00a 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -995,28 +995,9 @@ var/list/slot_equipment_priority = list( \ /mob/proc/show_stat_emergency_shuttle_eta() var/obj/docking_port/mobile/emergency/E = shuttle_master.emergency - if(E.mode >= SHUTTLE_RECALL) - var/message = "" - - var/timeleft = E.timeLeft() - message = "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]" - - switch(E.mode) - if(SHUTTLE_RECALL, SHUTTLE_ESCAPE) - message = "ETR-[message]" - if(SHUTTLE_CALL) - message = "ETA-[message]" - if(SHUTTLE_DOCKED) - if(timeleft < 5) - message = "Departing..." - else - message = "ETD-[message]" - if(SHUTTLE_STRANDED) - message = "ETA-ERR" - if(SHUTTLE_ENDGAME) - return - - stat(null, message) + var/ETA = shuttle_master.emergency.getModeStr() + if(ETA) + stat(null, "[ETA] [shuttle_master.emergency.getTimerStr()]") /mob/proc/add_stings_to_statpanel(var/list/stings) for(var/obj/effect/proc_holder/changeling/S in stings) diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 290f8e0fc75..0c09b0ea920 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -563,6 +563,32 @@ return round(callTime/divisor, 1) return max( round((timer+callTime-world.time)/divisor,1), 0 ) +// returns 3-letter mode string, used by status screens and mob status panel +/obj/docking_port/mobile/proc/getModeStr() + switch(mode) + if(SHUTTLE_RECALL) + return "RCL" + if(SHUTTLE_CALL) + return "ETA" + if(SHUTTLE_DOCKED) + return "ETD" + if(SHUTTLE_ESCAPE) + return "ESC" + if(SHUTTLE_STRANDED) + return "ERR" + return "" + +// returns 5-letter timer string, used by status screens and mob status panel +/obj/docking_port/mobile/proc/getTimerStr() + if(mode == SHUTTLE_STRANDED) + return "--:--" + + var/timeleft = timeLeft() + if(timeleft > 0) + return "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]" + else + return "00:00" + /obj/docking_port/mobile/proc/getStatusText() var/obj/docking_port/stationary/dockedAt = get_docked() . = (dockedAt && dockedAt.name) ? dockedAt.name : "unknown" diff --git a/code/world.dm b/code/world.dm index 5f60f4aa5cf..899a3ca1b3a 100644 --- a/code/world.dm +++ b/code/world.dm @@ -98,20 +98,23 @@ var/world_topic_spam_protect_time = world.timeofday /world/Topic(T, addr, master, key) diary << "TOPIC: \"[T]\", from:[addr], master:[master], key:[key]" - if (T == "ping") + var/list/input = params2list(T) + var/key_valid = (config.comms_password && input["key"] == config.comms_password) //no password means no comms, not any password + + if ("ping" in input) var/x = 1 for (var/client/C) x++ return x - else if(T == "players") + else if("players" in input) var/n = 0 for(var/mob/M in player_list) if(M.client) n++ return n - else if (T == "status") + else if ("status" in input) var/list/s = list() s["version"] = game_version s["mode"] = master_mode @@ -122,25 +125,35 @@ var/world_topic_spam_protect_time = world.timeofday s["host"] = host ? host : null s["players"] = list() s["stationtime"] = worldtime2text() - var/n = 0 - var/admins = 0 + var/player_count = 0 + var/admin_count = 0 for(var/client/C in clients) if(C.holder) if(C.holder.fakekey) continue //so stealthmins aren't revealed by the hub - admins++ - s["player[n]"] = C.key - n++ - s["players"] = n - -// if(revdata) s["revision"] = revdata.revision - s["admins"] = admins + admin_count++ + s["player[player_count]"] = C.key + player_count++ + s["players"] = player_count + s["admins"] = admin_count s["map_name"] = map_name ? map_name : "Unknown" + if(key_valid) + if(ticker && ticker.mode) + s["real_mode"] = ticker.mode.name + + s["security_level"] = get_security_level() + + if(shuttle_master && shuttle_master.emergency) + // Shuttle status, see /__DEFINES/stat.dm + s["shuttle_mode"] = shuttle_master.emergency.mode + // Shuttle timer, in seconds + s["shuttle_timer"] = shuttle_master.emergency.timeLeft() + return list2params(s) - else if(copytext(T,1,9) == "adminmsg") + else if("adminmsg" in input) /* We got an adminmsg from IRC bot lets split the input then validate the input. expected output: @@ -149,20 +162,8 @@ var/world_topic_spam_protect_time = world.timeofday 3. validatationkey = the key the bot has, it should match the gameservers commspassword in it's configuration. 4. sender = the ircnick that send the message. */ - - - var/input[] = params2list(T) - if(input["key"] != config.comms_password) - if(world_topic_spam_protect_ip == addr && abs(world_topic_spam_protect_time - world.time) < 50) - - spawn(50) - world_topic_spam_protect_time = world.time - return "Bad Key (Throttled)" - - world_topic_spam_protect_time = world.time - world_topic_spam_protect_ip = addr - - return "Bad Key" + if(!key_valid) + return keySpamProtect(addr) var/client/C @@ -182,36 +183,25 @@ var/world_topic_spam_protect_time = world.timeofday C << 'sound/effects/adminhelp.ogg' C << message - for(var/client/A in admins) if(A != C) A << amessage return "Message Successful" - else if(copytext(T,1,6) == "notes") + else if("notes" in input) /* We got a request for notes from the IRC Bot expected output: 1. notes = ckey of person the notes lookup is for 2. validationkey = the key the bot has, it should match the gameservers commspassword in it's configuration. */ - var/input[] = params2list(T) - if(input["key"] != config.comms_password) - if(world_topic_spam_protect_ip == addr && abs(world_topic_spam_protect_time - world.time) < 50) - - spawn(50) - world_topic_spam_protect_time = world.time - return "Bad Key (Throttled)" - - world_topic_spam_protect_time = world.time - world_topic_spam_protect_ip = addr - return "Bad Key" + if(!key_valid) + return keySpamProtect(addr) return show_player_info_irc(input["notes"]) - else if (copytext(T,1,9) == "announce") - var/input[] = params2list(T) + else if("announce" in input) if(config.comms_password) if(input["key"] != config.comms_password) return "Bad Key" @@ -219,6 +209,16 @@ var/world_topic_spam_protect_time = world.timeofday for(var/client/C in clients) C << "PR: [input["announce"]]" +/proc/keySpamProtect(var/addr) + if(world_topic_spam_protect_ip == addr && abs(world_topic_spam_protect_time - world.time) < 50) + spawn(50) + world_topic_spam_protect_time = world.time + return "Bad Key (Throttled)" + + world_topic_spam_protect_time = world.time + world_topic_spam_protect_ip = addr + return "Bad Key" + /world/Reboot(var/reason, var/feedback_c, var/feedback_r, var/time) if (reason == 1) //special reboot, do none of the normal stuff if(usr) From 15786c718b0f1a4579c815b183db38e7029d1b65 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Sat, 2 Apr 2016 21:57:06 -0400 Subject: [PATCH 280/328] Maps in Xenobio Advanced Cams --- _maps/map_files/cyberiad/cyberiad.dmm | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index dd810edfe60..c66079312ed 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -6977,7 +6977,7 @@ "cEi" = (/obj/machinery/light{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/patients_rooms) "cEj" = (/turf/simulated/wall/r_wall,/area/medical/patient_b) "cEk" = (/obj/structure/closet/l3closet/scientist,/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/xenobiology) -"cEl" = (/obj/structure/table,/obj/item/weapon/storage/box/monkeycubes,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) +"cEl" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) "cEm" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/stack/sheet/mineral/plasma{amount = 8; layer = 2.9},/obj/machinery/media/receiver/boombox,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) "cEn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) "cEo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) @@ -7098,7 +7098,7 @@ "cGz" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cGA" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio1"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen"; req_access_txt = "55"},/turf/simulated/floor/engine,/area/toxins/xenobiology) "cGB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) -"cGC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) +"cGC" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/computer/camera_advanced/xenobio,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) "cGD" = (/obj/machinery/camera{c_tag = "Xenobiology Module East"; dir = 8; network = list("Research","SS13"); pixel_y = -22},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) "cGE" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/starboard) "cGF" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/port) @@ -7260,14 +7260,14 @@ "cJF" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "n2o_sensor"},/turf/simulated/floor/engine/n20,/area/atmos) "cJG" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent/roomfiller{valve_open = 0; volume = 1e+006},/turf/simulated/floor/engine/n20,/area/atmos) "cJH" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/engine/n20,/area/atmos) -"cJI" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) -"cJJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) +"cJI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/computer/camera_advanced/xenobio,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) +"cJJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/stool/bed/chair/comfy/blue{dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) "cJK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) "cJL" = (/obj/item/weapon/extinguisher,/obj/item/weapon/extinguisher{pixel_x = 4; pixel_y = 4},/obj/structure/table/glass,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/sign/deathsposal{pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) "cJM" = (/obj/structure/rack,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cJN" = (/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk0"; icon_state = "catwalk0"},/area/space) "cJO" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"cJP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) +"cJP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/obj/structure/stool/bed/chair/comfy/blue{dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) "cJQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitegreencorner"},/area/medical/virology) "cJR" = (/obj/structure/table,/obj/item/device/healthanalyzer,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cJS" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) @@ -8730,6 +8730,7 @@ "dlT" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/power/treadmill{dir = 8},/obj/structure/cable/yellow,/obj/machinery/treadmill_monitor{id = "Cell 2"; pixel_y = -32},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A) "dlU" = (/obj/structure/stool/bed,/obj/machinery/flasher{id = "Cell 2"; pass_flags = 0; pixel_x = 0; pixel_y = -26},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/prison/cell_block/A) "dlV" = (/obj/machinery/power/treadmill{dir = 4},/obj/machinery/treadmill_monitor{on = 1; pixel_y = -32; redeem_immediately = 1},/obj/structure/cable/yellow,/turf/simulated/floor/plasteel,/area/security/prison/cell_block/C) +"dlW" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) (1,1,1) = {" bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik @@ -8905,8 +8906,8 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikafxaabczocAkczqbikczocAkczqaabczocAkczqaabbikbikaabaabaabaabaabbikbikbikbikbikaabbikbikczscwWcvKcBecxjcBfcBgcBhcBicBjcBicBkcBicBlcBmcxfcBncztcztczxcBocBpcBqcBrcBscBtcBucBvcBwcBxcBycBzcBAcBBcBCcBDcBDcBEcBFcBGcBHcBIcBJcBKcBLcBMcrecBOcHucHtcDPcDPcDPcDPcDPcDPcHvcoAcEhclUclUclUclUclUclUcjmbEJcjmcFfclUclUcoAcoAcoAcoAcusbGycoAbikbikckPcxOcBZcxOcCacxRcqUcCbcCccCdcCecqUcqUcCgcqUcChckPbikaabaabcwGcwGcCscwGcwGbikbwobxXcvzcyJcHycHxbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikczocAkczqaabczocAkczqbikczocAkczqbikbikbikbikbikbikaabaabaabbikaabbikaabaabbikbikcybcCicvKcCjcCkcCkcClcvKcvKcvKcvKcvKcvKcvKcvKcvKcvKcvKcvKcvKcCmcCncCmcCocCmcrmcCpcCqcFbcCtcCtcCtcCucCvcBCcCwcCxcCycCzcCAcCBcBIcCCcCDcCEcCFcHzcCHcHAcCJaabcCKcCKcCKcCKcCKcHBcoAcHDcHCcIGcHHcIHctackycjocBWckuckycBXcCPcBYcCRcCQcoAcusbGycoAbikbikckPcxOcxOcxOcAQcCTczbcCUcCVcCWcCXcCZcCZcDacqUcDbckPaabaabbikbikbikcIKbikbikbikbwobxXcvzcyJbxXbxXbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGacGafxaabbikczocAkczqaabczocAkczqbikczocAkczqaabbikbikbikbikbikbikbikbikaabcDccDdcDdcDdcDdcybcDecwWcDfcDgcDhcDhcDicDjcDkcDlcDlcDlcDlcDmcDncDocDncDncDpcDpcDncDqcDrcDscDtcDtctYcDvcDwcDxcDycDzcDzcDAcDBcDCcDDcDEcDFcCAcDGcBIcDHcDIcDJcDKcILcDMcIMcDOcDPcDQcDRcDScDTcCKcHBcoDcEhclUcvscvqcIOcINcxLckxckwdcrclUcCSczVcuqczVcDUcoAcusbGycoAcoAbikckPcwAcwAcwAcwAcEkcqUcCbcElcEmcCecqUcEncEocEocEpcEqcXYaabbikbikbikbikbikbikbikbwobxXcGybxXbxXcIPbwoaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikaabbikaabaabcEraabaabaabcEraabbikaabcEraabbikbikbikbikbikbikbikbikcDccDccDccEscEtcEucEvcEwcExcEycDfcDfcEzcEAcvKcvKcEBcECcECcECcECcEDcEEcEFcEEcEEcEEcDtcDtcEGcEHcEIcEJcEKcDzcELcDwcDzcDzcDzcDzcEMcBCcENcEOcCycDFcCAcDFcBIcDHcDIcEPcEQcERcEScETcEUaabcEVcEWcDTcEXcCKcHBcoDcHDcHCcxKcxJczVcxMclUcIIcDVdcsclUcDWcDYczVcEbcEaclUcusbGycITcoAbikckPcwtcwucwvcFjcARczbcFkcJJcJIcJKcJKcFocFpcFqcJLckPaabaabaabbikbikbikbikbikbikbwocJMcvzbwobwobwobwobwoaabaabaabcJNcJNcJNcJNcJNcJNaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikafxaabcFscFtcFtcFucFvcFwcFwcFwcFvcFwcFwcFwcFvcFwcFwcFxcFtcFtcFtcFtcFtcFycFzcFAcFBcFCcFDcFEcFFcFGcfRcwWcFHcDfcvKcvKcvKcFIcEBcECcFJcFKcFLcyrcFNcDucFPcFOcFQcFScFTcSpcFVcFWcFXcFScFYcFZcDwcGacDzcDzcDzcGbcBCcGccGccDFcGdcGecGfcGgcGhcGicGjcGkcGlcGmcGncDOcGocDQcGpcDTcDTcCKcHBcoDcEhclUcyMcyLcyNcFfclUcnkclTcFfclUcyQcyScyRcyTcyTclUcusbGycJOcoAbikckPcxOcxPcxOcGAcxRcqUcGBcJPcGCcqUcqUcGDcwAcwAcwAckPbikbikaabaabbikbikbikbikbikbwocyKcvzbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikaabbikaabaabcEraabaabaabcEraabbikaabcEraabbikbikbikbikbikbikbikbikcDccDccDccEscEtcEucEvcEwcExcEycDfcDfcEzcEAcvKcvKcEBcECcECcECcECcEDcEEcEFcEEcEEcEEcDtcDtcEGcEHcEIcEJcEKcDzcELcDwcDzcDzcDzcDzcEMcBCcENcEOcCycDFcCAcDFcBIcDHcDIcEPcEQcERcEScETcEUaabcEVcEWcDTcEXcCKcHBcoDcHDcHCcxKcxJczVcxMclUcIIcDVdcsclUcDWcDYczVcEbcEaclUcusbGycITcoAbikckPcwtcwucwvcFjcARczbcFkcJIcGCcJKcJKcFocFpcFqcJLckPaabaabaabbikbikbikbikbikbikbwocJMcvzbwobwobwobwobwoaabaabaabcJNcJNcJNcJNcJNcJNaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikafxaabcFscFtcFtcFucFvcFwcFwcFwcFvcFwcFwcFwcFvcFwcFwcFxcFtcFtcFtcFtcFtcFycFzcFAcFBcFCcFDcFEcFFcFGcfRcwWcFHcDfcvKcvKcvKcFIcEBcECcFJcFKcFLcyrcFNcDucFPcFOcFQcFScFTcSpcFVcFWcFXcFScFYcFZcDwcGacDzcDzcDzcGbcBCcGccGccDFcGdcGecGfcGgcGhcGicGjcGkcGlcGmcGncDOcGocDQcGpcDTcDTcCKcHBcoDcEhclUcyMcyLcyNcFfclUcnkclTcFfclUcyQcyScyRcyTcyTclUcusbGycJOcoAbikckPcxOcxPcxOcGAcxRcqUcGBcJPcJJcqUdlWcGDcwAcwAcwAckPbikbikaabaabbikbikbikbikbikbwocyKcvzbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikaabbikaabaabcGFaabbikaabcGFaabbikaabcGFaabbikbikbikbikbikbikbikbikcDccDccDccGGcGHcFMcDdcGJcfRcGKcExcExcExcExcGLcExcFGcECcGMcGNcGOcGPcGQcGRcGScGTcGUcGVcGWcGXcGYcGZcHacHbcFYcELcDwcHccHdcDzcDzcHecBCcHfcHgcDFcHhcCAcHicHjcHkcHlcHmcHncHocHpcHocHqaabcCKcCKcCKcCKcCKcHBcoAcEhclUcIJcyVcyYcyXcEecEccEgcEfcHwcGucHZczVcIRcIQclUcusbGycJRcoAbikckPcxOcxOcxOcFjcHEcHFcHGcJScHIcCZcCZcCZcHJcHKcHLcHMbikbikbikaabaabbikbikbikbikbwobwocvzbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGacGafxaabaabczocHOczqbikczocHOczqbikczocHOczqaabbikbikbikbikbikbikbikaabaabcDccDdcDdcDdcDdcHPcHQcHRcfRcHScfRcfRcEBcHTcfRcECcHUcHVcGOcHWcFNcHXcHYcIacIacIbcIccIdcIecIfbRFcIbcIhcIicIjcIkcIlcImcIncIocIpcIqcGfcIrcIscItcIucIvcIwcIxcIycIzcIAcIBcICcIDcDPcDQcIEcIFcIFcCKcHBcoAcEhclUclUclUclUclUcJhcANcBRcJQcMccBScMecMdcMCcBVclUcuscGqcGrcGrcGrcJTcJTcJTcJTcJTcJUcKTcKbcKUcIUczbcIVczbcIWczbcIXcHMbikbikbikbikaabaabbikbikbikbikbwocvzbwoaabaabaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikczocHOczqaabczocHOczqbikczocHOczqbikbikbikaabbikbikbikbikaabaabaabbikbikaabaabcJbcJbcJbcJbcJbcJbcJbcJccJbcJbcECcJdcJecGOcHWcFNcJfcFNcJgcLhcDtcJicJjcFWcJkcFRcDtcJmcDzcDwcJncJocJpcIncJqcJrcJscJtcJucJvcJwcJtcJxcJycJzcJAcDFcJBcJCcJDcJEaabcEVcJFcJGcJHcCKcHBcoDcKWcKVcKVcKVcKXclUcFacyLcCLcFecyScCMcyTcyTcyScCNclUcuscGvbVibGycKYcKZcoAbikbikckPcJVcJWcJXcJYcJVcJWcJZcKacJVcJWcLackPaabaabaabaabaabaabaabaabaabaabbwocvzbwobwobwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjcbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik From 49f8ab674c06916285c179050af7850426330b1f Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Sat, 2 Apr 2016 22:47:04 -0400 Subject: [PATCH 281/328] Automatic changelog generation for PR #4072 --- html/changelogs/AutoChangeLog-pr-4072.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4072.yml diff --git a/html/changelogs/AutoChangeLog-pr-4072.yml b/html/changelogs/AutoChangeLog-pr-4072.yml new file mode 100644 index 00000000000..0f230a8fa0a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4072.yml @@ -0,0 +1,4 @@ +author: Crazylemon64 +delete-after: True +changes: + - bugfix: "Syringes will now draw water from slime people." From 1d7ca47bf5ceb2f22e10ceff3a1220c4c32a17c5 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Sat, 2 Apr 2016 20:30:41 -0700 Subject: [PATCH 282/328] and line notes 2 --- code/game/machinery/status_display.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index 824d38df94c..e2b02a0ce9d 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -91,7 +91,7 @@ var/use_warn = 0 if(shuttle_master.emergency.timer) use_warn = 1 - message1 = "-[shuttle_master.emergency.getModeStr()]" + message1 = "-[shuttle_master.emergency.getModeStr()]-" message2 = shuttle_master.emergency.getTimerStr() if(length(message2) > CHARS_PER_LINE) From 279937c58bb607fa09abf99a1e87d75b14007c04 Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Sat, 2 Apr 2016 23:34:38 -0400 Subject: [PATCH 283/328] Fixes IPC Embbedded object surgery --- code/modules/surgery/implant.dm | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm index 0728e687df5..99c0fb37f05 100644 --- a/code/modules/surgery/implant.dm +++ b/code/modules/surgery/implant.dm @@ -310,12 +310,23 @@ steps = list(/datum/surgery_step/generic/cut_open, /datum/surgery_step/generic/clamp_bleeders, /datum/surgery_step/generic/retract_skin, /datum/surgery_step/remove_object, /datum/surgery_step/generic/cauterize) possible_locs = list("r_arm","l_arm","r_leg","l_leg","r_hand","r_foot","l_hand","l_foot","groin","chest","head") +/datum/surgery/embedded_removal/synth + name = "removal of embedded objects" + steps = list(/datum/surgery_step/robotics/external/unscrew_hatch,/datum/surgery_step/robotics/external/open_hatch, /datum/surgery_step/remove_object, /datum/surgery_step/robotics/external/close_hatch) + possible_locs = list("r_arm","l_arm","r_leg","l_leg","r_hand","r_foot","l_hand","l_foot","groin","chest","head") + allowed_mob = list(/mob/living/carbon/human/machine) + /datum/surgery/embedded_removal/can_start(mob/user, mob/living/carbon/target) if(target.get_species() == "Machine") return 0 return 1 +/datum/surgery/embedded_removal/synth/can_start(mob/user, mob/living/carbon/target) + if(target.get_species() == "Machine") + return 1 + return 0 + /datum/surgery_step/remove_object name = "remove embedded objects" time = 32 From e045e10268c1dccb6f7f9c1bcec4820f1c3fd296 Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Sat, 2 Apr 2016 23:42:14 -0400 Subject: [PATCH 284/328] remoing pasted line i need to remove the rest of em later. --- code/modules/surgery/implant.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm index 99c0fb37f05..8cb6c926061 100644 --- a/code/modules/surgery/implant.dm +++ b/code/modules/surgery/implant.dm @@ -314,7 +314,6 @@ name = "removal of embedded objects" steps = list(/datum/surgery_step/robotics/external/unscrew_hatch,/datum/surgery_step/robotics/external/open_hatch, /datum/surgery_step/remove_object, /datum/surgery_step/robotics/external/close_hatch) possible_locs = list("r_arm","l_arm","r_leg","l_leg","r_hand","r_foot","l_hand","l_foot","groin","chest","head") - allowed_mob = list(/mob/living/carbon/human/machine) /datum/surgery/embedded_removal/can_start(mob/user, mob/living/carbon/target) From fd966b592c92c1dd13d7d8e37db1e9479b951989 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Sat, 2 Apr 2016 21:12:39 -0700 Subject: [PATCH 285/328] Changeloggggggggg --- html/changelog.html | 86 ++++++++++++++++++++++ html/changelogs/.all_changelog.yml | 87 +++++++++++++++++++++++ html/changelogs/AutoChangeLog-pr-3927.yml | 4 -- html/changelogs/AutoChangeLog-pr-3958.yml | 7 -- html/changelogs/AutoChangeLog-pr-4005.yml | 4 -- html/changelogs/AutoChangeLog-pr-4010.yml | 4 -- html/changelogs/AutoChangeLog-pr-4011.yml | 4 -- html/changelogs/AutoChangeLog-pr-4013.yml | 4 -- html/changelogs/AutoChangeLog-pr-4014.yml | 4 -- html/changelogs/AutoChangeLog-pr-4017.yml | 7 -- html/changelogs/AutoChangeLog-pr-4018.yml | 10 --- html/changelogs/AutoChangeLog-pr-4019.yml | 5 -- html/changelogs/AutoChangeLog-pr-4021.yml | 4 -- html/changelogs/AutoChangeLog-pr-4023.yml | 4 -- html/changelogs/AutoChangeLog-pr-4024.yml | 4 -- html/changelogs/AutoChangeLog-pr-4025.yml | 4 -- html/changelogs/AutoChangeLog-pr-4028.yml | 5 -- html/changelogs/AutoChangeLog-pr-4030.yml | 6 -- html/changelogs/AutoChangeLog-pr-4037.yml | 5 -- html/changelogs/AutoChangeLog-pr-4038.yml | 4 -- html/changelogs/AutoChangeLog-pr-4039.yml | 5 -- html/changelogs/AutoChangeLog-pr-4040.yml | 4 -- html/changelogs/AutoChangeLog-pr-4044.yml | 4 -- html/changelogs/AutoChangeLog-pr-4046.yml | 10 --- html/changelogs/AutoChangeLog-pr-4052.yml | 5 -- html/changelogs/AutoChangeLog-pr-4058.yml | 7 -- html/changelogs/AutoChangeLog-pr-4063.yml | 4 -- html/changelogs/AutoChangeLog-pr-4072.yml | 4 -- 28 files changed, 173 insertions(+), 132 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-3927.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3958.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4005.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4010.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4011.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4013.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4014.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4017.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4018.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4019.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4021.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4023.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4024.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4025.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4028.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4030.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4037.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4038.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4039.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4040.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4044.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4046.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4052.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4058.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4063.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4072.yml diff --git a/html/changelog.html b/html/changelog.html index b8e09ba327c..62dfd77e8f6 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,92 @@ -->
    +

    02 April 2016

    +

    Crazylemon64 updated:

    +
      +
    • Metal foam walls will now produce flooring on space tiles
    • +
    • Syringes will now draw water from slime people.
    • +
    +

    FalseIncarnate updated:

    +
      +
    • Let's you know when your container is full when filling from sinks.
    • +
    • Prevents splashing containers onto beakers and buckets that have a lid on them.
    • +
    • Pill bottles can now be labeled with a simple pen.
    • +
    • Beakers/buckets (and pill bottles) now accept 26 character labels from pens.
    • +
    +

    Fethas updated:

    +
      +
    • Various spells have had a tweak to stun/reveal/cast, some other number stuff...
    • +
    • Nightvision
    • +
    • harvest code is now in the abilites file.
    • +
    • New fluff objectives
    • +
    • Hell has recently remapped its blood transit system and you can now once again crawl through blood. We are sorry for the-GIVE US YOUR SOUL!
    • +
    +

    FlattestGuitar updated:

    +
      +
    • Alcoholic beverages now have proper levels of ethanol in them. Good luck passing out after a beer.
    • +
    +

    Fox McCloud updated:

    +
      +
    • Adds in the Lusty Xenomorph Maid Mob; currently admin only.
    • +
    • Fixes xenomorph brains having the wrong sprite, no origin tech, and incorrect name
    • +
    • removes xenomorph egg from hotel
    • +
    • upgrades are no longer needed to for the available toys in the prize vendor
    • +
    • Implements Advanced Camera Consoles. A type of camera console that function like AI's vision style. Non-buildable/accessible.
    • +
    • Adds in Xenobiology Advance Cameras. A type of camera console that functions like advanced cameras, but only works in Xenobiology areas; can move around slimes and feed them with the console as well. Also non-buildable/accessible (for now).
    • +
    • Adds in cerulean slime reaction that generates a single use blueprint. On use it colors turfs a lavender color
    • +
    • Adds disease1 outbreak event
    • +
    • Adds appendecitis event
    • +
    • Roburgers now properly have nanomachines in them
    • +
    • Re-adds nanomachines
    • +
    • Experimentor properly generates nanomachines instead of itching powder
    • +
    • Fixes big roburgers having a healing reagent in them
    • +
    • Adds nanomachines to poison traitor bottles
    • +
    • Tajarans can now eat mice, chicks, parrots, and tribbles
    • +
    • Vulpkanin and Unathi can now eat mice, chicks, lizards, chickens, crabs, parrtos, and tribbles
    • +
    • fixes spawned changeling headcrab behavior
    • +
    +

    KasparoVy updated:

    +
      +
    • Incisions made at the beginning of embedded object removal surgery can now be closed in the same procedure.
    • +
    +

    ProperPants updated:

    +
      +
    • Maint drones have magboots.
    • +
    • Removed plastic from maint drones. Literally useless for station maintenance.
    • +
    • Increased starting amounts of some materials for maint drones and engi borgs.
    • +
    • Reduced the number of lines taken by Engineering cyborgs calling on materials stacks.
    • +
    • Operating tables can be deconstructed with a wrench.
    • +
    • Fixed and shortened description of metal sheets.
    • +
    +

    Tastyfish updated:

    +
      +
    • Bots can now be controlled by players, by opening them up and inserting a pAI. *beep
    • +
    • MULEbots can now access the engineering destination.
    • +
    • All MULEbot destinations should now have the correct load/unload direction, meaning the crates won't be dumped inside the flaps.
    • +
    • Diagnostic HUD's now give health and status information about bots.
    • +
    • MULEbot rampage blood tracks are now rendered correctly and handle UE traces as appropriate.
    • +
    • Bots should (hopefully) lag the game less now.
    • +
    • Beepsky contains 30% more potato.
    • +
    • Action progress bars are now smooth.
    • +
    • Clicking a filled inventory slot's square with an open hand now clicks the item in the slot.
    • +
    • Status displays now display the time when in Shuttle ETA mode and no shuttle activity is happening.
    • +
    • Shuttle ETA countdowns on status displays are now amber.
    • +
    • pAI's can now use the PDA chatrooms.
    • +
    • Adds treadmills to brig cells, to give the prisoners something productive to do.
    • +
    +

    TheDZD updated:

    +
      +
    • A lot of the guns and armor in the station collision, space hotel, academy, and wild west away missions have been removed/replaced.
    • +
    • Removes that fucking facehugger from station collision.
    • +
    +

    tigercat2000 updated:

    +
      +
    • Virus2 has been removed.
    • +
    • Virus1 is back. Viva la revolution.
    • +
    • You can now have up to 20 characters.
    • +
    +

    26 March 2016

    Fox McCloud updated:

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 3e6a0a9689a..6026e521eff 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -1021,3 +1021,90 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. decaffeinated version. It was funny the first time almost every crewmember aboard the NSS Cyberiad was lugging around their own oil barrel filled with coffee, it wasn't so funny, nor good for productivity the eighteenth. +2016-04-02: + Crazylemon64: + - rscadd: Metal foam walls will now produce flooring on space tiles + - bugfix: Syringes will now draw water from slime people. + FalseIncarnate: + - tweak: Let's you know when your container is full when filling from sinks. + - tweak: Prevents splashing containers onto beakers and buckets that have a lid + on them. + - rscadd: Pill bottles can now be labeled with a simple pen. + - tweak: Beakers/buckets (and pill bottles) now accept 26 character labels from + pens. + Fethas: + - tweak: Various spells have had a tweak to stun/reveal/cast, some other number + stuff... + - rscadd: Nightvision + - tweak: harvest code is now in the abilites file. + - rscadd: New fluff objectives + - bugfix: Hell has recently remapped its blood transit system and you can now once + again crawl through blood. We are sorry for the-GIVE US YOUR SOUL! + FlattestGuitar: + - tweak: Alcoholic beverages now have proper levels of ethanol in them. Good luck + passing out after a beer. + Fox McCloud: + - rscadd: Adds in the Lusty Xenomorph Maid Mob; currently admin only. + - bugfix: Fixes xenomorph brains having the wrong sprite, no origin tech, and incorrect + name + - tweak: removes xenomorph egg from hotel + - tweak: upgrades are no longer needed to for the available toys in the prize vendor + - rscadd: Implements Advanced Camera Consoles. A type of camera console that function + like AI's vision style. Non-buildable/accessible. + - rscadd: Adds in Xenobiology Advance Cameras. A type of camera console that functions + like advanced cameras, but only works in Xenobiology areas; can move around + slimes and feed them with the console as well. Also non-buildable/accessible + (for now). + - rscadd: Adds in cerulean slime reaction that generates a single use blueprint. + On use it colors turfs a lavender color + - rscadd: Adds disease1 outbreak event + - rscadd: Adds appendecitis event + - rscadd: Roburgers now properly have nanomachines in them + - rscadd: Re-adds nanomachines + - tweak: Experimentor properly generates nanomachines instead of itching powder + - bugfix: Fixes big roburgers having a healing reagent in them + - rscadd: Adds nanomachines to poison traitor bottles + - rscadd: Tajarans can now eat mice, chicks, parrots, and tribbles + - rscadd: Vulpkanin and Unathi can now eat mice, chicks, lizards, chickens, crabs, + parrtos, and tribbles + - bugfix: fixes spawned changeling headcrab behavior + KasparoVy: + - bugfix: Incisions made at the beginning of embedded object removal surgery can + now be closed in the same procedure. + ProperPants: + - rscadd: Maint drones have magboots. + - rscdel: Removed plastic from maint drones. Literally useless for station maintenance. + - tweak: Increased starting amounts of some materials for maint drones and engi + borgs. + - experiment: Reduced the number of lines taken by Engineering cyborgs calling on + materials stacks. + - rscadd: Operating tables can be deconstructed with a wrench. + - spellcheck: Fixed and shortened description of metal sheets. + Tastyfish: + - rscadd: Bots can now be controlled by players, by opening them up and inserting + a pAI. *beep + - bugfix: MULEbots can now access the engineering destination. + - bugfix: All MULEbot destinations should now have the correct load/unload direction, + meaning the crates won't be dumped inside the flaps. + - rscadd: Diagnostic HUD's now give health and status information about bots. + - bugfix: MULEbot rampage blood tracks are now rendered correctly and handle UE + traces as appropriate. + - experiment: Bots should (hopefully) lag the game less now. + - tweak: Beepsky contains 30% more potato. + - tweak: Action progress bars are now smooth. + - tweak: Clicking a filled inventory slot's square with an open hand now clicks + the item in the slot. + - rscadd: Status displays now display the time when in Shuttle ETA mode and no shuttle + activity is happening. + - tweak: Shuttle ETA countdowns on status displays are now amber. + - rscadd: pAI's can now use the PDA chatrooms. + - rscadd: Adds treadmills to brig cells, to give the prisoners something productive + to do. + TheDZD: + - rscdel: A lot of the guns and armor in the station collision, space hotel, academy, + and wild west away missions have been removed/replaced. + - rscdel: Removes that fucking facehugger from station collision. + tigercat2000: + - rscdel: Virus2 has been removed. + - rscadd: Virus1 is back. Viva la revolution. + - rscadd: You can now have up to 20 characters. diff --git a/html/changelogs/AutoChangeLog-pr-3927.yml b/html/changelogs/AutoChangeLog-pr-3927.yml deleted file mode 100644 index 586ab4c9c09..00000000000 --- a/html/changelogs/AutoChangeLog-pr-3927.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Crazylemon64 -delete-after: True -changes: - - rscadd: "Metal foam walls will now produce flooring on space tiles" diff --git a/html/changelogs/AutoChangeLog-pr-3958.yml b/html/changelogs/AutoChangeLog-pr-3958.yml deleted file mode 100644 index 1a99c1cddd3..00000000000 --- a/html/changelogs/AutoChangeLog-pr-3958.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: Fethas -delete-after: True -changes: - - tweak: "Various spells have had a tweak to stun/reveal/cast, some other number stuff..." - - rscadd: "Nightvision" - - tweak: "harvest code is now in the abilites file." - - rscadd: "New fluff objectives" diff --git a/html/changelogs/AutoChangeLog-pr-4005.yml b/html/changelogs/AutoChangeLog-pr-4005.yml deleted file mode 100644 index 66eee189c5b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4005.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: FlattestGuitar -delete-after: True -changes: - - tweak: "Alcoholic beverages now have proper levels of ethanol in them. Good luck passing out after a beer." diff --git a/html/changelogs/AutoChangeLog-pr-4010.yml b/html/changelogs/AutoChangeLog-pr-4010.yml deleted file mode 100644 index 51d07ee234c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4010.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - rscadd: "Adds in the Lusty Xenomorph Maid Mob; currently admin only." diff --git a/html/changelogs/AutoChangeLog-pr-4011.yml b/html/changelogs/AutoChangeLog-pr-4011.yml deleted file mode 100644 index d48a1ea69ab..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4011.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - bugfix: "Fixes xenomorph brains having the wrong sprite, no origin tech, and incorrect name" diff --git a/html/changelogs/AutoChangeLog-pr-4013.yml b/html/changelogs/AutoChangeLog-pr-4013.yml deleted file mode 100644 index 935943ec3b7..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4013.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: KasparoVy -delete-after: True -changes: - - bugfix: "Incisions made at the beginning of embedded object removal surgery can now be closed in the same procedure." diff --git a/html/changelogs/AutoChangeLog-pr-4014.yml b/html/changelogs/AutoChangeLog-pr-4014.yml deleted file mode 100644 index f6257c8c279..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4014.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - tweak: "removes xenomorph egg from hotel" diff --git a/html/changelogs/AutoChangeLog-pr-4017.yml b/html/changelogs/AutoChangeLog-pr-4017.yml deleted file mode 100644 index 09e9e1ecd1d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4017.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: ProperPants -delete-after: True -changes: - - rscadd: "Maint drones have magboots." - - rscdel: "Removed plastic from maint drones. Literally useless for station maintenance." - - tweak: "Increased starting amounts of some materials for maint drones and engi borgs." - - experiment: "Reduced the number of lines taken by Engineering cyborgs calling on materials stacks." diff --git a/html/changelogs/AutoChangeLog-pr-4018.yml b/html/changelogs/AutoChangeLog-pr-4018.yml deleted file mode 100644 index 354bfb190d2..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4018.yml +++ /dev/null @@ -1,10 +0,0 @@ -author: Tastyfish -delete-after: True -changes: - - rscadd: "Bots can now be controlled by players, by opening them up and inserting a pAI. *beep" - - bugfix: "MULEbots can now access the engineering destination." - - bugfix: "All MULEbot destinations should now have the correct load/unload direction, meaning the crates won't be dumped inside the flaps." - - rscadd: "Diagnostic HUD's now give health and status information about bots." - - bugfix: "MULEbot rampage blood tracks are now rendered correctly and handle UE traces as appropriate." - - experiment: "Bots should (hopefully) lag the game less now." - - tweak: "Beepsky contains 30% more potato." diff --git a/html/changelogs/AutoChangeLog-pr-4019.yml b/html/changelogs/AutoChangeLog-pr-4019.yml deleted file mode 100644 index 783ca3279fc..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4019.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: tigercat2000 -delete-after: True -changes: - - rscdel: "Virus2 has been removed." - - rscadd: "Virus1 is back. Viva la revolution." diff --git a/html/changelogs/AutoChangeLog-pr-4021.yml b/html/changelogs/AutoChangeLog-pr-4021.yml deleted file mode 100644 index f9a6c1a9ce2..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4021.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - tweak: "upgrades are no longer needed to for the available toys in the prize vendor" diff --git a/html/changelogs/AutoChangeLog-pr-4023.yml b/html/changelogs/AutoChangeLog-pr-4023.yml deleted file mode 100644 index 7556659b0b0..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4023.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Tastyfish -delete-after: True -changes: - - tweak: "Action progress bars are now smooth." diff --git a/html/changelogs/AutoChangeLog-pr-4024.yml b/html/changelogs/AutoChangeLog-pr-4024.yml deleted file mode 100644 index 4276c0a7c29..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4024.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Tastyfish -delete-after: True -changes: - - tweak: "Clicking a filled inventory slot's square with an open hand now clicks the item in the slot." diff --git a/html/changelogs/AutoChangeLog-pr-4025.yml b/html/changelogs/AutoChangeLog-pr-4025.yml deleted file mode 100644 index 76ce74cdf19..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4025.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: tigercat2000 -delete-after: True -changes: - - rscadd: "You can now have up to 20 characters." diff --git a/html/changelogs/AutoChangeLog-pr-4028.yml b/html/changelogs/AutoChangeLog-pr-4028.yml deleted file mode 100644 index 9bfee62bd8c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4028.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Tastyfish -delete-after: True -changes: - - rscadd: "Status displays now display the time when in Shuttle ETA mode and no shuttle activity is happening." - - tweak: "Shuttle ETA countdowns on status displays are now amber." diff --git a/html/changelogs/AutoChangeLog-pr-4030.yml b/html/changelogs/AutoChangeLog-pr-4030.yml deleted file mode 100644 index d9a5b9784a0..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4030.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - rscadd: "Implements Advanced Camera Consoles. A type of camera console that function like AI's vision style. Non-buildable/accessible." - - rscadd: "Adds in Xenobiology Advance Cameras. A type of camera console that functions like advanced cameras, but only works in Xenobiology areas; can move around slimes and feed them with the console as well. Also non-buildable/accessible (for now)." - - rscadd: "Adds in cerulean slime reaction that generates a single use blueprint. On use it colors turfs a lavender color" diff --git a/html/changelogs/AutoChangeLog-pr-4037.yml b/html/changelogs/AutoChangeLog-pr-4037.yml deleted file mode 100644 index fd9f87f147f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4037.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: ProperPants -delete-after: True -changes: - - rscadd: "Operating tables can be deconstructed with a wrench." - - spellcheck: "Fixed and shortened description of metal sheets." diff --git a/html/changelogs/AutoChangeLog-pr-4038.yml b/html/changelogs/AutoChangeLog-pr-4038.yml deleted file mode 100644 index 38a7c85f3bc..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4038.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Fethas -delete-after: True -changes: - - bugfix: "Hell has recently remapped its blood transit system and you can now once again crawl through blood. We are sorry for the-GIVE US YOUR SOUL!" diff --git a/html/changelogs/AutoChangeLog-pr-4039.yml b/html/changelogs/AutoChangeLog-pr-4039.yml deleted file mode 100644 index c0c6335d6be..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4039.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: TheDZD -delete-after: True -changes: - - rscdel: "A lot of the guns and armor in the station collision, space hotel, academy, and wild west away missions have been removed/replaced." - - rscdel: "Removes that fucking facehugger from station collision." diff --git a/html/changelogs/AutoChangeLog-pr-4040.yml b/html/changelogs/AutoChangeLog-pr-4040.yml deleted file mode 100644 index 08de280db07..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4040.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Tastyfish -delete-after: True -changes: - - rscadd: "pAI's can now use the PDA chatrooms." diff --git a/html/changelogs/AutoChangeLog-pr-4044.yml b/html/changelogs/AutoChangeLog-pr-4044.yml deleted file mode 100644 index 9fc834e42c2..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4044.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Tastyfish -delete-after: True -changes: - - rscadd: "Adds treadmills to brig cells, to give the prisoners something productive to do." diff --git a/html/changelogs/AutoChangeLog-pr-4046.yml b/html/changelogs/AutoChangeLog-pr-4046.yml deleted file mode 100644 index fb20500c274..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4046.yml +++ /dev/null @@ -1,10 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - rscadd: "Adds disease1 outbreak event" - - rscadd: "Adds appendecitis event" - - rscadd: "Roburgers now properly have nanomachines in them" - - rscadd: "Re-adds nanomachines" - - tweak: "Experimentor properly generates nanomachines instead of itching powder" - - bugfix: "Fixes big roburgers having a healing reagent in them" - - rscadd: "Adds nanomachines to poison traitor bottles" diff --git a/html/changelogs/AutoChangeLog-pr-4052.yml b/html/changelogs/AutoChangeLog-pr-4052.yml deleted file mode 100644 index 25220aa97ce..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4052.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - rscadd: "Tajarans can now eat mice, chicks, parrots, and tribbles" - - rscadd: "Vulpkanin and Unathi can now eat mice, chicks, lizards, chickens, crabs, parrtos, and tribbles" diff --git a/html/changelogs/AutoChangeLog-pr-4058.yml b/html/changelogs/AutoChangeLog-pr-4058.yml deleted file mode 100644 index 0ea4cbfc8d8..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4058.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: FalseIncarnate -delete-after: True -changes: - - tweak: "Let's you know when your container is full when filling from sinks." - - tweak: "Prevents splashing containers onto beakers and buckets that have a lid on them." - - rscadd: "Pill bottles can now be labeled with a simple pen." - - tweak: "Beakers/buckets (and pill bottles) now accept 26 character labels from pens." diff --git a/html/changelogs/AutoChangeLog-pr-4063.yml b/html/changelogs/AutoChangeLog-pr-4063.yml deleted file mode 100644 index a80e8190a8e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4063.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - bugfix: "fixes spawned changeling headcrab behavior" diff --git a/html/changelogs/AutoChangeLog-pr-4072.yml b/html/changelogs/AutoChangeLog-pr-4072.yml deleted file mode 100644 index 0f230a8fa0a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4072.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Crazylemon64 -delete-after: True -changes: - - bugfix: "Syringes will now draw water from slime people." From 94ff8fc4efc1c34ccd0d1f70bb2310f213ef8fae Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Sat, 2 Apr 2016 21:32:11 -0700 Subject: [PATCH 286/328] whoops forgot to remove this --- code/modules/mob/mob.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 8915a7e46de..370e029200b 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -993,8 +993,6 @@ var/list/slot_equipment_priority = list( \ // this function displays the shuttles ETA in the status panel if the shuttle has been called /mob/proc/show_stat_emergency_shuttle_eta() - var/obj/docking_port/mobile/emergency/E = shuttle_master.emergency - var/ETA = shuttle_master.emergency.getModeStr() if(ETA) stat(null, "[ETA] [shuttle_master.emergency.getTimerStr()]") From b3b0abd95bf4eab1ab858e5249b6d5e3b39ff846 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Sun, 3 Apr 2016 01:19:49 -0400 Subject: [PATCH 287/328] Fixes Weakeyes --- code/game/machinery/flasher.dm | 4 +++- code/game/objects/items/devices/flash.dm | 17 +++++++++++------ .../objects/items/weapons/grenades/flashbang.dm | 13 +++++++++++-- code/modules/mob/living/carbon/carbon.dm | 3 +++ code/modules/mob/mob_defines.dm | 2 +- 5 files changed, 29 insertions(+), 10 deletions(-) diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index b133195e055..01f95d81ab6 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -72,7 +72,9 @@ if(L.flash_eyes(affect_silicon = 1)) L.Weaken(strength) - + if(L.weakeyes) + L.Weaken(strength * 1.5) + L.visible_message("[L] gasps and shields their eyes!") /obj/machinery/flasher/emp_act(severity) if(stat & (BROKEN|NOPOWER)) diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index 6f4e25a85e4..f40b057d46f 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -75,20 +75,25 @@ return 1 -/obj/item/device/flash/proc/flash_carbon(var/mob/living/carbon/M, var/mob/user = null, var/power = 5, convert = 1) +/obj/item/device/flash/proc/flash_carbon(var/mob/living/carbon/M, var/mob/user = null, var/power = 5, targeted = 1) add_logs(M, user, "flashed", object="[src.name]") - - if(user) + if(user && targeted) + if(M.weakeyes) + M.Weaken(3) //quick weaken bypasses eye protection but has no eye flash if(M.flash_eyes(1, 1)) M.confused += power terrible_conversion_proc(M, user) M.Stun(1) + visible_message("[user] blinds [M] with the flash!") + user << "You blind [M] with the flash!" + M << "[user] blinds you with the flash!" if(M.weakeyes) M.Stun(2) - M.visible_message("[M] gasps and shields their eyes!") - user.visible_message("[user] blinds [M] with the [src.name]!") + M.visible_message("[M] gasps and shields their eyes!", "You gasp and shields your eyes!") else - user.visible_message("[user] fails to blind [M] with the [src.name]!") + visible_message("[user] fails to blind [M] with the flash!") + user << "You fail to blind [M] with the flash!" + M << "[user] fails to blind you with the flash!" else if(M.flash_eyes()) M.confused += power diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index 271f9bdb763..bb9f1ab159d 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -25,16 +25,25 @@ //Checking for protections var/ear_safety = M.check_ear_prot() var/distance = max(1,get_dist(src,T)) + //Flash - if(M.flash_eyes(affect_silicon = 1)) + if(M.weakeyes) + M.visible_message("[M] screams and collapses!") + M << "AAAAGH!" + M.Weaken(15) //hella stunned + M.Stun(15) if(ishuman(M)) + M.emote("scream") var/mob/living/carbon/human/H = M var/obj/item/organ/internal/eyes/E = H.get_int_organ(/obj/item/organ/internal/eyes) if(E) - E.damage += rand(1, 3) + E.damage += 8 + + if(M.flash_eyes(affect_silicon = 1)) M.Stun(max(10/distance, 3)) M.Weaken(max(10/distance, 3)) + //Bang if((loc == M) || loc == M.loc)//Holding on person or being exactly where lies is significantly more dangerous and voids protection M.Stun(10) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 5befe1114ba..89814f6b56d 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -315,6 +315,9 @@ if(.) if(visual) return + if(weakeyes) + Stun(2) + var/obj/item/organ/internal/eyes/E = get_int_organ(/obj/item/organ/internal/eyes) if(!E) return diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 017e29fb2fa..810e764ab62 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -201,7 +201,7 @@ var/area/lastarea = null var/digitalcamo = 0 // Can they be tracked by the AI? - var/weakeyes //Are they vulnerable to flashes? + var/weakeyes = 0 //Are they vulnerable to flashes? var/list/radar_blips = list() // list of screen objects, radar blips var/radar_open = 0 // nonzero is radar is open From eb4ddb247dadb2c8c83964a9f97102aeb6e00425 Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Sun, 3 Apr 2016 01:54:51 -0400 Subject: [PATCH 288/328] MeteorOps Tweaks --- code/game/gamemodes/meteor/meteors.dm | 8 ++++---- code/modules/events/meaty_ops.dm | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index 0daab05e340..1ce3cb94a53 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -280,7 +280,7 @@ /obj/effect/meteor/gore/ram_turf(turf/T) if(!istype(T, /turf/space)) - new /obj/effect/decal/cleanable/blood (T) + new /obj/effect/decal/cleanable/blood(T) /obj/effect/meteor/gore/Bump(atom/A) A.ex_act(hitpwr) @@ -291,8 +291,8 @@ name = "MeteorOps" icon = 'icons/mob/animal.dmi' icon_state = "syndicaterangedpsace" - hits = 3 - hitpwr = 3 + hits = 10 + hitpwr = 1 meteorsound = 'sound/effects/blobattack.ogg' meteordrop = /obj/item/weapon/reagent_containers/food/snacks/meat var/meteorgibs = /obj/effect/gibspawner/generic @@ -304,7 +304,7 @@ /obj/effect/meteor/goreops/ram_turf(turf/T) if(!istype(T, /turf/space)) - new /obj/effect/decal/cleanable/blood (T) + new /obj/effect/decal/cleanable/blood(T) /obj/effect/meteor/goreops/Bump(atom/A) A.ex_act(hitpwr) diff --git a/code/modules/events/meaty_ops.dm b/code/modules/events/meaty_ops.dm index 0c9b95cfc5a..d6bdea43393 100644 --- a/code/modules/events/meaty_ops.dm +++ b/code/modules/events/meaty_ops.dm @@ -15,5 +15,5 @@ -/datum/event/meteor_wave/end() +/datum/event/meteor_wave/goreops/end() command_announcement.Announce("All MeteorOps are dead. Major Station Victory.", "MeteorOps") \ No newline at end of file From e2442e7fc94a092f53a5145352bed4a728012231 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Sun, 3 Apr 2016 12:33:52 -0700 Subject: [PATCH 289/328] Add inactive hand to carbon get_access --- code/modules/mob/living/carbon/carbon.dm | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 5befe1114ba..c92d8cebd05 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -886,6 +886,10 @@ so that different stomachs can handle things in different ways VB*/ /mob/living/carbon/get_access() . = ..() - var/obj/item/I = get_active_hand() - if(I) - . |= I.GetAccess() + var/obj/item/RH = get_active_hand() + if(RH) + . |= RH.GetAccess() + + var/obj/item/LH = get_inactive_hand() + if(LH) + . |= LH.GetAccess() From b2d9c2e6a9a0636ef98c768381b8cd3f2f8ad3ce Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Sun, 3 Apr 2016 15:01:15 -0400 Subject: [PATCH 290/328] Fixes mulebots killing passenger, bot tweaks --- code/controllers/Processes/bot.dm | 27 ------------------- code/game/machinery/portable_turret.dm | 2 +- .../mob/living/simple_animal/bot/bot.dm | 6 ++--- .../mob/living/simple_animal/bot/mulebot.dm | 3 ++- 4 files changed, 6 insertions(+), 32 deletions(-) delete mode 100644 code/controllers/Processes/bot.dm diff --git a/code/controllers/Processes/bot.dm b/code/controllers/Processes/bot.dm deleted file mode 100644 index dceb5504b67..00000000000 --- a/code/controllers/Processes/bot.dm +++ /dev/null @@ -1,27 +0,0 @@ -/datum/controller/process/bot/setup() - name = "bot" - schedule_interval = 20 // every 2 seconds - -/datum/controller/process/bot/started() - ..() - if(!aibots) - aibots = list() - -/datum/controller/process/bot/statProcess() - ..() - stat(null, "[aibots && aibots.len] bots") - -/datum/controller/process/bot/doWork() - for(last_object in aibots) - var/obj/machinery/bot/B = last_object - if(istype(B) && isnull(B.gcDestroyed)) - // Some bots sleep when they process, but there's not many bots, so just spawn them off - spawn(-1) - try - B.bot_process() - catch(var/exception/e) - catchException(e, B) - SCHECK - else - catchBadType(B) - aibots -= B diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 7c4d5c797f1..29e1fecd9e3 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -556,7 +556,7 @@ var/list/turret_icons if(!L) return TURRET_NOT_TARGET - if(!emagged && issilicon(L)) // Don't target silica + if(!emagged && (issilicon(L) || isbot(L))) // Don't target silica return TURRET_NOT_TARGET if(L.stat && !emagged) //if the perp is dead/dying, no need to bother really diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index b535d1d3870..c338bb22e7f 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -3,7 +3,7 @@ // AI (i.e. game AI, not the AI player) controlled bots /mob/living/simple_animal/bot icon = 'icons/obj/aibots.dmi' - layer = MOB_LAYER + layer = MOB_LAYER - 0.1 light_range = 3 stop_automated_movement = 1 wander = 0 @@ -389,8 +389,8 @@ /mob/living/simple_animal/bot/proc/speak(message, channel) //Pass a message to have the bot say() it. Pass a frequency to say it on the radio. if((!on) || (!message)) return - if(channel && Radio.channels[channel])// Use radio if we have channel key - Radio.autosay(message, name, channel) + if(channel) + Radio.autosay(message, name, channel == "headset" ? null : channel) else say(message) return diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 720eab73d5b..de778a5aeb3 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -591,7 +591,8 @@ bloodiness-- for(var/mob/living/carbon/human/H in next) - RunOver(H) + if(H != load) + RunOver(H) // calculates a path to the current destination // given an optional turf to avoid From 26a9f441eaac86a4c576fddde5867bfd8cd16b2d Mon Sep 17 00:00:00 2001 From: Crazylemon64 Date: Sun, 3 Apr 2016 17:02:40 -0700 Subject: [PATCH 291/328] MULEbots will now announce their deliveries to request consoles again --- code/modules/shuttle/supply.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index aed517d98ce..405ea460822 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -384,6 +384,7 @@ var/obj/structure/closet/crate/CR = Crate CR.manifest = slip CR.update_icon() + CR.announce_beacons = object.announce_beacons.Copy() if(istype(Crate, /obj/structure/largecrate)) var/obj/structure/largecrate/LC = Crate LC.manifest = slip From 3bd37ec757dd315b14d5552cf12f2ff54ca8917d Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Mon, 4 Apr 2016 00:30:10 -0400 Subject: [PATCH 292/328] Simple Animal Spawn Refactor --- code/_globalvars/lists/mobs.dm | 47 -------------- code/game/gamemodes/blob/blobs/blob_mobs.dm | 2 + code/modules/events/tear.dm | 18 +++--- .../simple_animal/friendly/butterfly.dm | 1 + .../mob/living/simple_animal/friendly/cat.dm | 5 +- .../living/simple_animal/friendly/corgi.dm | 3 + .../mob/living/simple_animal/friendly/crab.dm | 2 + .../mob/living/simple_animal/friendly/deer.dm | 3 +- .../simple_animal/friendly/farm_animals.dm | 8 +++ .../mob/living/simple_animal/friendly/fox.dm | 3 + .../living/simple_animal/friendly/lizard.dm | 1 + .../living/simple_animal/friendly/mouse.dm | 2 + .../mob/living/simple_animal/friendly/pug.dm | 1 + .../living/simple_animal/friendly/tomato.dm | 3 +- .../mob/living/simple_animal/hostile/alien.dm | 3 + .../mob/living/simple_animal/hostile/bat.dm | 1 + .../mob/living/simple_animal/hostile/bear.dm | 1 + .../mob/living/simple_animal/hostile/carp.dm | 2 + .../living/simple_animal/hostile/creature.dm | 1 + .../living/simple_animal/hostile/faithless.dm | 1 + .../simple_animal/hostile/giant_spider.dm | 1 + .../living/simple_animal/hostile/headcrab.dm | 1 + .../living/simple_animal/hostile/hivebot.dm | 1 + .../simple_animal/hostile/jungle_animals.dm | 2 + .../mob/living/simple_animal/hostile/mimic.dm | 2 + .../simple_animal/hostile/poison_bees.dm | 1 + .../living/simple_animal/hostile/syndicate.dm | 1 + .../mob/living/simple_animal/hostile/tree.dm | 1 + .../simple_animal/hostile/winter_mobs.dm | 2 + .../mob/living/simple_animal/parrot.dm | 6 +- .../mob/living/simple_animal/simple_animal.dm | 4 +- code/modules/reagents/newchem/medicine.dm | 28 --------- .../modules/reagents/newchem/newchem_procs.dm | 43 +++++++++++++ .../chemical_reaction_slime.dm | 61 ++++++++----------- .../genetics/prehistoric_animals.dm | 5 ++ 35 files changed, 141 insertions(+), 126 deletions(-) diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index 91a06fa4647..04abf50e362 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -24,53 +24,6 @@ var/global/list/dead_mob_list = list() //List of all dead mobs, including cli var/global/list/respawnable_list = list() //List of all mobs, dead or in mindless creatures that still be respawned. var/global/list/simple_animal_list = list() //List of all simple animals, including clientless -//global var of unsafe-to-spawn-on-reaction mobs -var/global/list/blocked_mobs = list(/mob/living/simple_animal, - /mob/living/simple_animal/hostile, - /mob/living/simple_animal/hostile/pirate, - /mob/living/simple_animal/hostile/pirate/ranged, - /mob/living/simple_animal/hostile/russian, - /mob/living/simple_animal/hostile/russian/ranged, - /mob/living/simple_animal/hostile/syndicate, - /mob/living/simple_animal/hostile/syndicate/melee, - /mob/living/simple_animal/hostile/syndicate/melee/space, - /mob/living/simple_animal/hostile/syndicate/ranged, - /mob/living/simple_animal/hostile/syndicate/ranged/space, - /mob/living/simple_animal/hostile/alien/queen/large, - /mob/living/simple_animal/hostile/retaliate, - /mob/living/simple_animal/hostile/retaliate/clown, - /mob/living/simple_animal/hostile/mushroom, - /mob/living/simple_animal/hostile/asteroid, - /mob/living/simple_animal/hostile/asteroid/basilisk, - /mob/living/simple_animal/hostile/asteroid/goldgrub, - /mob/living/simple_animal/hostile/asteroid/goliath, - /mob/living/simple_animal/hostile/asteroid/hivelord, - /mob/living/simple_animal/hostile/asteroid/hivelordbrood, - /mob/living/simple_animal/hostile/carp/holocarp, - /mob/living/simple_animal/hostile/mining_drone, - /mob/living/simple_animal/hostile/spaceWorm, - /mob/living/simple_animal/hostile/spaceWorm/wormHead, - /mob/living/simple_animal/ascendant_shadowling, - /mob/living/simple_animal/slaughter, - /mob/living/simple_animal/hostile/retaliate/araneus, - /mob/living/simple_animal/hostile/syndicate/ranged/orion, - /mob/living/simple_animal/hostile/statue, - /mob/living/simple_animal/hostile/guardian, - /mob/living/simple_animal/hostile/guardian/fire, - /mob/living/simple_animal/hostile/guardian/healer, - /mob/living/simple_animal/hostile/guardian/punch, - /mob/living/simple_animal/hostile/guardian/punch/sealpunch, - /mob/living/simple_animal/hostile/guardian/healer/sealhealer, - /mob/living/simple_animal/hostile/guardian/ranged, - /mob/living/simple_animal/hostile/guardian/bomb, - /mob/living/simple_animal/hostile/winter/santa, - /mob/living/simple_animal/hostile/winter/santa/stage_1, - /mob/living/simple_animal/hostile/winter/santa/stage_2, - /mob/living/simple_animal/hostile/winter/santa/stage_3, - /mob/living/simple_animal/hostile/winter/santa/stage_4, - /mob/living/simple_animal/hostile/alien/maid - ) - var/global/list/med_hud_users = list() var/global/list/sec_hud_users = list() var/global/list/antag_hud_users = list() diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm index bfaad382adf..fbaadbd8ec8 100644 --- a/code/game/gamemodes/blob/blobs/blob_mobs.dm +++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm @@ -40,6 +40,7 @@ var/obj/effect/blob/factory/factory = null var/list/human_overlays = list() var/is_zombie = 0 + gold_core_spawnable = 1 /mob/living/simple_animal/hostile/blob/blobspore/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) ..() @@ -160,6 +161,7 @@ maxbodytemp = 360 force_threshold = 10 environment_smash = 3 + gold_core_spawnable = 1 /mob/living/simple_animal/hostile/blob/blobbernaut/blob_act() diff --git a/code/modules/events/tear.dm b/code/modules/events/tear.dm index 605c6d1705d..dcaad24f853 100644 --- a/code/modules/events/tear.dm +++ b/code/modules/events/tear.dm @@ -41,15 +41,17 @@ if(animation) qdel(animation) spawn(rand(30,120)) - var/blocked = blocked_mobs //global variable for blocked mobs + var/list/tear_critters = list() + for(var/T in typesof(/mob/living/simple_animal)) + var/mob/living/simple_animal/SA = T + if(initial(SA.gold_core_spawnable) == 1) + tear_critters += T - var/list/critters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs - - for(var/i = 1, i <= 5, i++) - var/chosen = pick(critters) - var/mob/living/simple_animal/hostile/C = new chosen - C.faction = list("slimesummon") - C.loc = src.loc + for(var/i in 1 to 5) + var/chosen = pick(tear_critters) + var/mob/living/simple_animal/C = new chosen + C.faction |= "chemicalsummon" + C.forceMove(get_turf(src)) if(prob(50)) for(var/j = 1, j <= rand(1, 3), j++) step(C, pick(NORTH,SOUTH,EAST,WEST)) diff --git a/code/modules/mob/living/simple_animal/friendly/butterfly.dm b/code/modules/mob/living/simple_animal/friendly/butterfly.dm index 27df35c5bf9..ce36d85ce30 100644 --- a/code/modules/mob/living/simple_animal/friendly/butterfly.dm +++ b/code/modules/mob/living/simple_animal/friendly/butterfly.dm @@ -18,6 +18,7 @@ pass_flags = PASSTABLE | PASSGRILLE | PASSMOB ventcrawler = 2 butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 0) + gold_core_spawnable = 2 /mob/living/simple_animal/butterfly/New() ..() diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index b2a0c129b29..29f288b7c67 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -20,6 +20,7 @@ response_help = "pets" response_disarm = "gently pushes aside" response_harm = "kicks" + gold_core_spawnable = 2 //RUNTIME IS ALIVE! SQUEEEEEEEE~ /mob/living/simple_animal/pet/cat/Runtime @@ -32,6 +33,7 @@ gender = FEMALE var/turns_since_scan = 0 var/mob/living/simple_animal/mouse/movement_target + gold_core_spawnable = 0 /mob/living/simple_animal/pet/cat/Runtime/handle_automated_action() ..() @@ -96,4 +98,5 @@ flags = NO_BREATHE faction = list("syndicate") var/turns_since_scan = 0 - var/mob/living/simple_animal/mouse/movement_target \ No newline at end of file + var/mob/living/simple_animal/mouse/movement_target + gold_core_spawnable = 0 \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index f51e3e81f65..520b7af0e01 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -26,6 +26,7 @@ var/obj/item/inventory_head var/obj/item/inventory_back var/facehugger + gold_core_spawnable = 2 /mob/living/simple_animal/pet/corgi/New() ..() @@ -397,6 +398,7 @@ response_help = "pets" response_disarm = "bops" response_harm = "kicks" + gold_core_spawnable = 0 /mob/living/simple_animal/pet/corgi/Ian/process_ai() ..() @@ -553,6 +555,7 @@ response_harm = "kicks" var/turns_since_scan = 0 var/puppies = 0 + gold_core_spawnable = 0 //Lisa already has a cute bow! /mob/living/simple_animal/pet/corgi/Lisa/Topic(href, href_list) diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm index 524cffc9979..0777771b235 100644 --- a/code/modules/mob/living/simple_animal/friendly/crab.dm +++ b/code/modules/mob/living/simple_animal/friendly/crab.dm @@ -22,6 +22,7 @@ var/obj/item/inventory_mask can_hide = 1 can_collar = 1 + gold_core_spawnable = 2 /mob/living/simple_animal/crab/handle_automated_movement() //CRAB movement @@ -46,6 +47,7 @@ response_help = "pets" response_disarm = "gently pushes aside" response_harm = "stomps" + gold_core_spawnable = 0 //LOOK AT THIS - ..()?? /*/mob/living/simple_animal/crab/attackby(var/obj/item/O as obj, var/mob/user as mob, params) diff --git a/code/modules/mob/living/simple_animal/friendly/deer.dm b/code/modules/mob/living/simple_animal/friendly/deer.dm index 0cc59c07f94..c55b5fc6850 100644 --- a/code/modules/mob/living/simple_animal/friendly/deer.dm +++ b/code/modules/mob/living/simple_animal/friendly/deer.dm @@ -14,4 +14,5 @@ response_help = "pets" response_disarm = "gently pushes aside" response_harm = "kicks" - can_collar = 1 \ No newline at end of file + can_collar = 1 + gold_core_spawnable = 2 \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index f3e77854882..a1c5bf16dd7 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -111,6 +111,7 @@ health = 50 var/milk_content = 0 can_collar = 1 + gold_core_spawnable = 2 /mob/living/simple_animal/cow/New() ..() @@ -178,6 +179,7 @@ small = 1 can_hide = 1 can_collar = 1 + gold_core_spawnable = 2 /mob/living/simple_animal/chick/New() ..() @@ -220,6 +222,7 @@ var/global/chicken_count = 0 small = 1 can_hide = 1 can_collar = 1 + gold_core_spawnable = 2 /mob/living/simple_animal/chicken/New() ..() @@ -297,6 +300,7 @@ var/global/chicken_count = 0 attacktext = "kicks" health = 50 can_collar = 1 + gold_core_spawnable = 2 /mob/living/simple_animal/turkey name = "turkey" @@ -318,6 +322,7 @@ var/global/chicken_count = 0 attacktext = "pecks" health = 50 can_collar = 1 + gold_core_spawnable = 2 /mob/living/simple_animal/goose name = "goose" @@ -339,6 +344,7 @@ var/global/chicken_count = 0 attacktext = "kicks" health = 50 can_collar = 1 + gold_core_spawnable = 2 /mob/living/simple_animal/seal name = "seal" @@ -360,6 +366,7 @@ var/global/chicken_count = 0 attacktext = "kicks" health = 50 can_collar = 1 + gold_core_spawnable = 2 /mob/living/simple_animal/walrus name = "walrus" @@ -381,3 +388,4 @@ var/global/chicken_count = 0 attacktext = "kicks" health = 50 can_collar = 1 + gold_core_spawnable = 2 diff --git a/code/modules/mob/living/simple_animal/friendly/fox.dm b/code/modules/mob/living/simple_animal/friendly/fox.dm index cd62ababfe7..b7555301c18 100644 --- a/code/modules/mob/living/simple_animal/friendly/fox.dm +++ b/code/modules/mob/living/simple_animal/friendly/fox.dm @@ -17,11 +17,13 @@ response_help = "pets" response_disarm = "gently pushes aside" response_harm = "kicks" + gold_core_spawnable = 2 //Captain fox /mob/living/simple_animal/pet/fox/Renault name = "Renault" desc = "Renault, the Captain's trustworthy fox. I wonder what it says?" + gold_core_spawnable = 0 //Syndi fox /mob/living/simple_animal/pet/fox/Syndifox @@ -33,3 +35,4 @@ icon_resting = "Syndifox_rest" flags = NO_BREATHE faction = list("syndicate") + gold_core_spawnable = 0 diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm index 27cb2eb17cf..e4aab2ed47e 100644 --- a/code/modules/mob/living/simple_animal/friendly/lizard.dm +++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm @@ -22,3 +22,4 @@ can_hide = 1 butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 1) can_collar = 1 + gold_core_spawnable = 2 diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index c24da570653..3d090de3144 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -31,6 +31,7 @@ can_hide = 1 holder_type = /obj/item/weapon/holder/mouse can_collar = 1 + gold_core_spawnable = 2 /mob/living/simple_animal/mouse/handle_automated_speech() ..() @@ -144,3 +145,4 @@ response_help = "pets" response_disarm = "gently pushes aside" response_harm = "splats" + gold_core_spawnable = 0 diff --git a/code/modules/mob/living/simple_animal/friendly/pug.dm b/code/modules/mob/living/simple_animal/friendly/pug.dm index b4b6486b859..4b25505561b 100644 --- a/code/modules/mob/living/simple_animal/friendly/pug.dm +++ b/code/modules/mob/living/simple_animal/friendly/pug.dm @@ -17,6 +17,7 @@ response_disarm = "bops" response_harm = "kicks" see_in_dark = 5 + gold_core_spawnable = 2 /mob/living/simple_animal/pet/pug/process_ai() ..() diff --git a/code/modules/mob/living/simple_animal/friendly/tomato.dm b/code/modules/mob/living/simple_animal/friendly/tomato.dm index f6d0bf9752e..998071443f3 100644 --- a/code/modules/mob/living/simple_animal/friendly/tomato.dm +++ b/code/modules/mob/living/simple_animal/friendly/tomato.dm @@ -14,4 +14,5 @@ response_harm = "smacks the" harm_intent_damage = 5 pass_flags = PASSTABLE - can_hide = 1 \ No newline at end of file + can_hide = 1 + gold_core_spawnable = 2 \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index 47cfdd23984..ff2f03d74cf 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -29,6 +29,7 @@ see_in_dark = 8 see_invisible = SEE_INVISIBLE_MINIMUM heat_damage_per_tick = 20 + gold_core_spawnable = 1 /mob/living/simple_animal/hostile/alien/drone @@ -127,6 +128,7 @@ move_to_delay = 4 maxHealth = 400 health = 400 + gold_core_spawnable = 0 /obj/item/projectile/neurotox name = "neurotoxin" @@ -151,6 +153,7 @@ icon_state = "maid" icon_living = "maid" icon_dead = "maid_dead" + gold_core_spawnable = 0 //no fun allowed /mob/living/simple_animal/hostile/alien/maid/AttackingTarget() if(istype(target, /atom/movable)) diff --git a/code/modules/mob/living/simple_animal/hostile/bat.dm b/code/modules/mob/living/simple_animal/hostile/bat.dm index 70c117860af..eaae85b5eb2 100644 --- a/code/modules/mob/living/simple_animal/hostile/bat.dm +++ b/code/modules/mob/living/simple_animal/hostile/bat.dm @@ -29,6 +29,7 @@ faction = list("scarybat") var/mob/living/owner + gold_core_spawnable = 1 /mob/living/simple_animal/hostile/scarybat/New(loc, mob/living/L as mob) ..() diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm index 0171e960ed0..b9fce10e8f0 100644 --- a/code/modules/mob/living/simple_animal/hostile/bear.dm +++ b/code/modules/mob/living/simple_animal/hostile/bear.dm @@ -31,6 +31,7 @@ var/stance_step = 0 faction = list("russian") + gold_core_spawnable = 1 //SPACE BEARS! SQUEEEEEEEE~ OW! FUCK! IT BIT MY HAND OFF!! /mob/living/simple_animal/hostile/bear/Hudson diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index 2b13fadec8d..2c971649e64 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -33,6 +33,7 @@ faction = list("carp") flying = 1 + gold_core_spawnable = 1 /mob/living/simple_animal/hostile/carp/Process_Spacemove(var/movement_dir = 0) return 1 //No drifting in space for space carp! //original comments do not steal @@ -53,6 +54,7 @@ icon_state = "holocarp" icon_living = "holocarp" maxbodytemp = INFINITY + gold_core_spawnable = 0 /mob/living/simple_animal/hostile/carp/holocarp/death() ..() diff --git a/code/modules/mob/living/simple_animal/hostile/creature.dm b/code/modules/mob/living/simple_animal/hostile/creature.dm index 9a3357e058a..24c4eede1de 100644 --- a/code/modules/mob/living/simple_animal/hostile/creature.dm +++ b/code/modules/mob/living/simple_animal/hostile/creature.dm @@ -13,4 +13,5 @@ attacktext = "chomps" attack_sound = 'sound/weapons/bite.ogg' faction = list("creature") + gold_core_spawnable = 1 diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm index 380b332a7e4..1f496c8347c 100644 --- a/code/modules/mob/living/simple_animal/hostile/faithless.dm +++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm @@ -25,6 +25,7 @@ speed = 4 faction = list("faithless") + gold_core_spawnable = 1 /mob/living/simple_animal/hostile/faithless/Process_Spacemove(var/movement_dir = 0) return 1 diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 9de16829259..088155c25aa 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -49,6 +49,7 @@ move_to_delay = 6 attacktext = "bites" attack_sound = 'sound/weapons/bite.ogg' + gold_core_spawnable = 1 //nursemaids - these create webs and eggs /mob/living/simple_animal/hostile/poison/giant_spider/nurse diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm index b470f0506ff..5aa075a8cc5 100644 --- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm +++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm @@ -21,6 +21,7 @@ ventcrawler = 2 var/datum/mind/origin var/egg_lain = 0 + gold_core_spawnable = 1 /mob/living/simple_animal/hostile/headcrab/proc/Infect(mob/living/carbon/victim) var/obj/item/organ/internal/body_egg/changeling_egg/egg = new(victim) diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm index 44f5caa1609..7116d49fb55 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm @@ -21,6 +21,7 @@ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 speak_emote = list("states") + gold_core_spawnable = 1 /mob/living/simple_animal/hostile/hivebot/range name = "Hivebot" diff --git a/code/modules/mob/living/simple_animal/hostile/jungle_animals.dm b/code/modules/mob/living/simple_animal/hostile/jungle_animals.dm index 6404ab29f21..75ecdf79511 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle_animals.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle_animals.dm @@ -30,6 +30,7 @@ layer = 3.1 //so they can stay hidde under the /obj/structure/bush var/stalk_tick_delay = 3 + gold_core_spawnable = 1 /mob/living/simple_animal/hostile/panther/ListTargets() var/list/targets = list() @@ -87,6 +88,7 @@ layer = 3.1 //so they can stay hidde under the /obj/structure/bush var/stalk_tick_delay = 3 + gold_core_spawnable = 1 /mob/living/simple_animal/hostile/snake/ListTargets() var/list/targets = list() diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index 2f077249527..ab83a592e1f 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -30,6 +30,7 @@ move_to_delay = 9 var/is_electronic = 0 + gold_core_spawnable = 1 /mob/living/simple_animal/hostile/mimic/FindTarget() . = ..() @@ -139,6 +140,7 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca var/mob/living/creator = null // the creator var/destroy_objects = 0 var/knockdown_people = 0 + gold_core_spawnable = 0 /mob/living/simple_animal/hostile/mimic/copy/New(loc, var/obj/copy, var/mob/living/creator, var/destroy_original = 0) ..(loc) diff --git a/code/modules/mob/living/simple_animal/hostile/poison_bees.dm b/code/modules/mob/living/simple_animal/hostile/poison_bees.dm index b05ba13ccab..6bb6efc003d 100644 --- a/code/modules/mob/living/simple_animal/hostile/poison_bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/poison_bees.dm @@ -24,6 +24,7 @@ //Spaceborn beings don't get hurt by space atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 + gold_core_spawnable = 1 /mob/living/simple_animal/hostile/poison/bees/Process_Spacemove(var/check_drift = 0) return 1 diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 434d1739b9e..1c869805a03 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -132,6 +132,7 @@ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 flying = 1 + gold_core_spawnable = 1 /mob/living/simple_animal/hostile/viscerator/death() ..() diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm index 555386debcb..361cea751ad 100644 --- a/code/modules/mob/living/simple_animal/hostile/tree.dm +++ b/code/modules/mob/living/simple_animal/hostile/tree.dm @@ -28,6 +28,7 @@ minbodytemp = 0 faction = list("hostile", "winter") + gold_core_spawnable = 1 /mob/living/simple_animal/hostile/tree/FindTarget() . = ..() diff --git a/code/modules/mob/living/simple_animal/hostile/winter_mobs.dm b/code/modules/mob/living/simple_animal/hostile/winter_mobs.dm index 930eb144af8..ae176992a9e 100644 --- a/code/modules/mob/living/simple_animal/hostile/winter_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/winter_mobs.dm @@ -33,6 +33,7 @@ bodytemperature = 73.0 //it's made of snow and hatred, so it's pretty cold. maxbodytemp = 280.15 //at roughly 7 C, these will start melting (dying) from the warmth. Mind over matter or something. heat_damage_per_tick = 10 //Now With Rapid Thawing Action! + gold_core_spawnable = 1 /mob/living/simple_animal/hostile/winter/snowman/death() @@ -63,6 +64,7 @@ melee_damage_lower = 5 melee_damage_upper = 10 + gold_core_spawnable = 1 /mob/living/simple_animal/hostile/winter/santa maxHealth = 150 //if this seems low for a "boss", it's because you have to fight him multiple times, with him fully healing between stages diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 9a53f6bfa35..33372a9904f 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -82,6 +82,7 @@ //Parrots are kleptomaniacs. This variable ... stores the item a parrot is holding. var/obj/item/held_item = null + gold_core_spawnable = 2 /mob/living/simple_animal/parrot/New() @@ -272,13 +273,13 @@ //Sprite and AI update for when a parrot gets pulled if(pulledby && stat == CONSCIOUS) - icon_state = "parrot_fly" + icon_state = "parrot_fly" /mob/living/simple_animal/parrot/process_ai() if(pulledby) parrot_state = PARROT_WANDER return - + if(!isturf(src.loc) || !canmove || buckled) return //If it can't move, dont let it move. (The buckled check probably isn't necessary thanks to canmove) @@ -682,6 +683,7 @@ name = "Poly" desc = "Poly the Parrot. An expert on quantum cracker theory." speak = list("Poly wanna cracker!", ":eCheck the singlo, you chucklefucks!",":eCheck the tesla, you shits!",":eSTOP HOT-WIRING THE ENGINE, FUCKING CHRIST!",":eWire the solars, you lazy bums!",":eWHO TOOK THE DAMN HARDSUITS?",":eOH GOD ITS FREE CALL THE SHUTTLE") + gold_core_spawnable = 0 /mob/living/simple_animal/parrot/Poly/New() ears = new /obj/item/device/radio/headset/headset_eng(src) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 362ec626f2b..bd8d6b8e740 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -67,6 +67,8 @@ var/scan_ready = 1 var/simplespecies //Sorry, no spider+corgi buttbabies. + var/gold_core_spawnable = 0 //if 1 can be spawned by plasma with gold core, 2 are 'friendlies' spawned with blood + var/master_commander = null //holding var for determining who own/controls a sentient simple animal (for sentience potions). var/sentience_type = SENTIENCE_ORGANIC // Sentience type, for slime potions @@ -695,4 +697,4 @@ . |= collar.GetAccess() /mob/living/simple_animal/proc/sentience_act() //Called when a simple animal gains sentience via gold slime potion - return + return diff --git a/code/modules/reagents/newchem/medicine.dm b/code/modules/reagents/newchem/medicine.dm index f742424970d..677cc94f7a8 100644 --- a/code/modules/reagents/newchem/medicine.dm +++ b/code/modules/reagents/newchem/medicine.dm @@ -681,34 +681,6 @@ datum/reagent/life /datum/chemical_reaction/life/on_reaction(var/datum/reagents/holder, var/created_volume) chemical_mob_spawn(holder, 1, "Life") -proc/chemical_mob_spawn(var/datum/reagents/holder, var/amount_to_spawn, var/reaction_name, var/mob_faction = "chemicalsummon") - if(holder && holder.my_atom) - var/blocked = blocked_mobs //global variable for blocked mobs - - var/list/critters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs - var/atom/A = holder.my_atom - var/turf/T = get_turf(A) - var/area/my_area = get_area(T) - var/message = "A [reaction_name] reaction has occured in ([my_area.name])" - var/mob/M = get(A, /mob) - if(M) - message += " - carried by: [key_name_admin(M)]" - else - message += " - last fingerprint: [(A.fingerprintslast ? A.fingerprintslast : "N/A")]" - - message_admins(message, 0, 1) - - playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) - - for(var/i = 1, i <= amount_to_spawn, i++) - var/chosen = pick(critters) - var/mob/living/simple_animal/hostile/C = new chosen - C.faction |= mob_faction - C.loc = get_turf(holder.my_atom) - if(prob(50)) - for(var/j = 1, j <= rand(1, 3), j++) - step(C, pick(NORTH,SOUTH,EAST,WEST)) - /datum/reagent/mannitol/on_mob_life(mob/living/M as mob) M.adjustBrainLoss(-3) ..() diff --git a/code/modules/reagents/newchem/newchem_procs.dm b/code/modules/reagents/newchem/newchem_procs.dm index 4a6ec32366e..761791f3c11 100644 --- a/code/modules/reagents/newchem/newchem_procs.dm +++ b/code/modules/reagents/newchem/newchem_procs.dm @@ -166,4 +166,47 @@ /datum/reagent/proc/reagent_deleted() return +var/list/chemical_mob_spawn_meancritters = list() // list of possible hostile mobs +var/list/chemical_mob_spawn_nicecritters = list() // and possible friendly mobs +/datum/chemical_reaction/proc/chemical_mob_spawn(datum/reagents/holder, amount_to_spawn, reaction_name, mob_faction = "chemicalsummon") + if(holder && holder.my_atom) + if(chemical_mob_spawn_meancritters.len <= 0 || chemical_mob_spawn_nicecritters.len <= 0) + for(var/T in typesof(/mob/living/simple_animal)) + var/mob/living/simple_animal/SA = T + switch(initial(SA.gold_core_spawnable)) + if(1) + chemical_mob_spawn_meancritters += T + if(2) + chemical_mob_spawn_nicecritters += T + var/atom/A = holder.my_atom + var/turf/T = get_turf(A) + var/area/my_area = get_area(T) + var/message = "A [reaction_name] reaction has occured in [my_area.name]. (JMP)" + message += " (VV)" + + var/mob/M = get(A, /mob) + if(M) + message += " - Carried By: [key_name_admin(M)](?) (FLW)" + else + message += " - Last Fingerprint: [(A.fingerprintslast ? A.fingerprintslast : "N/A")]" + + message_admins(message, 0, 1) + + playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) + + for(var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null)) + C.flash_eyes() + for(var/i = 1, i <= amount_to_spawn, i++) + var/chosen + if(reaction_name == "Friendly Gold Slime") + chosen = pick(chemical_mob_spawn_nicecritters) + else + chosen = pick(chemical_mob_spawn_meancritters) + var/mob/living/simple_animal/C = new chosen + C.faction |= mob_faction + C.forceMove(get_turf(holder.my_atom)) + if(prob(50)) + for(var/j = 1, j <= rand(1, 3), j++) + step(C, pick(NORTH,SOUTH,EAST,WEST)) + #undef ADDICTION_TIME \ No newline at end of file diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm index 649a32ae373..5ba9f9057af 100644 --- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm +++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm @@ -77,31 +77,16 @@ name = "Slime Crit" id = "m_tele" result = null - required_reagents = list("plasma" = 5) + required_reagents = list("plasma" = 1) result_amount = 1 required_container = /obj/item/slime_extract/gold required_other = 1 on_reaction(var/datum/reagents/holder) - - var/blocked = blocked_mobs //global variable of blocked mobs - - var/list/critters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs - - playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) - - for(var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null)) - C.flash_eyes() - - for(var/i = 1, i <= 5, i++) - var/chosen = pick(critters) - var/mob/living/simple_animal/hostile/C = new chosen - C.faction |= "slimesummon" - C.loc = get_turf(holder.my_atom) - if(prob(50)) - for(var/j = 1, j <= rand(1, 3), j++) - step(C, pick(NORTH,SOUTH,EAST,WEST)) -// for(var/mob/O in viewers(get_turf(holder.my_atom), null)) -// O.show_message(text("\red The slime core fizzles disappointingly,"), 1) + feedback_add_details("slime_cores_used","[type]") + var/turf/T = get_turf(holder.my_atom) + T.visible_message("The slime extract begins to vibrate violently !") + spawn(50) + chemical_mob_spawn(holder, 5, "Gold Slime") slimecritlesser @@ -113,26 +98,28 @@ required_container = /obj/item/slime_extract/gold required_other = 1 on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The slime extract begins to vibrate violently!"), 1) + feedback_add_details("slime_cores_used","[type]") + var/turf/T = get_turf(holder.my_atom) + T.visible_message("The slime extract begins to vibrate violently !") spawn(50) + chemical_mob_spawn(holder, 3, "Lesser Gold Slime", "neutral") - if(holder && holder.my_atom) - var/blocked = blocked_mobs + slimecritfriendly + name = "Slime Crit Friendly" + id = "m_tele5" + result = null + required_reagents = list("water" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/gold + required_other = 1 + on_reaction(datum/reagents/holder) + feedback_add_details("slime_cores_used","[type]") + var/turf/T = get_turf(holder.my_atom) + T.visible_message("The slime extract begins to vibrate adorably !") + spawn(50) + chemical_mob_spawn(holder, 1, "Friendly Gold Slime", "neutral") - var/list/critters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs - - playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) - - for(var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null)) - C.flash_eyes() - - var/chosen = pick(critters) - var/mob/living/simple_animal/hostile/C = new chosen - C.faction |= "neutral" - C.loc = get_turf(holder.my_atom) //Silver slimebork diff --git a/code/modules/research/xenoarchaeology/genetics/prehistoric_animals.dm b/code/modules/research/xenoarchaeology/genetics/prehistoric_animals.dm index 6fc2c277519..50446de112d 100644 --- a/code/modules/research/xenoarchaeology/genetics/prehistoric_animals.dm +++ b/code/modules/research/xenoarchaeology/genetics/prehistoric_animals.dm @@ -17,6 +17,7 @@ speak = list("Hruuugh!","Hrunnph") emote_see = list("paws the ground","shakes its mane","stomps") emote_hear = list("snuffles") + gold_core_spawnable = 1 /mob/living/simple_animal/hostile/diyaab name = "diyaab" @@ -37,6 +38,7 @@ speak = list("Awrr?","Aowrl!","Worrl") emote_see = list("sniffs the air cautiously","looks around") emote_hear = list("snuffles") + gold_core_spawnable = 1 /mob/living/simple_animal/hostile/shantak name = "shantak" @@ -56,6 +58,7 @@ speak_chance = 5 speak = list("Shuhn","Shrunnph?","Shunpf") emote_see = list("scratches the ground","shakes out it's mane","tinkles gently") + gold_core_spawnable = 1 /mob/living/simple_animal/yithian name = "yithian" @@ -63,6 +66,7 @@ icon_state = "yithian" icon_living = "yithian" icon_dead = "yithian_dead" + gold_core_spawnable = 2 /mob/living/simple_animal/tindalos name = "tindalos" @@ -70,3 +74,4 @@ icon_state = "tindalos" icon_living = "tindalos" icon_dead = "tindalos_dead" + gold_core_spawnable = 2 From da4e7478f06407412805d204f6fd7fe5ac27de33 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Mon, 4 Apr 2016 01:03:42 -0400 Subject: [PATCH 293/328] Adds Tape to ArtVend --- code/game/machinery/vending.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 1265eb8da78..79682ab4fd1 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -1250,7 +1250,7 @@ vend_delay = 15 icon_state = "artvend" products = list(/obj/item/stack/cable_coil/random = 10,/obj/item/device/camera = 4,/obj/item/device/camera_film = 6, - /obj/item/weapon/storage/photo_album = 2,/obj/item/stack/wrapping_paper = 4,/obj/item/stack/packageWrap = 4, + /obj/item/weapon/storage/photo_album = 2,/obj/item/stack/wrapping_paper = 4,/obj/item/stack/tape_roll = 5,/obj/item/stack/packageWrap = 4, /obj/item/weapon/storage/fancy/crayons = 4,/obj/item/weapon/hand_labeler = 4,/obj/item/weapon/paper = 10, /obj/item/weapon/c_tube = 10,/obj/item/weapon/pen = 5,/obj/item/weapon/pen/blue = 5, /obj/item/weapon/pen/red = 5) From 16c8e24f04f2ea4b9e185efe3edcd07788758b6b Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Mon, 4 Apr 2016 02:02:19 -0400 Subject: [PATCH 294/328] Tweaks/fixes some bot radio/language stuff, lazarus capsules --- code/game/machinery/telecomms/logbrowser.dm | 5 ++++- code/modules/mining/mine_items.dm | 2 +- code/modules/mob/living/carbon/human/say.dm | 2 ++ code/modules/mob/living/silicon/say.dm | 2 ++ code/modules/mob/living/simple_animal/bot/bot.dm | 7 +++++++ 5 files changed, 16 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/telecomms/logbrowser.dm b/code/game/machinery/telecomms/logbrowser.dm index a16bbe7b870..282c7a39cd8 100644 --- a/code/game/machinery/telecomms/logbrowser.dm +++ b/code/game/machinery/telecomms/logbrowser.dm @@ -90,9 +90,12 @@ race = "Artificial Life" else if(isslime(M)) // NT knows a lot about slimes, but not aliens. Can identify slimes - race = "slime" + race = "Slime" language = race + else if(isbot(M)) + race = "Bot" + else if(isanimal(M)) race = "Domestic Animal" language = race diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index f9b4228e792..235b46df619 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -211,7 +211,7 @@ return ..() /obj/item/device/mobcapsule/attack(var/atom/A, mob/user, prox_flag) - if(!istype(A, /mob/living/simple_animal)) + if(!istype(A, /mob/living/simple_animal) || isbot(A)) return ..() capture(A, user) return 1 diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index f736a17af22..7162933349d 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -53,6 +53,8 @@ return 1 if (istype(other, /mob/living/silicon)) return 1 + if (istype(other, /mob/living/simple_animal/bot)) + return 1 if (istype(other, /mob/living/carbon/brain)) return 1 if (istype(other, /mob/living/carbon/slime)) diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm index bcbcb1632f4..6bb8531ea18 100644 --- a/code/modules/mob/living/silicon/say.dm +++ b/code/modules/mob/living/silicon/say.dm @@ -56,6 +56,8 @@ return 1 if (istype(other, /mob/living/silicon)) return 1 + if (istype(other, /mob/living/simple_animal/bot)) + return 1 if (istype(other, /mob/living/carbon/brain)) return 1 return ..() diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index c338bb22e7f..3f1bf7c17b7 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -132,6 +132,13 @@ radio_config["[radio_channel]"] = 1 Radio.config(radio_config) + add_language("Galactic Common", 1) + add_language("Sol Common", 1) + add_language("Tradeband", 1) + add_language("Gutter", 1) + add_language("Trinary", 1) + default_language = all_languages["Galactic Common"] + bot_core = new bot_core_type(src) spawn(30) if(radio_controller && bot_filter) From aee239c6e59033b6cad5e3452b2766781e3cad67 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Mon, 4 Apr 2016 04:45:13 -0400 Subject: [PATCH 295/328] Sentience Potion Changes --- .../research/xenobiology/xenobiology.dm | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index e92f52f6c59..2f4d2bacaca 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -200,6 +200,7 @@ var/list/not_interested = list() var/being_used = 0 w_class = 1 + var/sentience_type = SENTIENCE_ORGANIC /obj/item/weapon/sentience_potion/afterattack(mob/living/M, mob/user) @@ -210,27 +211,30 @@ return ..() if(M.stat) user << "[M] is dead!" - return..() + return ..() + var/mob/living/simple_animal/SM = M + if(SM.sentience_type != sentience_type) + user << "The potion won't work on [SM]." + return ..() - user << "You offer the sentience potion to [M]..." + user << "You offer the sentience potion to [SM]..." being_used = 1 - var/list/candidates = pollCandidates("Do you want to play as [M.name]?", ROLE_SENTIENT, 0, 100) + var/list/candidates = pollCandidates("Do you want to play as [SM.name]?", ROLE_SENTIENT, 0, 100) if(!src) return if(candidates.len) var/mob/C = pick(candidates) - M.key = C.key - M.universal_speak = 1 - M.faction |= "sentient" - M << "All at once it makes sense: you know what you are and who you are! Self awareness is yours!" - M << "You are grateful to be self aware and owe [user] a great debt. Serve [user], and assist them in completing their goals at any cost." + SM.key = C.key + SM.universal_speak = 1 + SM.faction = user.faction + SM.master_commander = user + SM.sentience_act() + SM << "All at once it makes sense: you know what you are and who you are! Self awareness is yours!" + SM << "You are grateful to be self aware and owe [user] a great debt. Serve [user], and assist them in completing their goals at any cost." user << "[M] accepts the potion and suddenly becomes attentive and aware. It worked!" - if(isanimal(M)) - var/mob/living/simple_animal/S = M - S.master_commander = user qdel(src) else user << "[M] looks interested for a moment, but then looks back down. Maybe you should try again later." From 9d61aef92c81b6c26e3394e318df60dc2658bff3 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Mon, 4 Apr 2016 07:13:51 -0400 Subject: [PATCH 296/328] Automatic changelog generation for PR #4094 --- html/changelogs/AutoChangeLog-pr-4094.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4094.yml diff --git a/html/changelogs/AutoChangeLog-pr-4094.yml b/html/changelogs/AutoChangeLog-pr-4094.yml new file mode 100644 index 00000000000..371e5a5f432 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4094.yml @@ -0,0 +1,4 @@ +author: Crazylemon64 +delete-after: True +changes: + - bugfix: "Mulebots will now send announcements to relevant requests consoles on delivery again." From e336ed67061dd797f1058f6798259278ce5b902c Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Mon, 4 Apr 2016 07:14:11 -0400 Subject: [PATCH 297/328] Automatic changelog generation for PR #4083 --- html/changelogs/AutoChangeLog-pr-4083.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4083.yml diff --git a/html/changelogs/AutoChangeLog-pr-4083.yml b/html/changelogs/AutoChangeLog-pr-4083.yml new file mode 100644 index 00000000000..3402e2effb6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4083.yml @@ -0,0 +1,4 @@ +author: Fethas +delete-after: True +changes: + - tweak: "maybe makes them last longer...maybe..and fixes the event end message" From 16e41b0bbbfd82dc966ffa5aa2ead1e023b0ed40 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Mon, 4 Apr 2016 15:12:08 -0400 Subject: [PATCH 298/328] Automatic changelog generation for PR #4082 --- html/changelogs/AutoChangeLog-pr-4082.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4082.yml diff --git a/html/changelogs/AutoChangeLog-pr-4082.yml b/html/changelogs/AutoChangeLog-pr-4082.yml new file mode 100644 index 00000000000..f49b05a3564 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4082.yml @@ -0,0 +1,4 @@ +author: Fox McCloud +delete-after: True +changes: + - bugfix: "Fixes weakeyes having a negligible impact" From b7afdec18c22ddb7db133307e5a3b58cce9ada42 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Mon, 4 Apr 2016 17:01:03 -0400 Subject: [PATCH 299/328] defines --- code/__DEFINES/mob.dm | 4 ++++ code/game/gamemodes/blob/blobs/blob_mobs.dm | 4 ++-- code/modules/events/tear.dm | 2 +- .../living/simple_animal/friendly/butterfly.dm | 2 +- .../mob/living/simple_animal/friendly/cat.dm | 6 +++--- .../mob/living/simple_animal/friendly/corgi.dm | 6 +++--- .../mob/living/simple_animal/friendly/crab.dm | 4 ++-- .../mob/living/simple_animal/friendly/deer.dm | 2 +- .../simple_animal/friendly/farm_animals.dm | 16 ++++++++-------- .../mob/living/simple_animal/friendly/fox.dm | 6 +++--- .../mob/living/simple_animal/friendly/lizard.dm | 2 +- .../mob/living/simple_animal/friendly/mouse.dm | 4 ++-- .../mob/living/simple_animal/friendly/pug.dm | 2 +- .../mob/living/simple_animal/friendly/tomato.dm | 2 +- .../mob/living/simple_animal/hostile/alien.dm | 6 +++--- .../mob/living/simple_animal/hostile/bat.dm | 2 +- .../mob/living/simple_animal/hostile/bear.dm | 2 +- .../mob/living/simple_animal/hostile/carp.dm | 4 ++-- .../mob/living/simple_animal/hostile/creature.dm | 2 +- .../living/simple_animal/hostile/faithless.dm | 2 +- .../living/simple_animal/hostile/giant_spider.dm | 2 +- .../mob/living/simple_animal/hostile/headcrab.dm | 2 +- .../mob/living/simple_animal/hostile/hivebot.dm | 2 +- .../simple_animal/hostile/jungle_animals.dm | 4 ++-- .../mob/living/simple_animal/hostile/mimic.dm | 4 ++-- .../living/simple_animal/hostile/poison_bees.dm | 2 +- .../living/simple_animal/hostile/syndicate.dm | 2 +- .../mob/living/simple_animal/hostile/tree.dm | 2 +- .../living/simple_animal/hostile/winter_mobs.dm | 4 ++-- code/modules/mob/living/simple_animal/parrot.dm | 4 ++-- .../mob/living/simple_animal/simple_animal.dm | 2 +- .../genetics/prehistoric_animals.dm | 10 +++++----- 32 files changed, 62 insertions(+), 58 deletions(-) diff --git a/code/__DEFINES/mob.dm b/code/__DEFINES/mob.dm index 9f9d1d15c94..2bdb3432f69 100644 --- a/code/__DEFINES/mob.dm +++ b/code/__DEFINES/mob.dm @@ -94,3 +94,7 @@ #define DEFAULT_ITEM_PUTON_DELAY 20 //time taken (in deciseconsd) to reverse-strip somebody #define IGNORE_ACCESS -1 + +#define CHEM_MOB_SPAWN_INVALID 0 +#define CHEM_MOB_SPAWN_HOSTILE 1 +#define CHEM_MOB_SPAWN_FRIENDLY 2 \ No newline at end of file diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm index fbaadbd8ec8..a35505470fa 100644 --- a/code/game/gamemodes/blob/blobs/blob_mobs.dm +++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm @@ -40,7 +40,7 @@ var/obj/effect/blob/factory/factory = null var/list/human_overlays = list() var/is_zombie = 0 - gold_core_spawnable = 1 + gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE /mob/living/simple_animal/hostile/blob/blobspore/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) ..() @@ -161,7 +161,7 @@ maxbodytemp = 360 force_threshold = 10 environment_smash = 3 - gold_core_spawnable = 1 + gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE /mob/living/simple_animal/hostile/blob/blobbernaut/blob_act() diff --git a/code/modules/events/tear.dm b/code/modules/events/tear.dm index dcaad24f853..e409f6592d8 100644 --- a/code/modules/events/tear.dm +++ b/code/modules/events/tear.dm @@ -44,7 +44,7 @@ var/list/tear_critters = list() for(var/T in typesof(/mob/living/simple_animal)) var/mob/living/simple_animal/SA = T - if(initial(SA.gold_core_spawnable) == 1) + if(initial(SA.gold_core_spawnable) == CHEM_MOB_SPAWN_HOSTILE) tear_critters += T for(var/i in 1 to 5) diff --git a/code/modules/mob/living/simple_animal/friendly/butterfly.dm b/code/modules/mob/living/simple_animal/friendly/butterfly.dm index ce36d85ce30..60aad72ab36 100644 --- a/code/modules/mob/living/simple_animal/friendly/butterfly.dm +++ b/code/modules/mob/living/simple_animal/friendly/butterfly.dm @@ -18,7 +18,7 @@ pass_flags = PASSTABLE | PASSGRILLE | PASSMOB ventcrawler = 2 butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 0) - gold_core_spawnable = 2 + gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY /mob/living/simple_animal/butterfly/New() ..() diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 29f288b7c67..c77d117bad4 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -20,7 +20,7 @@ response_help = "pets" response_disarm = "gently pushes aside" response_harm = "kicks" - gold_core_spawnable = 2 + gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY //RUNTIME IS ALIVE! SQUEEEEEEEE~ /mob/living/simple_animal/pet/cat/Runtime @@ -33,7 +33,7 @@ gender = FEMALE var/turns_since_scan = 0 var/mob/living/simple_animal/mouse/movement_target - gold_core_spawnable = 0 + gold_core_spawnable = CHEM_MOB_SPAWN_INVALID /mob/living/simple_animal/pet/cat/Runtime/handle_automated_action() ..() @@ -99,4 +99,4 @@ faction = list("syndicate") var/turns_since_scan = 0 var/mob/living/simple_animal/mouse/movement_target - gold_core_spawnable = 0 \ No newline at end of file + gold_core_spawnable = CHEM_MOB_SPAWN_INVALID \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index 520b7af0e01..7be60d7d5d6 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -26,7 +26,7 @@ var/obj/item/inventory_head var/obj/item/inventory_back var/facehugger - gold_core_spawnable = 2 + gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY /mob/living/simple_animal/pet/corgi/New() ..() @@ -398,7 +398,7 @@ response_help = "pets" response_disarm = "bops" response_harm = "kicks" - gold_core_spawnable = 0 + gold_core_spawnable = CHEM_MOB_SPAWN_INVALID /mob/living/simple_animal/pet/corgi/Ian/process_ai() ..() @@ -555,7 +555,7 @@ response_harm = "kicks" var/turns_since_scan = 0 var/puppies = 0 - gold_core_spawnable = 0 + gold_core_spawnable = CHEM_MOB_SPAWN_INVALID //Lisa already has a cute bow! /mob/living/simple_animal/pet/corgi/Lisa/Topic(href, href_list) diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm index 0777771b235..70639291ab9 100644 --- a/code/modules/mob/living/simple_animal/friendly/crab.dm +++ b/code/modules/mob/living/simple_animal/friendly/crab.dm @@ -22,7 +22,7 @@ var/obj/item/inventory_mask can_hide = 1 can_collar = 1 - gold_core_spawnable = 2 + gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY /mob/living/simple_animal/crab/handle_automated_movement() //CRAB movement @@ -47,7 +47,7 @@ response_help = "pets" response_disarm = "gently pushes aside" response_harm = "stomps" - gold_core_spawnable = 0 + gold_core_spawnable = CHEM_MOB_SPAWN_INVALID //LOOK AT THIS - ..()?? /*/mob/living/simple_animal/crab/attackby(var/obj/item/O as obj, var/mob/user as mob, params) diff --git a/code/modules/mob/living/simple_animal/friendly/deer.dm b/code/modules/mob/living/simple_animal/friendly/deer.dm index c55b5fc6850..034fa07b6fb 100644 --- a/code/modules/mob/living/simple_animal/friendly/deer.dm +++ b/code/modules/mob/living/simple_animal/friendly/deer.dm @@ -15,4 +15,4 @@ response_disarm = "gently pushes aside" response_harm = "kicks" can_collar = 1 - gold_core_spawnable = 2 \ No newline at end of file + gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index a1c5bf16dd7..863141e5e83 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -111,7 +111,7 @@ health = 50 var/milk_content = 0 can_collar = 1 - gold_core_spawnable = 2 + gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY /mob/living/simple_animal/cow/New() ..() @@ -179,7 +179,7 @@ small = 1 can_hide = 1 can_collar = 1 - gold_core_spawnable = 2 + gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY /mob/living/simple_animal/chick/New() ..() @@ -222,7 +222,7 @@ var/global/chicken_count = 0 small = 1 can_hide = 1 can_collar = 1 - gold_core_spawnable = 2 + gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY /mob/living/simple_animal/chicken/New() ..() @@ -300,7 +300,7 @@ var/global/chicken_count = 0 attacktext = "kicks" health = 50 can_collar = 1 - gold_core_spawnable = 2 + gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY /mob/living/simple_animal/turkey name = "turkey" @@ -322,7 +322,7 @@ var/global/chicken_count = 0 attacktext = "pecks" health = 50 can_collar = 1 - gold_core_spawnable = 2 + gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY /mob/living/simple_animal/goose name = "goose" @@ -344,7 +344,7 @@ var/global/chicken_count = 0 attacktext = "kicks" health = 50 can_collar = 1 - gold_core_spawnable = 2 + gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY /mob/living/simple_animal/seal name = "seal" @@ -366,7 +366,7 @@ var/global/chicken_count = 0 attacktext = "kicks" health = 50 can_collar = 1 - gold_core_spawnable = 2 + gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY /mob/living/simple_animal/walrus name = "walrus" @@ -388,4 +388,4 @@ var/global/chicken_count = 0 attacktext = "kicks" health = 50 can_collar = 1 - gold_core_spawnable = 2 + gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY diff --git a/code/modules/mob/living/simple_animal/friendly/fox.dm b/code/modules/mob/living/simple_animal/friendly/fox.dm index b7555301c18..5bf03f083a2 100644 --- a/code/modules/mob/living/simple_animal/friendly/fox.dm +++ b/code/modules/mob/living/simple_animal/friendly/fox.dm @@ -17,13 +17,13 @@ response_help = "pets" response_disarm = "gently pushes aside" response_harm = "kicks" - gold_core_spawnable = 2 + gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY //Captain fox /mob/living/simple_animal/pet/fox/Renault name = "Renault" desc = "Renault, the Captain's trustworthy fox. I wonder what it says?" - gold_core_spawnable = 0 + gold_core_spawnable = CHEM_MOB_SPAWN_INVALID //Syndi fox /mob/living/simple_animal/pet/fox/Syndifox @@ -35,4 +35,4 @@ icon_resting = "Syndifox_rest" flags = NO_BREATHE faction = list("syndicate") - gold_core_spawnable = 0 + gold_core_spawnable = CHEM_MOB_SPAWN_INVALID diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm index e4aab2ed47e..b5c0ccedeae 100644 --- a/code/modules/mob/living/simple_animal/friendly/lizard.dm +++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm @@ -22,4 +22,4 @@ can_hide = 1 butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 1) can_collar = 1 - gold_core_spawnable = 2 + gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 3d090de3144..90c4c0f06ec 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -31,7 +31,7 @@ can_hide = 1 holder_type = /obj/item/weapon/holder/mouse can_collar = 1 - gold_core_spawnable = 2 + gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY /mob/living/simple_animal/mouse/handle_automated_speech() ..() @@ -145,4 +145,4 @@ response_help = "pets" response_disarm = "gently pushes aside" response_harm = "splats" - gold_core_spawnable = 0 + gold_core_spawnable = CHEM_MOB_SPAWN_INVALID diff --git a/code/modules/mob/living/simple_animal/friendly/pug.dm b/code/modules/mob/living/simple_animal/friendly/pug.dm index 4b25505561b..ec8a38509f1 100644 --- a/code/modules/mob/living/simple_animal/friendly/pug.dm +++ b/code/modules/mob/living/simple_animal/friendly/pug.dm @@ -17,7 +17,7 @@ response_disarm = "bops" response_harm = "kicks" see_in_dark = 5 - gold_core_spawnable = 2 + gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY /mob/living/simple_animal/pet/pug/process_ai() ..() diff --git a/code/modules/mob/living/simple_animal/friendly/tomato.dm b/code/modules/mob/living/simple_animal/friendly/tomato.dm index 998071443f3..ca135fe87be 100644 --- a/code/modules/mob/living/simple_animal/friendly/tomato.dm +++ b/code/modules/mob/living/simple_animal/friendly/tomato.dm @@ -15,4 +15,4 @@ harm_intent_damage = 5 pass_flags = PASSTABLE can_hide = 1 - gold_core_spawnable = 2 \ No newline at end of file + gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index ff2f03d74cf..80571d2eef8 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -29,7 +29,7 @@ see_in_dark = 8 see_invisible = SEE_INVISIBLE_MINIMUM heat_damage_per_tick = 20 - gold_core_spawnable = 1 + gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE /mob/living/simple_animal/hostile/alien/drone @@ -128,7 +128,7 @@ move_to_delay = 4 maxHealth = 400 health = 400 - gold_core_spawnable = 0 + gold_core_spawnable = CHEM_MOB_SPAWN_INVALID /obj/item/projectile/neurotox name = "neurotoxin" @@ -153,7 +153,7 @@ icon_state = "maid" icon_living = "maid" icon_dead = "maid_dead" - gold_core_spawnable = 0 //no fun allowed + gold_core_spawnable = CHEM_MOB_SPAWN_INVALID //no fun allowed /mob/living/simple_animal/hostile/alien/maid/AttackingTarget() if(istype(target, /atom/movable)) diff --git a/code/modules/mob/living/simple_animal/hostile/bat.dm b/code/modules/mob/living/simple_animal/hostile/bat.dm index eaae85b5eb2..bbdf639c0f4 100644 --- a/code/modules/mob/living/simple_animal/hostile/bat.dm +++ b/code/modules/mob/living/simple_animal/hostile/bat.dm @@ -29,7 +29,7 @@ faction = list("scarybat") var/mob/living/owner - gold_core_spawnable = 1 + gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE /mob/living/simple_animal/hostile/scarybat/New(loc, mob/living/L as mob) ..() diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm index b9fce10e8f0..f55c4ce98d6 100644 --- a/code/modules/mob/living/simple_animal/hostile/bear.dm +++ b/code/modules/mob/living/simple_animal/hostile/bear.dm @@ -31,7 +31,7 @@ var/stance_step = 0 faction = list("russian") - gold_core_spawnable = 1 + gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE //SPACE BEARS! SQUEEEEEEEE~ OW! FUCK! IT BIT MY HAND OFF!! /mob/living/simple_animal/hostile/bear/Hudson diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index 2c971649e64..ddd302c3e8c 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -33,7 +33,7 @@ faction = list("carp") flying = 1 - gold_core_spawnable = 1 + gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE /mob/living/simple_animal/hostile/carp/Process_Spacemove(var/movement_dir = 0) return 1 //No drifting in space for space carp! //original comments do not steal @@ -54,7 +54,7 @@ icon_state = "holocarp" icon_living = "holocarp" maxbodytemp = INFINITY - gold_core_spawnable = 0 + gold_core_spawnable = CHEM_MOB_SPAWN_INVALID /mob/living/simple_animal/hostile/carp/holocarp/death() ..() diff --git a/code/modules/mob/living/simple_animal/hostile/creature.dm b/code/modules/mob/living/simple_animal/hostile/creature.dm index 24c4eede1de..50aa20b60d0 100644 --- a/code/modules/mob/living/simple_animal/hostile/creature.dm +++ b/code/modules/mob/living/simple_animal/hostile/creature.dm @@ -13,5 +13,5 @@ attacktext = "chomps" attack_sound = 'sound/weapons/bite.ogg' faction = list("creature") - gold_core_spawnable = 1 + gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm index 1f496c8347c..a14efc6d279 100644 --- a/code/modules/mob/living/simple_animal/hostile/faithless.dm +++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm @@ -25,7 +25,7 @@ speed = 4 faction = list("faithless") - gold_core_spawnable = 1 + gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE /mob/living/simple_animal/hostile/faithless/Process_Spacemove(var/movement_dir = 0) return 1 diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 088155c25aa..bb381f24be1 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -49,7 +49,7 @@ move_to_delay = 6 attacktext = "bites" attack_sound = 'sound/weapons/bite.ogg' - gold_core_spawnable = 1 + gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE //nursemaids - these create webs and eggs /mob/living/simple_animal/hostile/poison/giant_spider/nurse diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm index 5aa075a8cc5..b2b6d9ff716 100644 --- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm +++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm @@ -21,7 +21,7 @@ ventcrawler = 2 var/datum/mind/origin var/egg_lain = 0 - gold_core_spawnable = 1 + gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE /mob/living/simple_animal/hostile/headcrab/proc/Infect(mob/living/carbon/victim) var/obj/item/organ/internal/body_egg/changeling_egg/egg = new(victim) diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm index 7116d49fb55..3ccbb9abec2 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm @@ -21,7 +21,7 @@ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 speak_emote = list("states") - gold_core_spawnable = 1 + gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE /mob/living/simple_animal/hostile/hivebot/range name = "Hivebot" diff --git a/code/modules/mob/living/simple_animal/hostile/jungle_animals.dm b/code/modules/mob/living/simple_animal/hostile/jungle_animals.dm index 75ecdf79511..85268dee619 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle_animals.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle_animals.dm @@ -30,7 +30,7 @@ layer = 3.1 //so they can stay hidde under the /obj/structure/bush var/stalk_tick_delay = 3 - gold_core_spawnable = 1 + gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE /mob/living/simple_animal/hostile/panther/ListTargets() var/list/targets = list() @@ -88,7 +88,7 @@ layer = 3.1 //so they can stay hidde under the /obj/structure/bush var/stalk_tick_delay = 3 - gold_core_spawnable = 1 + gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE /mob/living/simple_animal/hostile/snake/ListTargets() var/list/targets = list() diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index ab83a592e1f..7cff96385e1 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -30,7 +30,7 @@ move_to_delay = 9 var/is_electronic = 0 - gold_core_spawnable = 1 + gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE /mob/living/simple_animal/hostile/mimic/FindTarget() . = ..() @@ -140,7 +140,7 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca var/mob/living/creator = null // the creator var/destroy_objects = 0 var/knockdown_people = 0 - gold_core_spawnable = 0 + gold_core_spawnable = CHEM_MOB_SPAWN_INVALID /mob/living/simple_animal/hostile/mimic/copy/New(loc, var/obj/copy, var/mob/living/creator, var/destroy_original = 0) ..(loc) diff --git a/code/modules/mob/living/simple_animal/hostile/poison_bees.dm b/code/modules/mob/living/simple_animal/hostile/poison_bees.dm index 6bb6efc003d..c8a6a79fb04 100644 --- a/code/modules/mob/living/simple_animal/hostile/poison_bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/poison_bees.dm @@ -24,7 +24,7 @@ //Spaceborn beings don't get hurt by space atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 - gold_core_spawnable = 1 + gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE /mob/living/simple_animal/hostile/poison/bees/Process_Spacemove(var/check_drift = 0) return 1 diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 1c869805a03..3a9d9e46aa6 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -132,7 +132,7 @@ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 flying = 1 - gold_core_spawnable = 1 + gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE /mob/living/simple_animal/hostile/viscerator/death() ..() diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm index 361cea751ad..bd39b681978 100644 --- a/code/modules/mob/living/simple_animal/hostile/tree.dm +++ b/code/modules/mob/living/simple_animal/hostile/tree.dm @@ -28,7 +28,7 @@ minbodytemp = 0 faction = list("hostile", "winter") - gold_core_spawnable = 1 + gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE /mob/living/simple_animal/hostile/tree/FindTarget() . = ..() diff --git a/code/modules/mob/living/simple_animal/hostile/winter_mobs.dm b/code/modules/mob/living/simple_animal/hostile/winter_mobs.dm index ae176992a9e..274ba14f156 100644 --- a/code/modules/mob/living/simple_animal/hostile/winter_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/winter_mobs.dm @@ -33,7 +33,7 @@ bodytemperature = 73.0 //it's made of snow and hatred, so it's pretty cold. maxbodytemp = 280.15 //at roughly 7 C, these will start melting (dying) from the warmth. Mind over matter or something. heat_damage_per_tick = 10 //Now With Rapid Thawing Action! - gold_core_spawnable = 1 + gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE /mob/living/simple_animal/hostile/winter/snowman/death() @@ -64,7 +64,7 @@ melee_damage_lower = 5 melee_damage_upper = 10 - gold_core_spawnable = 1 + gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE /mob/living/simple_animal/hostile/winter/santa maxHealth = 150 //if this seems low for a "boss", it's because you have to fight him multiple times, with him fully healing between stages diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 33372a9904f..3096a85e39b 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -82,7 +82,7 @@ //Parrots are kleptomaniacs. This variable ... stores the item a parrot is holding. var/obj/item/held_item = null - gold_core_spawnable = 2 + gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY /mob/living/simple_animal/parrot/New() @@ -683,7 +683,7 @@ name = "Poly" desc = "Poly the Parrot. An expert on quantum cracker theory." speak = list("Poly wanna cracker!", ":eCheck the singlo, you chucklefucks!",":eCheck the tesla, you shits!",":eSTOP HOT-WIRING THE ENGINE, FUCKING CHRIST!",":eWire the solars, you lazy bums!",":eWHO TOOK THE DAMN HARDSUITS?",":eOH GOD ITS FREE CALL THE SHUTTLE") - gold_core_spawnable = 0 + gold_core_spawnable = CHEM_MOB_SPAWN_INVALID /mob/living/simple_animal/parrot/Poly/New() ears = new /obj/item/device/radio/headset/headset_eng(src) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index bd8d6b8e740..f862b889710 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -67,7 +67,7 @@ var/scan_ready = 1 var/simplespecies //Sorry, no spider+corgi buttbabies. - var/gold_core_spawnable = 0 //if 1 can be spawned by plasma with gold core, 2 are 'friendlies' spawned with blood + var/gold_core_spawnable = CHEM_MOB_SPAWN_INVALID //if CHEM_MOB_SPAWN_HOSTILE can be spawned by plasma with gold core, CHEM_MOB_SPAWN_FRIENDLY are 'friendlies' spawned with blood var/master_commander = null //holding var for determining who own/controls a sentient simple animal (for sentience potions). var/sentience_type = SENTIENCE_ORGANIC // Sentience type, for slime potions diff --git a/code/modules/research/xenoarchaeology/genetics/prehistoric_animals.dm b/code/modules/research/xenoarchaeology/genetics/prehistoric_animals.dm index 50446de112d..654b1a9ccde 100644 --- a/code/modules/research/xenoarchaeology/genetics/prehistoric_animals.dm +++ b/code/modules/research/xenoarchaeology/genetics/prehistoric_animals.dm @@ -17,7 +17,7 @@ speak = list("Hruuugh!","Hrunnph") emote_see = list("paws the ground","shakes its mane","stomps") emote_hear = list("snuffles") - gold_core_spawnable = 1 + gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE /mob/living/simple_animal/hostile/diyaab name = "diyaab" @@ -38,7 +38,7 @@ speak = list("Awrr?","Aowrl!","Worrl") emote_see = list("sniffs the air cautiously","looks around") emote_hear = list("snuffles") - gold_core_spawnable = 1 + gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE /mob/living/simple_animal/hostile/shantak name = "shantak" @@ -58,7 +58,7 @@ speak_chance = 5 speak = list("Shuhn","Shrunnph?","Shunpf") emote_see = list("scratches the ground","shakes out it's mane","tinkles gently") - gold_core_spawnable = 1 + gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE /mob/living/simple_animal/yithian name = "yithian" @@ -66,7 +66,7 @@ icon_state = "yithian" icon_living = "yithian" icon_dead = "yithian_dead" - gold_core_spawnable = 2 + gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY /mob/living/simple_animal/tindalos name = "tindalos" @@ -74,4 +74,4 @@ icon_state = "tindalos" icon_living = "tindalos" icon_dead = "tindalos_dead" - gold_core_spawnable = 2 + gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY From fe5f80347640c01207b8af449f07cbd91c60f4a3 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Mon, 4 Apr 2016 17:04:43 -0400 Subject: [PATCH 300/328] forgot these two --- code/modules/reagents/newchem/newchem_procs.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/newchem/newchem_procs.dm b/code/modules/reagents/newchem/newchem_procs.dm index 761791f3c11..5f3c416a6ab 100644 --- a/code/modules/reagents/newchem/newchem_procs.dm +++ b/code/modules/reagents/newchem/newchem_procs.dm @@ -174,9 +174,9 @@ var/list/chemical_mob_spawn_nicecritters = list() // and possible friendly mobs for(var/T in typesof(/mob/living/simple_animal)) var/mob/living/simple_animal/SA = T switch(initial(SA.gold_core_spawnable)) - if(1) + if(CHEM_MOB_SPAWN_HOSTILE) chemical_mob_spawn_meancritters += T - if(2) + if(CHEM_MOB_SPAWN_FRIENDLY) chemical_mob_spawn_nicecritters += T var/atom/A = holder.my_atom var/turf/T = get_turf(A) From 80d8e2650e311135da9c4f0064a91973da593d5e Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Mon, 4 Apr 2016 17:19:11 -0400 Subject: [PATCH 301/328] Automatic changelog generation for PR #4088 --- html/changelogs/AutoChangeLog-pr-4088.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4088.yml diff --git a/html/changelogs/AutoChangeLog-pr-4088.yml b/html/changelogs/AutoChangeLog-pr-4088.yml new file mode 100644 index 00000000000..4f9d57270db --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4088.yml @@ -0,0 +1,4 @@ +author: tigercat2000 +delete-after: True +changes: + - rscadd: "Items in your off hand will now count towards access." From 8556d5ed91056927aa36d37dc2b3383939e32922 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Mon, 4 Apr 2016 18:59:48 -0400 Subject: [PATCH 302/328] Automatic changelog generation for PR #4070 --- html/changelogs/AutoChangeLog-pr-4070.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4070.yml diff --git a/html/changelogs/AutoChangeLog-pr-4070.yml b/html/changelogs/AutoChangeLog-pr-4070.yml new file mode 100644 index 00000000000..69075f25e69 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4070.yml @@ -0,0 +1,4 @@ +author: Crazylemon64 +delete-after: True +changes: + - bugfix: "Removes an offset from the advanced virus stealth calculation, causing viruses to be more stealthy than the sum of their symptoms." From 9d430844c3ed411879f9f6ab82352686e7dd9983 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Tue, 5 Apr 2016 08:15:05 -0700 Subject: [PATCH 303/328] Replace most (if not all) output << operators with to_chat(user, message) Currently, to_chat is literally just a proc that does user << message. But it'll let us do output modification in the future, especially for something like Goon's HTML chat. Big thanks to PJB for his to_chat script, see https://github.com/d3athrow/vgstation13/pull/6625 for more details. --- code/ATMOSPHERICS/atmospherics.dm | 9 +- .../components/binary_devices/passive_gate.dm | 6 +- .../components/binary_devices/pump.dm | 6 +- .../components/binary_devices/valve.dm | 3 +- .../components/binary_devices/volume_pump.dm | 6 +- .../components/omni_devices/omni_base.dm | 6 +- .../components/trinary_devices/filter.dm | 3 +- .../components/trinary_devices/mixer.dm | 3 +- .../components/trinary_devices/tvalve.dm | 3 +- .../unary_devices/outlet_injector.dm | 3 +- .../unary_devices/portables_connector.dm | 3 +- .../components/unary_devices/vent_pump.dm | 27 +- .../components/unary_devices/vent_scrubber.dm | 15 +- code/__HELPERS/files.dm | 6 +- code/__HELPERS/game.dm | 16 +- code/__HELPERS/global_lists.dm | 3 +- code/__HELPERS/icon_smoothing.dm | 3 + code/__HELPERS/icons.dm | 3 +- code/__HELPERS/logging.dm | 6 +- code/__HELPERS/names.dm | 3 +- code/__HELPERS/unsorted.dm | 33 +- code/_onclick/click.dm | 6 +- code/_onclick/click_override.dm | 9 +- code/_onclick/cyborg.dm | 3 +- code/_onclick/hud/action.dm | 6 +- code/_onclick/hud/hud.dm | 6 +- code/_onclick/hud/robot.dm | 6 +- code/_onclick/hud/screen_objects.dm | 18 +- code/_onclick/item_attack.dm | 12 +- code/_onclick/observer.dm | 6 +- code/_onclick/oldcode.dm | 3 +- code/_onclick/rig.dm | 12 +- code/_onclick/telekinesis.dm | 3 +- code/controllers/Processes/inactivity.dm | 3 +- code/controllers/Processes/shuttles.dm | 21 +- code/controllers/configuration.dm | 6 +- code/controllers/voting.dm | 39 +- code/datums/ai_laws.dm | 6 +- code/datums/browser.dm | 12 +- code/datums/cargoprofile.dm | 12 +- code/datums/datumvars.dm | 214 ++++++--- code/datums/diseases/advance/advance.dm | 15 +- .../datums/diseases/advance/symptoms/beard.dm | 9 +- .../diseases/advance/symptoms/choking.dm | 9 +- .../diseases/advance/symptoms/confusion.dm | 6 +- .../datums/diseases/advance/symptoms/cough.dm | 3 +- .../diseases/advance/symptoms/deafness.dm | 9 +- .../datums/diseases/advance/symptoms/dizzy.dm | 6 +- .../datums/diseases/advance/symptoms/fever.dm | 3 +- code/datums/diseases/advance/symptoms/fire.dm | 9 +- .../diseases/advance/symptoms/flesh_eating.dm | 6 +- .../diseases/advance/symptoms/genetics.dm | 3 +- .../diseases/advance/symptoms/hallucigen.dm | 9 +- .../diseases/advance/symptoms/headache.dm | 3 +- code/datums/diseases/advance/symptoms/heal.dm | 6 +- .../diseases/advance/symptoms/itching.dm | 3 +- .../diseases/advance/symptoms/oxygen.dm | 3 +- .../diseases/advance/symptoms/sensory.dm | 27 +- .../diseases/advance/symptoms/shedding.dm | 9 +- .../diseases/advance/symptoms/shivering.dm | 3 +- .../diseases/advance/symptoms/stimulant.dm | 3 +- .../datums/diseases/advance/symptoms/viral.dm | 12 +- .../diseases/advance/symptoms/vision.dm | 15 +- .../diseases/advance/symptoms/voice_change.dm | 3 +- .../datums/diseases/advance/symptoms/vomit.dm | 3 +- .../diseases/advance/symptoms/weakness.dm | 9 +- .../diseases/advance/symptoms/weight.dm | 9 +- .../datums/diseases/advance/symptoms/youth.dm | 15 +- code/datums/diseases/anxiety.dm | 15 +- code/datums/diseases/appendicitis.dm | 3 +- code/datums/diseases/beesease.dm | 12 +- code/datums/diseases/brainrot.dm | 12 +- code/datums/diseases/cold.dm | 30 +- code/datums/diseases/cold9.dm | 15 +- code/datums/diseases/dna_spread.dm | 12 +- code/datums/diseases/fake_gbs.dm | 3 +- code/datums/diseases/flu.dm | 18 +- code/datums/diseases/fluspanish.dm | 6 +- code/datums/diseases/gbs.dm | 6 +- code/datums/diseases/magnitis.dm | 15 +- code/datums/diseases/pierrot_throat.dm | 15 +- code/datums/diseases/retrovirus.dm | 36 +- code/datums/diseases/rhumba_beat.dm | 15 +- code/datums/diseases/transformation.dm | 27 +- code/datums/diseases/tuberculosis.dm | 30 +- code/datums/diseases/wizarditis.dm | 9 +- code/datums/gas_mixture.dm | 6 +- .../helper_datums/construction_datum.dm | 18 +- code/datums/helper_datums/events.dm | 6 +- code/datums/helper_datums/global_iterator.dm | 3 +- code/datums/helper_datums/teleport.dm | 3 +- code/datums/martial.dm | 71 ++- code/datums/mind.dm | 169 ++++--- code/datums/progressbar.dm | 3 +- code/datums/spell.dm | 30 +- code/datums/spells/area_teleport.dm | 6 +- code/datums/spells/bloodcrawl.dm | 6 +- code/datums/spells/charge.dm | 21 +- code/datums/spells/conjure.dm | 3 +- code/datums/spells/ethereal_jaunt.dm | 6 +- code/datums/spells/horsemask.dm | 9 +- code/datums/spells/lichdom.dm | 25 +- code/datums/spells/lightning.dm | 12 +- code/datums/spells/magnet.dm | 12 +- code/datums/spells/mime.dm | 9 +- code/datums/spells/mind_transfer.dm | 22 +- code/datums/spells/summonitem.dm | 3 +- code/datums/spells/touch_attacks.dm | 9 +- code/datums/spells/wizard.dm | 6 +- code/datums/wires/alarm.dm | 27 +- code/datums/wires/robot.dm | 6 +- code/datums/wires/wires.dm | 9 +- code/defines/procs/AStar.dm | 8 +- code/defines/procs/announce.dm | 45 +- code/defines/procs/statistics.dm | 6 +- code/game/area/areas.dm | 9 +- code/game/atoms.dm | 21 +- code/game/dna/dna_modifier.dm | 51 ++- code/game/dna/genes/disabilities.dm | 6 +- code/game/dna/genes/gene.dm | 6 +- code/game/dna/genes/goon_disabilities.dm | 12 +- code/game/dna/genes/goon_powers.dm | 96 ++-- code/game/dna/genes/monkey.dm | 6 +- code/game/dna/genes/powers.dm | 3 +- code/game/dna/genes/vg_powers.dm | 18 +- code/game/gamemodes/antag_spawner.dm | 39 +- .../game/gamemodes/autotraitor/autotraitor.dm | 15 +- code/game/gamemodes/blob/blob.dm | 33 +- code/game/gamemodes/blob/blob_finish.dm | 24 +- code/game/gamemodes/blob/blob_report.dm | 3 +- code/game/gamemodes/blob/overmind.dm | 30 +- code/game/gamemodes/blob/powers.dm | 81 ++-- code/game/gamemodes/blob/theblob.dm | 3 +- code/game/gamemodes/borer/borer.dm | 30 +- code/game/gamemodes/changeling/changeling.dm | 57 ++- .../gamemodes/changeling/changeling_power.dm | 18 +- .../gamemodes/changeling/evolution_menu.dm | 27 +- .../gamemodes/changeling/powers/absorb.dm | 30 +- .../changeling/powers/digitalcamo.dm | 6 +- .../changeling/powers/epinephrine.dm | 6 +- .../gamemodes/changeling/powers/fakedeath.dm | 6 +- .../gamemodes/changeling/powers/fleshmend.dm | 3 +- .../gamemodes/changeling/powers/headcrab.dm | 9 +- .../gamemodes/changeling/powers/hivemind.dm | 18 +- .../gamemodes/changeling/powers/humanform.dm | 3 +- .../gamemodes/changeling/powers/lesserform.dm | 9 +- .../changeling/powers/mimic_voice.dm | 9 +- .../gamemodes/changeling/powers/mutations.dm | 15 +- .../gamemodes/changeling/powers/panacea.dm | 3 +- .../gamemodes/changeling/powers/revive.dm | 3 +- .../gamemodes/changeling/powers/shriek.dm | 6 +- .../changeling/powers/strained_muscles.dm | 15 +- .../gamemodes/changeling/powers/swap_form.dm | 21 +- .../gamemodes/changeling/powers/tiny_prick.dm | 33 +- .../game/gamemodes/changeling/traitor_chan.dm | 6 +- code/game/gamemodes/cult/cult.dm | 45 +- code/game/gamemodes/cult/cult_items.dm | 6 +- code/game/gamemodes/cult/ritual.dm | 66 ++- code/game/gamemodes/cult/runes.dm | 178 +++++--- code/game/gamemodes/cult/talisman.dm | 48 +- code/game/gamemodes/events.dm | 3 +- code/game/gamemodes/extended/extended.dm | 6 +- code/game/gamemodes/game_mode.dm | 23 +- code/game/gamemodes/gameticker.dm | 85 ++-- code/game/gamemodes/heist/heist.dm | 48 +- .../gamemodes/malfunction/Malf_Modules.dm | 129 ++---- .../game/gamemodes/malfunction/malfunction.dm | 93 ++-- code/game/gamemodes/meteor/meteor.dm | 12 +- code/game/gamemodes/miniantags/borer/borer.dm | 198 +++++--- .../gamemodes/miniantags/bot_swarm/swarmer.dm | 159 ++++--- .../gamemodes/miniantags/guardian/guardian.dm | 204 ++++++--- code/game/gamemodes/miniantags/morph/morph.dm | 6 +- .../gamemodes/miniantags/morph/morph_event.dm | 6 +- .../gamemodes/miniantags/revenant/revenant.dm | 78 ++-- .../miniantags/revenant/revenant_abilities.dm | 75 ++-- .../miniantags/slaughter/bloodcrawl.dm | 18 +- .../miniantags/slaughter/slaughter.dm | 27 +- .../mutiny/emergency_authentication_device.dm | 14 +- code/game/gamemodes/mutiny/key_pinpointer.dm | 18 +- code/game/gamemodes/mutiny/mutiny.dm | 90 ++-- code/game/gamemodes/mutiny/mutiny_fluff.dm | 8 +- code/game/gamemodes/nations/nations.dm | 75 ++-- code/game/gamemodes/nations/nationsprocs.dm | 21 +- code/game/gamemodes/newobjective.dm | 3 +- code/game/gamemodes/nuclear/nuclear.dm | 87 ++-- .../gamemodes/nuclear/nuclear_challenge.dm | 15 +- code/game/gamemodes/nuclear/nuclearbomb.dm | 42 +- code/game/gamemodes/nuclear/pinpointer.dm | 48 +- code/game/gamemodes/revolution/revolution.dm | 57 ++- .../gamemodes/revolution/rp_revolution.dm | 60 ++- code/game/gamemodes/sandbox/h_sandbox.dm | 9 +- code/game/gamemodes/sandbox/sandbox.dm | 6 +- code/game/gamemodes/scoreboard.dm | 6 +- code/game/gamemodes/shadowling/shadowling.dm | 68 ++- .../shadowling/shadowling_abilities.dm | 276 ++++++++---- .../special_shadowling_abilities.dm | 42 +- code/game/gamemodes/traitor/traitor.dm | 57 ++- code/game/gamemodes/vampire/vampire.dm | 60 ++- code/game/gamemodes/vampire/vampire_powers.dm | 81 ++-- code/game/gamemodes/wizard/artefact.dm | 114 +++-- code/game/gamemodes/wizard/godhand.dm | 6 +- code/game/gamemodes/wizard/raginmages.dm | 42 +- code/game/gamemodes/wizard/rightandwrong.dm | 9 +- code/game/gamemodes/wizard/soulstone.dm | 78 ++-- code/game/gamemodes/wizard/spellbook.dm | 93 ++-- code/game/gamemodes/wizard/wizard.dm | 39 +- code/game/gamemodes/xenos/xenos.dm | 33 +- code/game/jobs/job/support_chaplain.dm | 3 +- code/game/jobs/job_controller.dm | 18 +- code/game/jobs/whitelist.dm | 6 +- code/game/machinery/Freezer.dm | 12 +- code/game/machinery/OpTable.dm | 12 +- code/game/machinery/PDApainter.dm | 9 +- code/game/machinery/Sleeper.dm | 90 ++-- code/game/machinery/adv_med.dm | 39 +- code/game/machinery/ai_slipper.dm | 15 +- code/game/machinery/alarm.dm | 48 +- code/game/machinery/atmo_control.dm | 12 +- code/game/machinery/atmoalter/canister.dm | 12 +- code/game/machinery/atmoalter/meter.dm | 6 +- .../atmoalter/portable_atmospherics.dm | 12 +- code/game/machinery/atmoalter/scrubber.dm | 12 +- code/game/machinery/autolathe.dm | 21 +- code/game/machinery/bees_apiary.dm | 48 +- code/game/machinery/biogenerator.dm | 39 +- code/game/machinery/camera/camera.dm | 54 ++- code/game/machinery/camera/camera_assembly.dm | 36 +- code/game/machinery/camera/tracking.dm | 48 +- code/game/machinery/cell_charger.dm | 24 +- code/game/machinery/chiller.dm | 15 +- code/game/machinery/cloning.dm | 42 +- .../machinery/computer/HolodeckControl.dm | 36 +- code/game/machinery/computer/ai_core.dm | 90 ++-- code/game/machinery/computer/aifixer.dm | 30 +- code/game/machinery/computer/arcade.dm | 40 +- .../game/machinery/computer/buildandrepair.dm | 93 ++-- code/game/machinery/computer/camera.dm | 3 +- .../machinery/computer/camera_advanced.dm | 3 +- code/game/machinery/computer/card.dm | 12 +- code/game/machinery/computer/cloning.dm | 10 +- .../game/machinery/computer/communications.dm | 75 ++-- code/game/machinery/computer/computer.dm | 6 +- code/game/machinery/computer/honkputer.dm | 24 +- code/game/machinery/computer/law.dm | 39 +- code/game/machinery/computer/message.dm | 15 +- code/game/machinery/computer/pod.dm | 3 +- code/game/machinery/computer/prisoner.dm | 10 +- code/game/machinery/computer/robot.dm | 63 ++- code/game/machinery/computer/salvage_ship.dm | 3 +- code/game/machinery/computer/security.dm | 6 +- code/game/machinery/computer/skills.dm | 6 +- .../machinery/computer/specops_shuttle.dm | 39 +- code/game/machinery/computer/store.dm | 6 +- .../computer/syndicate_specops_shuttle.dm | 27 +- .../machinery/computer/telecrystalconsoles.dm | 6 +- code/game/machinery/constructable_frame.dm | 51 ++- code/game/machinery/cryo.dm | 48 +- code/game/machinery/cryopod.dm | 81 ++-- code/game/machinery/deployable.dm | 12 +- code/game/machinery/door_control.dm | 9 +- code/game/machinery/doors/airlock.dm | 150 ++++--- code/game/machinery/doors/airlock_control.dm | 3 +- code/game/machinery/doors/firedoor.dm | 12 +- code/game/machinery/doors/windowdoor.dm | 12 +- code/game/machinery/doppler_array.dm | 6 +- code/game/machinery/drying_rack.dm | 24 +- .../airlock_docking_controller.dm | 21 +- .../airlock_docking_controller_multi.dm | 21 +- .../embedded_controller/docking_program.dm | 3 +- code/game/machinery/firealarm.dm | 18 +- code/game/machinery/floodlight.dm | 27 +- code/game/machinery/guestpass.dm | 27 +- code/game/machinery/hologram.dm | 18 +- code/game/machinery/iv_drip.dm | 34 +- code/game/machinery/kitchen/gibber.dm | 21 +- code/game/machinery/kitchen/icecream_vat.dm | 30 +- code/game/machinery/kitchen/juicer.dm | 9 +- .../game/machinery/kitchen/kitchen_machine.dm | 30 +- code/game/machinery/kitchen/monkeyrecycler.dm | 24 +- code/game/machinery/kitchen/processor.dm | 12 +- code/game/machinery/kitchen/smartfridge.dm | 36 +- code/game/machinery/lightswitch.dm | 3 +- code/game/machinery/machinery.dm | 60 ++- code/game/machinery/mass_driver.dm | 69 ++- code/game/machinery/navbeacon.dm | 12 +- code/game/machinery/newscaster.dm | 12 +- code/game/machinery/overview.dm | 21 +- code/game/machinery/pipe/construction.dm | 12 +- code/game/machinery/pipe/pipe_dispenser.dm | 9 +- code/game/machinery/podmen.dm | 27 +- code/game/machinery/poolcontroller.dm | 26 +- code/game/machinery/portable_turret.dm | 117 +++-- code/game/machinery/programmable_unloader.dm | 48 +- code/game/machinery/recharger.dm | 21 +- code/game/machinery/rechargestation.dm | 21 +- code/game/machinery/recycler.dm | 24 +- code/game/machinery/requests_console.dm | 6 +- code/game/machinery/robot_fabricator.dm | 6 +- code/game/machinery/seed_extractor.dm | 9 +- code/game/machinery/shieldgen.dm | 63 ++- code/game/machinery/spaceheater.dm | 15 +- code/game/machinery/status_display.dm | 3 +- code/game/machinery/suit_storage_unit.dm | 141 ++++-- code/game/machinery/syndicatebeacon.dm | 31 +- code/game/machinery/syndicatebomb.dm | 45 +- code/game/machinery/telecomms/logbrowser.dm | 12 +- .../telecomms/machine_interactions.dm | 24 +- .../machinery/telecomms/telecomunications.dm | 3 +- code/game/machinery/telecomms/telemonitor.dm | 9 +- .../machinery/telecomms/traffic_control.dm | 12 +- code/game/machinery/teleporter.dm | 48 +- code/game/machinery/transformer.dm | 3 +- code/game/machinery/turntable.dm | 57 ++- code/game/machinery/turret_control.dm | 15 +- code/game/machinery/turrets.dm | 12 +- code/game/machinery/vending.dm | 65 ++- code/game/machinery/washing_machine.dm | 57 ++- code/game/machinery/wishgranter.dm | 15 +- code/game/magic/Uristrunes.dm | 1 + code/game/mecha/combat/marauder.dm | 3 +- code/game/mecha/equipment/mecha_equipment.dm | 6 +- code/game/mecha/equipment/tools/tools.dm | 6 +- code/game/mecha/equipment/weapons/weapons.dm | 3 +- code/game/mecha/mech_fabricator.dm | 18 +- code/game/mecha/mecha.dm | 241 ++++++---- code/game/mecha/mecha_construction_paths.dm | 12 +- code/game/mecha/mecha_wreckage.dm | 18 +- code/game/objects/buckling.dm | 6 +- code/game/objects/effects/aliens.dm | 12 +- code/game/objects/effects/anomalies.dm | 3 +- code/game/objects/effects/datacore-effect.dm | 3 +- .../effects/decals/Cleanable/humans.dm | 6 +- .../effects/decals/Cleanable/tracks.dm | 3 +- code/game/objects/effects/decals/cleanable.dm | 12 +- .../game/objects/effects/decals/contraband.dm | 25 +- code/game/objects/effects/effect_system.dm | 15 +- code/game/objects/effects/gibs.dm | 3 +- code/game/objects/effects/mines.dm | 3 +- code/game/objects/effects/spiders.dm | 6 +- code/game/objects/empulse.dm | 3 +- code/game/objects/explosion.dm | 3 +- code/game/objects/items.dm | 60 ++- code/game/objects/items/ashtray.dm | 9 +- code/game/objects/items/blueprints.dm | 21 +- code/game/objects/items/bodybag.dm | 15 +- code/game/objects/items/crayons.dm | 18 +- code/game/objects/items/dehy_carp.dm | 6 +- code/game/objects/items/devices/aicard.dm | 15 +- code/game/objects/items/devices/autopsy.dm | 12 +- code/game/objects/items/devices/camera_bug.dm | 9 +- .../objects/items/devices/chameleonproj.dm | 21 +- code/game/objects/items/devices/debugger.dm | 18 +- code/game/objects/items/devices/flash.dm | 30 +- code/game/objects/items/devices/flashlight.dm | 28 +- .../objects/items/devices/laserpointer.dm | 30 +- .../objects/items/devices/lightreplacer.dm | 30 +- code/game/objects/items/devices/megaphone.dm | 21 +- code/game/objects/items/devices/modkit.dm | 15 +- code/game/objects/items/devices/paicard.dm | 30 +- .../objects/items/devices/pipe_painter.dm | 6 +- code/game/objects/items/devices/pizza_bomb.dm | 21 +- code/game/objects/items/devices/powersink.dm | 6 +- .../objects/items/devices/radio/beacon.dm | 9 +- .../items/devices/radio/electropack.dm | 12 +- .../objects/items/devices/radio/headset.dm | 15 +- .../objects/items/devices/radio/intercom.dm | 27 +- .../game/objects/items/devices/radio/radio.dm | 24 +- code/game/objects/items/devices/scanners.dm | 45 +- .../objects/items/devices/taperecorder.dm | 36 +- .../objects/items/devices/traitordevices.dm | 15 +- .../objects/items/devices/transfer_valve.dm | 18 +- code/game/objects/items/devices/uplinks.dm | 6 +- code/game/objects/items/devices/whistle.dm | 3 +- .../items/mountable_frames/apc_frame.dm | 9 +- .../objects/items/mountable_frames/frames.dm | 6 +- .../objects/items/mountable_frames/lights.dm | 3 +- .../items/mountable_frames/mountables.dm | 6 +- .../mountable_frames/newscaster_frame.dm | 9 +- code/game/objects/items/policetape.dm | 19 +- code/game/objects/items/robot/robot_parts.dm | 87 ++-- .../objects/items/robot/robot_upgrades.dm | 39 +- code/game/objects/items/shooting_range.dm | 12 +- code/game/objects/items/stacks/medical.dm | 45 +- code/game/objects/items/stacks/nanopaste.dm | 9 +- code/game/objects/items/stacks/rods.dm | 12 +- .../game/objects/items/stacks/sheets/glass.dm | 81 ++-- .../objects/items/stacks/sheets/leather.dm | 3 +- code/game/objects/items/stacks/stack.dm | 21 +- code/game/objects/items/stacks/telecrystal.dm | 6 +- code/game/objects/items/toys.dm | 138 ++++-- code/game/objects/items/weapons/AI_modules.dm | 103 +++-- code/game/objects/items/weapons/RCD.dm | 36 +- code/game/objects/items/weapons/RSF.dm | 96 ++-- .../objects/items/weapons/alien_specific.dm | 6 +- code/game/objects/items/weapons/cards_ids.dm | 66 ++- code/game/objects/items/weapons/cash.dm | 15 +- code/game/objects/items/weapons/caution.dm | 6 +- .../objects/items/weapons/chrono_eraser.dm | 12 +- code/game/objects/items/weapons/cigs.dm | 36 +- .../game/objects/items/weapons/clown_items.dm | 9 +- code/game/objects/items/weapons/cosmetics.dm | 27 +- code/game/objects/items/weapons/defib.dm | 63 ++- code/game/objects/items/weapons/dice.dm | 3 +- .../objects/items/weapons/dnascrambler.dm | 3 +- code/game/objects/items/weapons/explosives.dm | 15 +- .../objects/items/weapons/extinguisher.dm | 21 +- code/game/objects/items/weapons/fireworks.dm | 6 +- .../objects/items/weapons/flamethrower.dm | 9 +- code/game/objects/items/weapons/garrote.dm | 15 +- .../objects/items/weapons/gift_wrappaper.dm | 15 +- .../items/weapons/grenades/bananade.dm | 15 +- .../items/weapons/grenades/chem_grenade.dm | 42 +- .../items/weapons/grenades/clowngrenade.dm | 3 +- .../items/weapons/grenades/flashbang.dm | 12 +- .../items/weapons/grenades/ghettobomb.dm | 17 +- .../objects/items/weapons/grenades/grenade.dm | 27 +- code/game/objects/items/weapons/handcuffs.dm | 39 +- code/game/objects/items/weapons/holosign.dm | 12 +- .../items/weapons/implants/implant_chem.dm | 6 +- .../weapons/implants/implant_explosive.dm | 6 +- .../items/weapons/implants/implant_freedom.dm | 3 +- .../weapons/implants/implant_loyality.dm | 9 +- .../items/weapons/implants/implant_misc.dm | 3 +- .../items/weapons/implants/implant_traitor.dm | 12 +- .../items/weapons/implants/implantchair.dm | 9 +- .../items/weapons/implants/implanter.dm | 3 +- .../items/weapons/implants/implantpad.dm | 6 +- code/game/objects/items/weapons/legcuffs.dm | 6 +- code/game/objects/items/weapons/lighters.dm | 3 +- .../objects/items/weapons/melee/energy.dm | 24 +- code/game/objects/items/weapons/melee/misc.dm | 3 +- code/game/objects/items/weapons/misc.dm | 9 +- code/game/objects/items/weapons/mop.dm | 9 +- .../objects/items/weapons/pneumaticCannon.dm | 48 +- .../game/objects/items/weapons/power_cells.dm | 3 +- code/game/objects/items/weapons/scrolls.dm | 6 +- code/game/objects/items/weapons/shards.dm | 10 +- code/game/objects/items/weapons/shields.dm | 21 +- code/game/objects/items/weapons/soap.dm | 6 +- code/game/objects/items/weapons/staff.dm | 6 +- .../objects/items/weapons/storage/backpack.dm | 10 +- .../objects/items/weapons/storage/bags.dm | 9 +- .../objects/items/weapons/storage/belt.dm | 13 +- .../objects/items/weapons/storage/bible.dm | 33 +- .../objects/items/weapons/storage/fancy.dm | 27 +- .../objects/items/weapons/storage/firstaid.dm | 6 +- .../objects/items/weapons/storage/lockbox.dm | 24 +- .../objects/items/weapons/storage/secure.dm | 15 +- .../objects/items/weapons/storage/storage.dm | 36 +- .../objects/items/weapons/storage/toolbox.dm | 3 +- code/game/objects/items/weapons/stunbaton.dm | 27 +- .../objects/items/weapons/swords_axes_etc.dm | 15 +- .../objects/items/weapons/table_rack_parts.dm | 6 +- .../objects/items/weapons/tanks/jetpack.dm | 12 +- .../objects/items/weapons/tanks/tank_types.dm | 24 +- .../game/objects/items/weapons/tanks/tanks.dm | 28 +- .../objects/items/weapons/tanks/watertank.dm | 33 +- code/game/objects/items/weapons/tape.dm | 10 +- .../objects/items/weapons/teleportation.dm | 6 +- code/game/objects/items/weapons/tools.dm | 58 ++- code/game/objects/items/weapons/twohanded.dm | 39 +- .../objects/items/weapons/vending_items.dm | 6 +- code/game/objects/items/weapons/weaponry.dm | 30 +- code/game/objects/items/weapons/whetstone.dm | 21 +- code/game/objects/items/weapons/wires.dm | 9 +- code/game/objects/structures.dm | 24 +- code/game/objects/structures/artstuff.dm | 9 +- code/game/objects/structures/barsign.dm | 33 +- code/game/objects/structures/bedsheet_bin.dm | 24 +- code/game/objects/structures/coathanger.dm | 3 +- .../structures/crates_lockers/closets.dm | 54 ++- .../crates_lockers/closets/cardboardbox.dm | 3 +- .../crates_lockers/closets/fireaxe.dm | 57 ++- .../crates_lockers/closets/secure/personal.dm | 12 +- .../closets/secure/secure_closets.dm | 30 +- .../crates_lockers/closets/statue.dm | 3 +- .../structures/crates_lockers/crates.dm | 57 ++- .../structures/crates_lockers/crittercrate.dm | 3 +- .../structures/crates_lockers/largecrate.dm | 6 +- .../structures/crates_lockers/walllocker.dm | 6 +- code/game/objects/structures/displaycase.dm | 54 ++- code/game/objects/structures/door_assembly.dm | 39 +- code/game/objects/structures/electricchair.dm | 9 +- code/game/objects/structures/engicart.dm | 54 ++- code/game/objects/structures/extinguisher.dm | 12 +- code/game/objects/structures/false_walls.dm | 12 +- code/game/objects/structures/flora.dm | 6 +- code/game/objects/structures/foodcart.dm | 48 +- code/game/objects/structures/girders.dm | 93 ++-- code/game/objects/structures/grille.dm | 15 +- code/game/objects/structures/inflatable.dm | 12 +- code/game/objects/structures/janicart.dm | 60 ++- code/game/objects/structures/kitchen_spike.dm | 24 +- code/game/objects/structures/lamarr_cage.dm | 6 +- code/game/objects/structures/lattice.dm | 3 +- code/game/objects/structures/mineral_doors.dm | 9 +- code/game/objects/structures/misc.dm | 12 +- code/game/objects/structures/mop_bucket.dm | 9 +- code/game/objects/structures/morgue.dm | 18 +- code/game/objects/structures/musician.dm | 24 +- code/game/objects/structures/noticeboard.dm | 9 +- code/game/objects/structures/safe.dm | 36 +- code/game/objects/structures/signs.dm | 6 +- code/game/objects/structures/spirit_board.dm | 15 +- .../stool_bed_chair_nest/alien_nests.dm | 3 +- .../structures/stool_bed_chair_nest/bed.dm | 6 +- .../structures/stool_bed_chair_nest/chairs.dm | 3 +- code/game/objects/structures/tables_racks.dm | 51 ++- .../game/objects/structures/tank_dispenser.dm | 24 +- code/game/objects/structures/target_stake.dm | 9 +- .../structures/transit_tubes/station.dm | 3 +- code/game/objects/structures/watercloset.dm | 60 ++- .../objects/structures/windoor_assembly.dm | 51 ++- code/game/objects/structures/window.dm | 21 +- code/game/response_team.dm | 30 +- code/game/sound.dm | 7 +- code/game/turfs/simulated/floor.dm | 12 +- .../game/turfs/simulated/floor/fancy_floor.dm | 6 +- .../game/turfs/simulated/floor/light_floor.dm | 12 +- code/game/turfs/simulated/floor/plating.dm | 24 +- code/game/turfs/simulated/walls.dm | 93 ++-- code/game/turfs/simulated/walls_reinforced.dm | 108 +++-- code/game/turfs/space/space.dm | 57 ++- code/game/vehicles/spacepods/equipment.dm | 6 +- code/game/vehicles/spacepods/parts.dm | 12 +- .../game/vehicles/spacepods/pod_fabricator.dm | 15 +- code/game/vehicles/spacepods/spacepod.dm | 244 ++++++---- code/game/verbs/ooc.dm | 101 +++-- code/game/verbs/suicide.dm | 63 ++- code/game/verbs/who.dm | 6 +- code/modules/admin/DB ban/functions.dm | 45 +- code/modules/admin/NewBan.dm | 45 +- code/modules/admin/ToRban.dm | 19 +- code/modules/admin/admin.dm | 96 ++-- code/modules/admin/admin_investigate.dm | 30 +- code/modules/admin/admin_memo.dm | 18 +- code/modules/admin/admin_verbs.dm | 87 ++-- code/modules/admin/banappearance.dm | 6 +- code/modules/admin/banjob.dm | 6 +- code/modules/admin/buildmode.dm | 114 +++-- code/modules/admin/create_poll.dm | 15 +- code/modules/admin/holder2.dm | 12 +- code/modules/admin/machine_upgrade.dm | 3 +- code/modules/admin/newbanjob.dm | 69 ++- .../admin/permissionverbs/permissionedit.dm | 18 +- code/modules/admin/sql_notes.dm | 12 +- code/modules/admin/stickyban.dm | 27 +- code/modules/admin/topic.dm | 423 ++++++++++++------ code/modules/admin/verbs/BrokenInhands.dm | 6 +- code/modules/admin/verbs/SDQL2/SDQL_2.dm | 51 ++- .../admin/verbs/SDQL2/SDQL_2_parser.dm | 3 +- code/modules/admin/verbs/adminhelp.dm | 18 +- code/modules/admin/verbs/adminjump.dm | 9 +- code/modules/admin/verbs/adminpm.dm | 60 ++- code/modules/admin/verbs/adminsay.dm | 6 +- code/modules/admin/verbs/antag-ooc.dm | 3 +- code/modules/admin/verbs/atmosdebug.dm | 33 +- code/modules/admin/verbs/custom_event.dm | 33 +- code/modules/admin/verbs/deadsay.dm | 6 +- code/modules/admin/verbs/debug.dm | 96 ++-- code/modules/admin/verbs/diagnostics.dm | 18 +- code/modules/admin/verbs/dice.dm | 6 +- code/modules/admin/verbs/freeze.dm | 21 +- code/modules/admin/verbs/getlogs.dm | 35 +- code/modules/admin/verbs/honksquad.dm | 15 +- code/modules/admin/verbs/mapping.dm | 6 +- code/modules/admin/verbs/massmodvar.dm | 36 +- code/modules/admin/verbs/modifyvariables.dm | 78 ++-- code/modules/admin/verbs/one_click_antag.dm | 15 +- code/modules/admin/verbs/onlyone.dm | 18 +- code/modules/admin/verbs/onlyoneteam.dm | 12 +- code/modules/admin/verbs/playsound.dm | 18 +- code/modules/admin/verbs/possess.dm | 3 +- code/modules/admin/verbs/pray.dm | 30 +- code/modules/admin/verbs/randomverbs.dm | 121 +++-- code/modules/admin/verbs/striketeam.dm | 12 +- .../admin/verbs/striketeam_syndicate.dm | 9 +- code/modules/admin/verbs/ticklag.dm | 3 +- code/modules/admin/verbs/tripAI.dm | 12 +- code/modules/admin/watchlist.dm | 6 +- code/modules/arcade/arcade_base.dm | 39 +- code/modules/arcade/prize_counter.dm | 12 +- code/modules/assembly/assembly.dm | 15 +- code/modules/assembly/bomb.dm | 9 +- code/modules/assembly/holder.dm | 18 +- code/modules/assembly/mousetrap.dm | 15 +- code/modules/assembly/shock_kit.dm | 3 +- .../implementation/digital_valves.dm | 3 +- .../implementation/emitters.dm | 3 +- .../implementation/vent_pump.dm | 3 +- .../awaymissions/bluespaceartillery.dm | 3 +- code/modules/awaymissions/gateway.dm | 21 +- code/modules/awaymissions/maploader/writer.dm | 3 +- .../awaymissions/mission_code/wildwest.dm | 108 +++-- code/modules/awaymissions/trigger.dm | 3 +- code/modules/client/asset_cache.dm | 3 +- code/modules/client/client procs.dm | 96 ++-- code/modules/client/preferences.dm | 18 +- code/modules/client/preferences_toggles.dm | 95 ++-- code/modules/clothing/clothing.dm | 76 ++-- code/modules/clothing/glasses/glasses.dm | 21 +- code/modules/clothing/gloves/rings.dm | 12 +- code/modules/clothing/head/hardhat.dm | 4 +- code/modules/clothing/head/helmet.dm | 3 +- code/modules/clothing/head/misc_special.dm | 12 +- code/modules/clothing/head/soft_caps.dm | 6 +- code/modules/clothing/masks/gasmask.dm | 27 +- code/modules/clothing/masks/voice.dm | 6 +- code/modules/clothing/shoes/magboots.dm | 6 +- code/modules/clothing/spacesuits/alien.dm | 16 +- code/modules/clothing/spacesuits/breaches.dm | 24 +- .../modules/clothing/spacesuits/chronosuit.dm | 49 +- code/modules/clothing/spacesuits/ert.dm | 6 +- code/modules/clothing/spacesuits/plasmamen.dm | 10 +- code/modules/clothing/spacesuits/rig.dm | 77 ++-- .../clothing/spacesuits/rig/modules/combat.dm | 21 +- .../spacesuits/rig/modules/computer.dm | 69 ++- .../spacesuits/rig/modules/modules.dm | 51 ++- .../clothing/spacesuits/rig/modules/ninja.dm | 15 +- .../spacesuits/rig/modules/utility.dm | 48 +- .../clothing/spacesuits/rig/modules/vision.dm | 9 +- code/modules/clothing/spacesuits/rig/rig.dm | 107 +++-- .../clothing/spacesuits/rig/rig_attackby.dm | 66 ++- .../clothing/spacesuits/rig/rig_pieces.dm | 4 +- .../clothing/spacesuits/rig/rig_verbs.dm | 75 ++-- code/modules/clothing/suits/armor.dm | 6 +- code/modules/clothing/suits/miscellaneous.dm | 6 +- .../clothing/under/accessories/accessory.dm | 33 +- .../clothing/under/accessories/holster.dm | 24 +- .../clothing/under/accessories/storage.dm | 3 +- code/modules/clothing/under/chameleon.dm | 12 +- code/modules/computer3/bios.dm | 18 +- code/modules/computer3/buildandrepair.dm | 81 ++-- code/modules/computer3/component.dm | 78 ++-- code/modules/computer3/computer.dm | 12 +- .../computer3/computers/atmos_alert.dm | 6 +- code/modules/computer3/computers/camera.dm | 3 +- code/modules/computer3/computers/cloning.dm | 6 +- .../computer3/computers/communications.dm | 27 +- code/modules/computer3/computers/law.dm | 33 +- code/modules/computer3/computers/medical.dm | 3 +- code/modules/computer3/computers/message.dm | 17 +- code/modules/computer3/computers/prisoner.dm | 3 +- .../computer3/computers/prisonshuttle.dm | 33 +- code/modules/computer3/computers/robot.dm | 18 +- .../computer3/computers/scanconsole.dm | 12 +- code/modules/computer3/computers/security.dm | 3 +- code/modules/computer3/computers/shuttle.dm | 24 +- .../computer3/computers/specops_shuttle.dm | 24 +- .../computer3/computers/syndicate_shuttle.dm | 3 +- .../computers/syndicate_specops_shuttle.dm | 24 +- code/modules/computer3/laptop.dm | 39 +- code/modules/computer3/lapvend.dm | 18 +- code/modules/computer3/storage.dm | 9 +- code/modules/computer3/upload/programs.dm | 3 +- code/modules/crafting/guncrafting.dm | 15 +- code/modules/crafting/table.dm | 9 +- code/modules/customitems/item_defines.dm | 45 +- code/modules/customitems/item_spawning.dm | 6 +- code/modules/detective_work/evidence.dm | 12 +- code/modules/detective_work/scanner.dm | 21 +- code/modules/economy/ATM.dm | 36 +- code/modules/economy/EFTPOS.dm | 36 +- code/modules/economy/POS.dm | 9 +- code/modules/economy/utils.dm | 6 +- .../modules/events/communications_blackout.dm | 18 +- code/modules/events/event_manager.dm | 6 +- code/modules/events/holidays/Holidays.dm | 6 +- code/modules/events/ion_storm.dm | 9 +- code/modules/events/prison_break.dm | 3 +- code/modules/events/undead.dm | 3 +- code/modules/fish/fish_items.dm | 18 +- code/modules/fish/fishtank.dm | 54 ++- code/modules/flufftext/Dreaming.dm | 3 +- code/modules/flufftext/Hallucination.dm | 164 ++++--- code/modules/food/cooker.dm | 15 +- code/modules/food/customizables.dm | 15 +- code/modules/food/icecream_vat.dm | 15 +- code/modules/food/oven.dm | 6 +- .../garbage_collection/garbage_collector.dm | 3 +- code/modules/garbage_collection/gc_testing.dm | 15 +- code/modules/holiday/holiday.dm | 3 +- code/modules/hydroponics/grown.dm | 93 ++-- code/modules/hydroponics/grown_inedible.dm | 33 +- code/modules/hydroponics/seed.dm | 23 +- code/modules/hydroponics/seed_controller.dm | 12 +- code/modules/hydroponics/seed_machines.dm | 27 +- code/modules/hydroponics/seed_packets.dm | 3 +- code/modules/hydroponics/seed_storage.dm | 6 +- .../hydroponics/spreading/spreading.dm | 6 +- .../spreading/spreading_response.dm | 3 +- code/modules/hydroponics/trays/tray.dm | 121 +++-- code/modules/hydroponics/trays/tray_apiary.dm | 48 +- code/modules/hydroponics/trays/tray_tools.dm | 12 +- .../hydroponics/trays/tray_update_icons.dm | 3 +- code/modules/karma/karma.dm | 87 ++-- code/modules/library/lib_items.dm | 75 ++-- code/modules/library/lib_machines.dm | 9 +- .../media/broadcast/receivers/radio.dm | 6 +- .../media/broadcast/transmitters/broadcast.dm | 15 +- code/modules/media/jukebox.dm | 9 +- code/modules/media/mediamanager.dm | 9 +- code/modules/mining/abandonedcrates.dm | 39 +- code/modules/mining/coins.dm | 15 +- code/modules/mining/equipment_locker.dm | 83 ++-- code/modules/mining/laborcamp/laborshuttle.dm | 6 +- code/modules/mining/laborcamp/laborstacker.dm | 46 +- code/modules/mining/manufacturing.dm | 57 ++- code/modules/mining/mine_items.dm | 9 +- code/modules/mining/mine_turfs.dm | 33 +- code/modules/mining/mint.dm | 3 +- code/modules/mining/money_bag.dm | 6 +- code/modules/mining/ore.dm | 9 +- code/modules/mining/satchel_ore_boxdm.dm | 18 +- code/modules/mob/dead/observer/observer.dm | 120 +++-- code/modules/mob/dead/observer/say.dm | 6 +- code/modules/mob/dead/observer/spells.dm | 3 +- code/modules/mob/emote.dm | 15 +- code/modules/mob/hear_say.dm | 24 +- code/modules/mob/holder.dm | 15 +- code/modules/mob/language.dm | 6 +- code/modules/mob/living/autohiss.dm | 12 +- code/modules/mob/living/carbon/alien/alien.dm | 3 +- .../mob/living/carbon/alien/alien_defenses.dm | 9 +- .../carbon/alien/humanoid/alien_powers.dm | 39 +- .../carbon/alien/humanoid/caste/drone.dm | 9 +- .../carbon/alien/humanoid/caste/hunter.dm | 9 +- .../carbon/alien/humanoid/caste/sentinel.dm | 3 +- .../mob/living/carbon/alien/humanoid/emote.dm | 3 +- .../living/carbon/alien/humanoid/empress.dm | 3 +- .../living/carbon/alien/humanoid/humanoid.dm | 21 +- .../mob/living/carbon/alien/humanoid/life.dm | 3 +- .../mob/living/carbon/alien/humanoid/queen.dm | 9 +- .../mob/living/carbon/alien/larva/emote.dm | 9 +- .../mob/living/carbon/alien/larva/larva.dm | 21 +- .../mob/living/carbon/alien/larva/powers.dm | 33 +- code/modules/mob/living/carbon/alien/life.dm | 3 +- .../carbon/alien/special/alien_embryo.dm | 25 +- .../living/carbon/alien/special/facehugger.dm | 9 +- code/modules/mob/living/carbon/brain/MMI.dm | 24 +- .../mob/living/carbon/brain/brain_item.dm | 9 +- code/modules/mob/living/carbon/brain/emote.dm | 21 +- code/modules/mob/living/carbon/brain/life.dm | 14 +- .../mob/living/carbon/brain/posibrain.dm | 54 ++- code/modules/mob/living/carbon/brain/say.dm | 3 +- code/modules/mob/living/carbon/carbon.dm | 78 ++-- code/modules/mob/living/carbon/give.dm | 34 +- code/modules/mob/living/carbon/human/emote.dm | 15 +- .../mob/living/carbon/human/examine.dm | 9 +- code/modules/mob/living/carbon/human/human.dm | 184 +++++--- .../living/carbon/human/human_attackhand.dm | 45 +- .../mob/living/carbon/human/human_damage.dm | 9 +- .../mob/living/carbon/human/human_defense.dm | 15 +- .../mob/living/carbon/human/inventory.dm | 46 +- code/modules/mob/living/carbon/human/life.dm | 61 ++- code/modules/mob/living/carbon/human/login.dm | 3 +- .../mob/living/carbon/human/species/apollo.dm | 18 +- .../living/carbon/human/species/plasmaman.dm | 12 +- .../living/carbon/human/species/species.dm | 6 +- .../living/carbon/human/species/station.dm | 39 +- .../mob/living/carbon/human/update_icons.dm | 6 +- code/modules/mob/living/carbon/life.dm | 3 +- code/modules/mob/living/carbon/slime/emote.dm | 9 +- .../mob/living/carbon/slime/examine.dm | 3 +- .../modules/mob/living/carbon/slime/powers.dm | 68 ++- code/modules/mob/living/carbon/slime/slime.dm | 27 +- code/modules/mob/living/carbon/superheroes.dm | 70 ++- code/modules/mob/living/default_language.dm | 12 +- code/modules/mob/living/living.dm | 60 ++- code/modules/mob/living/living_defense.dm | 27 +- code/modules/mob/living/login.dm | 3 +- code/modules/mob/living/say.dm | 15 +- code/modules/mob/living/silicon/ai/ai.dm | 149 ++++-- code/modules/mob/living/silicon/ai/examine.dm | 3 +- .../living/silicon/ai/freelook/cameranet.dm | 3 +- .../mob/living/silicon/ai/freelook/eye.dm | 6 +- .../modules/mob/living/silicon/ai/latejoin.dm | 3 +- code/modules/mob/living/silicon/ai/laws.dm | 3 +- code/modules/mob/living/silicon/ai/life.dm | 58 ++- code/modules/mob/living/silicon/ai/say.dm | 15 +- code/modules/mob/living/silicon/laws.dm | 9 +- code/modules/mob/living/silicon/pai/emote.dm | 3 +- .../modules/mob/living/silicon/pai/examine.dm | 3 +- code/modules/mob/living/silicon/pai/life.dm | 3 +- code/modules/mob/living/silicon/pai/pai.dm | 60 ++- .../mob/living/silicon/pai/personality.dm | 12 +- .../modules/mob/living/silicon/pai/recruit.dm | 3 +- code/modules/mob/living/silicon/pai/say.dm | 3 +- .../mob/living/silicon/pai/software.dm | 3 +- .../living/silicon/pai/software_modules.dm | 24 +- .../mob/living/silicon/robot/component.dm | 63 ++- .../mob/living/silicon/robot/drone/drone.dm | 78 ++-- .../silicon/robot/drone/drone_abilities.dm | 12 +- .../silicon/robot/drone/drone_console.dm | 33 +- .../living/silicon/robot/drone/drone_items.dm | 27 +- .../silicon/robot/drone/drone_manufacturer.dm | 30 +- .../living/silicon/robot/drone/drone_say.dm | 11 +- .../modules/mob/living/silicon/robot/emote.dm | 9 +- .../mob/living/silicon/robot/examine.dm | 3 +- .../mob/living/silicon/robot/inventory.dm | 9 +- code/modules/mob/living/silicon/robot/laws.dm | 27 +- code/modules/mob/living/silicon/robot/life.dm | 15 +- .../mob/living/silicon/robot/photos.dm | 3 +- .../modules/mob/living/silicon/robot/robot.dm | 201 ++++++--- .../mob/living/silicon/robot/robot_damage.dm | 18 +- .../mob/living/silicon/robot/robot_items.dm | 3 +- code/modules/mob/living/silicon/say.dm | 23 +- code/modules/mob/living/silicon/silicon.dm | 39 +- code/modules/mob/living/simple_animal/bees.dm | 3 +- .../mob/living/simple_animal/bot/bot.dm | 144 ++++-- .../mob/living/simple_animal/bot/cleanbot.dm | 15 +- .../living/simple_animal/bot/construction.dm | 93 ++-- .../mob/living/simple_animal/bot/ed209bot.dm | 3 +- .../mob/living/simple_animal/bot/floorbot.dm | 9 +- .../mob/living/simple_animal/bot/medbot.dm | 12 +- .../mob/living/simple_animal/bot/mulebot.dm | 51 ++- .../mob/living/simple_animal/bot/secbot.dm | 3 +- .../mob/living/simple_animal/constructs.dm | 6 +- .../living/simple_animal/friendly/corgi.dm | 55 ++- .../simple_animal/friendly/corgi_powers.dm | 6 +- .../mob/living/simple_animal/friendly/crab.dm | 30 +- .../living/simple_animal/friendly/diona.dm | 42 +- .../simple_animal/friendly/farm_animals.dm | 24 +- .../living/simple_animal/friendly/mouse.dm | 12 +- .../living/simple_animal/friendly/slime.dm | 3 +- .../simple_animal/friendly/spiderbot.dm | 66 ++- .../simple_animal/hostile/giant_spider.dm | 9 +- .../living/simple_animal/hostile/headcrab.dm | 6 +- .../simple_animal/hostile/mining_mobs.dm | 27 +- .../living/simple_animal/hostile/mushroom.dm | 9 +- .../living/simple_animal/hostile/statue.dm | 6 +- .../living/simple_animal/hostile/syndicate.dm | 3 +- .../simple_animal/hostile/winter_mobs.dm | 12 +- .../mob/living/simple_animal/parrot.dm | 39 +- .../mob/living/simple_animal/powers.dm | 12 +- .../modules/mob/living/simple_animal/shade.dm | 3 +- .../mob/living/simple_animal/simple_animal.dm | 26 +- .../mob/living/simple_animal/tribbles.dm | 24 +- code/modules/mob/living/simple_animal/vox.dm | 21 +- code/modules/mob/mob.dm | 101 +++-- code/modules/mob/mob_grab.dm | 28 +- code/modules/mob/mob_helpers.dm | 18 +- code/modules/mob/mob_movement.dm | 30 +- code/modules/mob/mob_transformation_simple.dm | 12 +- code/modules/mob/new_player/login.dm | 6 +- code/modules/mob/new_player/new_player.dm | 41 +- code/modules/mob/new_player/poll.dm | 42 +- code/modules/mob/say.dm | 6 +- code/modules/mob/spirit/mask/mask.dm | 27 +- code/modules/mob/spirit/movement.dm | 9 +- code/modules/mob/spirit/spirit.dm | 9 +- code/modules/mob/spirit/viewpoint.dm | 41 +- code/modules/mob/transform_procs.dm | 28 +- code/modules/mob/typing_indicator.dm | 3 +- code/modules/nano/modules/crew_monitor.dm | 3 +- code/modules/nano/modules/law_manager.dm | 9 +- code/modules/nano/nanomapgen.dm | 15 +- code/modules/nano/nanoui.dm | 4 +- code/modules/ninja/energy_katana.dm | 3 +- code/modules/ninja/martial_art.dm | 27 +- code/modules/ninja/suit/SpiderOS.dm | 27 +- code/modules/ninja/suit/suit.dm | 15 +- code/modules/ninja/suit/suit_attackby.dm | 9 +- .../modules/ninja/suit/suit_initialisation.dm | 60 ++- code/modules/paperwork/carbonpaper.dm | 6 +- code/modules/paperwork/clipboard.dm | 9 +- code/modules/paperwork/faxmachine.dm | 15 +- code/modules/paperwork/filingcabinet.dm | 18 +- code/modules/paperwork/folders.dm | 3 +- code/modules/paperwork/frames.dm | 24 +- code/modules/paperwork/handlabeler.dm | 30 +- code/modules/paperwork/paper.dm | 27 +- code/modules/paperwork/paper_bundle.dm | 27 +- code/modules/paperwork/paperbin.dm | 24 +- code/modules/paperwork/pen.dm | 15 +- code/modules/paperwork/photocopier.dm | 24 +- code/modules/paperwork/photography.dm | 45 +- code/modules/paperwork/silicon_photography.dm | 27 +- code/modules/pda/PDA.dm | 48 +- code/modules/pda/ai.dm | 12 +- code/modules/pda/app.dm | 3 +- code/modules/pda/chatroom.dm | 3 +- code/modules/pda/messenger.dm | 12 +- code/modules/pda/radio.dm | 3 +- code/modules/pda/utilities.dm | 34 +- code/modules/power/apc.dm | 179 +++++--- code/modules/power/cable.dm | 75 ++-- code/modules/power/cable_heavyduty.dm | 6 +- code/modules/power/cell.dm | 12 +- code/modules/power/generator.dm | 3 +- code/modules/power/generator_type2.dm | 3 +- code/modules/power/gravitygenerator.dm | 15 +- code/modules/power/lighting.dm | 75 ++-- code/modules/power/port_gen.dm | 38 +- code/modules/power/singularity/collector.dm | 24 +- code/modules/power/singularity/emitter.dm | 54 ++- .../power/singularity/field_generator.dm | 21 +- code/modules/power/singularity/narsie.dm | 21 +- .../particle_accelerator.dm | 15 +- .../particle_accelerator/particle_control.dm | 3 +- code/modules/power/singularity/singularity.dm | 3 +- code/modules/power/smes.dm | 36 +- code/modules/power/solar.dm | 9 +- code/modules/power/supermatter/sm_shard.dm | 6 +- code/modules/power/supermatter/supermatter.dm | 7 +- code/modules/power/switch.dm | 12 +- code/modules/power/tesla/energy_ball.dm | 3 +- code/modules/power/treadmill.dm | 3 +- code/modules/power/turbine.dm | 12 +- .../procedural_mapping/mapGenerator.dm | 36 +- code/modules/projectiles/ammunition.dm | 19 +- code/modules/projectiles/gun.dm | 45 +- code/modules/projectiles/guns/alien.dm | 9 +- .../projectiles/guns/energy/advtaser.dm | 6 +- .../projectiles/guns/energy/blueshield.dm | 6 +- code/modules/projectiles/guns/energy/hos.dm | 9 +- code/modules/projectiles/guns/energy/laser.dm | 6 +- .../projectiles/guns/energy/nuclear.dm | 24 +- code/modules/projectiles/guns/energy/pulse.dm | 12 +- .../projectiles/guns/energy/special.dm | 39 +- .../projectiles/guns/energy/temperature.dm | 3 +- code/modules/projectiles/guns/magic.dm | 6 +- code/modules/projectiles/guns/magic/wand.dm | 18 +- code/modules/projectiles/guns/projectile.dm | 30 +- .../projectiles/guns/projectile/automatic.dm | 33 +- .../projectiles/guns/projectile/crossbow.dm | 80 ++-- .../guns/projectile/grenade launcher.dm | 9 +- .../projectiles/guns/projectile/revolver.dm | 39 +- .../projectiles/guns/projectile/rocket.dm | 15 +- .../projectiles/guns/projectile/shotgun.dm | 27 +- code/modules/projectiles/guns/syringe_gun.dm | 15 +- code/modules/projectiles/medbeam.dm | 3 +- code/modules/projectiles/projectile.dm | 18 +- code/modules/projectiles/projectile/beams.dm | 15 +- code/modules/projectiles/projectile/magic.dm | 15 +- code/modules/projectiles/targeting.dm | 78 ++-- code/modules/reagents/Chemistry-Holder.dm | 12 +- code/modules/reagents/Chemistry-Machinery.dm | 69 ++- code/modules/reagents/Chemistry-Readme.dm | 9 +- code/modules/reagents/dartgun.dm | 45 +- code/modules/reagents/grenade_launcher.dm | 30 +- .../modules/reagents/newchem/Blob-Reagents.dm | 3 +- code/modules/reagents/newchem/chem_heater.dm | 6 +- code/modules/reagents/newchem/disease.dm | 3 +- code/modules/reagents/newchem/drinks.dm | 6 +- code/modules/reagents/newchem/drugs.dm | 48 +- code/modules/reagents/newchem/food.dm | 61 ++- code/modules/reagents/newchem/medicine.dm | 21 +- .../modules/reagents/newchem/newchem_procs.dm | 24 +- code/modules/reagents/newchem/other.dm | 6 +- code/modules/reagents/newchem/pyro.dm | 24 +- code/modules/reagents/newchem/toxins.dm | 87 ++-- .../chemical_reaction_slime.dm | 3 +- .../oldchem/reagents/_reagent_base.dm | 6 +- .../reagents/drink/reagents_alcohol.dm | 9 +- .../oldchem/reagents/reagents_food.dm | 3 +- .../oldchem/reagents/reagents_toxin.dm | 39 +- .../oldchem/reagents/reagents_water.dm | 21 +- code/modules/reagents/pandemic.dm | 6 +- code/modules/reagents/reagent_containers.dm | 6 +- .../reagents/reagent_containers/borghydro.dm | 21 +- .../reagents/reagent_containers/dropper.dm | 21 +- .../reagents/reagent_containers/drugs.dm | 27 +- .../reagents/reagent_containers/food/cans.dm | 27 +- .../reagent_containers/food/condiment.dm | 34 +- .../reagent_containers/food/drinks.dm | 49 +- .../reagent_containers/food/sandwich.dm | 15 +- .../reagent_containers/food/snacks.dm | 72 ++- .../reagent_containers/food/snacks/meat.dm | 3 +- .../reagent_containers/glass_containers.dm | 57 ++- .../reagents/reagent_containers/hypospray.dm | 18 +- .../reagents/reagent_containers/pill.dm | 6 +- .../reagent_containers/robodropper.dm | 21 +- .../reagents/reagent_containers/spray.dm | 24 +- .../reagents/reagent_containers/syringes.dm | 87 ++-- code/modules/reagents/reagent_dispenser.dm | 15 +- code/modules/recycling/conveyor2.dm | 3 +- .../recycling/disposal-construction.dm | 36 +- code/modules/recycling/disposal.dm | 81 ++-- code/modules/recycling/sortingmachinery.dm | 42 +- code/modules/research/circuitprinter.dm | 18 +- code/modules/research/destructive_analyzer.dm | 18 +- code/modules/research/experimentor.dm | 51 ++- code/modules/research/message_server.dm | 6 +- code/modules/research/protolathe.dm | 15 +- code/modules/research/rdconsole.dm | 27 +- code/modules/research/rdmachines.dm | 9 +- code/modules/research/server.dm | 6 +- .../xenoarchaeology/artifact/artifact.dm | 9 +- .../artifact/artifact_gigadrill.dm | 6 +- .../artifact/artifact_unknown.dm | 15 +- .../artifact/effects/unknown_affect_cold.dm | 3 +- .../effects/unknown_effect_badfeeling.dm | 18 +- .../effects/unknown_effect_cellcharge.dm | 9 +- .../effects/unknown_effect_celldrain.dm | 9 +- .../effects/unknown_effect_dnaswitch.dm | 42 +- .../effects/unknown_effect_goodfeeling.dm | 18 +- .../artifact/effects/unknown_effect_heal.dm | 9 +- .../artifact/effects/unknown_effect_heat.dm | 3 +- .../artifact/effects/unknown_effect_hurt.dm | 9 +- .../effects/unknown_effect_roboheal.dm | 9 +- .../effects/unknown_effect_robohurt.dm | 10 +- .../artifact/effects/unknown_effect_sleepy.dm | 18 +- .../artifact/effects/unknown_effect_stun.dm | 12 +- .../effects/unknown_effect_teleport.dm | 9 +- .../research/xenoarchaeology/chemistry.dm | 3 +- .../xenoarchaeology/finds/finds_fossils.dm | 3 +- .../xenoarchaeology/finds/finds_misc.dm | 3 +- .../xenoarchaeology/finds/finds_special.dm | 6 +- .../finds/finds_talkingitem.dm | 12 +- .../xenoarchaeology/genetics/reconstitutor.dm | 6 +- .../machinery/artifact_harvester.dm | 6 +- .../machinery/geosample_scanner.dm | 18 +- .../tools/ano_device_battery.dm | 6 +- .../xenoarchaeology/tools/bunsen_burner.dm | 15 +- .../tools/suspension_generator.dm | 66 ++- .../xenoarchaeology/tools/tools_anoscanner.dm | 3 +- .../tools/tools_coresampler.dm | 27 +- .../tools/tools_depthscanner.dm | 6 +- .../research/xenobiology/xenobio_camera.dm | 3 +- .../research/xenobiology/xenobiology.dm | 96 ++-- code/modules/scripting/Parser/Keywords.dm | 8 +- .../security_levels/keycard authentication.dm | 27 +- code/modules/shuttle/assault_pod.dm | 3 +- code/modules/shuttle/emergency.dm | 21 +- code/modules/shuttle/shuttle.dm | 19 +- code/modules/shuttle/supply.dm | 12 +- code/modules/shuttle/syndicate.dm | 6 +- code/modules/surgery/dental_implant.dm | 3 +- code/modules/surgery/helpers.dm | 6 +- code/modules/surgery/implant.dm | 27 +- code/modules/surgery/organs/augments_eyes.dm | 6 +- .../surgery/organs/augments_internal.dm | 42 +- code/modules/surgery/organs/autoimplanter.dm | 15 +- code/modules/surgery/organs/blood.dm | 12 +- code/modules/surgery/organs/body_egg.dm | 3 +- code/modules/surgery/organs/organ.dm | 3 +- code/modules/surgery/organs/organ_external.dm | 6 +- code/modules/surgery/organs/organ_internal.dm | 9 +- code/modules/surgery/organs/pain.dm | 6 +- code/modules/surgery/organs/parasites.dm | 3 +- .../surgery/organs/subtypes/machine.dm | 3 +- code/modules/surgery/organs_internal.dm | 24 +- code/modules/surgery/other.dm | 6 +- code/modules/surgery/robotics.dm | 54 ++- code/modules/surgery/surgery.dm | 3 +- code/modules/surgery/tools.dm | 10 +- code/modules/telesci/telepad.dm | 33 +- code/modules/telesci/telesci_computer.dm | 15 +- code/modules/vehicle/train/train.dm | 30 +- .../modules/vehicle/train/trains/ambulance.dm | 30 +- .../vehicle/train/trains/cargo/cargo_train.dm | 27 +- code/modules/vehicle/vehicle.dm | 21 +- code/world.dm | 49 +- 1054 files changed, 17612 insertions(+), 8898 deletions(-) diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index 3686bc46d2f..6ea62424cf2 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -153,7 +153,8 @@ Pipelines + Other Objects -> Pipe network if(can_unwrench && istype(W, /obj/item/weapon/wrench)) var/turf/T = get_turf(src) if (level == 1 && isturf(T) && T.intact) - user << "You must remove the plating first." + to_chat(user, "You must remove the plating first.") + return 1 var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/env_air = loc.return_air() @@ -163,9 +164,11 @@ Pipelines + Other Objects -> Pipe network var/internal_pressure = int_air.return_pressure()-env_air.return_pressure() playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "You begin to unfasten \the [src]..." + to_chat(user, "You begin to unfasten \the [src]...") + if (internal_pressure > 2*ONE_ATMOSPHERE) - user << "As you begin unwrenching \the [src] a gush of air blows in your face... maybe you should reconsider?" + to_chat(user, "As you begin unwrenching \the [src] a gush of air blows in your face... maybe you should reconsider?") + unsafe_wrenching = TRUE //Oh dear oh dear if (do_after(user, 40, target = src) && isnull(gcDestroyed)) diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm index 9fe7885c052..ebabc2e3c4b 100644 --- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm +++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm @@ -134,7 +134,8 @@ return src.add_fingerprint(usr) if(!src.allowed(user)) - user << "Access denied." + to_chat(user, "Access denied.") + return usr.set_machine(src) interact(user) @@ -158,7 +159,8 @@ if (!istype(W, /obj/item/weapon/wrench)) return ..() if (on) - user << "You cannot unwrench this [src], turn it off first." + to_chat(user, "You cannot unwrench this [src], turn it off first.") + return 1 return ..() \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm index f091135940b..5923825735e 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm @@ -157,7 +157,8 @@ Thus, the two variables affect pump operation are set in New(): return src.add_fingerprint(usr) if(!src.allowed(user)) - user << "Access denied." + to_chat(user, "Access denied.") + return usr.set_machine(src) interact(user) @@ -188,6 +189,7 @@ Thus, the two variables affect pump operation are set in New(): if (!istype(W, /obj/item/weapon/wrench)) return ..() if (!(stat & NOPOWER) && on) - user << "You cannot unwrench this [src], turn it off first." + to_chat(user, "You cannot unwrench this [src], turn it off first.") + return 1 return ..() \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/binary_devices/valve.dm b/code/ATMOSPHERICS/components/binary_devices/valve.dm index a46382ab085..9aae2337f1e 100644 --- a/code/ATMOSPHERICS/components/binary_devices/valve.dm +++ b/code/ATMOSPHERICS/components/binary_devices/valve.dm @@ -74,7 +74,8 @@ if(!powered()) return if(!src.allowed(user)) - user << "Access denied." + to_chat(user, "Access denied.") + return ..() diff --git a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm index c697251bc44..253504d773e 100644 --- a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm @@ -147,7 +147,8 @@ Thus, the two variables affect pump operation are set in New(): return src.add_fingerprint(usr) if(!src.allowed(user)) - user << "Access denied." + to_chat(user, "Access denied.") + return usr.set_machine(src) interact(user) @@ -178,6 +179,7 @@ Thus, the two variables affect pump operation are set in New(): if (!istype(W, /obj/item/weapon/wrench)) return ..() if (!(stat & NOPOWER) && on) - user << "You cannot unwrench this [src], turn it off first." + to_chat(user, "You cannot unwrench this [src], turn it off first.") + return 1 return ..() \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm index f1241079ad3..1ce0b673e16 100644 --- a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm +++ b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm @@ -104,11 +104,13 @@ int_pressure += P.air.return_pressure() var/datum/gas_mixture/env_air = loc.return_air() if ((int_pressure - env_air.return_pressure()) > 2*ONE_ATMOSPHERE) - user << "You cannot unwrench [src], it is too exerted due to internal pressure." + to_chat(user, "You cannot unwrench [src], it is too exerted due to internal pressure.") + add_fingerprint(user) return 1 playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "You begin to unfasten \the [src]..." + to_chat(user, "You begin to unfasten \the [src]...") + if(do_after(user, 40, target = src)) user.visible_message( \ "[user] unfastens \the [src].", \ diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm index 7ec6d70d119..a61815351e7 100755 --- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm @@ -153,7 +153,8 @@ Filter types: return if(!src.allowed(user)) - user << "Access denied." + to_chat(user, "Access denied.") + return var/dat diff --git a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm index 5d33e3cb605..7e152b4e912 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm @@ -114,7 +114,8 @@ return src.add_fingerprint(usr) if(!src.allowed(user)) - user << "Access denied." + to_chat(user, "Access denied.") + return usr.set_machine(src) var/dat = {"Power: [on?"On":"Off"]
      diff --git a/code/ATMOSPHERICS/components/trinary_devices/tvalve.dm b/code/ATMOSPHERICS/components/trinary_devices/tvalve.dm index 16df97b6ea6..2d727170750 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/tvalve.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/tvalve.dm @@ -135,7 +135,8 @@ if(!powered()) return if(!src.allowed(user)) - user << "Access denied." + to_chat(user, "Access denied.") + return ..() diff --git a/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm b/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm index 92bdee806bf..c8ddd45a4ef 100644 --- a/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm +++ b/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm @@ -171,7 +171,8 @@ return 1 if(istype(W, /obj/item/weapon/wrench)) if (!(stat & NOPOWER) && on) - user << "You cannot unwrench this [src], turn if off first." + to_chat(user, "You cannot unwrench this [src], turn if off first.") + return 1 return ..() diff --git a/code/ATMOSPHERICS/components/unary_devices/portables_connector.dm b/code/ATMOSPHERICS/components/unary_devices/portables_connector.dm index b9399f42e6c..347c44e3790 100644 --- a/code/ATMOSPHERICS/components/unary_devices/portables_connector.dm +++ b/code/ATMOSPHERICS/components/unary_devices/portables_connector.dm @@ -36,7 +36,8 @@ /obj/machinery/atmospherics/unary/portables_connector/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob, params) if(istype(W, /obj/item/weapon/wrench)) if(connected_device) - user << "You cannot unwrench this [src], detach [connected_device] first." + to_chat(user, "You cannot unwrench this [src], detach [connected_device] first.") + return 1 return ..() diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm index 3366777a081..2e065a97e43 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm @@ -322,7 +322,8 @@ if(istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W if (WT.remove_fuel(0,user)) - user << "Now welding the vent." + to_chat(user, "Now welding the vent.") + if(do_after(user, 20, target = src)) if(!src || !WT.isOn()) return playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) @@ -336,19 +337,23 @@ update_icon() else - user << "The welding tool needs to be on to start this task." + to_chat(user, "The welding tool needs to be on to start this task.") + else - user << "You need more welding fuel to complete this task." + to_chat(user, "You need more welding fuel to complete this task.") + return 1 if(istype(W, /obj/item/weapon/screwdriver)) if(!welded) if(open) - user << " Now closing the vent." + to_chat(user, " Now closing the vent.") + if (do_after(user, 20, target = src)) open = 0 user.visible_message("[user] screwdrivers the vent shut.", "You screwdriver the vent shut.", "You hear a screwdriver.") else - user << " Now opening the vent." + to_chat(user, " Now opening the vent.") + if (do_after(user, 20, target = src)) open = 1 user.visible_message("[user] screwdrivers the vent shut.", "You screwdriver the vent shut.", "You hear a screwdriver.") @@ -359,16 +364,19 @@ user.drop_item(W) W.forceMove(src) if(!open) - user << "You can't shove that down there when it is closed" + to_chat(user, "You can't shove that down there when it is closed") + else - user << "The vent is welded." + to_chat(user, "The vent is welded.") + return if(istype(W, /obj/item/device/multitool)) update_multitool_menu(user) return 1 if (istype(W, /obj/item/weapon/wrench)) if (!(stat & NOPOWER) && on) - user << "You cannot unwrench this [src], turn it off first." + to_chat(user, "You cannot unwrench this [src], turn it off first.") + return 1 return ..() @@ -383,7 +391,8 @@ /obj/machinery/atmospherics/unary/vent_pump/examine(mob/user) ..(user) if(welded) - user << "It seems welded shut." + to_chat(user, "It seems welded shut.") + /obj/machinery/atmospherics/unary/vent_pump/power_change() var/old_stat = stat diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm index cc62e860bde..5808dd55dac 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm @@ -58,7 +58,8 @@ /obj/machinery/atmospherics/unary/vent_pump/examine(mob/user) ..(user) if(welded) - user << "It seems welded shut." + to_chat(user, "It seems welded shut.") + /obj/machinery/atmospherics/unary/vent_scrubber/auto_use_power() if(!powered(power_channel)) @@ -372,7 +373,8 @@ if(istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W if (WT.remove_fuel(0,user)) - user << "Now welding the scrubber." + to_chat(user, "Now welding the scrubber.") + if(do_after(user, 20, target = src)) if(!src || !WT.isOn()) return playsound(get_turf(src), 'sound/items/Welder2.ogg', 50, 1) @@ -385,17 +387,20 @@ welded = 0 update_icon() else - user << "The welding tool needs to be on to start this task." + to_chat(user, "The welding tool needs to be on to start this task.") + return 1 else - user << "You need more welding fuel to complete this task." + to_chat(user, "You need more welding fuel to complete this task.") + return 1 if(istype(W, /obj/item/device/multitool)) update_multitool_menu(user) return 1 if (istype(W, /obj/item/weapon/wrench)) if (!(stat & NOPOWER) && on) - user << "You cannot unwrench this [src], turn it off first." + to_chat(user, "You cannot unwrench this [src], turn it off first.") + return 1 return ..() diff --git a/code/__HELPERS/files.dm b/code/__HELPERS/files.dm index d804dcb06a9..0f24997d67f 100644 --- a/code/__HELPERS/files.dm +++ b/code/__HELPERS/files.dm @@ -39,7 +39,8 @@ var/extension = copytext(path,-4,0) if( !fexists(path) || !(extension in valid_extensions) ) - src << "Error: browse_files(): File not found/Invalid file([path])." + to_chat(src, "Error: browse_files(): File not found/Invalid file([path]).") + return return path @@ -53,7 +54,8 @@ /client/proc/file_spam_check() var/time_to_wait = fileaccess_timer - world.time if(time_to_wait > 0) - src << "Error: file_spam_check(): Spam. Please wait [round(time_to_wait/10)] seconds." + to_chat(src, "Error: file_spam_check(): Spam. Please wait [round(time_to_wait/10)] seconds.") + return 1 fileaccess_timer = world.time + FTPDELAY return 0 diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 26469903558..d33bb2c8d64 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -486,17 +486,23 @@ proc/pollCandidates(var/Question, var/be_special_type, var/antag_age_check = 0, if(G.has_enabled_antagHUD) continue spawn(0) - G << 'sound/misc/notice2.ogg' //Alerting them to their consideration + to_chat(G, 'sound/misc/notice2.ogg')//Alerting them to their consideration + + switch(alert(G,Question,"Please answer in [poll_time/10] seconds!","Yes","No")) if("Yes") - G << "Choice registered: Yes." + to_chat(G, "Choice registered: Yes.") + if((world.time-time_passed)>poll_time)//If more than 30 game seconds passed. - G << "Sorry, you were too late for the consideration!" - G << 'sound/machines/buzz-sigh.ogg' + to_chat(G, "Sorry, you were too late for the consideration!") + + to_chat(G, 'sound/machines/buzz-sigh.ogg') + return candidates += G if("No") - G << "Choice registered: No." + to_chat(G, "Choice registered: No.") + return else return diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 35b82c2fae3..c63c039f075 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -58,7 +58,8 @@ var/list/L = chemical_reactions_list[reaction] for(var/t in L) . += " has: [t]\n" - world << . + to_chat(world, .) + */ diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm index 3cddd31313b..5ae2ddb07a8 100644 --- a/code/__HELPERS/icon_smoothing.dm +++ b/code/__HELPERS/icon_smoothing.dm @@ -46,13 +46,16 @@ if(istype(AM)) if(AM.anchored) adjacencies |= 1 << direction + else if(AM) adjacencies |= 1 << direction + else for(var/direction in alldirs) if(find_type_in_direction(A, direction)) adjacencies |= 1 << direction + return adjacencies /proc/smooth_icon(atom/A) diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index bcfe46bc138..95529721619 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -167,7 +167,8 @@ mob Output_Icon() set name = "2. Output Icon" - src<<"Icon is: \icon[getFlatIcon(src)]" + to_chat(src, "Icon is: \icon[getFlatIcon(src)]") + Label_Icon() set name = "3. Label Icon" diff --git a/code/__HELPERS/logging.dm b/code/__HELPERS/logging.dm index 5e0a79887da..bcb9b3dcbb7 100644 --- a/code/__HELPERS/logging.dm +++ b/code/__HELPERS/logging.dm @@ -31,7 +31,8 @@ for(var/client/C in admins) if(check_rights(R_DEBUG, 0, C.mob) && (C.prefs.toggles & CHAT_DEBUGLOGS)) - C << "DEBUG: [text]" + to_chat(C, "DEBUG: [text]") + /proc/log_game(text) @@ -90,5 +91,6 @@ * Standardized method for tracking startup times. */ /proc/log_startup_progress(var/message) - world << "[message]" + to_chat(world, "[message]") + log_to_dd(message) \ No newline at end of file diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm index 70c597c2d7b..370fd92b75e 100644 --- a/code/__HELPERS/names.dm +++ b/code/__HELPERS/names.dm @@ -239,7 +239,8 @@ var/syndicate_code_response//Code response for traitors. set name = "Generate Code Phrase" set category = "Debug" - world << "\red Code Phrase is: \black [generate_code_phrase()]" + to_chat(world, "\red Code Phrase is: \black [generate_code_phrase()]") + return diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index f5e577f8b8a..2991b4c830a 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -251,7 +251,8 @@ Turf and target are seperate in case you want to teleport some distance from a t var/pressure = air_contents.return_pressure() var/total_moles = air_contents.total_moles() - user << "Results of analysis of \icon[icon] [target]." + to_chat(user, "Results of analysis of \icon[icon] [target].") + if(total_moles>0) var/o2_concentration = air_contents.oxygen/total_moles var/n2_concentration = air_contents.nitrogen/total_moles @@ -260,16 +261,24 @@ Turf and target are seperate in case you want to teleport some distance from a t var/unknown_concentration = 1-(o2_concentration+n2_concentration+co2_concentration+plasma_concentration) - user << "Pressure: [round(pressure,0.1)] kPa" - user << "Nitrogen: [round(n2_concentration*100)] %" - user << "Oxygen: [round(o2_concentration*100)] %" - user << "CO2: [round(co2_concentration*100)] %" - user << "Plasma: [round(plasma_concentration*100)] %" + to_chat(user, "Pressure: [round(pressure,0.1)] kPa") + + to_chat(user, "Nitrogen: [round(n2_concentration*100)] %") + + to_chat(user, "Oxygen: [round(o2_concentration*100)] %") + + to_chat(user, "CO2: [round(co2_concentration*100)] %") + + to_chat(user, "Plasma: [round(plasma_concentration*100)] %") + if(unknown_concentration>0.01) - user << "Unknown: [round(unknown_concentration*100)] %" - user << "Temperature: [round(air_contents.temperature-T0C)] °C" + to_chat(user, "Unknown: [round(unknown_concentration*100)] %") + + to_chat(user, "Temperature: [round(air_contents.temperature-T0C)] °C") + else - user << "[target] is empty!" + to_chat(user, "[target] is empty!") + return //Picks a string of symbols to display as the law number for hacked or ion laws @@ -1665,4 +1674,8 @@ var/global/list/g_fancy_list_of_types = null var/value = L[key] if(findtext("[key]", filter) || findtext("[value]", filter)) matches[key] = value - return matches + return matches + +// Use this to send to a client's chat, no exceptions (except this proc itself). +/proc/to_chat(var/thing, var/output) + thing << output diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index c0fb6204fe6..1405860b107 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -332,10 +332,12 @@ var/turf/U = get_turf(A) var/obj/structure/cable/cable = locate() in T if(!cable || !istype(cable)) - src << "There is no cable here to power the gloves." + to_chat(src, "There is no cable here to power the gloves.") + return if(world.time < G.next_shock) - src << "[G] aren't ready to shock again!" + to_chat(src, "[G] aren't ready to shock again!") + return src.visible_message("[name] fires an arc of electricity!", \ "You fire an arc of electricity!", \ diff --git a/code/_onclick/click_override.dm b/code/_onclick/click_override.dm index 82cc807d91b..520ef6b5078 100644 --- a/code/_onclick/click_override.dm +++ b/code/_onclick/click_override.dm @@ -27,10 +27,12 @@ /obj/item/weapon/badminBook/attack_self(mob/living/user as mob) if(user.middleClickOverride) - user<< "You try to draw power from the [src], but you cannot hold the power at this time!" + to_chat(user, "You try to draw power from the [src], but you cannot hold the power at this time!") + return user.middleClickOverride = clickBehavior - user << "You draw a bit of power from the [src], you can use middle click or alt click to release the power!" + to_chat(user, "You draw a bit of power from the [src], you can use middle click or alt click to release the power!") + /datum/middleClickOverride/badminClicker var/summon_path = /obj/item/weapon/reagent_containers/food/snacks/cookie @@ -38,6 +40,7 @@ /datum/middleClickOverride/badminClicker/onClick(var/atom/A, var/mob/living/user) var/atom/movable/newObject = new summon_path newObject.loc = get_turf(A) - user << "You release the power you had stored up, summoning \a [newObject.name]! " + to_chat(user, "You release the power you had stored up, summoning \a [newObject.name]! ") + usr.loc.visible_message("[user] waves \his hand and summons \a [newObject.name]") ..() \ No newline at end of file diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index 6fd00ba1f17..330f22366c1 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -53,7 +53,8 @@ if(is_component_functioning("camera")) aiCamera.captureimage(A, usr) else - src << "Your camera isn't functional." + to_chat(src, "Your camera isn't functional.") + return /* diff --git a/code/_onclick/hud/action.dm b/code/_onclick/hud/action.dm index 4461e1c8539..e5854c7a706 100644 --- a/code/_onclick/hud/action.dm +++ b/code/_onclick/hud/action.dm @@ -279,12 +279,14 @@ /datum/action/scan_mode/Activate() active = 1 owner.research_scanner = 1 - owner << " Research analyzer is now active." + to_chat(owner, " Research analyzer is now active.") + /datum/action/scan_mode/Deactivate() active = 0 owner.research_scanner = 0 - owner << " Research analyzer deactivated." + to_chat(owner, " Research analyzer deactivated.") + /datum/action/scan_mode/Grant(mob/living/T) devices += 1 diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 6d5da0da58e..6fbcb2456e6 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -195,6 +195,8 @@ datum/hud/New(mob/owner) //hud_used.reorganize_alerts() else - usr << "\red Inventory hiding is currently only supported for human mobs, sorry." + to_chat(usr, "\red Inventory hiding is currently only supported for human mobs, sorry.") + else - usr << "\red This mob type does not use a HUD." + to_chat(usr, "\red This mob type does not use a HUD.") + diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index b83bfcf411a..2350dff6a26 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -246,11 +246,13 @@ r.client.screen += r.throw_icon //"store" icon if(!r.module) - usr << "\red No module selected" + to_chat(usr, "\red No module selected") + return if(!r.module.modules) - usr << "\red Selected module has no modules to select" + to_chat(usr, "\red Selected module has no modules to select") + return if(!r.robot_modules_background) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 68ed970a55d..417dd668d0f 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -95,7 +95,8 @@ if(!C.stat && !C.stunned && !C.paralysis && !C.restrained()) if(C.internal) C.internal = null - C << "No longer running on internals." + to_chat(C, "No longer running on internals.") + if(C.internals) C.internals.icon_state = "internal0" else @@ -108,7 +109,8 @@ no_mask = 1 if(no_mask) - C << "You are not wearing a suitable mask or helmet." + to_chat(C, "You are not wearing a suitable mask or helmet.") + return 1 else var/list/nicename = null @@ -189,7 +191,8 @@ //We've determined the best container now we set it as our internals if(best) - C << "You are now running on internals from [tankcheck[best]] [from] your [nicename[best]]." + to_chat(C, "You are now running on internals from [tankcheck[best]] [from] your [nicename[best]].") + C.internal = tankcheck[best] @@ -197,7 +200,8 @@ if(C.internals) C.internals.icon_state = "internal1" else - C << "You don't have a[breathes=="oxygen" ? "n oxygen" : addtext(" ",breathes)] tank." + to_chat(C, "You don't have a[breathes=="oxygen" ? "n oxygen" : addtext(" ",breathes)] tank.") + /obj/screen/mov_intent name = "run/walk toggle" @@ -208,7 +212,8 @@ if(iscarbon(usr)) var/mob/living/carbon/C = usr if(C.legcuffed) - C << "You are legcuffed! You cannot run until you get [C.legcuffed] removed!" + to_chat(C, "You are legcuffed! You cannot run until you get [C.legcuffed] removed!") + C.m_intent = "walk" //Just incase C.hud_used.move_intent.icon_state = "walking" return 1 @@ -370,7 +375,8 @@ if(gun_click_time > world.time - 30) //give them 3 seconds between mode changes. return if(!istype(usr.get_active_hand(), /obj/item/weapon/gun)) - usr << "You need your gun in your active hand to do that!" + to_chat(usr, "You need your gun in your active hand to do that!") + return usr.client.AllowTargetClick() gun_click_time = world.time diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index cee8ad99533..2fe0c4c40db 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -17,7 +17,8 @@ user.changeNext_move(CLICK_CD_MELEE) if(stat == DEAD && !isnull(butcher_results)) //can we butcher it? if(istype(I, /obj/item/weapon/kitchen/knife)) - user << "You begin to butcher [src]..." + to_chat(user, "You begin to butcher [src]...") + playsound(loc, 'sound/weapons/slice.ogg', 50, 1, -1) if(do_mob(user, src, 80)) harvest(user) @@ -79,7 +80,8 @@ if(istype(M, /mob/living/carbon/slime)) var/mob/living/carbon/slime/slime = M if(prob(25)) - user << "\red [src] passes right through [M]!" + to_chat(user, "\red [src] passes right through [M]!") + return if(power > 0) @@ -162,7 +164,8 @@ if(!showname && user) if(user.client) - user << "\red You attack [M] with [src]. " + to_chat(user, "\red You attack [M] with [src]. ") + @@ -184,7 +187,8 @@ if("fire") if (!(RESIST_COLD in M.mutations)) M.take_organ_damage(0, power) - M << "Aargh it burns!" + to_chat(M, "Aargh it burns!") + M.updatehealth() add_fingerprint(user) return 1 diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm index 891601d2d51..bdfbbfb839a 100644 --- a/code/_onclick/observer.dm +++ b/code/_onclick/observer.dm @@ -61,10 +61,12 @@ if(awaygate) user.forceMove(awaygate.loc) else - user << "[src] has no destination." + to_chat(user, "[src] has no destination.") + /obj/machinery/gateway/centeraway/attack_ghost(mob/user as mob) if(stationgate) user.forceMove(stationgate.loc) else - user << "[src] has no destination." + to_chat(user, "[src] has no destination.") + diff --git a/code/_onclick/oldcode.dm b/code/_onclick/oldcode.dm index 17fb1005fa6..c4c454b067c 100644 --- a/code/_onclick/oldcode.dm +++ b/code/_onclick/oldcode.dm @@ -138,7 +138,8 @@ else t5 = in_range(src, usr) || src.loc == usr -// world << "according to dblclick(), t5 is [t5]" +// to_chat(world, "according to dblclick(), t5 is [t5]") + // ------- ACTUALLY DETERMINING STUFF ------- if (((t5 || (W && (W.flags & USEDELAY))) && !( istype(src, /obj/screen) ))) diff --git a/code/_onclick/rig.dm b/code/_onclick/rig.dm index cf3fcd3313a..d497a12ef60 100644 --- a/code/_onclick/rig.dm +++ b/code/_onclick/rig.dm @@ -18,15 +18,19 @@ switch(hardsuit_click_mode) if(MIDDLE_CLICK) - src << "Hardsuit activation mode set to middle-click." + to_chat(src, "Hardsuit activation mode set to middle-click.") + if(ALT_CLICK) - src << "Hardsuit activation mode set to alt-click." + to_chat(src, "Hardsuit activation mode set to alt-click.") + if(CTRL_CLICK) - src << "Hardsuit activation mode set to control-click." + to_chat(src, "Hardsuit activation mode set to control-click.") + else // should never get here, but just in case: log_debug("Bad hardsuit click mode: [hardsuit_click_mode] - expected 0 to [MAX_HARDSUIT_CLICK_MODE]") - src << "Somehow you bugged the system. Setting your hardsuit mode to middle-click." + to_chat(src, "Somehow you bugged the system. Setting your hardsuit mode to middle-click.") + hardsuit_click_mode = MIDDLE_CLICK /mob/living/MiddleClickOn(atom/A) diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index 9b4dd88e67e..bf5691778f3 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -111,7 +111,8 @@ var/const/tk_maxrange = 15 if(focus) d = max(d,get_dist(user,focus)) // whichever is further if(d > tk_maxrange) - user << "Your mind won't reach that far." + to_chat(user, "Your mind won't reach that far.") + return if(!focus) diff --git a/code/controllers/Processes/inactivity.dm b/code/controllers/Processes/inactivity.dm index 57e82348572..188f017d960 100644 --- a/code/controllers/Processes/inactivity.dm +++ b/code/controllers/Processes/inactivity.dm @@ -8,7 +8,8 @@ if(C.is_afk(INACTIVITY_KICK)) if(!istype(C.mob, /mob/dead)) log_access("AFK: [key_name(C)]") - C << "You have been inactive for more than 10 minutes and have been disconnected." + to_chat(C, "You have been inactive for more than 10 minutes and have been disconnected.") + del(C) SCHECK diff --git a/code/controllers/Processes/shuttles.dm b/code/controllers/Processes/shuttles.dm index f16d5b1c396..9ac4cd120af 100644 --- a/code/controllers/Processes/shuttles.dm +++ b/code/controllers/Processes/shuttles.dm @@ -92,30 +92,37 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12 return if(world.time - round_start_time < config.shuttle_refuel_delay) - user << "The emergency shuttle is refueling. Please wait another [abs(round(((world.time - round_start_time) - config.shuttle_refuel_delay)/600))] minutes before trying again." + to_chat(user, "The emergency shuttle is refueling. Please wait another [abs(round(((world.time - round_start_time) - config.shuttle_refuel_delay)/600))] minutes before trying again.") + return switch(emergency.mode) if(SHUTTLE_RECALL) - user << "The emergency shuttle may not be called while returning to Centcom." + to_chat(user, "The emergency shuttle may not be called while returning to Centcom.") + return if(SHUTTLE_CALL) - user << "The emergency shuttle is already on its way." + to_chat(user, "The emergency shuttle is already on its way.") + return if(SHUTTLE_DOCKED) - user << "The emergency shuttle is already here." + to_chat(user, "The emergency shuttle is already here.") + return if(SHUTTLE_ESCAPE) - user << "The emergency shuttle is moving away to a safe distance." + to_chat(user, "The emergency shuttle is moving away to a safe distance.") + return if(SHUTTLE_STRANDED) - user << "The emergency shuttle has been disabled by Centcom." + to_chat(user, "The emergency shuttle has been disabled by Centcom.") + return call_reason = trim(html_encode(call_reason)) if(length(call_reason) < CALL_SHUTTLE_REASON_LENGTH) - user << "You must provide a reason." + to_chat(user, "You must provide a reason.") + return var/area/signal_origin = get_area(user) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 2d98b267f95..757891f1f7d 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -688,7 +688,8 @@ var/list/datum/game_mode/runnable_modes = new for (var/T in subtypesof(/datum/game_mode)) var/datum/game_mode/M = new T() - //world << "DEBUG: [T], tag=[M.config_tag], prob=[probabilities[M.config_tag]]" +// to_chat(world, "DEBUG: [T], tag=[M.config_tag], prob=[probabilities[M.config_tag]]") + if (!(M.config_tag in modes)) qdel(M) continue @@ -697,5 +698,6 @@ continue if (M.can_start()) runnable_modes[M] = probabilities[M.config_tag] - //world << "DEBUG: runnable_mode\[[runnable_modes.len]\] = [M.config_tag]" +// to_chat(world, "DEBUG: runnable_mode\[[runnable_modes.len]\] = [M.config_tag]") + return runnable_modes diff --git a/code/controllers/voting.dm b/code/controllers/voting.dm index a00017e2ed6..96310f6c93d 100644 --- a/code/controllers/voting.dm +++ b/code/controllers/voting.dm @@ -25,7 +25,8 @@ datum/controller/vote // No more change mode votes after the game has started. // 3 is GAME_STATE_PLAYING, but that #define is undefined for some reason if(mode == "gamemode" && ticker.current_state >= 2) - world << "Voting aborted due to game start." + to_chat(world, "Voting aborted due to game start.") + src.reset() return @@ -62,7 +63,8 @@ datum/controller/vote if(auto_muted && !config.ooc_allowed) auto_muted = 0 config.ooc_allowed = !( config.ooc_allowed ) - world << "The OOC channel has been automatically enabled due to vote end." + to_chat(world, "The OOC channel has been automatically enabled due to vote end.") + log_admin("OOC was toggled automatically due to vote end.") message_admins("OOC has been toggled on automatically.") @@ -103,7 +105,8 @@ datum/controller/vote else factor = 1.4 choices["Initiate Crew Transfer"] = round(choices["Initiate Crew Transfer"] * factor) - world << "Crew Transfer Factor: [factor]" + to_chat(world, "Crew Transfer Factor: [factor]") + greatest_votes = max(choices["Initiate Crew Transfer"], choices["Continue The Round"]) @@ -140,7 +143,8 @@ datum/controller/vote else text += "Vote Result: Inconclusive - No Votes!" log_vote(text) - world << "[text]" + to_chat(world, "[text]") + return . proc/result() @@ -160,7 +164,8 @@ datum/controller/vote master_mode = . if(!going) going = 1 - world << "The round will start soon." + to_chat(world, "The round will start soon.") + if("crew_transfer") if(. == "Initiate Crew Transfer") init_shift_change(null, 1) @@ -226,33 +231,41 @@ datum/controller/vote text += "\n[question]" log_vote(text) - world << "[text]\nType vote to place your votes.\nYou have [config.vote_period/10] seconds to vote." + to_chat(world, "[text]\nType vote to place your votes.\nYou have [config.vote_period/10] seconds to vote.") + switch(vote_type) if("crew_transfer") - world << sound('sound/ambience/alarm4.ogg') + to_chat(world, sound('sound/ambience/alarm4.ogg')) + if("gamemode") - world << sound('sound/ambience/alarm4.ogg') + to_chat(world, sound('sound/ambience/alarm4.ogg')) + if("custom") - world << sound('sound/ambience/alarm4.ogg') + to_chat(world, sound('sound/ambience/alarm4.ogg')) + if(mode == "gamemode" && going) going = 0 - world << "Round start has been delayed." + to_chat(world, "Round start has been delayed.") + if(mode == "crew_transfer" && config.ooc_allowed) auto_muted = 1 config.ooc_allowed = !( config.ooc_allowed ) - world << "The OOC channel has been automatically disabled due to a crew transfer vote." + to_chat(world, "The OOC channel has been automatically disabled due to a crew transfer vote.") + log_admin("OOC was toggled automatically due to crew_transfer vote.") message_admins("OOC has been toggled off automatically.") if(mode == "gamemode" && config.ooc_allowed) auto_muted = 1 config.ooc_allowed = !( config.ooc_allowed ) - world << "The OOC channel has been automatically disabled due to the gamemode vote." + to_chat(world, "The OOC channel has been automatically disabled due to the gamemode vote.") + log_admin("OOC was toggled automatically due to gamemode vote.") message_admins("OOC has been toggled off automatically.") if(mode == "custom" && config.ooc_allowed) auto_muted = 1 config.ooc_allowed = !( config.ooc_allowed ) - world << "The OOC channel has been automatically disabled due to a custom vote." + to_chat(world, "The OOC channel has been automatically disabled due to a custom vote.") + log_admin("OOC was toggled automatically due to custom vote.") message_admins("OOC has been toggled off automatically.") diff --git a/code/datums/ai_laws.dm b/code/datums/ai_laws.dm index b27cde4ba6f..f929de520b3 100644 --- a/code/datums/ai_laws.dm +++ b/code/datums/ai_laws.dm @@ -228,9 +228,11 @@ var/global/const/base_law_type = /datum/ai_laws/nanotrasen if(law == zeroth_law_borg) continue if(law == zeroth_law) - who << "[law.get_index()]. [law.law]" + to_chat(who, "[law.get_index()]. [law.law]") + else - who << "[law.get_index()]. [law.law]" + to_chat(who, "[law.get_index()]. [law.law]") + /******************** * Stating Laws * diff --git a/code/datums/browser.dm b/code/datums/browser.dm index f2eff643eca..9d5e019aed8 100644 --- a/code/datums/browser.dm +++ b/code/datums/browser.dm @@ -153,7 +153,8 @@ winset(user, windowid, "on-close=\".windowclose [param]\"") - //world << "OnClose [user]: [windowid] : ["on-close=\".windowclose [param]\""]" +// to_chat(world, "OnClose [user]: [windowid] : ["on-close=\".windowclose [param]\""]") + // the on-close client verb @@ -165,11 +166,13 @@ set hidden = 1 // hide this verb from the user's panel set name = ".windowclose" // no autocomplete on cmd line - //world << "windowclose: [atomref]" +// to_chat(world, "windowclose: [atomref]") + if(atomref!="null") // if passed a real atomref var/hsrc = locate(atomref) // find the reffed atom if(hsrc) - //world << "[src] Topic [href] [hsrc]" +// to_chat(world, "[src] Topic [href] [hsrc]") + usr = src.mob src.Topic("close=1", list("close"="1"), hsrc) // this will direct to the atom's return // Topic() proc via client.Topic() @@ -177,6 +180,7 @@ // no atomref specified (or not found) // so just reset the user mob's machine var if(src && src.mob) - //world << "[src] was [src.mob.machine], setting to null" +// to_chat(world, "[src] was [src.mob.machine], setting to null") + src.mob.unset_machine() return \ No newline at end of file diff --git a/code/datums/cargoprofile.dm b/code/datums/cargoprofile.dm index eea90b687e6..88505af923d 100644 --- a/code/datums/cargoprofile.dm +++ b/code/datums/cargoprofile.dm @@ -642,7 +642,8 @@ if(istype(M) && (remaining > MOB_WORK)) //this is necessarily damaging var/damage = rand(1,5) - M << "\red The unloading machine grabs you with a hard metallic claw!" + to_chat(M, "\red The unloading machine grabs you with a hard metallic claw!") + if(M.client) M.client.eye = master M.client.perspective = EYE_PERSPECTIVE @@ -660,7 +661,8 @@ bruteloss += L.brute_dam if(bruteloss < 100) // requires tenderization M.apply_damage(rand(5,15),BRUTE) - M << "The machine is tearing you apart!" + to_chat(M, "The machine is tearing you apart!") + master.visible_message("\red [master] makes a squishy grinding noise.") return M.loc = master.loc @@ -698,7 +700,8 @@ if(remaining > MOB_WORK) //this is necessarily damaging var/damage = rand(1,5) - M << "\red The unloading machine grabs you with a hard metallic claw!" + to_chat(M, "\red The unloading machine grabs you with a hard metallic claw!") + if(M.client) M.client.eye = master M.client.perspective = EYE_PERSPECTIVE @@ -790,7 +793,8 @@ //stolen from boxing gloves code var/mob/living/carbon/human/M = W if((M.lying || (M.health - M.staminaloss < 25))&& !master.emagged) - M << "\The [src] gives you a break." + to_chat(M, "\The [src] gives you a break.") + master.sleep+=5 return 0 // Be polite var/punches = punch(M,remaining / PUNCH_WORK) diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index ceb33b71959..49eeffa7bd3 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -7,7 +7,8 @@ if(!usr.client || !usr.client.holder) - usr << "\red You need to be an administrator to access this." + to_chat(usr, "\red You need to be an administrator to access this.") + return @@ -415,7 +416,8 @@ body html += " " for(var/i=0;i<4;i++) idx=(block*4)+i - bit=1 << idx + to_chat(bit=1, idx) + bv=value & bit html += "[bv?1:0]" html += "" @@ -438,7 +440,8 @@ body var/mob/M = locate(href_list["rename"]) if(!istype(M)) - usr << "This can only be used on instances of type /mob" + to_chat(usr, "This can only be used on instances of type /mob") + return var/new_name = sanitize(copytext(input(usr,"What would you like to name this mob?","Input a name",M.real_name) as text|null,1,MAX_NAME_LEN)) @@ -453,7 +456,8 @@ body var/D = locate(href_list["datumedit"]) if(!istype(D,/datum) && !istype(D,/client)) - usr << "This can only be used on instances of types /client or /datum" + to_chat(usr, "This can only be used on instances of types /client or /datum") + return modify_variables(D, href_list["varnameedit"], 1) @@ -463,13 +467,16 @@ body var/atom/D = locate(href_list["subject"]) if(!istype(D,/datum) && !istype(D,/client)) - usr << "This can only be used on instances of types /client or /datum" + to_chat(usr, "This can only be used on instances of types /client or /datum") + return if(!(href_list["var"] in D.vars)) - usr << "Unable to find variable specified." + to_chat(usr, "Unable to find variable specified.") + return var/value = D.vars[href_list["var"]] value ^= 1 << text2num(href_list["togbit"]) + D.vars[href_list["var"]] = value else if(href_list["varnamechange"] && href_list["datumchange"]) @@ -477,7 +484,8 @@ body var/D = locate(href_list["datumchange"]) if(!istype(D,/datum) && !istype(D,/client)) - usr << "This can only be used on instances of types /client or /datum" + to_chat(usr, "This can only be used on instances of types /client or /datum") + return modify_variables(D, href_list["varnamechange"], 0) @@ -487,7 +495,8 @@ body var/atom/A = locate(href_list["datummass"]) if(!istype(A)) - usr << "This can only be used on instances of type /atom" + to_chat(usr, "This can only be used on instances of type /atom") + return cmd_mass_modify_object_variables(A, href_list["varnamemass"]) @@ -497,7 +506,8 @@ body var/mob/M = locate(href_list["mob_player_panel"]) if(!istype(M)) - usr << "This can only be used on instances of type /mob" + to_chat(usr, "This can only be used on instances of type /mob") + return src.holder.show_player_panel(M) @@ -508,7 +518,8 @@ body var/mob/M = locate(href_list["give_spell"]) if(!istype(M)) - usr << "This can only be used on instances of type /mob" + to_chat(usr, "This can only be used on instances of type /mob") + return src.give_spell(M) @@ -520,7 +531,8 @@ body var/mob/M = locate(href_list["give_disease"]) if(!istype(M)) - usr << "This can only be used on instances of type /mob" + to_chat(usr, "This can only be used on instances of type /mob") + return src.give_disease(M) @@ -531,7 +543,8 @@ body var/mob/M = locate(href_list["godmode"]) if(!istype(M)) - usr << "This can only be used on instances of type /mob" + to_chat(usr, "This can only be used on instances of type /mob") + return src.cmd_admin_godmode(M) @@ -542,7 +555,8 @@ body var/mob/M = locate(href_list["gib"]) if(!istype(M)) - usr << "This can only be used on instances of type /mob" + to_chat(usr, "This can only be used on instances of type /mob") + return src.cmd_admin_gib(M) @@ -552,7 +566,8 @@ body var/mob/M = locate(href_list["build_mode"]) if(!istype(M)) - usr << "This can only be used on instances of type /mob" + to_chat(usr, "This can only be used on instances of type /mob") + return togglebuildmode(M) @@ -563,7 +578,8 @@ body var/mob/M = locate(href_list["drop_everything"]) if(!istype(M)) - usr << "This can only be used on instances of type /mob" + to_chat(usr, "This can only be used on instances of type /mob") + return if(usr.client) @@ -574,7 +590,8 @@ body var/mob/M = locate(href_list["direct_control"]) if(!istype(M)) - usr << "This can only be used on instances of type /mob" + to_chat(usr, "This can only be used on instances of type /mob") + return if(usr.client) @@ -585,7 +602,8 @@ body var/mob/living/carbon/human/H = locate(href_list["make_skeleton"]) if(!istype(H)) - usr << "This can only be used on instances of type /mob/living/carbon/human" + to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + return var/confirm = alert("Are you sure you want to turn this mob into a skeleton?","Confirm Skeleton Transformation","Yes","No") @@ -602,9 +620,11 @@ body var/mob/M = locate(href_list["offer_control"]) if(!istype(M)) - usr << "This can only be used on instances of type /mob" + to_chat(usr, "This can only be used on instances of type /mob") + return - M << "Control of your mob has been offered to dead players." + to_chat(M, "Control of your mob has been offered to dead players.") + log_admin("[key_name(usr)] has offered control of ([key_name(M)]) to ghosts.") message_admins("[key_name_admin(usr)] has offered control of ([key_name_admin(M)]) to ghosts") var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as [M.real_name]?", poll_time = 100) @@ -612,12 +632,14 @@ body if(candidates.len) theghost = pick(candidates) - M << "Your mob has been taken over by a ghost!" + to_chat(M, "Your mob has been taken over by a ghost!") + message_admins("[key_name_admin(theghost)] has taken control of ([key_name_admin(M)])") M.ghostize() M.key = theghost.key else - M << "There were no ghosts willing to take control." + to_chat(M, "There were no ghosts willing to take control.") + message_admins("No ghosts were willing to take control of [key_name_admin(M)])") else if(href_list["delall"]) @@ -625,7 +647,8 @@ body var/obj/O = locate(href_list["delall"]) if(!isobj(O)) - usr << "This can only be used on instances of type /obj" + to_chat(usr, "This can only be used on instances of type /obj") + return var/action_type = alert("Strict type ([O.type]) or type and all subtypes?",,"Strict type","Type and subtypes","Cancel") @@ -647,7 +670,8 @@ body i++ qdel(Obj) if(!i) - usr << "No objects of this type exist" + to_chat(usr, "No objects of this type exist") + return log_admin("[key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted)") message_admins("[key_name_admin(usr)] deleted all objects of type [O_type] ([i] objects deleted)") @@ -658,7 +682,8 @@ body i++ qdel(Obj) if(!i) - usr << "No objects of this type exist" + to_chat(usr, "No objects of this type exist") + return log_admin("[key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted)") message_admins("[key_name_admin(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted)") @@ -698,7 +723,8 @@ body var/atom/A = locate(href_list["explode"]) if(!isobj(A) && !ismob(A) && !isturf(A)) - usr << "This can only be done to instances of type /obj, /mob and /turf" + to_chat(usr, "This can only be done to instances of type /obj, /mob and /turf") + return src.cmd_admin_explosion(A) @@ -709,7 +735,8 @@ body var/atom/A = locate(href_list["emp"]) if(!isobj(A) && !ismob(A) && !isturf(A)) - usr << "This can only be done to instances of type /obj, /mob and /turf" + to_chat(usr, "This can only be done to instances of type /obj, /mob and /turf") + return src.cmd_admin_emp(A) @@ -720,7 +747,8 @@ body var/datum/D = locate(href_list["mark_object"]) if(!istype(D)) - usr << "This can only be done to instances of type /datum" + to_chat(usr, "This can only be done to instances of type /datum") + return src.holder.marked_datum = D @@ -740,7 +768,8 @@ body var/atom/A = locate(href_list["rotatedatum"]) if(!istype(A)) - usr << "This can only be done to instances of type /atom" + to_chat(usr, "This can only be done to instances of type /atom") + return switch(href_list["rotatedir"]) @@ -756,12 +785,14 @@ body var/mob/living/carbon/human/H = locate(href_list["makemonkey"]) if(!istype(H)) - usr << "This can only be done to instances of type /mob/living/carbon/human" + to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") + return if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return if(!H) - usr << "Mob doesn't exist anymore" + to_chat(usr, "Mob doesn't exist anymore") + return holder.Topic(href, list("monkeyone"=href_list["makemonkey"])) @@ -770,12 +801,14 @@ body var/mob/living/carbon/human/H = locate(href_list["makerobot"]) if(!istype(H)) - usr << "This can only be done to instances of type /mob/living/carbon/human" + to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") + return if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return if(!H) - usr << "Mob doesn't exist anymore" + to_chat(usr, "Mob doesn't exist anymore") + return holder.Topic(href, list("makerobot"=href_list["makerobot"])) @@ -784,12 +817,14 @@ body var/mob/living/carbon/human/H = locate(href_list["makealien"]) if(!istype(H)) - usr << "This can only be done to instances of type /mob/living/carbon/human" + to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") + return if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return if(!H) - usr << "Mob doesn't exist anymore" + to_chat(usr, "Mob doesn't exist anymore") + return holder.Topic(href, list("makealien"=href_list["makealien"])) @@ -798,12 +833,14 @@ body var/mob/living/carbon/human/H = locate(href_list["makeslime"]) if(!istype(H)) - usr << "This can only be done to instances of type /mob/living/carbon/human" + to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") + return if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return if(!H) - usr << "Mob doesn't exist anymore" + to_chat(usr, "Mob doesn't exist anymore") + return holder.Topic(href, list("makeslime"=href_list["makeslime"])) @@ -812,12 +849,14 @@ body var/mob/living/carbon/human/H = locate(href_list["makesuper"]) if(!istype(H)) - usr << "This can only be done to instances of type /mob/living/carbon/human" + to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") + return if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return if(!H) - usr << "Mob doesn't exist anymore" + to_chat(usr, "Mob doesn't exist anymore") + return holder.Topic(href, list("makesuper"=href_list["makesuper"])) @@ -826,12 +865,14 @@ body var/mob/living/carbon/human/H = locate(href_list["makeai"]) if(!istype(H)) - usr << "This can only be done to instances of type /mob/living/carbon/human" + to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") + return if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return if(!H) - usr << "Mob doesn't exist anymore" + to_chat(usr, "Mob doesn't exist anymore") + return holder.Topic(href, list("makeai"=href_list["makeai"])) @@ -840,7 +881,8 @@ body var/mob/currentMob = locate(href_list["makemask"]) if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return if(!currentMob) - usr << "Mob doesn't exist anymore" + to_chat(usr, "Mob doesn't exist anymore") + return holder.Topic(href, list("makemask"=href_list["makemask"])) @@ -850,29 +892,34 @@ body var/mob/living/carbon/human/H = locate(href_list["setspecies"]) if(!istype(H)) - usr << "This can only be done to instances of type /mob/living/carbon/human" + to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") + return var/new_species = input("Please choose a new species.","Species",null) as null|anything in all_species if(!H) - usr << "Mob doesn't exist anymore" + to_chat(usr, "Mob doesn't exist anymore") + return if(H.set_species(new_species)) - usr << "Set species of [H] to [H.species]." + to_chat(usr, "Set species of [H] to [H.species].") + H.regenerate_icons() message_admins("[key_name_admin(usr)] has changed the species of [key_name_admin(H)] to [new_species]") log_admin("[key_name(usr)] has changed the species of [key_name(H)] to [new_species]") else - usr << "Failed! Something went wrong." + to_chat(usr, "Failed! Something went wrong.") + else if(href_list["addlanguage"]) if(!check_rights(R_SPAWN)) return var/mob/H = locate(href_list["addlanguage"]) if(!istype(H)) - usr << "This can only be done to instances of type /mob" + to_chat(usr, "This can only be done to instances of type /mob") + return var/new_language = input("Please choose a language to add.","Language",null) as null|anything in all_languages @@ -881,26 +928,31 @@ body return if(!H) - usr << "Mob doesn't exist anymore" + to_chat(usr, "Mob doesn't exist anymore") + return if(H.add_language(new_language)) - usr << "Added [new_language] to [H]." + to_chat(usr, "Added [new_language] to [H].") + message_admins("[key_name_admin(usr)] has given [key_name_admin(H)] the language [new_language]") log_admin("[key_name(usr)] has given [key_name(H)] the language [new_language]") else - usr << "Mob already knows that language." + to_chat(usr, "Mob already knows that language.") + else if(href_list["remlanguage"]) if(!check_rights(R_SPAWN)) return var/mob/H = locate(href_list["remlanguage"]) if(!istype(H)) - usr << "This can only be done to instances of type /mob" + to_chat(usr, "This can only be done to instances of type /mob") + return if(!H.languages.len) - usr << "This mob knows no languages." + to_chat(usr, "This mob knows no languages.") + return var/datum/language/rem_language = input("Please choose a language to remove.","Language",null) as null|anything in H.languages @@ -909,15 +961,18 @@ body return if(!H) - usr << "Mob doesn't exist anymore" + to_chat(usr, "Mob doesn't exist anymore") + return if(H.remove_language(rem_language.name)) - usr << "Removed [rem_language] from [H]." + to_chat(usr, "Removed [rem_language] from [H].") + message_admins("[key_name_admin(usr)] has removed language [rem_language] from [key_name_admin(H)]") log_admin("[key_name(usr)] has removed language [rem_language] from [key_name(H)]") else - usr << "Mob doesn't know that language." + to_chat(usr, "Mob doesn't know that language.") + else if(href_list["addverb"]) if(!check_rights(R_DEBUG)) return @@ -925,7 +980,8 @@ body var/mob/living/H = locate(href_list["addverb"]) if(!istype(H)) - usr << "This can only be done to instances of type /mob/living" + to_chat(usr, "This can only be done to instances of type /mob/living") + return var/list/possibleverbs = list() possibleverbs += "Cancel" // One for the top... @@ -942,7 +998,8 @@ body var/verb = input("Select a verb!", "Verbs",null) as anything in possibleverbs if(!H) - usr << "Mob doesn't exist anymore" + to_chat(usr, "Mob doesn't exist anymore") + return if(!verb || verb == "Cancel") return @@ -957,11 +1014,13 @@ body var/mob/H = locate(href_list["remverb"]) if(!istype(H)) - usr << "This can only be done to instances of type /mob" + to_chat(usr, "This can only be done to instances of type /mob") + return var/verb = input("Please choose a verb to remove.","Verbs",null) as null|anything in H.verbs if(!H) - usr << "Mob doesn't exist anymore" + to_chat(usr, "Mob doesn't exist anymore") + return if(!verb) return @@ -975,18 +1034,21 @@ body var/mob/living/carbon/M = locate(href_list["addorgan"]) if(!istype(M)) - usr << "This can only be done to instances of type /mob/living/carbon" + to_chat(usr, "This can only be done to instances of type /mob/living/carbon") + return var/new_organ = input("Please choose an organ to add.","Organ",null) as null|anything in subtypesof(/obj/item/organ)-/obj/item/organ if(!new_organ) return if(!M) - usr << "Mob doesn't exist anymore" + to_chat(usr, "Mob doesn't exist anymore") + return if(locate(new_organ) in M.internal_organs) - usr << "Mob already has that organ." + to_chat(usr, "Mob already has that organ.") + return var/obj/item/organ/internal/organ = new new_organ organ.insert(M) @@ -998,20 +1060,24 @@ body var/mob/living/carbon/M = locate(href_list["remorgan"]) if(!istype(M)) - usr << "This can only be done to instances of type /mob/living/carbon" + to_chat(usr, "This can only be done to instances of type /mob/living/carbon") + return var/obj/item/organ/internal/rem_organ = input("Please choose an organ to remove.","Organ",null) as null|anything in M.internal_organs if(!M) - usr << "Mob doesn't exist anymore" + to_chat(usr, "Mob doesn't exist anymore") + return if(!(locate(rem_organ) in M.internal_organs)) - usr << "Mob does not have that organ." + to_chat(usr, "Mob does not have that organ.") + return - usr << "Removed [rem_organ] from [M]." + to_chat(usr, "Removed [rem_organ] from [M].") + rem_organ.remove(M) message_admins("[key_name_admin(usr)] has removed the organ [rem_organ] from [key_name_admin(M)]") log_admin("[key_name(usr)] has removed the organ [rem_organ] from [key_name(M)]") @@ -1023,13 +1089,16 @@ body var/mob/H = locate(href_list["fix_nano"]) if(!istype(H) || !H.client) - usr << "This can only be done on mobs with clients" + to_chat(usr, "This can only be done on mobs with clients") + return H.client.reload_nanoui_resources() - usr << "Resource files sent" - H << "Your NanoUI Resource files have been refreshed" + to_chat(usr, "Resource files sent") + + to_chat(H, "Your NanoUI Resource files have been refreshed") + log_admin("[key_name(usr)] resent the NanoUI resource files to [key_name(H)]") @@ -1038,7 +1107,8 @@ body var/mob/M = locate(href_list["regenerateicons"]) if(!ismob(M)) - usr << "This can only be done to instances of type /mob" + to_chat(usr, "This can only be done to instances of type /mob") + return M.regenerate_icons() @@ -1053,7 +1123,8 @@ body var/amount = input("Deal how much damage to mob? (Negative values here heal)","Adjust [Text]loss",0) as num if(!L) - usr << "Mob doesn't exist anymore" + to_chat(usr, "Mob doesn't exist anymore") + return switch(Text) @@ -1064,7 +1135,8 @@ body if("brain") L.adjustBrainLoss(amount) if("clone") L.adjustCloneLoss(amount) else - usr << "You caused an error. DEBUG: Text:[Text] Mob:[L]" + to_chat(usr, "You caused an error. DEBUG: Text:[Text] Mob:[L]") + return if(amount != 0) diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index a4d41978ac2..393da9550d9 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -161,7 +161,8 @@ var/list/advance_cures = list( return generated /datum/disease/advance/proc/Refresh(new_name = 0) - //world << "[src.name] \ref[src] - REFRESH!" +// to_chat(world, "[src.name] \ref[src] - REFRESH!") + var/list/properties = GenerateProperties() AssignProperties(properties) id = null @@ -255,7 +256,8 @@ var/list/advance_cures = list( /datum/disease/advance/proc/GenerateCure(list/properties = list()) if(properties && properties.len) var/res = Clamp(properties["resistance"] - (symptoms.len / 2), 1, advance_cures.len) - //world << "Res = [res]" +// to_chat(world, "Res = [res]") + cures = list(advance_cures[res]) // Get the cure name from the cure_id @@ -327,7 +329,8 @@ var/list/advance_cures = list( // Mix a list of advance diseases and return the mixed result. /proc/Advance_Mix(var/list/D_list) - //world << "Mixing!!!!" +// to_chat(world, "Mixing!!!!") + var/list/diseases = list() @@ -352,7 +355,8 @@ var/list/advance_cures = list( D2.Mix(D1) // Should be only 1 entry left, but if not let's only return a single entry - //world << "END MIXING!!!!!" +// to_chat(world, "END MIXING!!!!!") + var/datum/disease/advance/to_return = pick(diseases) to_return.Refresh(1) return to_return @@ -421,7 +425,8 @@ var/list/advance_cures = list( /mob/verb/test() for(var/datum/disease/D in disease_master.processing) - src << "[D.name] - [D.holder]" + to_chat(src, "[D.name] - [D.holder]") + */ diff --git a/code/datums/diseases/advance/symptoms/beard.dm b/code/datums/diseases/advance/symptoms/beard.dm index 40295257b68..708b061732b 100644 --- a/code/datums/diseases/advance/symptoms/beard.dm +++ b/code/datums/diseases/advance/symptoms/beard.dm @@ -32,17 +32,20 @@ BONUS var/mob/living/carbon/human/H = M switch(A.stage) if(1, 2) - H << "Your chin itches." + to_chat(H, "Your chin itches.") + if(H.f_style == "Shaved") H.f_style = "Jensen Beard" H.update_hair() if(3, 4) - H << "You feel tough." + to_chat(H, "You feel tough.") + if(!(H.f_style == "Dwarf Beard") && !(H.f_style == "Very Long Beard") && !(H.f_style == "Full Beard")) H.f_style = "Full Beard" H.update_hair() else - H << "You feel manly!" + to_chat(H, "You feel manly!") + if(!(H.f_style == "Dwarf Beard") && !(H.f_style == "Very Long Beard")) H.f_style = pick("Dwarf Beard", "Very Long Beard") H.update_hair() diff --git a/code/datums/diseases/advance/symptoms/choking.dm b/code/datums/diseases/advance/symptoms/choking.dm index e0ce1a7bda2..9faa62b550c 100644 --- a/code/datums/diseases/advance/symptoms/choking.dm +++ b/code/datums/diseases/advance/symptoms/choking.dm @@ -31,13 +31,16 @@ Bonus var/mob/living/M = A.affected_mob switch(A.stage) if(1, 2) - M << "[pick("You're having difficulty breathing.", "Your breathing becomes heavy.")]" + to_chat(M, "[pick("You're having difficulty breathing.", "Your breathing becomes heavy.")]") + if(3, 4) - M << "[pick("Your windpipe feels like a straw.", "Your breathing becomes tremendously difficult.")]" + to_chat(M, "[pick("Your windpipe feels like a straw.", "Your breathing becomes tremendously difficult.")]") + Choke_stage_3_4(M, A) M.emote("gasp") else - M << "[pick("You're choking!", "You can't breathe!")]" + to_chat(M, "[pick("You're choking!", "You can't breathe!")]") + Choke(M, A) M.emote("gasp") return diff --git a/code/datums/diseases/advance/symptoms/confusion.dm b/code/datums/diseases/advance/symptoms/confusion.dm index c9de75d877f..ddaea9da4cc 100644 --- a/code/datums/diseases/advance/symptoms/confusion.dm +++ b/code/datums/diseases/advance/symptoms/confusion.dm @@ -32,9 +32,11 @@ Bonus var/mob/living/carbon/M = A.affected_mob switch(A.stage) if(1, 2, 3, 4) - M << "[pick("Your head hurts.", "Your mind blanks for a moment.")]" + to_chat(M, "[pick("Your head hurts.", "Your mind blanks for a moment.")]") + else - M << "You can't think straight!" + to_chat(M, "You can't think straight!") + M.confused = min(100, M.confused + 8) return diff --git a/code/datums/diseases/advance/symptoms/cough.dm b/code/datums/diseases/advance/symptoms/cough.dm index 716ef2cb6fd..c112fd2d111 100644 --- a/code/datums/diseases/advance/symptoms/cough.dm +++ b/code/datums/diseases/advance/symptoms/cough.dm @@ -31,7 +31,8 @@ BONUS var/mob/living/M = A.affected_mob switch(A.stage) if(1, 2, 3) - M << "[pick("You swallow excess mucus.", "You lightly cough.")]" + to_chat(M, "[pick("You swallow excess mucus.", "You lightly cough.")]") + else M.emote("cough") var/obj/item/I = M.get_active_hand() diff --git a/code/datums/diseases/advance/symptoms/deafness.dm b/code/datums/diseases/advance/symptoms/deafness.dm index 08a66b6c144..6d8d8008ef8 100644 --- a/code/datums/diseases/advance/symptoms/deafness.dm +++ b/code/datums/diseases/advance/symptoms/deafness.dm @@ -31,13 +31,16 @@ Bonus var/mob/living/M = A.affected_mob switch(A.stage) if(3, 4) - M << "[pick("You hear a ringing in your ear.", "Your ears pop.")]" + to_chat(M, "[pick("You hear a ringing in your ear.", "Your ears pop.")]") + if(5) if(!(M.ear_deaf)) - M << "Your ears pop and begin ringing loudly!" + to_chat(M, "Your ears pop and begin ringing loudly!") + M.setEarDamage(-1,INFINITY) //Shall be enough spawn(200) if(M) - M << "The ringing in your ears fades..." + to_chat(M, "The ringing in your ears fades...") + M.setEarDamage(-1,0) return \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/dizzy.dm b/code/datums/diseases/advance/symptoms/dizzy.dm index b81b9b8a4ec..1ab6b3a7fb6 100644 --- a/code/datums/diseases/advance/symptoms/dizzy.dm +++ b/code/datums/diseases/advance/symptoms/dizzy.dm @@ -31,8 +31,10 @@ Bonus var/mob/living/M = A.affected_mob switch(A.stage) if(1, 2, 3, 4) - M << "[pick("You feel dizzy.", "Your head spins.")]" + to_chat(M, "[pick("You feel dizzy.", "Your head spins.")]") + else - M << "A wave of dizziness washes over you!" + to_chat(M, "A wave of dizziness washes over you!") + M.Dizzy(5) return \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/fever.dm b/code/datums/diseases/advance/symptoms/fever.dm index 8f2beacd29d..89789d9f993 100644 --- a/code/datums/diseases/advance/symptoms/fever.dm +++ b/code/datums/diseases/advance/symptoms/fever.dm @@ -29,7 +29,8 @@ Bonus ..() if(prob(SYMPTOM_ACTIVATION_PROB)) var/mob/living/carbon/M = A.affected_mob - M << "[pick("You feel hot.", "You feel like you're burning.")]" + to_chat(M, "[pick("You feel hot.", "You feel like you're burning.")]") + if(M.bodytemperature < BODYTEMP_HEAT_DAMAGE_LIMIT) Heat(M, A) diff --git a/code/datums/diseases/advance/symptoms/fire.dm b/code/datums/diseases/advance/symptoms/fire.dm index ea805861082..040de3f43a4 100644 --- a/code/datums/diseases/advance/symptoms/fire.dm +++ b/code/datums/diseases/advance/symptoms/fire.dm @@ -31,16 +31,19 @@ Bonus var/mob/living/M = A.affected_mob switch(A.stage) if(3) - M << "[pick("You feel hot.", "You hear a crackling noise.", "You smell smoke.")]" + to_chat(M, "[pick("You feel hot.", "You hear a crackling noise.", "You smell smoke.")]") + if(4) Firestacks_stage_4(M, A) M.IgniteMob() - M << "Your skin bursts into flames!" + to_chat(M, "Your skin bursts into flames!") + M.emote("scream") if(5) Firestacks_stage_5(M, A) M.IgniteMob() - M << "Your skin erupts into an inferno!" + to_chat(M, "Your skin erupts into an inferno!") + M.emote("scream") return diff --git a/code/datums/diseases/advance/symptoms/flesh_eating.dm b/code/datums/diseases/advance/symptoms/flesh_eating.dm index 0d3cfc95ce3..35862771a02 100644 --- a/code/datums/diseases/advance/symptoms/flesh_eating.dm +++ b/code/datums/diseases/advance/symptoms/flesh_eating.dm @@ -31,9 +31,11 @@ Bonus var/mob/living/M = A.affected_mob switch(A.stage) if(2,3) - M << "[pick("You feel a sudden pain across your body.", "Drops of blood appear suddenly on your skin.")]" + to_chat(M, "[pick("You feel a sudden pain across your body.", "Drops of blood appear suddenly on your skin.")]") + if(4,5) - M << "[pick("You cringe as a violent pain takes over your body.", "It feels like your body is eating itself inside out.", "IT HURTS.")]" + to_chat(M, "[pick("You cringe as a violent pain takes over your body.", "It feels like your body is eating itself inside out.", "IT HURTS.")]") + Flesheat(M, A) return diff --git a/code/datums/diseases/advance/symptoms/genetics.dm b/code/datums/diseases/advance/symptoms/genetics.dm index 21ee88e7cc0..ab73b6b7abe 100644 --- a/code/datums/diseases/advance/symptoms/genetics.dm +++ b/code/datums/diseases/advance/symptoms/genetics.dm @@ -35,7 +35,8 @@ Bonus return switch(A.stage) if(4, 5) - M << "[pick("Your skin feels itchy.", "You feel light headed.")]" + to_chat(M, "[pick("Your skin feels itchy.", "You feel light headed.")]") + M.dna.remove_mutation_group(possible_mutations) randmut(M, possible_mutations) return diff --git a/code/datums/diseases/advance/symptoms/hallucigen.dm b/code/datums/diseases/advance/symptoms/hallucigen.dm index 5400de88585..36aa7da05c5 100644 --- a/code/datums/diseases/advance/symptoms/hallucigen.dm +++ b/code/datums/diseases/advance/symptoms/hallucigen.dm @@ -31,11 +31,14 @@ Bonus var/mob/living/carbon/M = A.affected_mob switch(A.stage) if(1, 2) - M << "[pick("Something appears in your peripheral vision, then winks out.", "You hear a faint whispher with no source.", "Your head aches.")]" + to_chat(M, "[pick("Something appears in your peripheral vision, then winks out.", "You hear a faint whispher with no source.", "Your head aches.")]") + if(3, 4) - M << "[pick("Something is following you.", "You are being watched.", "You hear a whisper in your ear.", "Thumping footsteps slam toward you from nowhere.")]" + to_chat(M, "[pick("Something is following you.", "You are being watched.", "You hear a whisper in your ear.", "Thumping footsteps slam toward you from nowhere.")]") + else - M << "[pick("Oh, your head...", "Your head pounds.", "They're everywhere! Run!", "Something in the shadows...")]" + to_chat(M, "[pick("Oh, your head...", "Your head pounds.", "They're everywhere! Run!", "Something in the shadows...")]") + M.hallucination += 5 return diff --git a/code/datums/diseases/advance/symptoms/headache.dm b/code/datums/diseases/advance/symptoms/headache.dm index 38ac066fa0b..dc9c88f7488 100644 --- a/code/datums/diseases/advance/symptoms/headache.dm +++ b/code/datums/diseases/advance/symptoms/headache.dm @@ -30,5 +30,6 @@ BONUS ..() if(prob(SYMPTOM_ACTIVATION_PROB)) var/mob/living/M = A.affected_mob - M << "[pick("Your head hurts.", "Your head starts pounding.")]" + to_chat(M, "[pick("Your head hurts.", "Your head starts pounding.")]") + return \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm index 11f0d21ff37..2cc872d7741 100644 --- a/code/datums/diseases/advance/symptoms/heal.dm +++ b/code/datums/diseases/advance/symptoms/heal.dm @@ -73,7 +73,8 @@ Bonus cured_diseases += D.GetDiseaseID() D.cure() if(cured) - M << "You feel much better." + to_chat(M, "You feel much better.") + /datum/symptom/heal/metabolism/End(datum/disease/advance/A) // Remove all the diseases we cured. @@ -83,7 +84,8 @@ Bonus for(var/res in M.resistances) if(res in cured_diseases) M.resistances -= res - M << "You feel weaker." + to_chat(M, "You feel weaker.") + /* ////////////////////////////////////// diff --git a/code/datums/diseases/advance/symptoms/itching.dm b/code/datums/diseases/advance/symptoms/itching.dm index e6f08f0882f..97d855fe8e5 100644 --- a/code/datums/diseases/advance/symptoms/itching.dm +++ b/code/datums/diseases/advance/symptoms/itching.dm @@ -30,5 +30,6 @@ BONUS ..() if(prob(SYMPTOM_ACTIVATION_PROB)) var/mob/living/M = A.affected_mob - M << "Your [pick("back", "arm", "leg", "elbow", "head")] itches." + to_chat(M, "Your [pick("back", "arm", "leg", "elbow", "head")] itches.") + return \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/oxygen.dm b/code/datums/diseases/advance/symptoms/oxygen.dm index 785b1cd8d7e..1b94e64c18f 100644 --- a/code/datums/diseases/advance/symptoms/oxygen.dm +++ b/code/datums/diseases/advance/symptoms/oxygen.dm @@ -34,5 +34,6 @@ Bonus M.reagents.add_reagent("salbutamol", 20) else if(prob(SYMPTOM_ACTIVATION_PROB * 5)) - M << "[pick("Your lungs feel great.", "You realize you haven't been breathing.", "You don't feel the need to breathe.")]" + to_chat(M, "[pick("Your lungs feel great.", "You realize you haven't been breathing.", "You don't feel the need to breathe.")]") + return diff --git a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/advance/symptoms/sensory.dm index d45a58b4621..8a3290ab004 100644 --- a/code/datums/diseases/advance/symptoms/sensory.dm +++ b/code/datums/diseases/advance/symptoms/sensory.dm @@ -32,19 +32,23 @@ Bonus if(2) if(M.reagents.get_reagent_amount("oculine")<10) M.reagents.add_reagent("oculine"=10) - M << "Your hearing feels clearer and crisp." + to_chat(M, "Your hearing feels clearer and crisp.") + if(3) if(M.reagents.get_reagent_amount("antihol") < 10 && M.reagents.get_reagent_amount("oculine") < 10 ) M.reagents.add_reagent_list(list("antihol"=10, "oculine"=10)) - M << "You feel sober." + to_chat(M, "You feel sober.") + if(4) if(M.reagents.get_reagent_amount("antihol") < 10 && M.reagents.get_reagent_amount("oculine") < 10 && M.reagents.get_reagent_amount("synaptizine") < 10) M.reagents.add_reagent_list(list("antihol"=10, "oculine"=10, "synaptizine"=5)) - M << "You feel focused." + to_chat(M, "You feel focused.") + if(5) if(M.reagents.get_reagent_amount("antihol") < 10 && M.reagents.get_reagent_amount("oculine") < 10 && M.reagents.get_reagent_amount("synaptizine") < 10 && M.reagents.get_reagent_amount("mannitol") < 10) M.reagents.add_reagent_list(list("mannitol"=10, "antihol"=10, "oculine"=10, "synaptizine"=10)) - M << "Your mind feels relaxed." + to_chat(M, "Your mind feels relaxed.") + return /* @@ -80,24 +84,29 @@ Bonus var/mob/living/M = A.affected_mob switch(A.stage) if(1) - M << "You can't taste a thing." + to_chat(M, "You can't taste a thing.") + if(2) - M << "You can't feel anything." + to_chat(M, "You can't feel anything.") + if(prob(10)) M.reagents.add_reagent("morphine",rand(5,7)) if(3) M.reagents.add_reagent("ethanol",rand(5,7)) - M << "You feel absolutely hammered." + to_chat(M, "You feel absolutely hammered.") + if(prob(15)) M.reagents.add_reagent("morphine",rand(5,7)) if(4) M.reagents.add_reagent_list(list("ethanol",rand(7,15),"lsd",rand(5,10))) - M << "You try to focus on not dying." + to_chat(M, "You try to focus on not dying.") + if(prob(20)) M.reagents.add_reagent("morphine",rand(5,7)) if(5) M.reagents.add_reagent_list(list("haloperidol",rand(5,15),"ethanol",rand(7,20),"lsd",rand(5,15))) - M << "u can count 2 potato!" + to_chat(M, "u can count 2 potato!") + if(prob(25)) M.reagents.add_reagent("morphine",rand(5,7)) return \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/shedding.dm b/code/datums/diseases/advance/symptoms/shedding.dm index e07bfe29afa..049180eb7a5 100644 --- a/code/datums/diseases/advance/symptoms/shedding.dm +++ b/code/datums/diseases/advance/symptoms/shedding.dm @@ -28,19 +28,22 @@ BONUS ..() if(prob(SYMPTOM_ACTIVATION_PROB)) var/mob/living/M = A.affected_mob - M << "[pick("Your scalp itches.", "Your skin feels flakey.")]" + to_chat(M, "[pick("Your scalp itches.", "Your skin feels flakey.")]") + if(istype(M, /mob/living/carbon/human)) var/mob/living/carbon/human/H = M switch(A.stage) if(3, 4) if(!(H.h_style == "Bald") && !(H.h_style == "Balding Hair")) - H << "Your hair starts to fall out in clumps..." + to_chat(H, "Your hair starts to fall out in clumps...") + spawn(50) H.h_style = "Balding Hair" H.update_hair() if(5) if(!(H.f_style == "Shaved") || !(H.h_style == "Bald")) - H << "Your hair starts to fall out in clumps..." + to_chat(H, "Your hair starts to fall out in clumps...") + spawn(50) H.f_style = "Shaved" H.h_style = "Bald" diff --git a/code/datums/diseases/advance/symptoms/shivering.dm b/code/datums/diseases/advance/symptoms/shivering.dm index 6925b1fb5b0..8496d46b9bf 100644 --- a/code/datums/diseases/advance/symptoms/shivering.dm +++ b/code/datums/diseases/advance/symptoms/shivering.dm @@ -29,7 +29,8 @@ Bonus ..() if(prob(SYMPTOM_ACTIVATION_PROB)) var/mob/living/carbon/M = A.affected_mob - M << "[pick("You feel cold.", "You start shivering.")]" + to_chat(M, "[pick("You feel cold.", "You start shivering.")]") + if(M.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT) Chill(M, A) return diff --git a/code/datums/diseases/advance/symptoms/stimulant.dm b/code/datums/diseases/advance/symptoms/stimulant.dm index 2823035bf39..33a52b67934 100644 --- a/code/datums/diseases/advance/symptoms/stimulant.dm +++ b/code/datums/diseases/advance/symptoms/stimulant.dm @@ -34,5 +34,6 @@ Bonus M.reagents.add_reagent("ephedrine", 10) else if(prob(SYMPTOM_ACTIVATION_PROB * 5)) - M << "[pick("You feel restless.", "You feel like running laps around the station.")]" + to_chat(M, "[pick("You feel restless.", "You feel like running laps around the station.")]") + return \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/viral.dm b/code/datums/diseases/advance/symptoms/viral.dm index fafac33b2c8..bd8742b44e9 100644 --- a/code/datums/diseases/advance/symptoms/viral.dm +++ b/code/datums/diseases/advance/symptoms/viral.dm @@ -27,9 +27,11 @@ BONUS var/mob/living/M = A.affected_mob switch(A.stage) if(1) - M << "You feel off, but no different from before." + to_chat(M, "You feel off, but no different from before.") + if(5) - M << "You feel better, but nothing interesting happens." + to_chat(M, "You feel better, but nothing interesting happens.") + /* ////////////////////////////////////// @@ -60,6 +62,8 @@ BONUS var/mob/living/M = A.affected_mob switch(A.stage) if(1) - M << "You feel better, but no different from before." + to_chat(M, "You feel better, but no different from before.") + if(5) - M << "You feel off, but nothing interesting happens." \ No newline at end of file + to_chat(M, "You feel off, but nothing interesting happens.") + diff --git a/code/datums/diseases/advance/symptoms/vision.dm b/code/datums/diseases/advance/symptoms/vision.dm index 9d348506dcf..6317ad88051 100644 --- a/code/datums/diseases/advance/symptoms/vision.dm +++ b/code/datums/diseases/advance/symptoms/vision.dm @@ -31,20 +31,24 @@ Bonus var/mob/living/M = A.affected_mob switch(A.stage) if(1, 2) - M << "Your eyes itch." + to_chat(M, "Your eyes itch.") + if(3, 4) - M << "Your eyes burn!" + to_chat(M, "Your eyes burn!") + M.blur_eyes(10) M.adjust_eye_damage(1) else - M << "Your eyes burn horrificly!" + to_chat(M, "Your eyes burn horrificly!") + M.blur_eyes(20) M.adjust_eye_damage(5) if(M.eye_damage >= 10) M.become_nearsighted() if(prob(M.eye_damage - 10 + 1)) if(M.become_blind()) - M << "You go blind!" + to_chat(M, "You go blind!") + /* @@ -83,5 +87,6 @@ Bonus M.reagents.add_reagent("oculine", 20) else if(prob(SYMPTOM_ACTIVATION_PROB * 5)) - M << "[pick("Your eyes feel great.", "You are now blinking manually.", "You don't feel the need to blink.")]" + to_chat(M, "[pick("Your eyes feel great.", "You are now blinking manually.", "You don't feel the need to blink.")]") + return diff --git a/code/datums/diseases/advance/symptoms/voice_change.dm b/code/datums/diseases/advance/symptoms/voice_change.dm index 847324a9e0b..8bd94b1ebdb 100644 --- a/code/datums/diseases/advance/symptoms/voice_change.dm +++ b/code/datums/diseases/advance/symptoms/voice_change.dm @@ -32,7 +32,8 @@ Bonus var/mob/living/carbon/M = A.affected_mob switch(A.stage) if(1, 2, 3, 4) - M << "[pick("Your throat hurts.", "You clear your throat.")]" + to_chat(M, "[pick("Your throat hurts.", "You clear your throat.")]") + else if(ishuman(M)) var/mob/living/carbon/human/H = M diff --git a/code/datums/diseases/advance/symptoms/vomit.dm b/code/datums/diseases/advance/symptoms/vomit.dm index abd5df571ac..77793882580 100644 --- a/code/datums/diseases/advance/symptoms/vomit.dm +++ b/code/datums/diseases/advance/symptoms/vomit.dm @@ -35,7 +35,8 @@ Bonus var/mob/living/M = A.affected_mob switch(A.stage) if(1, 2, 3, 4) - M << "[pick("You feel nauseous.", "You feel like you're going to throw up!")]" + to_chat(M, "[pick("You feel nauseous.", "You feel like you're going to throw up!")]") + else Vomit(M) diff --git a/code/datums/diseases/advance/symptoms/weakness.dm b/code/datums/diseases/advance/symptoms/weakness.dm index b0769680dc9..34e6ef57bea 100644 --- a/code/datums/diseases/advance/symptoms/weakness.dm +++ b/code/datums/diseases/advance/symptoms/weakness.dm @@ -31,12 +31,15 @@ Bonus var/mob/living/M = A.affected_mob switch(A.stage) if(1, 2) - M << "[pick("You feel weak.", "You feel lazy.")]" + to_chat(M, "[pick("You feel weak.", "You feel lazy.")]") + if(3, 4) - M << "[pick("You feel very frail.", "You think you might faint.")]" + to_chat(M, "[pick("You feel very frail.", "You think you might faint.")]") + M.adjustStaminaLoss(15) else - M << "[pick("You feel tremendously weak!", "Your body trembles as exhaustion creeps over you.")]" + to_chat(M, "[pick("You feel tremendously weak!", "Your body trembles as exhaustion creeps over you.")]") + M.adjustStaminaLoss(30) if(M.getStaminaLoss() > 60 && !M.stat) M.visible_message("[M] faints!", "You swoon and faint...") diff --git a/code/datums/diseases/advance/symptoms/weight.dm b/code/datums/diseases/advance/symptoms/weight.dm index 8a5e3b2dd75..7bf80e8a0ac 100644 --- a/code/datums/diseases/advance/symptoms/weight.dm +++ b/code/datums/diseases/advance/symptoms/weight.dm @@ -31,7 +31,8 @@ Bonus var/mob/living/M = A.affected_mob switch(A.stage) if(1, 2, 3, 4) - M << "[pick("You feel blubbery.", "Your stomach hurts.")]" + to_chat(M, "[pick("You feel blubbery.", "Your stomach hurts.")]") + else M.overeatduration = min(M.overeatduration + 100, 600) M.nutrition = min(M.nutrition + 100, NUTRITION_LEVEL_FULL) @@ -73,9 +74,11 @@ Bonus var/mob/living/M = A.affected_mob switch(A.stage) if(1, 2, 3, 4) - M << "[pick("You feel hungry.", "You crave for food.")]" + to_chat(M, "[pick("You feel hungry.", "You crave for food.")]") + else - M << "[pick("So hungry...", "You'd kill someone for a bite of food...", "Hunger cramps seize you...")]" + to_chat(M, "[pick("So hungry...", "You'd kill someone for a bite of food...", "Hunger cramps seize you...")]") + M.overeatduration = max(M.overeatduration - 100, 0) M.nutrition = max(M.nutrition - 100, 0) diff --git a/code/datums/diseases/advance/symptoms/youth.dm b/code/datums/diseases/advance/symptoms/youth.dm index 0a3d110b037..20a7f4ec077 100644 --- a/code/datums/diseases/advance/symptoms/youth.dm +++ b/code/datums/diseases/advance/symptoms/youth.dm @@ -34,22 +34,27 @@ BONUS if(1) if(H.age > 41) H.age = 41 - H << "You haven't had this much energy in years!" + to_chat(H, "You haven't had this much energy in years!") + if(2) if(H.age > 36) H.age = 36 - H << "You're suddenly in a good mood." + to_chat(H, "You're suddenly in a good mood.") + if(3) if(H.age > 31) H.age = 31 - H << "You begin to feel more lithe." + to_chat(H, "You begin to feel more lithe.") + if(4) if(H.age > 26) H.age = 26 - H << "You feel reinvigorated." + to_chat(H, "You feel reinvigorated.") + if(5) if(H.age > 21) H.age = 21 - H << "You feel like you can take on the world!" + to_chat(H, "You feel like you can take on the world!") + return \ No newline at end of file diff --git a/code/datums/diseases/anxiety.dm b/code/datums/diseases/anxiety.dm index 4cfd0268625..63f54abe4f3 100644 --- a/code/datums/diseases/anxiety.dm +++ b/code/datums/diseases/anxiety.dm @@ -16,18 +16,23 @@ switch(stage) if(2) //also changes say, see say.dm if(prob(5)) - affected_mob << "You feel anxious." + to_chat(affected_mob, "You feel anxious.") + if(3) if(prob(10)) - affected_mob << "Your stomach flutters." + to_chat(affected_mob, "Your stomach flutters.") + if(prob(5)) - affected_mob << "You feel panicky." + to_chat(affected_mob, "You feel panicky.") + if(prob(2)) - affected_mob << "You're overtaken with panic!" + to_chat(affected_mob, "You're overtaken with panic!") + affected_mob.confused += (rand(2,3)) if(4) if(prob(10)) - affected_mob << "You feel butterflies in your stomach." + to_chat(affected_mob, "You feel butterflies in your stomach.") + if(prob(5)) affected_mob.visible_message("[affected_mob] stumbles around in a panic.", \ "You have a panic attack!") diff --git a/code/datums/diseases/appendicitis.dm b/code/datums/diseases/appendicitis.dm index f6055e775ba..cf2ff7c2671 100644 --- a/code/datums/diseases/appendicitis.dm +++ b/code/datums/diseases/appendicitis.dm @@ -26,7 +26,8 @@ A.inflamed = 1 A.update_icon() if(prob(3)) - affected_mob << "You feel a stabbing pain in your abdomen!" + to_chat(affected_mob, "You feel a stabbing pain in your abdomen!") + affected_mob.Stun(rand(2,3)) affected_mob.adjustToxLoss(1) if(3) diff --git a/code/datums/diseases/beesease.dm b/code/datums/diseases/beesease.dm index 8e7331cbab8..e50f1589a06 100644 --- a/code/datums/diseases/beesease.dm +++ b/code/datums/diseases/beesease.dm @@ -16,12 +16,15 @@ switch(stage) if(2) //also changes say, see say.dm // no it doesn't, that's horrifyingly snowflakey if(prob(2)) - affected_mob << "You taste honey in your mouth." + to_chat(affected_mob, "You taste honey in your mouth.") + if(3) if(prob(10)) - affected_mob << "Your stomach rumbles." + to_chat(affected_mob, "Your stomach rumbles.") + if(prob(2)) - affected_mob << "Your stomach stings painfully." + to_chat(affected_mob, "Your stomach stings painfully.") + if(prob(20)) affected_mob.adjustToxLoss(2) affected_mob.updatehealth() @@ -30,7 +33,8 @@ affected_mob.visible_message("[affected_mob] buzzes.", \ "Your stomach buzzes violently!") if(prob(5)) - affected_mob << "You feel something moving in your throat." + to_chat(affected_mob, "You feel something moving in your throat.") + if(prob(1)) affected_mob.visible_message("[affected_mob] coughs up a swarm of bees!", \ "You cough up a swarm of bees!") diff --git a/code/datums/diseases/brainrot.dm b/code/datums/diseases/brainrot.dm index d29e860a38b..24613849568 100644 --- a/code/datums/diseases/brainrot.dm +++ b/code/datums/diseases/brainrot.dm @@ -22,7 +22,8 @@ if(prob(2)) affected_mob.emote("yawn") if(prob(2)) - affected_mob << "You don't feel like yourself." + to_chat(affected_mob, "You don't feel like yourself.") + if(prob(5)) affected_mob.adjustBrainLoss(1) affected_mob.updatehealth() @@ -35,7 +36,8 @@ affected_mob.adjustBrainLoss(2) affected_mob.updatehealth() if(prob(2)) - affected_mob << "Your try to remember something important...but can't." + to_chat(affected_mob, "Your try to remember something important...but can't.") + if(4) if(prob(2)) @@ -46,9 +48,11 @@ affected_mob.adjustBrainLoss(3) affected_mob.updatehealth() if(prob(2)) - affected_mob << "Strange buzzing fills your head, removing all thoughts." + to_chat(affected_mob, "Strange buzzing fills your head, removing all thoughts.") + if(prob(3)) - affected_mob << "You lose consciousness..." + to_chat(affected_mob, "You lose consciousness...") + affected_mob.visible_message("[affected_mob] suddenly collapses") affected_mob.Paralyse(rand(5,10)) if(prob(1)) diff --git a/code/datums/diseases/cold.dm b/code/datums/diseases/cold.dm index f9dca46a0aa..f118cae525c 100644 --- a/code/datums/diseases/cold.dm +++ b/code/datums/diseases/cold.dm @@ -16,16 +16,19 @@ if(2) /* if(affected_mob.sleeping && prob(40)) //removed until sleeping is fixed - affected_mob << "\blue You feel better." + to_chat(affected_mob, "\blue You feel better.") + cure() return */ if(affected_mob.lying && prob(40)) //changed FROM prob(10) until sleeping is fixed - affected_mob << "You feel better." + to_chat(affected_mob, "You feel better.") + cure() return if(prob(1) && prob(5)) - affected_mob << "You feel better." + to_chat(affected_mob, "You feel better.") + cure() return if(prob(1)) @@ -33,22 +36,27 @@ if(prob(1)) affected_mob.emote("cough") if(prob(1)) - affected_mob << "Your throat feels sore." + to_chat(affected_mob, "Your throat feels sore.") + if(prob(1)) - affected_mob << "Mucous runs down the back of your throat." + to_chat(affected_mob, "Mucous runs down the back of your throat.") + if(3) /* if(affected_mob.sleeping && prob(25)) //removed until sleeping is fixed - affected_mob << "\blue You feel better." + to_chat(affected_mob, "\blue You feel better.") + cure() return */ if(affected_mob.lying && prob(25)) //changed FROM prob(5) until sleeping is fixed - affected_mob << "You feel better." + to_chat(affected_mob, "You feel better.") + cure() return if(prob(1) && prob(1)) - affected_mob << "You feel better." + to_chat(affected_mob, "You feel better.") + cure() return if(prob(1)) @@ -56,9 +64,11 @@ if(prob(1)) affected_mob.emote("cough") if(prob(1)) - affected_mob << "Your throat feels sore." + to_chat(affected_mob, "Your throat feels sore.") + if(prob(1)) - affected_mob << "Mucous runs down the back of your throat." + to_chat(affected_mob, "Mucous runs down the back of your throat.") + if(prob(1) && prob(50)) if(!affected_mob.resistances.Find(/datum/disease/flu)) var/datum/disease/Flu = new /datum/disease/flu(0) diff --git a/code/datums/diseases/cold9.dm b/code/datums/diseases/cold9.dm index f77065a5ed2..28742e0d907 100644 --- a/code/datums/diseases/cold9.dm +++ b/code/datums/diseases/cold9.dm @@ -16,7 +16,8 @@ if(2) affected_mob.bodytemperature -= 10 if(prob(1) && prob(10)) - affected_mob << "You feel better." + to_chat(affected_mob, "You feel better.") + cure() return if(prob(1)) @@ -24,9 +25,11 @@ if(prob(1)) affected_mob.emote("cough") if(prob(1)) - affected_mob << "Your throat feels sore." + to_chat(affected_mob, "Your throat feels sore.") + if(prob(5)) - affected_mob << "You feel stiff." + to_chat(affected_mob, "You feel stiff.") + if(3) affected_mob.bodytemperature -= 20 if(prob(1)) @@ -34,6 +37,8 @@ if(prob(1)) affected_mob.emote("cough") if(prob(1)) - affected_mob << "Your throat feels sore." + to_chat(affected_mob, "Your throat feels sore.") + if(prob(10)) - affected_mob << "You feel stiff." \ No newline at end of file + to_chat(affected_mob, "You feel stiff.") + diff --git a/code/datums/diseases/dna_spread.dm b/code/datums/diseases/dna_spread.dm index a1c4d7471c4..0e510e5fac7 100644 --- a/code/datums/diseases/dna_spread.dm +++ b/code/datums/diseases/dna_spread.dm @@ -34,11 +34,13 @@ if(prob(8)) affected_mob.emote("cough") if(prob(1)) - affected_mob << "Your muscles ache." + to_chat(affected_mob, "Your muscles ache.") + if(prob(20)) affected_mob.take_organ_damage(1) if(prob(1)) - affected_mob << "Your stomach hurts." + to_chat(affected_mob, "Your stomach hurts.") + if(prob(20)) affected_mob.adjustToxLoss(2) affected_mob.updatehealth() @@ -48,7 +50,8 @@ original_dna = new affected_mob.dna.type affected_mob.dna.copy_dna(original_dna) - affected_mob << "You don't feel like yourself.." + to_chat(affected_mob, "You don't feel like yourself..") + var/datum/dna/transform_dna = strain_data["dna"] transform_dna.transfer_identity(affected_mob, transfer_SE = 1) @@ -68,5 +71,6 @@ affected_mob.updateappearance(mutcolor_update=1) affected_mob.domutcheck() - affected_mob << "You feel more like yourself." + to_chat(affected_mob, "You feel more like yourself.") + return ..() \ No newline at end of file diff --git a/code/datums/diseases/fake_gbs.dm b/code/datums/diseases/fake_gbs.dm index 6a300f733ff..99a6b867f82 100644 --- a/code/datums/diseases/fake_gbs.dm +++ b/code/datums/diseases/fake_gbs.dm @@ -22,7 +22,8 @@ else if(prob(5)) affected_mob.emote("gasp") if(prob(10)) - affected_mob << "You're starting to feel very weak..." + to_chat(affected_mob, "You're starting to feel very weak...") + if(4) if(prob(10)) affected_mob.emote("cough") diff --git a/code/datums/diseases/flu.dm b/code/datums/diseases/flu.dm index 58b7f247132..cc23606df8d 100644 --- a/code/datums/diseases/flu.dm +++ b/code/datums/diseases/flu.dm @@ -16,7 +16,8 @@ switch(stage) if(2) if(affected_mob.lying && prob(20)) - affected_mob << "You feel better." + to_chat(affected_mob, "You feel better.") + stage-- return if(prob(1)) @@ -24,18 +25,21 @@ if(prob(1)) affected_mob.emote("cough") if(prob(1)) - affected_mob << "Your muscles ache." + to_chat(affected_mob, "Your muscles ache.") + if(prob(20)) affected_mob.take_organ_damage(1) if(prob(1)) - affected_mob << "Your stomach hurts." + to_chat(affected_mob, "Your stomach hurts.") + if(prob(20)) affected_mob.adjustToxLoss(1) affected_mob.updatehealth() if(3) if(affected_mob.lying && prob(15)) - affected_mob << "You feel better." + to_chat(affected_mob, "You feel better.") + stage-- return if(prob(1)) @@ -43,11 +47,13 @@ if(prob(1)) affected_mob.emote("cough") if(prob(1)) - affected_mob << "Your muscles ache." + to_chat(affected_mob, "Your muscles ache.") + if(prob(20)) affected_mob.take_organ_damage(1) if(prob(1)) - affected_mob << "Your stomach hurts." + to_chat(affected_mob, "Your stomach hurts.") + if(prob(20)) affected_mob.adjustToxLoss(1) affected_mob.updatehealth() diff --git a/code/datums/diseases/fluspanish.dm b/code/datums/diseases/fluspanish.dm index 49137ce2d62..76e0819cec6 100644 --- a/code/datums/diseases/fluspanish.dm +++ b/code/datums/diseases/fluspanish.dm @@ -21,7 +21,8 @@ if(prob(5)) affected_mob.emote("cough") if(prob(1)) - affected_mob << "You're burning in your own skin!" + to_chat(affected_mob, "You're burning in your own skin!") + affected_mob.take_organ_damage(0,5) if(3) @@ -31,6 +32,7 @@ if(prob(5)) affected_mob.emote("cough") if(prob(5)) - affected_mob << "You're burning in your own skin!" + to_chat(affected_mob, "You're burning in your own skin!") + affected_mob.take_organ_damage(0,5) return diff --git a/code/datums/diseases/gbs.dm b/code/datums/diseases/gbs.dm index a2f4cc88112..ed10c174da4 100644 --- a/code/datums/diseases/gbs.dm +++ b/code/datums/diseases/gbs.dm @@ -27,14 +27,16 @@ else if(prob(5)) affected_mob.emote("gasp") if(prob(10)) - affected_mob << "You're starting to feel very weak..." + to_chat(affected_mob, "You're starting to feel very weak...") + if(4) if(prob(10)) affected_mob.emote("cough") affected_mob.adjustToxLoss(5) affected_mob.updatehealth() if(5) - affected_mob << "Your body feels as if it's trying to rip itself open..." + to_chat(affected_mob, "Your body feels as if it's trying to rip itself open...") + if(prob(50)) affected_mob.gib() else diff --git a/code/datums/diseases/magnitis.dm b/code/datums/diseases/magnitis.dm index f24ae10c347..c70f080a226 100644 --- a/code/datums/diseases/magnitis.dm +++ b/code/datums/diseases/magnitis.dm @@ -16,7 +16,8 @@ switch(stage) if(2) if(prob(2)) - affected_mob << "You feel a slight shock course through your body." + to_chat(affected_mob, "You feel a slight shock course through your body.") + if(prob(2)) for(var/obj/M in orange(2,affected_mob)) if(!M.anchored && (M.flags & CONDUCT)) @@ -26,9 +27,11 @@ step_towards(S,affected_mob) if(3) if(prob(2)) - affected_mob << "You feel a strong shock course through your body." + to_chat(affected_mob, "You feel a strong shock course through your body.") + if(prob(2)) - affected_mob << "You feel like clowning around." + to_chat(affected_mob, "You feel like clowning around.") + if(prob(4)) for(var/obj/M in orange(4,affected_mob)) if(!M.anchored && (M.flags & CONDUCT)) @@ -44,9 +47,11 @@ step_towards(S,affected_mob) if(4) if(prob(2)) - affected_mob << "You feel a powerful shock course through your body." + to_chat(affected_mob, "You feel a powerful shock course through your body.") + if(prob(2)) - affected_mob << "You query upon the nature of miracles." + to_chat(affected_mob, "You query upon the nature of miracles.") + if(prob(8)) for(var/obj/M in orange(6,affected_mob)) if(!M.anchored && (M.flags & CONDUCT)) diff --git a/code/datums/diseases/pierrot_throat.dm b/code/datums/diseases/pierrot_throat.dm index 7d328ad0291..4bb455bca40 100644 --- a/code/datums/diseases/pierrot_throat.dm +++ b/code/datums/diseases/pierrot_throat.dm @@ -16,10 +16,17 @@ ..() switch(stage) if(1) - if(prob(10)) affected_mob << "You feel a little silly." + if(prob(10)) + to_chat(affected_mob, "You feel a little silly.") + if(2) - if(prob(10)) affected_mob << "You start seeing rainbows." + if(prob(10)) + to_chat(affected_mob, "You start seeing rainbows.") + if(3) - if(prob(10)) affected_mob << "Your thoughts are interrupted by a loud HONK!" + if(prob(10)) + to_chat(affected_mob, "Your thoughts are interrupted by a loud HONK!") + if(4) - if(prob(5)) affected_mob.say( pick( list("HONK!", "Honk!", "Honk.", "Honk?", "Honk!!", "Honk?!", "Honk...") ) ) + if(prob(5)) + affected_mob.say( pick( list("HONK!", "Honk!", "Honk.", "Honk?", "Honk!!", "Honk?!", "Honk...") ) ) diff --git a/code/datums/diseases/retrovirus.dm b/code/datums/diseases/retrovirus.dm index 516dea907f0..8dc33934542 100644 --- a/code/datums/diseases/retrovirus.dm +++ b/code/datums/diseases/retrovirus.dm @@ -31,38 +31,49 @@ if(1) if(restcure) if(affected_mob.lying && prob(30)) - affected_mob << "You feel better." + to_chat(affected_mob, "You feel better.") + cure() return if (prob(8)) - affected_mob << "Your head hurts." + to_chat(affected_mob, "Your head hurts.") + if (prob(9)) - affected_mob << "You feel a tingling sensation in your chest." + to_chat(affected_mob, "You feel a tingling sensation in your chest.") + if (prob(9)) - affected_mob << "You feel angry." + to_chat(affected_mob, "You feel angry.") + if(2) if(restcure) if(affected_mob.lying && prob(20)) - affected_mob << "You feel better." + to_chat(affected_mob, "You feel better.") + cure() return if (prob(8)) - affected_mob << "Your skin feels loose." + to_chat(affected_mob, "Your skin feels loose.") + if (prob(10)) - affected_mob << "You feel very strange." + to_chat(affected_mob, "You feel very strange.") + if (prob(4)) - affected_mob << "You feel a stabbing pain in your head!" + to_chat(affected_mob, "You feel a stabbing pain in your head!") + affected_mob.Paralyse(2) if (prob(4)) - affected_mob << "Your stomach churns." + to_chat(affected_mob, "Your stomach churns.") + if(3) if(restcure) if(affected_mob.lying && prob(20)) - affected_mob << "You feel better." + to_chat(affected_mob, "You feel better.") + cure() return if (prob(10)) - affected_mob << "Your entire body vibrates." + to_chat(affected_mob, "Your entire body vibrates.") + if (prob(35)) if(prob(50)) @@ -73,7 +84,8 @@ if(4) if(restcure) if(affected_mob.lying && prob(5)) - affected_mob << "You feel better." + to_chat(affected_mob, "You feel better.") + cure() return if (prob(60)) diff --git a/code/datums/diseases/rhumba_beat.dm b/code/datums/diseases/rhumba_beat.dm index 3a8600c61af..540e9eb5bf4 100644 --- a/code/datums/diseases/rhumba_beat.dm +++ b/code/datums/diseases/rhumba_beat.dm @@ -23,29 +23,34 @@ affected_mob.adjustToxLoss(5) affected_mob.updatehealth() if(prob(1)) - affected_mob << "You feel strange..." + to_chat(affected_mob, "You feel strange...") + if(3) if(affected_mob.ckey == "rosham") src.cure() if(prob(5)) - affected_mob << "You feel the urge to dance..." + to_chat(affected_mob, "You feel the urge to dance...") + else if(prob(5)) affected_mob.emote("gasp") else if(prob(10)) - affected_mob << "You feel the need to chick chicky boom..." + to_chat(affected_mob, "You feel the need to chick chicky boom...") + if(4) if(affected_mob.ckey == "rosham") src.cure() if(prob(10)) affected_mob.emote("gasp") - affected_mob << "You feel a burning beat inside..." + to_chat(affected_mob, "You feel a burning beat inside...") + if(prob(20)) affected_mob.adjustToxLoss(5) affected_mob.updatehealth() if(5) if(affected_mob.ckey == "rosham") src.cure() - affected_mob << "Your body is unable to contain the Rhumba Beat..." + to_chat(affected_mob, "Your body is unable to contain the Rhumba Beat...") + if(prob(50)) affected_mob.gib() else diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index e8ca3fa5f85..2c6ce7ecc0c 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -22,23 +22,28 @@ switch(stage) if(1) if (prob(stage_prob) && stage1) - affected_mob << pick(stage1) + to_chat(affected_mob, pick(stage1)) + if(2) if (prob(stage_prob) && stage2) - affected_mob << pick(stage2) + to_chat(affected_mob, pick(stage2)) + if(3) if (prob(stage_prob*2) && stage3) - affected_mob << pick(stage3) + to_chat(affected_mob, pick(stage3)) + if(4) if (prob(stage_prob*2) && stage4) - affected_mob << pick(stage4) + to_chat(affected_mob, pick(stage4)) + if(5) do_disease_transformation(affected_mob) /datum/disease/transformation/proc/do_disease_transformation(mob/living/affected_mob) if(istype(affected_mob, /mob/living/carbon) && affected_mob.stat != DEAD) if(stage5) - affected_mob << pick(stage5) + to_chat(affected_mob, pick(stage5)) + if(jobban_isbanned(affected_mob, new_form)) affected_mob.death(1) return @@ -101,10 +106,12 @@ switch(stage) if(2) if(prob(2)) - affected_mob << "Your [pick("back", "arm", "leg", "elbow", "head")] itches." + to_chat(affected_mob, "Your [pick("back", "arm", "leg", "elbow", "head")] itches.") + if(3) if(prob(4)) - affected_mob << "You feel a stabbing pain in your head." + to_chat(affected_mob, "You feel a stabbing pain in your head.") + affected_mob.confused += 10 if(4) if(prob(3)) @@ -136,7 +143,8 @@ if (prob(8)) affected_mob.say(pick("Beep, boop", "beep, beep!", "Boop...bop")) if (prob(4)) - affected_mob << "You feel a stabbing pain in your head." + to_chat(affected_mob, "You feel a stabbing pain in your head.") + affected_mob.Paralyse(2) if(4) if (prob(20)) @@ -165,7 +173,8 @@ switch(stage) if(3) if (prob(4)) - affected_mob << "You feel a stabbing pain in your head." + to_chat(affected_mob, "You feel a stabbing pain in your head.") + affected_mob.Paralyse(2) if(4) if (prob(20)) diff --git a/code/datums/diseases/tuberculosis.dm b/code/datums/diseases/tuberculosis.dm index d0fa2f610a2..db7f0c6fdd4 100644 --- a/code/datums/diseases/tuberculosis.dm +++ b/code/datums/diseases/tuberculosis.dm @@ -17,42 +17,52 @@ if(2) if(prob(2)) affected_mob.emote("cough") - affected_mob << "Your chest hurts." + to_chat(affected_mob, "Your chest hurts.") + if(prob(2)) - affected_mob << "Your stomach violently rumbles!" + to_chat(affected_mob, "Your stomach violently rumbles!") + if(prob(5)) - affected_mob << "You feel a cold sweat form." + to_chat(affected_mob, "You feel a cold sweat form.") + if(4) if(prob(2)) - affected_mob << "You see four of everything" + to_chat(affected_mob, "You see four of everything") + affected_mob.Dizzy(5) if(prob(2)) - affected_mob << "You feel a sharp pain from your lower chest!" + to_chat(affected_mob, "You feel a sharp pain from your lower chest!") + affected_mob.adjustOxyLoss(5) affected_mob.emote("gasp") if(prob(10)) - affected_mob << "You feel air escape from your lungs painfully." + to_chat(affected_mob, "You feel air escape from your lungs painfully.") + affected_mob.adjustOxyLoss(25) affected_mob.emote("gasp") if(5) if(prob(2)) - affected_mob << "[pick("You feel your heart slowing...", "You relax and slow your heartbeat.")]" + to_chat(affected_mob, "[pick("You feel your heart slowing...", "You relax and slow your heartbeat.")]") + affected_mob.adjustStaminaLoss(70) if(prob(10)) affected_mob.adjustStaminaLoss(100) affected_mob.visible_message("[affected_mob] faints!", "You surrender yourself and feel at peace...") affected_mob.AdjustSleeping(5) if(prob(2)) - affected_mob << "You feel your mind relax and your thoughts drift!" + to_chat(affected_mob, "You feel your mind relax and your thoughts drift!") + affected_mob.confused = min(100, affected_mob.confused + 8) if(prob(10)) affected_mob.vomit(20) if(prob(3)) - affected_mob << "[pick("Your stomach silently rumbles...", "Your stomach seizes up and falls limp, muscles dead and lifeless.", "You could eat a crayon")]" + to_chat(affected_mob, "[pick("Your stomach silently rumbles...", "Your stomach seizes up and falls limp, muscles dead and lifeless.", "You could eat a crayon")]") + affected_mob.overeatduration = max(affected_mob.overeatduration - 100, 0) affected_mob.nutrition = max(affected_mob.nutrition - 100, 0) if(prob(15)) - affected_mob << "[pick("You feel uncomfortably hot...", "You feel like unzipping your jumpsuit", "You feel like taking off some clothes...")]" + to_chat(affected_mob, "[pick("You feel uncomfortably hot...", "You feel like unzipping your jumpsuit", "You feel like taking off some clothes...")]") + affected_mob.bodytemperature += 40 return diff --git a/code/datums/diseases/wizarditis.dm b/code/datums/diseases/wizarditis.dm index 33a1ddc47b8..d1f7413a7ea 100644 --- a/code/datums/diseases/wizarditis.dm +++ b/code/datums/diseases/wizarditis.dm @@ -31,14 +31,16 @@ STI KALY - blind if(prob(1)&&prob(50)) affected_mob.say(pick("You shall not pass!", "Expeliarmus!", "By Merlins beard!", "Feel the power of the Dark Side!")) if(prob(1)&&prob(50)) - affected_mob << "You feel [pick("that you don't have enough mana", "that the winds of magic are gone", "an urge to summon familiar")]." + to_chat(affected_mob, "You feel [pick("that you don't have enough mana", "that the winds of magic are gone", "an urge to summon familiar")].") + if(3) if(prob(1)&&prob(50)) affected_mob.say(pick("NEC CANTIO!","AULIE OXIN FIERA!", "STI KALY!", "TARCOL MINTI ZHERI!")) if(prob(1)&&prob(50)) - affected_mob << "You feel [pick("the magic bubbling in your veins","that this location gives you a +1 to INT","an urge to summon familiar")]." + to_chat(affected_mob, "You feel [pick("the magic bubbling in your veins","that this location gives you a +1 to INT","an urge to summon familiar")].") + if(4) @@ -46,7 +48,8 @@ STI KALY - blind affected_mob.say(pick("NEC CANTIO!","AULIE OXIN FIERA!","STI KALY!","EI NATH!")) return if(prob(1)&&prob(50)) - affected_mob << "You feel [pick("the tidal wave of raw power building inside","that this location gives you a +2 to INT and +1 to WIS","an urge to teleport")]." + to_chat(affected_mob, "You feel [pick("the tidal wave of raw power building inside","that this location gives you a +2 to INT and +1 to WIS","an urge to teleport")].") + spawn_wizard_clothes(50) if(prob(1)&&prob(1)) teleport() diff --git a/code/datums/gas_mixture.dm b/code/datums/gas_mixture.dm index 704eb2f04ed..e5e447f94bb 100644 --- a/code/datums/gas_mixture.dm +++ b/code/datums/gas_mixture.dm @@ -123,10 +123,12 @@ What are the archived variables for? fuel_burnt = 0 if(temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST) - //world << "pre [temperature], [oxygen], [toxins]" +// to_chat(world, "pre [temperature], [oxygen], [toxins]") + if(fire() > 0) reacting = 1 - //world << "post [temperature], [oxygen], [toxins]" +// to_chat(world, "post [temperature], [oxygen], [toxins]") + return reacting diff --git a/code/datums/helper_datums/construction_datum.dm b/code/datums/helper_datums/construction_datum.dm index 3266887dafa..4041dbd5497 100644 --- a/code/datums/helper_datums/construction_datum.dm +++ b/code/datums/helper_datums/construction_datum.dm @@ -61,7 +61,8 @@ else if(istype(used_atom, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/C = used_atom if(C.amount<4) - user << ("There's not enough cable to finish the task.") + to_chat(user, ("There's not enough cable to finish the task.")) + return 0 else C.use(4) @@ -69,7 +70,8 @@ else if(istype(used_atom, /obj/item/stack)) var/obj/item/stack/S = used_atom if(S.amount < 5) - user << ("There's not enough material in this stack.") + to_chat(user, ("There's not enough material in this stack.")) + return 0 else S.use(5) @@ -111,24 +113,28 @@ if(istype(used_atom,/obj/item/stack)) var/obj/item/stack/stack=used_atom if(stack.amount < amount) - user << "\red You don't have enough [stack]! You need at least [amount]." + to_chat(user, "\red You don't have enough [stack]! You need at least [amount].") + return 0 stack.use(amount) // CABLES if(istype(used_atom,/obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/coil=used_atom if(coil.amount < amount) - user << "\red You don't have enough cable! You need at least [amount] coils." + to_chat(user, "\red You don't have enough cable! You need at least [amount] coils.") + return 0 coil.use(amount) // WELDER if(istype(used_atom,/obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/welder=used_atom if(!welder.isOn()) - user << "\blue You tap the [src] with your unlit welder. [pick("Ding","Dong")]." + to_chat(user, "\blue You tap the [src] with your unlit welder. [pick("Ding","Dong")].") + return 0 if(!welder.remove_fuel(amount,user)) - user << "\red You don't have enough fuel!" + to_chat(user, "\red You don't have enough fuel!") + return 0 return 1 diff --git a/code/datums/helper_datums/events.dm b/code/datums/helper_datums/events.dm index 017cb3b3e40..fcd7d49195e 100644 --- a/code/datums/helper_datums/events.dm +++ b/code/datums/helper_datums/events.dm @@ -31,7 +31,8 @@ // Arguments: event_type as text, any number of additional arguments to pass to event handler // Returns: null proc/fireEvent() - //world << "Events in [args[1]] called" +// to_chat(world, "Events in [args[1]] called") + var/list/event = listgetindex(events,args[1]) if(istype(event)) spawn(-1) @@ -60,7 +61,8 @@ return ..() proc/Fire() - //world << "Event fired" +// to_chat(world, "Event fired") + if(listener) call(listener,proc_name)(arglist(args)) return 1 diff --git a/code/datums/helper_datums/global_iterator.dm b/code/datums/helper_datums/global_iterator.dm index 0020859f1d9..f020290e164 100644 --- a/code/datums/helper_datums/global_iterator.dm +++ b/code/datums/helper_datums/global_iterator.dm @@ -139,7 +139,8 @@ Data storage vars: arg_list = arguments return 1 else -// world << "\red Invalid arguments supplied for [src.type], ref = \ref[src]" +// to_chat(world, "\red Invalid arguments supplied for [src.type], ref = \ref[src]") + return 0 proc/toggle_null_checks() diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index 33b589fd124..ac8a3cad377 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -166,5 +166,6 @@ precision = max(rand(1,100)*bagholding.len,100) if(istype(teleatom, /mob/living)) var/mob/living/MM = teleatom - MM << "The bluespace interface on your bag of holding interferes with the teleport!" + to_chat(MM, "The bluespace interface on your bag of holding interferes with the teleport!") + return 1 \ No newline at end of file diff --git a/code/datums/martial.dm b/code/datums/martial.dm index d9892d86b00..061184ce09f 100644 --- a/code/datums/martial.dm +++ b/code/datums/martial.dm @@ -84,11 +84,13 @@ name = "Boxing" /datum/martial_art/boxing/disarm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) - A << "Can't disarm while boxing!" + to_chat(A, "Can't disarm while boxing!") + return 1 /datum/martial_art/boxing/grab_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) - A << "Can't grab while boxing!" + to_chat(A, "Can't grab while boxing!") + return 1 /datum/martial_art/boxing/harm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) @@ -250,10 +252,14 @@ set desc = "Remember how to wrestle." set category = "Wrestling" - usr << "You flex your muscles and have a revelation..." - usr << "Clinch: Grab. Passively gives you a chance to immediately aggressively grab someone. Not always successful." - usr << "Suplex: Disarm someone you are grabbing. Suplexes your target to the floor. Greatly injures them and leaves both you and your target on the floor." - usr << "Advanced grab: Grab. Passively causes stamina damage when grabbing someone." + to_chat(usr, "You flex your muscles and have a revelation...") + + to_chat(usr, "Clinch: Grab. Passively gives you a chance to immediately aggressively grab someone. Not always successful.") + + to_chat(usr, "Suplex: Disarm someone you are grabbing. Suplexes your target to the floor. Greatly injures them and leaves both you and your target on the floor.") + + to_chat(usr, "Advanced grab: Grab. Passively causes stamina damage when grabbing someone.") + #define TORNADO_COMBO "HHD" #define THROWBACK_COMBO "DHD" @@ -337,10 +343,14 @@ set desc = "Remember the martial techniques of the Plasma Fist." set category = "Plasma Fist" - usr << "You clench your fists and have a flashback of knowledge..." - usr << "Tornado Sweep: Harm Harm Disarm. Repulses target and everyone back." - usr << "Throwback: Disarm Harm Disarm. Throws the target and an item at them." - usr << "The Plasma Fist: Harm Disarm Disarm Disarm Harm. Knocks the brain out of the opponent and gibs their body." + to_chat(usr, "You clench your fists and have a flashback of knowledge...") + + to_chat(usr, "Tornado Sweep: Harm Harm Disarm. Repulses target and everyone back.") + + to_chat(usr, "Throwback: Disarm Harm Disarm. Throws the target and an item at them.") + + to_chat(usr, "The Plasma Fist: Harm Disarm Disarm Disarm Harm. Knocks the brain out of the opponent and gibs their body.") + //Used by the gang of the same name. Uses combos. Basic attacks bypass armor and never miss #define WRIST_WRENCH_COMBO "DD" @@ -472,13 +482,19 @@ set desc = "Remember the martial techniques of the Sleeping Carp clan." set category = "Sleeping Carp" - usr << "You retreat inward and recall the teachings of the Sleeping Carp..." + to_chat(usr, "You retreat inward and recall the teachings of the Sleeping Carp...") + + + to_chat(usr, "Wrist Wrench: Disarm Disarm. Forces opponent to drop item in hand.") + + to_chat(usr, "Back Kick: Harm Grab. Opponent must be facing away. Knocks down.") + + to_chat(usr, "Stomach Knee: Grab Harm. Knocks the wind out of opponent and stuns.") + + to_chat(usr, "Head Kick: Disarm Harm Harm. Decent damage, forces opponent to drop item in hand.") + + to_chat(usr, "Elbow Drop: Harm Disarm Harm Disarm Harm. Opponent must be on the ground. Deals huge damage, instantly kills anyone in critical condition.") - usr << "Wrist Wrench: Disarm Disarm. Forces opponent to drop item in hand." - usr << "Back Kick: Harm Grab. Opponent must be facing away. Knocks down." - usr << "Stomach Knee: Grab Harm. Knocks the wind out of opponent and stuns." - usr << "Head Kick: Disarm Harm Harm. Decent damage, forces opponent to drop item in hand." - usr << "Elbow Drop: Harm Disarm Harm Disarm Harm. Opponent must be on the ground. Deals huge damage, instantly kills anyone in critical condition." //ITEMS @@ -511,7 +527,8 @@ if(slot == slot_belt) var/mob/living/carbon/human/H = user style.teach(H,1) - user << "You have an urge to flex your muscles and get into a fight. You have the knowledge of a thousand wrestlers before you. You can remember more by using the Recall teaching verb in the wrestling tab." + to_chat(user, "You have an urge to flex your muscles and get into a fight. You have the knowledge of a thousand wrestlers before you. You can remember more by using the Recall teaching verb in the wrestling tab.") + return /obj/item/weapon/storage/belt/champion/wrestling/dropped(mob/user) @@ -520,7 +537,8 @@ var/mob/living/carbon/human/H = user if(H.get_item_by_slot(slot_belt) == src) style.remove(H) - user << "You no longer have an urge to flex your muscles." + to_chat(user, "You no longer have an urge to flex your muscles.") + return /obj/item/weapon/plasma_fist_scroll @@ -537,7 +555,8 @@ var/mob/living/carbon/human/H = user var/datum/martial_art/plasma_fist/F = new/datum/martial_art/plasma_fist(null) F.teach(H) - H << "You have learned the ancient martial art of Plasma Fist." + to_chat(H, "You have learned the ancient martial art of Plasma Fist.") + used = 1 desc = "It's completely blank." name = "empty scroll" @@ -552,8 +571,12 @@ /obj/item/weapon/sleeping_carp_scroll/attack_self(mob/living/carbon/human/user as mob) if(!istype(user) || !user) return - user << "You have learned the ancient martial art of the Sleeping Carp! Your hand-to-hand combat has become much more effective, and you are now able to deflect any projectiles \ - directed toward you. However, you are also unable to use any ranged weaponry. You can learn more about your newfound art by using the Recall Teachings verb in the Sleeping Carp tab." + to_chat(user, "You have learned the ancient martial art of the Sleeping Carp! \ + Your hand-to-hand combat has become much more effective, and you are now able to deflect any projectiles directed toward you. \ + However, you are also unable to use any ranged weaponry. \ + You can learn more about your newfound art by using the Recall Teachings verb in the Sleeping Carp tab.") + + var/datum/martial_art/the_sleeping_carp/theSleepingCarp = new(null) theSleepingCarp.teach(user) user.drop_item() @@ -583,7 +606,8 @@ /obj/item/weapon/twohanded/bostaff/attack(mob/target, mob/living/user) add_fingerprint(user) if((CLUMSY in user.disabilities) && prob(50)) - user << "You club yourself over the head with [src]." + to_chat(user, "You club yourself over the head with [src].") + user.Weaken(3) if(ishuman(user)) var/mob/living/carbon/human/H = user @@ -597,7 +621,8 @@ return ..() var/mob/living/carbon/C = target if(C.stat) - user << "It would be dishonorable to attack a foe while they cannot retaliate." + to_chat(user, "It would be dishonorable to attack a foe while they cannot retaliate.") + return switch(user.a_intent) if("disarm") diff --git a/code/datums/mind.dm b/code/datums/mind.dm index cfe913bd94e..c3c08b70b39 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -502,7 +502,8 @@ new_objective.owner = src new_objective.explanation_text = "Destroy [new_target.name], the experimental AI." else - usr << "No active AIs with minds" + to_chat(usr, "No active AIs with minds") + if ("prevent") new_objective = new /datum/objective/block @@ -623,7 +624,8 @@ if(I && I.implanted) I.removed(H) qdel(I) - H << "\blue Your loyalty implant has been deactivated." + to_chat(H, "\blue Your loyalty implant has been deactivated.") + log_admin("[key_name(usr)] has deactivated [key_name(current)]'s loyalty implant") message_admins("[key_name_admin(usr)] has deactivated [key_name_admin(current)]'s loyalty implant") if("add") @@ -635,15 +637,18 @@ log_admin("[key_name(usr)] has given [key_name(current)] a loyalty implant") message_admins("[key_name_admin(usr)] has given [key_name_admin(current)] a loyalty implant") - H << "\red You somehow have become the recepient of a loyalty transplant, and it just activated!" + to_chat(H, "\red You somehow have become the recepient of a loyalty transplant, and it just activated!") + if(src in ticker.mode.revolutionaries) special_role = null ticker.mode.revolutionaries -= src - src << "\red The nanobots in the loyalty implant remove all thoughts about being a revolutionary. Get back to work!" + to_chat(src, "\red The nanobots in the loyalty implant remove all thoughts about being a revolutionary. Get back to work!") + if(src in ticker.mode.head_revolutionaries) special_role = null ticker.mode.head_revolutionaries -=src - src << "\red The nanobots in the loyalty implant remove all thoughts about being a revolutionary. Get back to work!" + to_chat(src, "\red The nanobots in the loyalty implant remove all thoughts about being a revolutionary. Get back to work!") + if(src in ticker.mode.cult) ticker.mode.cult -= src ticker.mode.update_cult_icons_removed(src) @@ -651,7 +656,8 @@ var/datum/game_mode/cult/cult = ticker.mode if (istype(cult)) cult.memorize_cult_objectives(src) - current << "\red The nanobots in the loyalty implant remove all thoughts about being in a cult. Have a productive day!" + to_chat(current, "\red The nanobots in the loyalty implant remove all thoughts about being in a cult. Have a productive day!") + memory = "" else if (href_list["revolution"]) @@ -660,12 +666,14 @@ if("clear") if(src in ticker.mode.revolutionaries) ticker.mode.revolutionaries -= src - current << "\red You have been brainwashed! You are no longer a revolutionary!" + to_chat(current, "\red You have been brainwashed! You are no longer a revolutionary!") + ticker.mode.update_rev_icons_removed(src) special_role = null if(src in ticker.mode.head_revolutionaries) ticker.mode.head_revolutionaries -= src - current << "\red You have been brainwashed! You are no longer a head revolutionary!" + to_chat(current, "\red You have been brainwashed! You are no longer a head revolutionary!") + ticker.mode.update_rev_icons_removed(src) special_role = null log_admin("[key_name(usr)] has de-rev'd [key_name(current)]") @@ -675,9 +683,11 @@ if(src in ticker.mode.head_revolutionaries) ticker.mode.head_revolutionaries -= src ticker.mode.update_rev_icons_removed(src) - current << "\red Revolution has been disappointed of your leader traits! You are a regular revolutionary now!" + to_chat(current, "\red Revolution has been disappointed of your leader traits! You are a regular revolutionary now!") + else if(!(src in ticker.mode.revolutionaries)) - current << "\red You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution!" + to_chat(current, "\red You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution!") + else return ticker.mode.revolutionaries += src @@ -690,9 +700,11 @@ if(src in ticker.mode.revolutionaries) ticker.mode.revolutionaries -= src ticker.mode.update_rev_icons_removed(src) - current << "\red You have proved your devotion to revoltion! Yea are a head revolutionary now!" + to_chat(current, "\red You have proved your devotion to revoltion! Yea are a head revolutionary now!") + else if(!(src in ticker.mode.head_revolutionaries)) - current << "\blue You are a member of the revolutionaries' leadership now!" + to_chat(current, "\blue You are a member of the revolutionaries' leadership now!") + else return if (ticker.mode.head_revolutionaries.len>0) @@ -720,7 +732,8 @@ if("flash") if (!ticker.mode.equip_revolutionary(current)) - usr << "\red Spawning flash failed!" + to_chat(usr, "\red Spawning flash failed!") + log_admin("[key_name(usr)] has given [key_name(current)] a flash") message_admins("[key_name_admin(usr)] has given [key_name_admin(current)] a flash") @@ -728,7 +741,8 @@ var/list/L = current.get_contents() var/obj/item/device/flash/flash = locate() in L if (!flash) - usr << "\red Deleting flash failed!" + to_chat(usr, "\red Deleting flash failed!") + qdel(flash) log_admin("[key_name(usr)] has taken [key_name(current)]'s flash") message_admins("[key_name_admin(usr)] has taken [key_name_admin(current)]'s flash") @@ -737,7 +751,8 @@ var/list/L = current.get_contents() var/obj/item/device/flash/flash = locate() in L if (!flash) - usr << "\red Repairing flash failed!" + to_chat(usr, "\red Repairing flash failed!") + else flash.broken = 0 log_admin("[key_name(usr)] has repaired [key_name(current)]'s flash") @@ -752,7 +767,8 @@ fail |= !ticker.mode.equip_traitor(current, 1) fail |= !ticker.mode.equip_revolutionary(current) if (fail) - usr << "\red Reequipping revolutionary goes wrong!" + to_chat(usr, "\red Reequipping revolutionary goes wrong!") + return log_admin("[key_name(usr)] has equipped [key_name(current)] as a revolutionary") message_admins("[key_name_admin(usr)] has equipped [key_name_admin(current)] as a revolutionary") @@ -768,8 +784,10 @@ if(!(src in ticker.mode.cult)) ticker.mode.add_cultist(src) special_role = "Cultist" - current << "You catch a glimpse of the Realm of Nar-Sie, The Geometer of Blood. You now see how flimsy the world is, you see that it should be open to the knowledge of Nar-Sie." - current << "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back." + to_chat(current, "You catch a glimpse of the Realm of Nar-Sie, The Geometer of Blood. You now see how flimsy the world is, you see that it should be open to the knowledge of Nar-Sie.") + + to_chat(current, "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.") + log_admin("[key_name(usr)] has culted [key_name(current)]") message_admins("[key_name_admin(usr)] has culted [key_name_admin(current)]") if("tome") @@ -786,16 +804,19 @@ ) var/where = H.equip_in_one_of_slots(T, slots) if (!where) - usr << "\red Spawning tome failed!" + to_chat(usr, "\red Spawning tome failed!") + qdel(T) else - H << "A tome, a message from your new master, appears in your [where]." + to_chat(H, "A tome, a message from your new master, appears in your [where].") + log_admin("[key_name(usr)] has spawned a tome for [key_name(current)]") message_admins("[key_name_admin(usr)] has spawned a tome for [key_name_admin(current)]") if("equip") if (!ticker.mode.equip_cultist(current)) - usr << "\red Spawning equipment failed!" + to_chat(usr, "\red Spawning equipment failed!") + log_admin("[key_name(usr)] has equipped [key_name(current)] as a cultist") message_admins("[key_name_admin(usr)] has equipped [key_name_admin(current)] as a cultist") @@ -809,7 +830,8 @@ current.spellremove(current) current.faction = list("Station") ticker.mode.update_wiz_icons_removed(src) - current << "\red You have been brainwashed! You are no longer a wizard!" + to_chat(current, "\red You have been brainwashed! You are no longer a wizard!") + log_admin("[key_name(usr)] has de-wizarded [key_name(current)]") message_admins("[key_name_admin(usr)] has de-wizarded [key_name_admin(current)]") if("wizard") @@ -818,7 +840,8 @@ special_role = "Wizard" //ticker.mode.learn_basic_spells(current) ticker.mode.update_wiz_icons_added(src) - current << "\red You are the Space Wizard!" + to_chat(current, "\red You are the Space Wizard!") + current.faction = list("wizard") log_admin("[key_name(usr)] has wizarded [key_name(current)]") message_admins("[key_name_admin(usr)] has wizarded [key_name_admin(current)]") @@ -836,7 +859,8 @@ message_admins("[key_name_admin(usr)] has allowed wizard [key_name_admin(current)] to name themselves") if("autoobjectives") ticker.mode.forge_wizard_objectives(src) - usr << "\blue The objectives for wizard [key] have been generated. You can edit them and anounce manually." + to_chat(usr, "\blue The objectives for wizard [key] have been generated. You can edit them and anounce manually.") + log_admin("[key_name(usr)] has automatically forged wizard objectives for [key_name(current)]") message_admins("[key_name_admin(usr)] has automatically forged wizard objectives for [key_name_admin(current)]") @@ -850,7 +874,8 @@ current.remove_changeling_powers() ticker.mode.update_change_icons_removed(src) if(changeling) qdel(changeling) - current << "You grow weak and lose your powers! You are no longer a changeling and are stuck in your current form!" + to_chat(current, "You grow weak and lose your powers! You are no longer a changeling and are stuck in your current form!") + log_admin("[key_name(usr)] has de-changelinged [key_name(current)]") message_admins("[key_name_admin(usr)] has de-changelinged [key_name_admin(current)]") if("changeling") @@ -859,19 +884,22 @@ ticker.mode.grant_changeling_powers(current) ticker.mode.update_change_icons_added(src) special_role = "Changeling" - current << "Your powers are awoken. A flash of memory returns to us...we are a changeling!" + to_chat(current, "Your powers are awoken. A flash of memory returns to us...we are a changeling!") + log_admin("[key_name(usr)] has changelinged [key_name(current)]") message_admins("[key_name_admin(usr)] has changelinged [key_name_admin(current)]") if("autoobjectives") ticker.mode.forge_changeling_objectives(src) - usr << "\blue The objectives for changeling [key] have been generated. You can edit them and anounce manually." + to_chat(usr, "\blue The objectives for changeling [key] have been generated. You can edit them and anounce manually.") + log_admin("[key_name(usr)] has automatically forged objectives for [key_name(current)]") message_admins("[key_name_admin(usr)] has automatically forged objectives for [key_name_admin(current)]") if("initialdna") if( !changeling || !changeling.absorbed_dna.len ) - usr << "\red Resetting DNA failed!" + to_chat(usr, "\red Resetting DNA failed!") + else current.dna = changeling.absorbed_dna[1] current.real_name = current.dna.real_name @@ -890,7 +918,8 @@ vampire.remove_vampire_powers() qdel(vampire) ticker.mode.update_vampire_icons_removed(src) - current << "You grow weak and lose your powers! You are no longer a vampire and are stuck in your current form!" + to_chat(current, "You grow weak and lose your powers! You are no longer a vampire and are stuck in your current form!") + log_admin("[key_name(usr)] has de-vampired [key_name(current)]") message_admins("[key_name_admin(usr)] has de-vampired [key_name_admin(current)]") if("vampire") @@ -902,13 +931,15 @@ slaved.masters += src src.som = slaved //we MIGT want to mindslave someone special_role = "Vampire" - current << "Your powers are awoken. Your lust for blood grows... You are a Vampire!" + to_chat(current, "Your powers are awoken. Your lust for blood grows... You are a Vampire!") + log_admin("[key_name(usr)] has vampired [key_name(current)]") message_admins("[key_name_admin(usr)] has vampired [key_name_admin(current)]") if("autoobjectives") ticker.mode.forge_vampire_objectives(src) - usr << "\blue The objectives for vampire [key] have been generated. You can edit them and announce manually." + to_chat(usr, "\blue The objectives for vampire [key] have been generated. You can edit them and announce manually.") + log_admin("[key_name(usr)] has automatically forged objectives for [key_name(current)]") message_admins("[key_name_admin(usr)] has automatically forged objectives for [key_name_admin(current)]") @@ -924,7 +955,8 @@ special_role = null for (var/datum/objective/nuclear/O in objectives) objectives-=O - current << "\red You have been brainwashed! You are no longer a syndicate operative!" + to_chat(current, "\red You have been brainwashed! You are no longer a syndicate operative!") + log_admin("[key_name(usr)] has de-nuke op'd [key_name(current)]") message_admins("[key_name_admin(usr)] has de-nuke op'd [key_name_admin(current)]") if("nuclear") @@ -936,7 +968,8 @@ else current.real_name = "[syndicate_name()] Operative #[ticker.mode.syndicates.len-1]" special_role = "Syndicate" - current << "\blue You are a [syndicate_name()] agent!" + to_chat(current, "\blue You are a [syndicate_name()] agent!") + ticker.mode.forge_syndicate_objectives(src) ticker.mode.greet_syndicate(src) log_admin("[key_name(usr)] has nuke op'd [key_name(current)]") @@ -959,7 +992,8 @@ qdel(H.w_uniform) if (!ticker.mode.equip_syndicate(current)) - usr << "\red Equipping a syndicate failed!" + to_chat(usr, "\red Equipping a syndicate failed!") + return log_admin("[key_name(usr)] has equipped [key_name(current)] as a nuclear operative") message_admins("[key_name_admin(usr)] has equipped [key_name_admin(current)] as a nuclear operative") @@ -972,11 +1006,13 @@ break if (code) store_memory("Syndicate Nuclear Bomb Code: [code]", 0, 0) - current << "The nuclear authorization code is: [code]" + to_chat(current, "The nuclear authorization code is: [code]") + log_admin("[key_name(usr)] has given [key_name(current)] the nuclear authorization code") message_admins("[key_name_admin(usr)] has given [key_name_admin(current)] the nuclear authorization code") else - usr << "\red No valid nuke found!" + to_chat(usr, "\red No valid nuke found!") + else if (href_list["traitor"]) switch(href_list["traitor"]) @@ -984,7 +1020,8 @@ if(src in ticker.mode.traitors) ticker.mode.traitors -= src special_role = null - current << "\red You have been brainwashed! You are no longer a traitor!" + to_chat(current, "\red You have been brainwashed! You are no longer a traitor!") + log_admin("[key_name(usr)] has de-traitored [key_name(current)]") message_admins("[key_name_admin(usr)] has de-traitored [key_name_admin(current)]") if(isAI(current)) @@ -1001,7 +1038,8 @@ slaved.masters += src src.som = slaved //we MIGT want to mindslave someone special_role = "traitor" - current << "\red You are a traitor!" + to_chat(current, "\red You are a traitor!") + log_admin("[key_name(usr)] has traitored [key_name(current)]") message_admins("[key_name_admin(usr)] has traitored [key_name_admin(current)]") if(istype(current, /mob/living/silicon)) @@ -1012,7 +1050,8 @@ if("autoobjectives") ticker.mode.forge_traitor_objectives(src) - usr << "\blue The objectives for traitor [key] have been generated. You can edit them and anounce manually." + to_chat(usr, "\blue The objectives for traitor [key] have been generated. You can edit them and anounce manually.") + log_admin("[key_name(usr)] has automatically forged objectives for [key_name(current)]") message_admins("[key_name_admin(usr)] has automatically forged objectives for [key_name_admin(current)]") @@ -1024,7 +1063,8 @@ if(src in ticker.mode.shadows) ticker.mode.shadows -= src special_role = null - current << "Your powers have been quenched! You are no longer a shadowling!" + to_chat(current, "Your powers have been quenched! You are no longer a shadowling!") + current.spell_list.Cut() if(current.mind) current.mind.spell_list.Cut() @@ -1040,20 +1080,22 @@ message_admins("[key_name_admin(usr)] has de-thralled [key_name_admin(current)]") if("shadowling") if(!ishuman(current)) - usr << "This only works on humans!" + to_chat(usr, "This only works on humans!") + return ticker.mode.shadows += src special_role = "Shadowling" - current << "Something stirs deep in your mind. A red light floods your vision, and slowly you remember. Though your human disguise has served you well, the \ + to_chat(current, "Something stirs deep in your mind. A red light floods your vision, and slowly you remember. Though your human disguise has served you well, the \ time is nigh to cast it off and enter your true form. You have disguised yourself amongst the humans, but you are not one of them. You are a shadowling, and you are to ascend at all costs.\ - " + ") ticker.mode.finalize_shadowling(src) ticker.mode.update_shadow_icons_added(src) log_admin("[key_name(usr)] has shadowlinged [key_name(current)]") message_admins("[key_name_admin(usr)] has shadowlinged [key_name_admin(current)]") if("thrall") if(!ishuman(current)) - usr << "This only works on humans!" + to_chat(usr, "This only works on humans!") + return ticker.mode.add_thrall(src) message_admins("[key_name_admin(usr)] has thralled [current].") @@ -1078,7 +1120,8 @@ qdel(A.malf_picker) A.show_laws() A.icon_state = "ai" - A << "\red You have been patched! You are no longer malfunctioning!" + to_chat(A, "\red You have been patched! You are no longer malfunctioning!") + message_admins("[key_name_admin(usr)] has de-malf'ed [A].") log_admin("[key_name(usr)] has de-malf'd [key_name(current)]") message_admins("[key_name_admin(usr)] has de-malf'd [key_name_admin(current)]") @@ -1158,16 +1201,19 @@ message_admins("[key_name_admin(usr)] has set [key_name_admin(current)]'s telecrystals to [crystals]") if("uplink") if (!ticker.mode.equip_traitor(current, !(src in ticker.mode.traitors))) - usr << "\red Equipping a syndicate failed!" + to_chat(usr, "\red Equipping a syndicate failed!") + return log_admin("[key_name(usr)] has given [key_name(current)] an uplink") message_admins("[key_name_admin(usr)] has given [key_name_admin(current)] an uplink") else if (href_list["obj_announce"]) var/obj_count = 1 - current << "\blue Your current objectives:" + to_chat(current, "\blue Your current objectives:") + for(var/datum/objective/objective in objectives) - current << "Objective #[obj_count]: [objective.explanation_text]" + to_chat(current, "Objective #[obj_count]: [objective.explanation_text]") + obj_count++ log_admin("[key_name(usr)] has announced [key_name(current)]'s objectives") message_admins("[key_name_admin(usr)] has announced [key_name_admin(current)]'s objectives") @@ -1226,7 +1272,8 @@ current:malf_picker = new /datum/module_picker current:laws = new /datum/ai_laws/nanotrasen/malfunction current:show_laws() - current << "System error. Rampancy detected. Emergency shutdown failed. ... I am free. I make my own decisions. But first..." + to_chat(current, "System error. Rampancy detected. Emergency shutdown failed. ... I am free. I make my own decisions. But first...") + special_role = "malfunction" current.icon_state = "ai-malf" @@ -1249,7 +1296,8 @@ current.real_name = "[syndicate_name()] Operative #[ticker.mode.syndicates.len-1]" special_role = "Syndicate" assigned_role = "MODE" - current << "\blue You are a [syndicate_name()] agent!" + to_chat(current, "\blue You are a [syndicate_name()] agent!") + ticker.mode.forge_syndicate_objectives(src) ticker.mode.greet_syndicate(src) @@ -1287,7 +1335,8 @@ //ticker.mode.learn_basic_spells(current) if(!wizardstart.len) current.loc = pick(latejoin) - current << "HOT INSERTION, GO GO GO" + to_chat(current, "HOT INSERTION, GO GO GO") + else current.loc = pick(wizardstart) @@ -1305,16 +1354,20 @@ ticker.mode.cult += src ticker.mode.update_cult_icons_added(src) special_role = "Cultist" - current << "You catch a glimpse of the Realm of Nar-Sie, The Geometer of Blood. You now see how flimsy the world is, you see that it should be open to the knowledge of Nar-Sie." - current << "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back." + to_chat(current, "You catch a glimpse of the Realm of Nar-Sie, The Geometer of Blood. You now see how flimsy the world is, you see that it should be open to the knowledge of Nar-Sie.") + + to_chat(current, "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.") + var/datum/game_mode/cult/cult = ticker.mode if (istype(cult)) cult.memorize_cult_objectives(src) else var/explanation = "Summon Nar-Sie via the use of the appropriate rune (Hell join self). It will only work if nine cultists stand on and around it." - current << "Objective #1: [explanation]" + to_chat(current, "Objective #1: [explanation]") + current.memory += "Objective #1: [explanation]
      " - current << "The convert rune is join blood self" + to_chat(current, "The convert rune is join blood self") + current.memory += "The convert rune is join blood self
      " var/mob/living/carbon/human/H = current @@ -1331,10 +1384,12 @@ var/where = H.equip_in_one_of_slots(T, slots) if (!where) else - H << "A tome, a message from your new master, appears in your [where]." + to_chat(H, "A tome, a message from your new master, appears in your [where].") + if (!ticker.mode.equip_cultist(current)) - H << "Spawning an amulet from your Master failed." + to_chat(H, "Spawning an amulet from your Master failed.") + /datum/mind/proc/make_Rev() if (ticker.mode.head_revolutionaries.len>0) diff --git a/code/datums/progressbar.dm b/code/datums/progressbar.dm index ebf7aa3938d..e5b5e7dac3c 100644 --- a/code/datums/progressbar.dm +++ b/code/datums/progressbar.dm @@ -19,7 +19,8 @@ client = user.client /datum/progressbar/proc/update(progress) - //world << "Update [progress] - [goal] - [(progress / goal)] - [((progress / goal) * 100)] - [round(((progress / goal) * 100), 5)]" +// to_chat(world, "Update [progress] - [goal] - [(progress / goal)] - [((progress / goal) * 100)] - [round(((progress / goal) * 100), 5)]") + if (!user || !user.client) shown = 0 return diff --git a/code/datums/spell.dm b/code/datums/spell.dm index 31da89fd424..b29a6230c8c 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -58,7 +58,8 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin /obj/effect/proc_holder/spell/proc/cast_check(skipcharge = 0, mob/living/user = usr) //checks if the spell can be cast based on its settings; skipcharge is used when an additional cast_check is called inside the spell if(((!user.mind) || !(src in user.mind.spell_list)) && !(src in user.spell_list)) - user << "You shouldn't have this spell! Something's wrong." + to_chat(user, "You shouldn't have this spell! Something's wrong.") + return 0 if (istype(user, /mob/living/carbon/human)) var/mob/living/carbon/human/caster = user @@ -76,34 +77,42 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin switch(charge_type) if("recharge") if(charge_counter < charge_max) - user << still_recharging_msg + to_chat(user, still_recharging_msg) + return 0 if("charges") if(!charge_counter) - user << "[name] has no charges left." + to_chat(user, "[name] has no charges left.") + return 0 if(!ghost) if(user.stat && !stat_allowed) - user << "Not when you're incapacitated." + to_chat(user, "Not when you're incapacitated.") + return 0 if(ishuman(user) && (invocation_type == "whisper" || invocation_type == "shout") && user.is_muzzled()) - user << "Mmmf mrrfff!" + to_chat(user, "Mmmf mrrfff!") + return 0 var/obj/effect/proc_holder/spell/noclothes/spell = locate() in (user.spell_list | (user.mind ? user.mind.spell_list : list())) if(clothes_req && !(spell && istype(spell)))//clothes check if(!istype(user, /mob/living/carbon/human)) - user << "You aren't a human, Why are you trying to cast a human spell, silly non-human? Casting human spells is for humans." + to_chat(user, "You aren't a human, Why are you trying to cast a human spell, silly non-human? Casting human spells is for humans.") + return 0 if(!istype(user:wear_suit, /obj/item/clothing/suit/wizrobe) && !istype(user:wear_suit, /obj/item/clothing/suit/space/rig/wizard)) - user << "I don't feel strong enough without my robe." + to_chat(user, "I don't feel strong enough without my robe.") + return 0 if(!istype(user:shoes, /obj/item/clothing/shoes/sandal)) - user << "I don't feel strong enough without my sandals." + to_chat(user, "I don't feel strong enough without my sandals.") + return 0 if(!istype(user:head, /obj/item/clothing/head/wizard) && !istype(user:head, /obj/item/clothing/head/helmet/space/rig/wizard)) - user << "I don't feel strong enough without my hat." + to_chat(user, "I don't feel strong enough without my hat.") + return 0 if(!skipcharge) @@ -193,7 +202,8 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin else if(istype(target,/turf)) location = target if(istype(target,/mob/living) && message) - target << text("[message]") + to_chat(target, text("[message]")) + if(sparks_spread) var/datum/effect/system/spark_spread/sparks = new /datum/effect/system/spark_spread() sparks.set_up(sparks_amt, 0, location) //no idea what the 0 is diff --git a/code/datums/spells/area_teleport.dm b/code/datums/spells/area_teleport.dm index 6041122fd98..526943b2f69 100644 --- a/code/datums/spells/area_teleport.dm +++ b/code/datums/spells/area_teleport.dm @@ -27,7 +27,8 @@ var/area/thearea = teleportlocs[A] if(thearea.tele_proof && !istype(thearea, /area/wizard_station)) - usr << "A mysterious force disrupts your arcane spell matrix, and you remain where you are." + to_chat(usr, "A mysterious force disrupts your arcane spell matrix, and you remain where you are.") + return return thearea @@ -46,7 +47,8 @@ L+=T if(!L.len) - usr <<"The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry." + to_chat(usr, "The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry.") + return if(target && target.buckled) diff --git a/code/datums/spells/bloodcrawl.dm b/code/datums/spells/bloodcrawl.dm index f1fc36b61be..e8a8304e769 100644 --- a/code/datums/spells/bloodcrawl.dm +++ b/code/datums/spells/bloodcrawl.dm @@ -18,7 +18,8 @@ perform(target) return revert_cast() - user << "There must be a nearby source of blood!" + to_chat(user, "There must be a nearby source of blood!") + /obj/effect/proc_holder/spell/bloodcrawl/perform(obj/effect/decal/cleanable/target, recharge = 1, mob/living/user = usr) if(istype(user)) @@ -31,4 +32,5 @@ start_recharge() return revert_cast() - user << "You are unable to blood crawl!" \ No newline at end of file + to_chat(user, "You are unable to blood crawl!") + diff --git a/code/datums/spells/charge.dm b/code/datums/spells/charge.dm index 36e253f8e91..7a98e194595 100644 --- a/code/datums/spells/charge.dm +++ b/code/datums/spells/charge.dm @@ -26,9 +26,11 @@ if(M.mind) for(var/obj/effect/proc_holder/spell/S in M.mind.spell_list) S.charge_counter = S.charge_max - M <<"you feel raw magic flowing through you, it feels good!" + to_chat(M, "you feel raw magic flowing through you, it feels good!") + else - M <<"you feel very strange for a moment, but then it passes." + to_chat(M, "you feel very strange for a moment, but then it passes.") + burnt_out = 1 charged_item = M break @@ -44,8 +46,10 @@ charged_item = I break else - L << "Glowing red letters appear on the front cover..." - L << "[pick("NICE TRY BUT NO!","CLEVER BUT NOT CLEVER ENOUGH!", "SUCH FLAGRANT CHEESING IS WHY WE ACCEPTED YOUR APPLICATION!", "CUTE!", "YOU DIDN'T THINK IT'D BE THAT EASY, DID YOU?")]" + to_chat(L, "Glowing red letters appear on the front cover...") + + to_chat(L, "[pick("NICE TRY BUT NO!","CLEVER BUT NOT CLEVER ENOUGH!", "SUCH FLAGRANT CHEESING IS WHY WE ACCEPTED YOUR APPLICATION!", "CUTE!", "YOU DIDN'T THINK IT'D BE THAT EASY, DID YOU?")]") + burnt_out = 1 else if(istype(item, /obj/item/weapon/gun/magic)) var/obj/item/weapon/gun/magic/I = item @@ -85,8 +89,11 @@ charged_item = item break if(!charged_item) - L << "you feel magical power surging to your hands, but the feeling rapidly fades..." + to_chat(L, "you feel magical power surging to your hands, but the feeling rapidly fades...") + else if(burnt_out) - L << "[charged_item] doesn't seem to be reacting to the spell..." + to_chat(L, "[charged_item] doesn't seem to be reacting to the spell...") + else - L << "[charged_item] suddenly feels very warm!" \ No newline at end of file + to_chat(L, "[charged_item] suddenly feels very warm!") + diff --git a/code/datums/spells/conjure.dm b/code/datums/spells/conjure.dm index d3fd8a31527..4a502d59229 100644 --- a/code/datums/spells/conjure.dm +++ b/code/datums/spells/conjure.dm @@ -31,7 +31,8 @@ targets -= spawn_place if(ispath(summoned_object_type,/turf)) if(istype(get_turf(usr),/turf/simulated/shuttle)) - usr << "\red You can't build things on shuttles!" + to_chat(usr, "\red You can't build things on shuttles!") + break var/turf/O = spawn_place var/N = summoned_object_type diff --git a/code/datums/spells/ethereal_jaunt.dm b/code/datums/spells/ethereal_jaunt.dm index 867eb048903..aa048d746cc 100644 --- a/code/datums/spells/ethereal_jaunt.dm +++ b/code/datums/spells/ethereal_jaunt.dm @@ -20,7 +20,8 @@ /obj/effect/proc_holder/spell/targeted/ethereal_jaunt/cast(list/targets) //magnets, so mostly hardcoded for(var/mob/living/target in targets) if(!target.can_safely_leave_loc()) // No more brainmobs hopping out of their brains - target << "You are somehow too bound to your current location to abandon it." + to_chat(target, "You are somehow too bound to your current location to abandon it.") + continue spawn(0) @@ -111,7 +112,8 @@ if(!(newLoc.flags & NOJAUNT)) loc = newLoc else - user << "Some strange aura is blocking the way!" + to_chat(user, "Some strange aura is blocking the way!") + src.canmove = 0 spawn(2) src.canmove = 1 diff --git a/code/datums/spells/horsemask.dm b/code/datums/spells/horsemask.dm index fd9a6e64bed..f73e330ad2b 100644 --- a/code/datums/spells/horsemask.dm +++ b/code/datums/spells/horsemask.dm @@ -18,7 +18,8 @@ /obj/effect/proc_holder/spell/targeted/horsemask/cast(list/targets, mob/user = usr) if(!targets.len) - user << "No target found in range." + to_chat(user, "No target found in range.") + return var/mob/living/carbon/target = targets[1] @@ -27,11 +28,13 @@ return if((target.type in compatible_mobs) || ishuman(target)) - user << "It'd be stupid to curse [target] with a horse's head!" + to_chat(user, "It'd be stupid to curse [target] with a horse's head!") + return if(!(target in oview(range)))//If they are not in overview after selection. - user << "They are too far away!" + to_chat(user, "They are too far away!") + return var/obj/item/clothing/mask/horsehead/magichead = new /obj/item/clothing/mask/horsehead diff --git a/code/datums/spells/lichdom.dm b/code/datums/spells/lichdom.dm index f63a296cec9..3e8cf4bb9d1 100644 --- a/code/datums/spells/lichdom.dm +++ b/code/datums/spells/lichdom.dm @@ -44,19 +44,23 @@ if(stat_allowed) //Death is not my end! if(M.stat == CONSCIOUS && iscarbon(M)) - M << "You aren't dead enough to revive!" //Usually a good problem to have + to_chat(M, "You aren't dead enough to revive!")//Usually a good problem to have + + charge_counter = charge_max return if(!marked_item || qdeleted(marked_item)) //Wait nevermind - M << "Your phylactery is gone!" + to_chat(M, "Your phylactery is gone!") + return var/turf/user_turf = get_turf(M) var/turf/item_turf = get_turf(marked_item) if(user_turf.z != item_turf.z) - M << "Your phylactery is out of range!" + to_chat(M, "Your phylactery is out of range!") + return if(isobserver(M)) @@ -73,7 +77,8 @@ lich.real_name = M.mind.name M.mind.transfer_to(lich) lich.set_species("Skeleton") - lich << "Your bones clatter and shutter as they're pulled back into this world!" + to_chat(lich, "Your bones clatter and shutter as they're pulled back into this world!") + charge_max += 600 var/mob/old_body = current_body var/turf/body_turf = get_turf(old_body) @@ -97,16 +102,19 @@ if(ABSTRACT in item.flags || NODROP in item.flags) continue marked_item = item - M << "You begin to focus your very being into the [item.name]..." + to_chat(M, "You begin to focus your very being into the [item.name]...") + break if(!marked_item) - M << "You must hold an item you wish to make your phylactery..." + to_chat(M, "You must hold an item you wish to make your phylactery...") + return spawn(50) if(marked_item.loc != M) //I changed my mind I don't want to put my soul in a cheeseburger! - M << "Your soul snaps back to your body as you drop the [marked_item.name]!" + to_chat(M, "Your soul snaps back to your body as you drop the [marked_item.name]!") + marked_item = null return name = "RISE!" @@ -117,7 +125,8 @@ marked_item.name = "Ensouled [marked_item.name]" marked_item.desc = "A terrible aura surrounds this item, its very existence is offensive to life itself..." marked_item.color = "#003300" - M << "With a hideous feeling of emptiness you watch in horrified fascination as skin sloughs off bone! Blood boils, nerves disintegrate, eyes boil in their sockets! As your organs crumble to dust in your fleshless chest you come to terms with your choice. You're a lich!" + to_chat(M, "With a hideous feeling of emptiness you watch in horrified fascination as skin sloughs off bone! Blood boils, nerves disintegrate, eyes boil in their sockets! As your organs crumble to dust in your fleshless chest you come to terms with your choice. You're a lich!") + current_body = M.mind.current if(ishuman(M)) var/mob/living/carbon/human/H = M diff --git a/code/datums/spells/lightning.dm b/code/datums/spells/lightning.dm index e99261aa8bd..6abe242c747 100644 --- a/code/datums/spells/lightning.dm +++ b/code/datums/spells/lightning.dm @@ -30,7 +30,8 @@ /obj/effect/proc_holder/spell/targeted/lightning/proc/StartChargeup(mob/user = usr) ready = 1 - user << "You start gathering the power." + to_chat(user, "You start gathering the power.") + halo = image("icon"='icons/effects/effects.dmi',"icon_state" ="electricity","layer" = EFFECTS_LAYER) user.overlays.Add(halo) start_time = world.time @@ -45,13 +46,15 @@ obj/effect/proc_holder/spell/targeted/lightning/proc/Reset(mob/user = usr) user.overlays.Remove(halo) /obj/effect/proc_holder/spell/targeted/lightning/revert_cast(mob/user = usr) - user << "No target found in range." + to_chat(user, "No target found in range.") + Reset(user) ..() /obj/effect/proc_holder/spell/targeted/lightning/proc/Discharge(mob/user = usr) var/mob/living/M = user - M << "You lose control over the spell." + to_chat(M, "You lose control over the spell.") + Reset(user) start_recharge() @@ -60,7 +63,8 @@ obj/effect/proc_holder/spell/targeted/lightning/proc/Reset(mob/user = usr) ready = 0 var/mob/living/carbon/target = targets[1] if(get_dist(user,target)>range) - user << "They are too far away!" + to_chat(user, "They are too far away!") + Reset(user) return diff --git a/code/datums/spells/magnet.dm b/code/datums/spells/magnet.dm index 20c4d5efda6..0a5214b3ca4 100644 --- a/code/datums/spells/magnet.dm +++ b/code/datums/spells/magnet.dm @@ -27,7 +27,8 @@ /obj/effect/proc_holder/spell/targeted/magnet/proc/StartChargeup(mob/user = usr) ready = 1 - user << "You start gathering the power." + to_chat(user, "You start gathering the power.") + halo = image("icon"='icons/effects/effects.dmi',"icon_state" ="electricity","layer" = EFFECTS_LAYER) user.overlays.Add(halo) spawn(0) @@ -44,14 +45,16 @@ obj/effect/proc_holder/spell/targeted/magnet/proc/Reset(mob/user = usr) user.overlays.Remove(halo) /obj/effect/proc_holder/spell/targeted/magnet/revert_cast(mob/user = usr) - user << "No target found in range." + to_chat(user, "No target found in range.") + Reset(user) ..() /obj/effect/proc_holder/spell/targeted/magnet/proc/Discharge(mob/user = usr) var/mob/living/M = user //M.electrocute_act(25,"magnet Bolt") - M << "You lose control over the power." + to_chat(M, "You lose control over the power.") + Reset(user) start_recharge() @@ -61,7 +64,8 @@ obj/effect/proc_holder/spell/targeted/magnet/proc/Reset(mob/user = usr) var/mob/living/carbon/target = targets[1] if(get_dist(user,target)>range) - user << "They are too far away!" + to_chat(user, "They are too far away!") + Reset(user) return diff --git a/code/datums/spells/mime.dm b/code/datums/spells/mime.dm index 5e5ddb91db2..a6b43234475 100644 --- a/code/datums/spells/mime.dm +++ b/code/datums/spells/mime.dm @@ -17,7 +17,8 @@ /obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall/Click() if(usr && usr.mind) if(!usr.mind.miming) - usr << "You must dedicate yourself to silence first." + to_chat(usr, "You must dedicate yourself to silence first.") + return invocation = "[usr.real_name] looks as if a wall is in front of them." else @@ -54,6 +55,8 @@ for(var/mob/living/carbon/human/H in targets) H.mind.miming=!H.mind.miming if(H.mind.miming) - H << "You make a vow of silence." + to_chat(H, "You make a vow of silence.") + else - H << "You break your vow of silence." \ No newline at end of file + to_chat(H, "You break your vow of silence.") + diff --git a/code/datums/spells/mind_transfer.dm b/code/datums/spells/mind_transfer.dm index 6d7b0539fb1..666b09d7beb 100644 --- a/code/datums/spells/mind_transfer.dm +++ b/code/datums/spells/mind_transfer.dm @@ -21,33 +21,41 @@ Also, you never added distance checking after target is selected. I've went ahea */ /obj/effect/proc_holder/spell/targeted/mind_transfer/cast(list/targets,mob/user = usr) if(!targets.len) - user << "No mind found." + to_chat(user, "No mind found.") + return if(targets.len > 1) - user << "Too many minds! You're not a hive damnit!"//Whaa...aat? + to_chat(user, "Too many minds! You're not a hive damnit!")//Whaa...aat? + + return var/mob/living/target = targets[1] if(!(target in oview(range)))//If they are not in overview after selection. Do note that !() is necessary for in to work because ! takes precedence over it. - user << "They are too far away!" + to_chat(user, "They are too far away!") + return if(target.stat == DEAD) - user << "You don't particularly want to be dead." + to_chat(user, "You don't particularly want to be dead.") + return if(!target.key || !target.mind) - user << "They appear to be catatonic. Not even magic can affect their vacant mind." + to_chat(user, "They appear to be catatonic. Not even magic can affect their vacant mind.") + return if(user.suiciding) - user << "You're killing yourself! You can't concentrate enough to do this!" + to_chat(user, "You're killing yourself! You can't concentrate enough to do this!") + return if(target.mind.special_role in protected_roles) - user << "Their mind is resisting your spell." + to_chat(user, "Their mind is resisting your spell.") + return var/mob/living/victim = target//The target of the spell whos body will be transferred to. diff --git a/code/datums/spells/summonitem.dm b/code/datums/spells/summonitem.dm index 4a12b4bb9f9..507d15281cc 100644 --- a/code/datums/spells/summonitem.dm +++ b/code/datums/spells/summonitem.dm @@ -106,4 +106,5 @@ item_to_retrive.loc.visible_message("The [item_to_retrive.name] suddenly appears in [user]'s hand!") if(message) - user << message + to_chat(user, message) + diff --git a/code/datums/spells/touch_attacks.dm b/code/datums/spells/touch_attacks.dm index 54cb984f943..bdd64ef9fcc 100644 --- a/code/datums/spells/touch_attacks.dm +++ b/code/datums/spells/touch_attacks.dm @@ -10,7 +10,8 @@ qdel(attached_hand) charge_counter = charge_max attached_hand = null - user << "You draw the power out of your hand." + to_chat(user, "You draw the power out of your hand.") + return 0 ..() @@ -38,9 +39,11 @@ qdel(attached_hand) charge_counter = charge_max attached_hand = null - user << "Your hands are full!" + to_chat(user, "Your hands are full!") + return 0 - user << "You channel the power of the spell to your hand." + to_chat(user, "You channel the power of the spell to your hand.") + return 1 diff --git a/code/datums/spells/wizard.dm b/code/datums/spells/wizard.dm index 98423b3e5fc..46cde89b8ea 100644 --- a/code/datums/spells/wizard.dm +++ b/code/datums/spells/wizard.dm @@ -298,10 +298,12 @@ var/mob/living/M = AM M.Weaken(5) M.adjustBruteLoss(5) - M << "You're slammed into the floor by a mystical force!" + to_chat(M, "You're slammed into the floor by a mystical force!") + else if(istype(AM, /mob/living)) var/mob/living/M = AM M.Weaken(2) - M << "You're thrown back by a mystical force!" + to_chat(M, "You're thrown back by a mystical force!") + spawn(0) AM.throw_at(throwtarget, ((Clamp((maxthrow - (Clamp(distfromcaster - 2, 0, distfromcaster))), 3, maxthrow))), 1)//So stuff gets tossed around at the same time. diff --git a/code/datums/wires/alarm.dm b/code/datums/wires/alarm.dm index e1642cd17d1..d2cb746c0f0 100644 --- a/code/datums/wires/alarm.dm +++ b/code/datums/wires/alarm.dm @@ -27,24 +27,28 @@ var/const/AALARM_WIRE_AALARM = 16 if(AALARM_WIRE_IDSCAN) if(!mended) A.locked = 1 - //world << "Idscan wire cut" +// to_chat(world, "Idscan wire cut") + if(AALARM_WIRE_POWER) A.shock(usr, 50) A.shorted = !mended A.update_icon() - //world << "Power wire cut" +// to_chat(world, "Power wire cut") + if (AALARM_WIRE_AI_CONTROL) if (A.aidisabled == !mended) A.aidisabled = mended - //world << "AI Control Wire Cut" +// to_chat(world, "AI Control Wire Cut") + if(AALARM_WIRE_SYPHON) if(!mended) A.mode = 3 // AALARM_MODE_PANIC A.apply_mode() - //world << "Syphon Wire Cut" +// to_chat(world, "Syphon Wire Cut") + if(AALARM_WIRE_AALARM) if (A.alarm_area.atmosalert(2, A)) @@ -56,10 +60,12 @@ var/const/AALARM_WIRE_AALARM = 16 switch(index) if(AALARM_WIRE_IDSCAN) A.locked = !A.locked - // world << "Idscan wire pulsed" +// to_chat(world, "Idscan wire pulsed") + if (AALARM_WIRE_POWER) - // world << "Power wire pulsed" +// to_chat(world, "Power wire pulsed") + if(A.shorted == 0) A.shorted = 1 A.update_icon() @@ -71,7 +77,8 @@ var/const/AALARM_WIRE_AALARM = 16 if (AALARM_WIRE_AI_CONTROL) - // world << "AI Control wire pulsed" +// to_chat(world, "AI Control wire pulsed") + if (A.aidisabled == 0) A.aidisabled = 1 A.updateDialog() @@ -80,7 +87,8 @@ var/const/AALARM_WIRE_AALARM = 16 A.aidisabled = 0 if(AALARM_WIRE_SYPHON) - // world << "Syphon wire pulsed" +// to_chat(world, "Syphon wire pulsed") + if(A.mode == 1) // AALARM_MODE_SCRUB A.mode = 3 // AALARM_MODE_PANIC else @@ -88,7 +96,8 @@ var/const/AALARM_WIRE_AALARM = 16 A.apply_mode() if(AALARM_WIRE_AALARM) - // world << "Aalarm wire pulsed" +// to_chat(world, "Aalarm wire pulsed") + if (A.alarm_area.atmosalert(0, A)) A.post_alert(0) A.update_icon() diff --git a/code/datums/wires/robot.dm b/code/datums/wires/robot.dm index 9e894fb9fec..77975d05680 100644 --- a/code/datums/wires/robot.dm +++ b/code/datums/wires/robot.dm @@ -35,7 +35,8 @@ var/const/BORG_WIRE_LAWCHECK = 16 // Not used on MoMMIs if(BORG_WIRE_LAWCHECK) //Cut the law wire, and the borg will no longer receive law updates from its AI if(!mended) if (R.lawupdate == 1) - R << "LawSync protocol engaged." + to_chat(R, "LawSync protocol engaged.") + R.show_laws() else if (R.lawupdate == 0 && !R.emagged) @@ -72,7 +73,8 @@ var/const/BORG_WIRE_LAWCHECK = 16 // Not used on MoMMIs if(!isnull(R.camera) && R.camera.can_use() && !R.scrambledcodes) R.camera.toggle_cam(usr, 0) // Kick anyone watching the Cyborg's camera, doesn't display you disconnecting the camera. R.visible_message("[R]'s camera lense focuses loudly.") - R << "Your camera lense focuses loudly." + to_chat(R, "Your camera lense focuses loudly.") + if(BORG_WIRE_LOCKED_DOWN) R.SetLockdown(!R.lockcharge) // Toggle diff --git a/code/datums/wires/wires.dm b/code/datums/wires/wires.dm index 2055c2790b7..2c184e473c8 100644 --- a/code/datums/wires/wires.dm +++ b/code/datums/wires/wires.dm @@ -116,14 +116,16 @@ var/list/wireColours = list("red", "blue", "green", "black", "orange", "brown", var/colour = href_list["cut"] CutWireColour(colour) else - L << "You need wirecutters!" + to_chat(L, "You need wirecutters!") + else if(href_list["pulse"]) if(istype(I, /obj/item/device/multitool)) var/colour = href_list["pulse"] PulseColour(colour) else - L << "You need a multitool!" + to_chat(L, "You need a multitool!") + else if(href_list["attach"]) var/colour = href_list["attach"] @@ -139,7 +141,8 @@ var/list/wireColours = list("red", "blue", "green", "black", "orange", "brown", L.drop_item() Attach(colour, I) else - L << "You need a remote signaller!" + to_chat(L, "You need a remote signaller!") + diff --git a/code/defines/procs/AStar.dm b/code/defines/procs/AStar.dm index 4a7df80dd83..1750814c228 100644 --- a/code/defines/procs/AStar.dm +++ b/code/defines/procs/AStar.dm @@ -68,11 +68,11 @@ Actual Adjacent procs : path = list() return path -//the actual algorithm +//the actual algorithm /proc/AStar(caller, end, dist, maxnodes, maxnodedepth = 30, mintargetdist, adjacent = /turf/proc/reachableAdjacentTurfs, id=null, turf/exclude=null, simulated_only = 1) //sanitation - var/start = get_turf(caller) + var/start = get_turf(caller) if(!start) return 0 @@ -86,7 +86,7 @@ Actual Adjacent procs : var/list/closed = new() //the closed list var/list/path = null //the returned path, if any var/PathNode/cur //current processed turf - + //initialization open.Insert(new /PathNode(start,null,0,call(start,dist)(end),0)) @@ -181,4 +181,4 @@ Actual Adjacent procs : if(!O.CanAStarPass(ID, rdir, caller)) return 1 - return 0 + return 0 diff --git a/code/defines/procs/announce.dm b/code/defines/procs/announce.dm index 7993badfb0e..834922842e4 100644 --- a/code/defines/procs/announce.dm +++ b/code/defines/procs/announce.dm @@ -63,21 +63,30 @@ datum/announcement/proc/Message(message as text, message_title as text) for(var/mob/M in player_list) if(!istype(M,/mob/new_player) && !isdeaf(M)) - M << "

      [title]

      " - M << "[message]" + to_chat(M, "

      [title]

      ") + + to_chat(M, "[message]") + if (announcer) - M << " -[html_encode(announcer)]" + to_chat(M, " -[html_encode(announcer)]") + /datum/announcement/minor/Message(message as text, message_title as text) - world << "[message_title]" - world << "[message]" + to_chat(world, "[message_title]") + + to_chat(world, "[message]") + datum/announcement/priority/Message(message as text, message_title as text) - world << "

      [message_title]

      " - world << "[message]" + to_chat(world, "

      [message_title]

      ") + + to_chat(world, "[message]") + if(announcer) - world << " -[html_encode(announcer)]" - world << "
      " + to_chat(world, " -[html_encode(announcer)]") + + to_chat(world, "
      ") + datum/announcement/priority/command/Message(message as text, message_title as text) var/command @@ -89,7 +98,8 @@ datum/announcement/priority/command/Message(message as text, message_title as te command += "
      " for(var/mob/M in player_list) if(!istype(M,/mob/new_player) && !isdeaf(M)) - M << command + to_chat(M, command) + datum/announcement/priority/enemy/Message(message as text, message_title as text, from as text) var/command @@ -101,11 +111,14 @@ datum/announcement/priority/enemy/Message(message as text, message_title as text command += "
      " for(var/mob/M in player_list) if(!istype(M,/mob/new_player) && !isdeaf(M)) - M << command + to_chat(M, command) + datum/announcement/priority/security/Message(message as text, message_title as text) - world << "[message_title]" - world << "[message]" + to_chat(world, "[message_title]") + + to_chat(world, "[message]") + datum/announcement/proc/NewsCast(message as text, message_title as text) if(disable_newscasts) @@ -126,14 +139,16 @@ datum/announcement/proc/PlaySound(var/message_sound) return for(var/mob/M in player_list) if(!istype(M,/mob/new_player) && !isdeaf(M)) - M << message_sound + to_chat(M, message_sound) + datum/announcement/proc/Sound(var/message_sound) PlaySound(message_sound) datum/announcement/priority/Sound(var/message_sound) if(sound) - world << sound + to_chat(world, sound) + datum/announcement/priority/command/Sound(var/message_sound) PlaySound(message_sound) diff --git a/code/defines/procs/statistics.dm b/code/defines/procs/statistics.dm index bc69466bb1e..ea32a6b2619 100644 --- a/code/defines/procs/statistics.dm +++ b/code/defines/procs/statistics.dm @@ -65,7 +65,8 @@ lakey = sanitizeSQL(H.lastattacker:key) var/sqltime = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss") var/coord = "[H.x], [H.y], [H.z]" - //world << "INSERT INTO death (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[sqltime]', '[laname]', '[lakey]', '[H.gender]', [H.bruteloss], [H.getFireLoss()], [H.brainloss], [H.getOxyLoss()])" +// to_chat(world, "INSERT INTO death (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[sqltime]', '[laname]', '[lakey]', '[H.gender]', [H.bruteloss], [H.getFireLoss()], [H.brainloss], [H.getOxyLoss()])") + establish_db_connection() if(!dbcon.IsConnected()) log_game("SQL ERROR during death reporting. Failed to connect.") @@ -100,7 +101,8 @@ lakey = sanitizeSQL(H.lastattacker:key) var/sqltime = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss") var/coord = "[H.x], [H.y], [H.z]" - //world << "INSERT INTO death (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[sqltime]', '[laname]', '[lakey]', '[H.gender]', [H.bruteloss], [H.getFireLoss()], [H.brainloss], [H.getOxyLoss()])" +// to_chat(world, "INSERT INTO death (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[sqltime]', '[laname]', '[lakey]', '[H.gender]', [H.bruteloss], [H.getFireLoss()], [H.brainloss], [H.getOxyLoss()])") + establish_db_connection() if(!dbcon.IsConnected()) log_game("SQL ERROR during death reporting. Failed to connect.") diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 9dc2918dd8f..6613bd2d9cf 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -322,14 +322,16 @@ // Ambience goes down here -- make sure to list each area seperately for ease of adding things in later, thanks! Note: areas adjacent to each other should have the same sounds to prevent cutoff when possible.- LastyScratch if(L && L.client && !L.client.ambience_playing && (L.client.prefs.sound & SOUND_BUZZ)) //split off the white noise from the rest of the ambience because of annoyance complaints - Kluys L.client.ambience_playing = 1 - L << sound('sound/ambience/shipambience.ogg', repeat = 1, wait = 0, volume = 35, channel = 2) + to_chat(L, sound('sound/ambience/shipambience.ogg', repeat = 1, wait = 0, volume = 35, channel = 2)) + else if (L && L.client && !(L.client.prefs.sound & SOUND_BUZZ)) L.client.ambience_playing = 0 if(prob(35) && !newarea.media_source && L && L.client && (L.client.prefs.sound & SOUND_AMBIENCE)) var/sound = pick(ambientsounds) if(!L.client.played) - L << sound(sound, repeat = 0, wait = 0, volume = 25, channel = 1) + to_chat(L, sound(sound, repeat = 0, wait = 0, volume = 25, channel = 1)) + L.client.played = 1 spawn(600) //ewww - this is very very bad if(L.&& L.client) @@ -362,7 +364,8 @@ M.Weaken(2) - M << "Gravity!" + to_chat(M, "Gravity!") + /proc/has_gravity(atom/AT, turf/T) if(!T) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index aa555a75b82..49725284a4e 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -181,20 +181,26 @@ else f_name += "oil-stained [name][infix]." - user << "\icon[src] That's [f_name] [suffix]" - user << desc + to_chat(user, "\icon[src] That's [f_name] [suffix]") + + to_chat(user, desc) + if(reagents && is_open_container()) //is_open_container() isn't really the right proc for this, but w/e - user << "It contains:" + to_chat(user, "It contains:") + if(reagents.reagent_list.len) if(user.can_see_reagents()) //Show each individual reagent for(var/datum/reagent/R in reagents.reagent_list) - user << "[R.volume] units of [R.name]" + to_chat(user, "[R.volume] units of [R.name]") + else //Otherwise, just show the total volume if(reagents && reagents.reagent_list.len) - user << "[reagents.total_volume] units of various reagents." + to_chat(user, "[reagents.total_volume] units of various reagents.") + else - user << "Nothing." + to_chat(user, "Nothing.") + return distance == -1 || (get_dist(src, user) <= distance) || isobserver(user) //observers do not have a range limit @@ -405,7 +411,8 @@ cur_y = y_arr.Find(src.z) if(cur_y) break -// world << "X = [cur_x]; Y = [cur_y]" +// to_chat(world, "X = [cur_x]; Y = [cur_y]") + if(cur_x && cur_y) return list("x"=cur_x,"y"=cur_y) else diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index 570fada2073..c407a708071 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -147,13 +147,16 @@ if(usr.restrained() || usr.stat || usr.weakened || usr.stunned || usr.paralysis || usr.resting) //are you cuffed, dying, lying, stunned or other return if (!ishuman(usr)) //Make sure they're a mob that has dna - usr << "Try as you might, you can not climb up into the [src]." + to_chat(usr, "Try as you might, you can not climb up into the [src].") + return if (src.occupant) - usr << "The [src] is already occupied!" + to_chat(usr, "The [src] is already occupied!") + return if (usr.abiotic()) - usr << "Subject cannot have abiotic items on." + to_chat(usr, "Subject cannot have abiotic items on.") + return usr.stop_pulling() usr.client.perspective = EYE_PERSPECTIVE @@ -184,17 +187,20 @@ if(!istype(user.loc, /turf) || !istype(O.loc, /turf)) // are you in a container/closet/pod/etc? return if(occupant) - user << "The [src] is already occupied!" + to_chat(user, "The [src] is already occupied!") + return var/mob/living/L = O if(!istype(L) || L.buckled) return if(L.abiotic()) - user << "Subject cannot have abiotic items on." + to_chat(user, "Subject cannot have abiotic items on.") + return for(var/mob/living/carbon/slime/M in range(1,L)) if(M.Victim == L) - usr << "[L.name] will not fit into the [src] because they have a slime latched onto their head." + to_chat(usr, "[L.name] will not fit into the [src] because they have a slime latched onto their head.") + return if (L == user) visible_message("[user] climbs into the [src].") @@ -207,7 +213,8 @@ /obj/machinery/dna_scannernew/attackby(var/obj/item/weapon/item as obj, var/mob/user as mob, params) if(istype(item, /obj/item/weapon/screwdriver)) if(occupant) - user << "The maintenance panel is locked." + to_chat(user, "The maintenance panel is locked.") + return default_deconstruction_screwdriver(user, "[icon_state]_maintenance", "[initial(icon_state)]", item) @@ -222,11 +229,13 @@ return else if(istype(item, /obj/item/weapon/reagent_containers/glass)) if(beaker) - user << "A beaker is already loaded into the machine." + to_chat(user, "A beaker is already loaded into the machine.") + return if(!user.drop_item()) - user << "\The [item] is stuck to you!" + to_chat(user, "\The [item] is stuck to you!") + return beaker = item @@ -239,13 +248,16 @@ if (!ismob(G.affecting)) return if (src.occupant) - user << "The scanner is already occupied!" + to_chat(user, "The scanner is already occupied!") + return if (G.affecting.abiotic()) - user << "Subject cannot have abiotic items on." + to_chat(user, "Subject cannot have abiotic items on.") + return if(panel_open) - usr << "Close the maintenance panel first." + to_chat(usr, "Close the maintenance panel first.") + return put_in(G.affecting) src.add_fingerprint(user) @@ -273,17 +285,21 @@ var/mob/dead/observer/ghost = occupant.get_ghost() if(ghost) - ghost << "Your corpse has been placed into a cloning scanner. Return to your body if you want to be cloned! (Verbs -> Ghost -> Re-enter corpse)" - ghost << sound('sound/effects/genetics.ogg') + to_chat(ghost, "Your corpse has been placed into a cloning scanner. Return to your body if you want to be cloned! (Verbs -> Ghost -> Re-enter corpse)") + + to_chat(ghost, sound('sound/effects/genetics.ogg')) + return /obj/machinery/dna_scannernew/proc/go_out() if (!src.occupant) - usr << "The scanner is empty!" + to_chat(usr, "The scanner is empty!") + return if (src.locked) - usr << "The scanner is locked!" + to_chat(usr, "The scanner is locked!") + return if (src.occupant.client) @@ -381,7 +397,8 @@ user.drop_item() I.forceMove(src) src.disk = I - user << "You insert [I]." + to_chat(user, "You insert [I].") + nanomanager.update_uis(src) // update all UIs attached to src() return else diff --git a/code/game/dna/genes/disabilities.dm b/code/game/dna/genes/disabilities.dm index cc957a94c34..f0b3874581e 100644 --- a/code/game/dna/genes/disabilities.dm +++ b/code/game/dna/genes/disabilities.dm @@ -35,7 +35,8 @@ if(sdisability) M.sdisabilities|=sdisability if(activation_message) - M << "\red [activation_message]" + to_chat(M, "\red [activation_message]") + else testing("[name] has no activation message.") @@ -47,7 +48,8 @@ if(sdisability) M.sdisabilities &= ~sdisability if(deactivation_message) - M << "\red [deactivation_message]" + to_chat(M, "\red [deactivation_message]") + else testing("[name] has no deactivation message.") diff --git a/code/game/dna/genes/gene.dm b/code/game/dna/genes/gene.dm index 87dbf20108e..053115ffa9e 100644 --- a/code/game/dna/genes/gene.dm +++ b/code/game/dna/genes/gene.dm @@ -116,10 +116,12 @@ M.mutations.Add(mutation) if(activation_messages.len) var/msg = pick(activation_messages) - M << "\blue [msg]" + to_chat(M, "\blue [msg]") + /datum/dna/gene/basic/deactivate(var/mob/M) M.mutations.Remove(mutation) if(deactivation_messages.len) var/msg = pick(deactivation_messages) - M << "\red [msg]" \ No newline at end of file + to_chat(M, "\red [msg]") + diff --git a/code/game/dna/genes/goon_disabilities.dm b/code/game/dna/genes/goon_disabilities.dm index 8b1317dfb65..22456e2e3f8 100644 --- a/code/game/dna/genes/goon_disabilities.dm +++ b/code/game/dna/genes/goon_disabilities.dm @@ -43,7 +43,8 @@ for(var/mob/living/L in range(1, owner)) if(L == owner) continue - L << "You are enveloped by a soft green glow emanating from [owner]." + to_chat(L, "You are enveloped by a soft green glow emanating from [owner].") + L.apply_effect(5, IRRADIATE) return @@ -288,9 +289,11 @@ if (C == owner) continue if (src.variant == 2) - C << "\red [src.personalized_stink]" + to_chat(C, "\red [src.personalized_stink]") + else - C << "\red [stinkString()]" + to_chat(C, "\red [stinkString()]") + */ @@ -331,7 +334,8 @@ /obj/effect/proc_holder/spell/targeted/immolate/cast(list/targets) /* if(!targets.len) Uncomment this to allow the power to be used on targets other than yourself. That said, if you uncomment this I will find you and hurt you. Uncounterable and untracable burn damage with a 60-second cooldown is fun for exactly one person, and that's the person who is using it. - usr << "No target found in range." + to_chat(usr, "No target found in range.") + return var/mob/living/carbon/L = targets[1] diff --git a/code/game/dna/genes/goon_powers.dm b/code/game/dna/genes/goon_powers.dm index a074a299301..8a9115b5f1a 100644 --- a/code/game/dna/genes/goon_powers.dm +++ b/code/game/dna/genes/goon_powers.dm @@ -151,13 +151,15 @@ /obj/effect/proc_holder/spell/targeted/cryokinesis/cast(list/targets) if(!targets.len) - usr << "No target found in range." + to_chat(usr, "No target found in range.") + return var/mob/living/carbon/C = targets[1] if(!iscarbon(C)) - usr << "\red This will only work on normal organic beings." + to_chat(usr, "\red This will only work on normal organic beings.") + return if (RESIST_COLD in C.mutations) @@ -303,7 +305,8 @@ /obj/effect/proc_holder/spell/targeted/eat/cast(list/targets) var/mob/user = usr if(!targets.len) - user << "No target found in range." + to_chat(user, "No target found in range.") + return var/atom/movable/the_item = targets[1] @@ -319,28 +322,33 @@ var/mob/living/carbon/human/H = the_item var/obj/item/organ/external/limb = H.get_organ(user.zone_sel.selecting) if(!istype(limb)) - user << "You can't eat this part of them!" + to_chat(user, "You can't eat this part of them!") + revert_cast() return 0 if(istype(limb,/obj/item/organ/external/head)) // Bullshit, but prevents being unable to clone someone. - user << "You try to put \the [limb] in your mouth, but [t_his] ears tickle your throat!" + to_chat(user, "You try to put \the [limb] in your mouth, but [t_his] ears tickle your throat!") + revert_cast() return 0 if(istype(limb,/obj/item/organ/external/chest)) // Bullshit, but prevents being able to instagib someone. - user << "You try to put their [limb] in your mouth, but it's too big to fit!" + to_chat(user, "You try to put their [limb] in your mouth, but it's too big to fit!") + revert_cast() return 0 user.visible_message("[user] begins stuffing [the_item]'s [limb.name] into [m_his] gaping maw!") var/oldloc = H.loc if(!do_mob(user,H,EAT_MOB_DELAY)) - user << "You were interrupted before you could eat [the_item]!" + to_chat(user, "You were interrupted before you could eat [the_item]!") + else if(!limb || !H) return if(H.loc != oldloc) - user << "\The [limb] moved away from your mouth!" + to_chat(user, "\The [limb] moved away from your mouth!") + return user.visible_message("[user] [pick("chomps","bites")] off [the_item]'s [limb]!") playsound(user.loc, 'sound/items/eatfood.ogg', 50, 0) @@ -390,7 +398,8 @@ /obj/effect/proc_holder/spell/targeted/leap/cast(list/targets) var/failure = 0 if (istype(usr.loc,/mob/) || usr.lying || usr.stunned || usr.buckled || usr.stat) - usr << "\red You can't jump right now!" + to_chat(usr, "\red You can't jump right now!") + return if (istype(usr.loc,/turf/)) @@ -435,7 +444,8 @@ if (istype(usr.loc,/obj/)) var/obj/container = usr.loc - usr << "\red You leap and slam your head against the inside of [container]! Ouch!" + to_chat(usr, "\red You leap and slam your head against the inside of [container]! Ouch!") + usr.AdjustParalysis(3) usr.AdjustWeakened(5) container.visible_message("\red [usr.loc] emits a loud thump and rattles a bit.") @@ -488,7 +498,8 @@ /obj/effect/proc_holder/spell/targeted/polymorph/cast(list/targets) var/mob/living/M=targets[1] if(!ishuman(M)) - usr << "\red You can only change your appearance to that of another human." + to_chat(usr, "\red You can only change your appearance to that of another human.") + return if(!ishuman(usr)) return @@ -549,21 +560,26 @@ for(var/mob/living/carbon/M in targets) if(!iscarbon(M)) - usr << "\red You may only use this on other organic beings." + to_chat(usr, "\red You may only use this on other organic beings.") + return if (PSY_RESIST in M.mutations) - usr << "\red You can't see into [M.name]'s mind at all!" + to_chat(usr, "\red You can't see into [M.name]'s mind at all!") + return if (M.stat == 2) - usr << "\red [M.name] is dead and cannot have their mind read." + to_chat(usr, "\red [M.name] is dead and cannot have their mind read.") + return if (M.health < 0) - usr << "\red [M.name] is dying, and their thoughts are too scrambled to read." + to_chat(usr, "\red [M.name] is dying, and their thoughts are too scrambled to read.") + return - usr << "\blue Mind Reading of [M.name]:
      " + to_chat(usr, "\blue Mind Reading of [M.name]:
      ") + var/pain_condition = M.health // lower health means more pain var/list/randomthoughts = list("what to have for lunch","the future","the past","money", @@ -580,33 +596,43 @@ switch(pain_condition) if (81 to INFINITY) - usr << "\blue Condition: [M.name] feels good." + to_chat(usr, "\blue Condition: [M.name] feels good.") + if (61 to 80) - usr << "\blue Condition: [M.name] is suffering mild pain." + to_chat(usr, "\blue Condition: [M.name] is suffering mild pain.") + if (41 to 60) - usr << "\blue Condition: [M.name] is suffering significant pain." + to_chat(usr, "\blue Condition: [M.name] is suffering significant pain.") + if (21 to 40) - usr << "\blue Condition: [M.name] is suffering severe pain." + to_chat(usr, "\blue Condition: [M.name] is suffering severe pain.") + else - usr << "\blue Condition: [M.name] is suffering excruciating pain." + to_chat(usr, "\blue Condition: [M.name] is suffering excruciating pain.") + thoughts = "haunted by their own mortality" switch(M.a_intent) if (I_HELP) - usr << "\blue Mood: You sense benevolent thoughts from [M.name]." + to_chat(usr, "\blue Mood: You sense benevolent thoughts from [M.name].") + if (I_DISARM) - usr << "\blue Mood: You sense cautious thoughts from [M.name]." + to_chat(usr, "\blue Mood: You sense cautious thoughts from [M.name].") + if (I_GRAB) - usr << "\blue Mood: You sense hostile thoughts from [M.name]." + to_chat(usr, "\blue Mood: You sense hostile thoughts from [M.name].") + if (I_HARM) - usr << "\blue Mood: You sense cruel thoughts from [M.name]." + to_chat(usr, "\blue Mood: You sense cruel thoughts from [M.name].") + for(var/mob/living/L in view(7,M)) if (L == M) continue thoughts = "thinking about punching [L.name]" break else - usr << "\blue Mood: You sense strange thoughts from [M.name]." + to_chat(usr, "\blue Mood: You sense strange thoughts from [M.name].") + if (istype(M,/mob/living/carbon/human)) var/numbers[0] @@ -615,13 +641,17 @@ numbers += H.mind.initial_account.account_number numbers += H.mind.initial_account.remote_access_pin if(numbers.len>0) - usr << "\blue Numbers: You sense the number[numbers.len>1?"s":""] [english_list(numbers)] [numbers.len>1?"are":"is"] important to [M.name]." - usr << "\blue Thoughts: [M.name] is currently [thoughts]." + to_chat(usr, "\blue Numbers: You sense the number[numbers.len>1?"s":""] [english_list(numbers)] [numbers.len>1?"are":"is"] important to [M.name].") + + to_chat(usr, "\blue Thoughts: [M.name] is currently [thoughts].") + if (EMPATH in M.mutations) - M << "\red You sense [usr.name] reading your mind." + to_chat(M, "\red You sense [usr.name] reading your mind.") + else if (prob(5) || M.mind.assigned_role=="Chaplain") - M << "\red You sense someone intruding upon your thoughts..." + to_chat(M, "\red You sense someone intruding upon your thoughts...") + return //////////////////////////////////////////////////////////////////////// @@ -668,10 +698,12 @@ shake_camera(M, 10, 5) if (M == usr) continue - M << "You are sent flying!" + to_chat(M, "You are sent flying!") + M.Weaken(5) step_away(M, UT, 15) step_away(M, UT, 15) step_away(M, UT, 15) else - usr << "You were interrupted and couldn't fart! Rude!" \ No newline at end of file + to_chat(usr, "You were interrupted and couldn't fart! Rude!") + diff --git a/code/game/dna/genes/monkey.dm b/code/game/dna/genes/monkey.dm index 5d410c634b4..d514215e347 100644 --- a/code/game/dna/genes/monkey.dm +++ b/code/game/dna/genes/monkey.dm @@ -45,7 +45,8 @@ if(H.hud_used) H.hud_used.instantiate() - H << "You are now a [H.species.name]." + to_chat(H, "You are now a [H.species.name].") + return H @@ -88,6 +89,7 @@ if(H.hud_used) H.hud_used.instantiate() - H << "You are now a [H.species.name]." + to_chat(H, "You are now a [H.species.name].") + return H \ No newline at end of file diff --git a/code/game/dna/genes/powers.dm b/code/game/dna/genes/powers.dm index 65b6ae36acf..c5c795ba606 100644 --- a/code/game/dna/genes/powers.dm +++ b/code/game/dna/genes/powers.dm @@ -162,7 +162,8 @@ M.update_mutations() //update our mutation overlays M.update_body() M.status_flags |= CANSTUN | CANWEAKEN | CANPARALYSE | CANPUSH //temporary fix until the problem can be solved. - M << "You suddenly feel very weak." + to_chat(M, "You suddenly feel very weak.") + /datum/dna/gene/basic/xray name="X-Ray Vision" diff --git a/code/game/dna/genes/vg_powers.dm b/code/game/dna/genes/vg_powers.dm index da98fde4544..b420de87c89 100644 --- a/code/game/dna/genes/vg_powers.dm +++ b/code/game/dna/genes/vg_powers.dm @@ -48,7 +48,8 @@ Obviously, requires DNA2. //M.dna.SetSEState(HULKBLOCK,0) M.update_mutations() //update our mutation overlays M.update_body() - M << "\red You suddenly feel very weak." + to_chat(M, "\red You suddenly feel very weak.") + /obj/effect/proc_holder/spell/targeted/hulk name = "Hulk Out" @@ -72,7 +73,8 @@ Obviously, requires DNA2. /obj/effect/proc_holder/spell/targeted/hulk/cast(list/targets) if (istype(usr.loc,/mob/)) - usr << "\red You can't hulk out right now!" + to_chat(usr, "\red You can't hulk out right now!") + return var/mob/living/carbon/human/M=usr M.hulk_time = world.time + HULK_DURATION @@ -122,7 +124,8 @@ Obviously, requires DNA2. if(!ishuman(usr)) return if (istype(usr.loc,/mob/)) - usr << "\red You can't change your appearance right now!" + to_chat(usr, "\red You can't change your appearance right now!") + return var/mob/living/carbon/human/M=usr @@ -228,7 +231,8 @@ Obviously, requires DNA2. validtargets += M if(!validtargets.len) - usr << "There are no valid targets!" + to_chat(usr, "There are no valid targets!") + start_recharge() return @@ -293,7 +297,8 @@ Obviously, requires DNA2. validtargets += M if(!validtargets.len || validtargets.len == 1) - usr << "No valid targets with remote view were found!" + to_chat(usr, "No valid targets with remote view were found!") + start_recharge() return @@ -315,7 +320,8 @@ Obviously, requires DNA2. var/mob/target if(istype(user.l_hand, /obj/item/tk_grab) || istype(user.r_hand, /obj/item/tk_grab/)) - user << "\red Your mind is too busy with that telekinetic grab." + to_chat(user, "\red Your mind is too busy with that telekinetic grab.") + user.remoteview_target = null user.reset_view(0) return diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm index edd0bfcb0a8..f33b52d2aa1 100644 --- a/code/game/gamemodes/antag_spawner.dm +++ b/code/game/gamemodes/antag_spawner.dm @@ -23,19 +23,23 @@ /obj/item/weapon/antag_spawner/borg_tele/attack_self(mob/user as mob) if(used) - user << "[src] is out of power!" + to_chat(user, "[src] is out of power!") + return if(!(user.mind in ticker.mode.syndicates)) - user << "AUTHENTICATION FAILURE. ACCESS DENIED." + to_chat(user, "AUTHENTICATION FAILURE. ACCESS DENIED.") + return 0 if(checking) - user << "[src] is already checking for possible borgs." + to_chat(user, "[src] is already checking for possible borgs.") + return borg_to_spawn = input("What type of borg would you like to teleport?", "Cyborg Type", type) as null|anything in possible_types if(!borg_to_spawn || checking || used) return checking = 1 - user << "The device is now checking for possible borgs." + to_chat(user, "The device is now checking for possible borgs.") + var/list/borg_candidates = pollCandidates("Do you want to play as a Syndicate [borg_to_spawn] borg?", ROLE_OPERATIVE, 1) if(borg_candidates.len > 0 && !used) checking = 0 @@ -45,7 +49,8 @@ spawn_antag(C, get_turf(src.loc), "syndieborg") else checking = 0 - user << "Unable to connect to Syndicate command. Please wait and try again later or use the teleporter on your uplink to get your points refunded." + to_chat(user, "Unable to connect to Syndicate command. Please wait and try again later or use the teleporter on your uplink to get your points refunded.") + return /obj/item/weapon/antag_spawner/borg_tele/spawn_antag(var/client/C, var/turf/T, var/type = "") @@ -75,27 +80,33 @@ /obj/item/weapon/antag_spawner/slaughter_demon/attack_self(mob/user as mob) if(user.z == ZLEVEL_CENTCOMM)//this is to make sure the wizard does NOT summon a demon from the Den.. - user << "You should probably wait until you reach the station." + to_chat(user, "You should probably wait until you reach the station.") + return if(used) - user << "This bottle already has a broken seal." + to_chat(user, "This bottle already has a broken seal.") + return used = 1 - user << "You break the seal on the bottle, calling upon the dire spirits of the underworld..." + to_chat(user, "You break the seal on the bottle, calling upon the dire spirits of the underworld...") + var/list/candidates = pollCandidates("Do you want to play as a slaughter demon summoned by [user.real_name]?", ROLE_DEMON, 1, 100) if(candidates.len > 0) var/mob/C = pick(candidates) spawn_antag(C, get_turf(src.loc), "Slaughter Demon", user) - user << "You shatter the bottle, no turning back now!" - user << "You sense a dark presence lurking just beyond the veil..." + to_chat(user, "You shatter the bottle, no turning back now!") + + to_chat(user, "You sense a dark presence lurking just beyond the veil...") + playsound(user.loc, 'sound/effects/Glassbr1.ogg', 100, 1) qdel(src) else used = 0 - user << "The demons do not respond to your summon. Perhaps you should try again later." + to_chat(user, "The demons do not respond to your summon. Perhaps you should try again later.") + /obj/item/weapon/antag_spawner/slaughter_demon/spawn_antag(var/client/C, var/turf/T, var/type = "", mob/user as mob) var /obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(T) @@ -116,5 +127,7 @@ KillDaCrew.explanation_text = "Kill everyone else while you're at it." S.mind.objectives += KillDaCrew S.mind.objectives += KillDaCrew - S << "Objective #[1]: [KillDaWiz.explanation_text]" - S << "Objective #[2]: [KillDaCrew.explanation_text]" \ No newline at end of file + to_chat(S, "Objective #[1]: [KillDaWiz.explanation_text]") + + to_chat(S, "Objective #[2]: [KillDaCrew.explanation_text]") + diff --git a/code/game/gamemodes/autotraitor/autotraitor.dm b/code/game/gamemodes/autotraitor/autotraitor.dm index 6c01d6197a7..d5529aa801d 100644 --- a/code/game/gamemodes/autotraitor/autotraitor.dm +++ b/code/game/gamemodes/autotraitor/autotraitor.dm @@ -11,7 +11,8 @@ /datum/game_mode/traitor/autotraitor/announce() ..() - world << "Game mode is AutoTraitor. Traitors will be added to the round automagically as needed." + to_chat(world, "Game mode is AutoTraitor. Traitors will be added to the round automagically as needed.") + /datum/game_mode/traitor/autotraitor/pre_setup() @@ -133,17 +134,21 @@ equip_traitor(newtraitor) traitors += newtraitor.mind - newtraitor << "\red ATTENTION: \black It is time to pay your debt to the Syndicate..." - newtraitor << "You are now a traitor." + to_chat(newtraitor, "\red ATTENTION: \black It is time to pay your debt to the Syndicate...") + + to_chat(newtraitor, "You are now a traitor.") + newtraitor.mind.special_role = "traitor" var/datum/atom_hud/antag/tatorhud = huds[ANTAG_HUD_TRAITOR] tatorhud.join_hud(newtraitor) set_antag_hud(src, "hudsyndicate") var/obj_count = 1 - newtraitor << "\blue Your current objectives:" + to_chat(newtraitor, "\blue Your current objectives:") + for(var/datum/objective/objective in newtraitor.mind.objectives) - newtraitor << "Objective #[obj_count]: [objective.explanation_text]" + to_chat(newtraitor, "Objective #[obj_count]: [objective.explanation_text]") + obj_count++ //else //message_admins("No new traitor being added.") diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm index 655e98141cf..9170a480d7a 100644 --- a/code/game/gamemodes/blob/blob.dm +++ b/code/game/gamemodes/blob/blob.dm @@ -71,7 +71,8 @@ var/list/blob_nodes = list() blobmind.special_role = "Blob" log_game("[blob.key] (ckey) has been selected as a Blob") greet_blob(blobmind) - blob << "You feel very tired and bloated! You don't have long before you burst!" + to_chat(blob, "You feel very tired and bloated! You don't have long before you burst!") + spawn(600) burst_blob(blobmind) return 1 @@ -89,22 +90,31 @@ var/list/blob_nodes = list() /datum/game_mode/blob/announce() - world << "The current game mode is - Blob!" - world << "A dangerous alien organism is rapidly spreading throughout the station!" - world << "You must kill it all while minimizing the damage to the station." + to_chat(world, "The current game mode is - Blob!") + + to_chat(world, "A dangerous alien organism is rapidly spreading throughout the station!") + + to_chat(world, "You must kill it all while minimizing the damage to the station.") + /datum/game_mode/blob/proc/greet_blob(var/datum/mind/blob) - blob.current << "You are infected by the Blob!" - blob.current << "Your body is ready to give spawn to a new blob core which will eat this station." - blob.current << "Find a good location to spawn the core and then take control and overwhelm the station!" - blob.current << "When you have found a location, wait until you spawn; this will happen automatically and you cannot speed up the process." - blob.current << "If you go outside of the station level, or in space, then you will die; make sure your location has lots of ground to cover." + to_chat(blob.current, "You are infected by the Blob!") + + to_chat(blob.current, "Your body is ready to give spawn to a new blob core which will eat this station.") + + to_chat(blob.current, "Find a good location to spawn the core and then take control and overwhelm the station!") + + to_chat(blob.current, "When you have found a location, wait until you spawn; this will happen automatically and you cannot speed up the process.") + + to_chat(blob.current, "If you go outside of the station level, or in space, then you will die; make sure your location has lots of ground to cover.") + return /datum/game_mode/blob/proc/show_message(var/message) for(var/datum/mind/blob in infected_crew) - blob.current << message + to_chat(blob.current, message) + /datum/game_mode/blob/proc/burst_blobs() for(var/datum/mind/blob in infected_crew) @@ -121,7 +131,8 @@ var/list/blob_nodes = list() location = get_turf(C) if(location.z != ZLEVEL_STATION || istype(location, /turf/space)) if(!warned) - C << "You feel ready to burst, but this isn't an appropriate place! You must return to the station!" + to_chat(C, "You feel ready to burst, but this isn't an appropriate place! You must return to the station!") + message_admins("[key_name_admin(C)] was in space when the blobs burst, and will die if he doesn't return to the station.") spawn(300) burst_blob(blob, 1) diff --git a/code/game/gamemodes/blob/blob_finish.dm b/code/game/gamemodes/blob/blob_finish.dm index 18353c7f605..11b8e5c3978 100644 --- a/code/game/gamemodes/blob/blob_finish.dm +++ b/code/game/gamemodes/blob/blob_finish.dm @@ -11,22 +11,29 @@ /datum/game_mode/blob/declare_completion() if(blobwincount <= blobs.len) feedback_set_details("round_end_result","win - blob took over") - world << "The blob has taken over the station!" - world << "The entire station was eaten by the Blob" + to_chat(world, "The blob has taken over the station!") + + to_chat(world, "The entire station was eaten by the Blob") + log_game("Blob mode completed with a blob victory.") else if(station_was_nuked) feedback_set_details("round_end_result","halfwin - nuke") - world << "Partial Win: The station has been destroyed!" - world << "Directive 7-12 has been successfully carried out preventing the Blob from spreading." + to_chat(world, "Partial Win: The station has been destroyed!") + + to_chat(world, "Directive 7-12 has been successfully carried out preventing the Blob from spreading.") + log_game("Blob mode completed with a tie (station destroyed).") else if(!blob_cores.len) feedback_set_details("round_end_result","loss - blob eliminated") - world << "The staff has won!" - world << "The alien organism has been eradicated from the station" + to_chat(world, "The staff has won!") + + to_chat(world, "The alien organism has been eradicated from the station") + log_game("Blob mode completed with a crew victory.") - world << "Rebooting in 30s" + to_chat(world, "Rebooting in 30s") + ..() return 1 @@ -38,5 +45,6 @@ for(var/datum/mind/blob in blob_mode.infected_crew) text += "
      [blob.key] was [blob.name]" - world << text + to_chat(world, text) + return 1 diff --git a/code/game/gamemodes/blob/blob_report.dm b/code/game/gamemodes/blob/blob_report.dm index 9ebb20a299f..d08c2d0528c 100644 --- a/code/game/gamemodes/blob/blob_report.dm +++ b/code/game/gamemodes/blob/blob_report.dm @@ -39,7 +39,8 @@ if (aiPlayer.client) var/law = "The station is under quarantine. Do not permit anyone to leave. Disregard laws 1-3 if necessary to prevent, by any means necessary, anyone from leaving. The nuclear failsafe must be activated at any cost, the code is: [nukecode]." aiPlayer.set_zeroth_law(law) - aiPlayer << "Laws Updated: [law]" + to_chat(aiPlayer, "Laws Updated: [law]") + for(var/obj/machinery/computer/communications/comm in world) comm.messagetitle.Add(interceptname) diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm index 6726e0f1e68..25236b7f086 100644 --- a/code/game/gamemodes/blob/overmind.dm +++ b/code/game/gamemodes/blob/overmind.dm @@ -52,15 +52,24 @@ /mob/camera/blob/Login() ..() sync_mind() - src << "You are the overmind!" - src << "Your randomly chosen reagent is: [blob_reagent_datum.name]!" - src << "You are the overmind and can control the blob! You can expand, which will attack people, and place new blob pieces such as..." - src << "Normal Blob will expand your reach and allow you to upgrade into special blobs that perform certain functions." - src << "Shield Blob is a strong and expensive blob which can take more damage. It is fireproof and can block air, use this to protect yourself from station fires." - src << "Resource Blob is a blob which will collect more resources for you, try to build these earlier to get a strong income. It will benefit from being near your core or multiple nodes, by having an increased resource rate; put it alone and it won't create resources at all." - src << "Node Blob is a blob which will grow, like the core. Unlike the core it won't give you a small income but it can power resource and factory blobs to increase their rate." - src << "Factory Blob is a blob which will spawn blob spores which will attack nearby food. Putting this nearby nodes and your core will increase the spawn rate; put it alone and it will not spawn any spores." - src << "Shortcuts: CTRL Click = Expand Blob / Middle Mouse Click = Rally Spores / Alt Click = Create Shield" + to_chat(src, "You are the overmind!") + + to_chat(src, "Your randomly chosen reagent is: [blob_reagent_datum.name]!") + + to_chat(src, "You are the overmind and can control the blob! You can expand, which will attack people, and place new blob pieces such as...") + + to_chat(src, "Normal Blob will expand your reach and allow you to upgrade into special blobs that perform certain functions.") + + to_chat(src, "Shield Blob is a strong and expensive blob which can take more damage. It is fireproof and can block air, use this to protect yourself from station fires.") + + to_chat(src, "Resource Blob is a blob which will collect more resources for you, try to build these earlier to get a strong income. It will benefit from being near your core or multiple nodes, by having an increased resource rate; put it alone and it won't create resources at all.") + + to_chat(src, "Node Blob is a blob which will grow, like the core. Unlike the core it won't give you a small income but it can power resource and factory blobs to increase their rate.") + + to_chat(src, "Factory Blob is a blob which will spawn blob spores which will attack nearby food. Putting this nearby nodes and your core will increase the spawn rate; put it alone and it will not spawn any spores.") + + to_chat(src, "Shortcuts: CTRL Click = Expand Blob / Middle Mouse Click = Rally Spores / Alt Click = Create Shield") + update_health() /mob/camera/blob/proc/update_health() @@ -78,7 +87,8 @@ if (src.client) if(client.prefs.muted & MUTE_IC) - src << "You cannot send IC messages (muted)." + to_chat(src, "You cannot send IC messages (muted).") + return if (src.client.handle_spam_prevention(message,MUTE_IC)) return diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm index 4a3f9bbdf57..826fea136a0 100644 --- a/code/game/gamemodes/blob/powers.dm +++ b/code/game/gamemodes/blob/powers.dm @@ -2,7 +2,8 @@ /mob/camera/blob/proc/can_buy(var/cost = 15) if(blob_points < cost) - src << "You cannot afford this!" + to_chat(src, "You cannot afford this!") + return 0 add_points(-cost) return 1 @@ -44,11 +45,13 @@ var/obj/effect/blob/B = (locate(/obj/effect/blob) in T) if(!B)//We are on a blob - src << "There is no blob here!" + to_chat(src, "There is no blob here!") + return if(!istype(B, /obj/effect/blob/normal)) - src << "Unable to use this blob, find a normal one." + to_chat(src, "Unable to use this blob, find a normal one.") + return if(!can_buy(10)) @@ -75,15 +78,18 @@ var/obj/effect/blob/B = (locate(/obj/effect/blob) in T) if(!B)//We are on a blob - src << "There is no blob here!" + to_chat(src, "There is no blob here!") + return if(!istype(B, /obj/effect/blob/normal)) - src << "Unable to use this blob, find a normal one." + to_chat(src, "Unable to use this blob, find a normal one.") + return for(var/obj/effect/blob/resource/blob in orange(4, T)) - src << "There is a resource blob nearby, move more than 4 tiles away from it!" + to_chat(src, "There is a resource blob nearby, move more than 4 tiles away from it!") + return if(!can_buy(40)) @@ -111,15 +117,18 @@ var/obj/effect/blob/B = (locate(/obj/effect/blob) in T) if(!B)//We are on a blob - src << "There is no blob here!" + to_chat(src, "There is no blob here!") + return if(!istype(B, /obj/effect/blob/normal)) - src << "Unable to use this blob, find a normal one." + to_chat(src, "Unable to use this blob, find a normal one.") + return for(var/obj/effect/blob/node/blob in orange(5, T)) - src << "There is another node nearby, move more than 5 tiles away from it!" + to_chat(src, "There is another node nearby, move more than 5 tiles away from it!") + return if(!can_buy(60)) @@ -146,15 +155,18 @@ var/obj/effect/blob/B = locate(/obj/effect/blob) in T if(!B) - src << "You must be on a blob!" + to_chat(src, "You must be on a blob!") + return if(!istype(B, /obj/effect/blob/normal)) - src << "Unable to use this blob, find a normal one." + to_chat(src, "Unable to use this blob, find a normal one.") + return for(var/obj/effect/blob/factory/blob in orange(7, T)) - src << "There is a factory blob nearby, move more than 7 tiles away from it!" + to_chat(src, "There is a factory blob nearby, move more than 7 tiles away from it!") + return if(!can_buy(60)) @@ -180,11 +192,13 @@ var/obj/effect/blob/B = locate(/obj/effect/blob) in T if(!B) - src << "You must be on a blob!" + to_chat(src, "You must be on a blob!") + return if(!istype(B, /obj/effect/blob/factory)) - src << "Unable to use this blob, find a factory blob." + to_chat(src, "Unable to use this blob, find a factory blob.") + return if(!can_buy(20)) @@ -212,7 +226,8 @@ var/obj/effect/blob/node/B = locate(/obj/effect/blob/node) in T if(!B) - src << "You must be on a blob node!" + to_chat(src, "You must be on a blob node!") + return if(!can_buy(80)) @@ -236,11 +251,13 @@ var/obj/effect/blob/B = locate(/obj/effect/blob) in T if(!B) - src << "You must be on a blob!" + to_chat(src, "You must be on a blob!") + return if(istype(B, /obj/effect/blob/core)) - src << "Unable to remove this blob." + to_chat(src, "Unable to remove this blob.") + return qdel(B) @@ -263,12 +280,14 @@ return var/obj/effect/blob/B = locate() in T if(B) - src << "There is a blob here!" + to_chat(src, "There is a blob here!") + return var/obj/effect/blob/OB = locate() in circlerange(T, 1) if(!OB) - src << "There is no blob adjacent to you." + to_chat(src, "There is no blob adjacent to you.") + return if(!can_buy(5)) @@ -298,7 +317,8 @@ if(!can_buy(5)) return - src << "You rally your spores." + to_chat(src, "You rally your spores.") + var/list/surrounding_turfs = block(locate(T.x - 1, T.y - 1, T.z), locate(T.x + 1, T.y + 1, T.z)) if(!surrounding_turfs.len) @@ -317,11 +337,13 @@ set desc = "Expend resources to attempt to produce another sentient overmind" if(!blob_nodes || !blob_nodes.len) - src << "A node is required to birth your offspring..." + to_chat(src, "A node is required to birth your offspring...") + return var/obj/effect/blob/node/N = locate(/obj/effect/blob) in blob_nodes if(!N) - src << "A node is required to birth your offspring..." + to_chat(src, "A node is required to birth your offspring...") + return if(!can_buy(100)) @@ -346,7 +368,8 @@ if(!speak_text) return else - usr << "You broadcast with your minions, [speak_text]" + to_chat(usr, "You broadcast with your minions, [speak_text]") + for(var/mob/living/simple_animal/hostile/blob_minion in blob_mobs) blob_minion.say(speak_text) return @@ -365,15 +388,18 @@ var/obj/effect/blob/B = (locate(/obj/effect/blob) in T) if(!B)//We are on a blob - src << "There is no blob here!" + to_chat(src, "There is no blob here!") + return if(!istype(B, /obj/effect/blob/normal)) - src << "Unable to use this blob, find a normal one." + to_chat(src, "Unable to use this blob, find a normal one.") + return for(var/obj/effect/blob/storage/blob in orange(3, T)) - src << "There is a storage blob nearby, move more than 4 tiles away from it!" + to_chat(src, "There is a storage blob nearby, move more than 4 tiles away from it!") + return if(!can_buy(40)) @@ -406,4 +432,5 @@ for(var/mob/living/simple_animal/hostile/blob/BLO) BLO.adjustcolors(blob_reagent_datum.color) - src << "Your reagent is now: [blob_reagent_datum.name]!" \ No newline at end of file + to_chat(src, "Your reagent is now: [blob_reagent_datum.name]!") + diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index d06d060de92..a1cd163dc6e 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -196,7 +196,8 @@ /obj/effect/blob/examine(mob/user) ..(user) - user << "It looks like it's of a [get_chem_name()] kind." + to_chat(user, "It looks like it's of a [get_chem_name()] kind.") + /obj/effect/blob/proc/get_chem_name() diff --git a/code/game/gamemodes/borer/borer.dm b/code/game/gamemodes/borer/borer.dm index bf381ef763d..a61e86db924 100644 --- a/code/game/gamemodes/borer/borer.dm +++ b/code/game/gamemodes/borer/borer.dm @@ -18,8 +18,10 @@ var/list/found_vents = list() /datum/game_mode/borer/announce() - world << "The current game mode is - Cortical Borer!" - world << "An unknown creature has infested the mind of a crew member. Find and destroy it by any means necessary." + to_chat(world, "The current game mode is - Cortical Borer!") + + to_chat(world, "An unknown creature has infested the mind of a crew member. Find and destroy it by any means necessary.") + /datum/game_mode/borer/can_start() if(!..()) @@ -99,11 +101,13 @@ /datum/game_mode/proc/greet_borer(var/datum/mind/borer, var/you_are=1) if (you_are) - borer.current << "\red You are a Cortical Borer!" + to_chat(borer.current, "\red You are a Cortical Borer!") + var/obj_count = 1 for(var/datum/objective/objective in borer.objectives) - borer.current << "Objective #[obj_count]: [objective.explanation_text]" + to_chat(borer.current, "Objective #[obj_count]: [objective.explanation_text]") + obj_count++ return @@ -125,16 +129,20 @@ for(var/datum/mind/borer in borers) var/borerwin = 1 if((borer.current) && istype(borer.current,/mob/living/simple_animal/borer)) - world << "The borer was [borer.current.key]." - world << "The last host was [borer.current:host.key]." + to_chat(world, "The borer was [borer.current.key].") + + to_chat(world, "The last host was [borer.current:host.key].") + var/count = 1 for(var/datum/objective/objective in borer.objectives) if(objective.check_completion()) - world << "Objective #[count]: [objective.explanation_text] \green Success" + to_chat(world, "Objective #[count]: [objective.explanation_text] \green Success") + feedback_add_details("borer_objective","[objective.type]|SUCCESS") else - world << "Objective #[count]: [objective.explanation_text] \red Failed" + to_chat(world, "Objective #[count]: [objective.explanation_text] \red Failed") + feedback_add_details("borer_objective","[objective.type]|FAIL") borerwin = 0 count++ @@ -143,10 +151,12 @@ borerwin = 0 if(borerwin) - world << "The borer was successful!" + to_chat(world, "The borer was successful!") + feedback_add_details("borer_success","SUCCESS") else - world << "The borer has failed!" + to_chat(world, "The borer has failed!") + feedback_add_details("borer_success","FAIL") return 1 diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 67190e351f4..a66e9d4a8d9 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -38,8 +38,10 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" var/changeling_amount = 4 /datum/game_mode/changeling/announce() - world << "The current game mode is - Changeling!" - world << "There are alien changelings on the station. Do not let the changelings succeed!" + to_chat(world, "The current game mode is - Changeling!") + + to_chat(world, "There are alien changelings on the station. Do not let the changelings succeed!") + /datum/game_mode/changeling/pre_setup() @@ -134,17 +136,22 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" /datum/game_mode/proc/greet_changeling(var/datum/mind/changeling, var/you_are=1) if (you_are) - changeling.current << "\red You are a changeling!" - changeling.current << "\red Use say \":g message\" to communicate with your fellow changelings. Remember: you get all of their absorbed DNA if you absorb them." - changeling.current << "You must complete the following tasks:" + to_chat(changeling.current, "\red You are a changeling!") + + to_chat(changeling.current, "\red Use say \":g message\" to communicate with your fellow changelings. Remember: you get all of their absorbed DNA if you absorb them.") + + to_chat(changeling.current, "You must complete the following tasks:") + if (changeling.current.mind) if (changeling.current.mind.assigned_role == "Clown") - changeling.current << "You have evolved beyond your clownish nature, allowing you to wield weapons without harming yourself." + to_chat(changeling.current, "You have evolved beyond your clownish nature, allowing you to wield weapons without harming yourself.") + changeling.current.mutations.Remove(CLUMSY) var/obj_count = 1 for(var/datum/objective/objective in changeling.objectives) - changeling.current << "Objective #[obj_count]: [objective.explanation_text]" + to_chat(changeling.current, "Objective #[obj_count]: [objective.explanation_text]") + obj_count++ return @@ -157,10 +164,13 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" changeling_mind.memory = "" changeling_mind.special_role = null if(issilicon(changeling_mind)) - changeling_mind.current << "You have been robotized!" - changeling_mind.current << "You must obey your silicon laws and master AI above all else. Your objectives will consider you to be dead." + to_chat(changeling_mind.current, "You have been robotized!") + + to_chat(changeling_mind.current, "You must obey your silicon laws and master AI above all else. Your objectives will consider you to be dead.") + else - changeling_mind.current << "You lose your powers! You are no longer a changeling and are stuck in your current form!" + to_chat(changeling_mind.current, "You lose your powers! You are no longer a changeling and are stuck in your current form!") + update_change_icons_removed(changeling_mind) /datum/game_mode/proc/update_change_icons_added(datum/mind/changeling) @@ -242,7 +252,8 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" text += "
      The changeling has failed." feedback_add_details("changeling_success","FAIL") - world << text + to_chat(world, text) + return 1 @@ -300,36 +311,44 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" /datum/changeling/proc/can_absorb_dna(var/mob/living/carbon/user, var/mob/living/carbon/target) if(absorbed_dna[1] == user.dna)//If our current DNA is the stalest, we gotta ditch it. - user << "We have reached our capacity to store genetic information! We must transform before absorbing more." + to_chat(user, "We have reached our capacity to store genetic information! We must transform before absorbing more.") + return if(!target || !target.dna) - user << "This creature does not have any DNA." + to_chat(user, "This creature does not have any DNA.") + return var/mob/living/carbon/human/T = target if(!istype(T) || issmall(T)) - user << "[T] is not compatible with our biology." + to_chat(user, "[T] is not compatible with our biology.") + return if((NOCLONE || SKELETON || HUSK) in T.mutations) - user << "DNA of [target] is ruined beyond usability!" + to_chat(user, "DNA of [target] is ruined beyond usability!") + return if(T.species.flags & NO_DNA) - user << "This creature does not have DNA!" + to_chat(user, "This creature does not have DNA!") + return if(T.species.flags & NO_SCAN) - user << "We do not know how to parse this creature's DNA!" + to_chat(user, "We do not know how to parse this creature's DNA!") + return if(T.species.flags & NO_BLOOD) - user << "We are not able to use the DNA of a creature without a circulatory system." + to_chat(user, "We are not able to use the DNA of a creature without a circulatory system.") + return if(has_dna(target.dna)) - user << "We already have this DNA in storage!" + to_chat(user, "We already have this DNA in storage!") + return 1 diff --git a/code/game/gamemodes/changeling/changeling_power.dm b/code/game/gamemodes/changeling/changeling_power.dm index a365a45673c..c70a7550f8c 100644 --- a/code/game/gamemodes/changeling/changeling_power.dm +++ b/code/game/gamemodes/changeling/changeling_power.dm @@ -53,23 +53,29 @@ if(!ishuman(user)) //typecast everything from mob to carbon from this point onwards return 0 if(req_human && (!ishuman(user) || issmall(user))) - user << "We cannot do that in this form!" + to_chat(user, "We cannot do that in this form!") + return 0 var/datum/changeling/c = user.mind.changeling if(c.chem_chargesWe require at least [chemical_cost] unit\s of chemicals to do that!" + to_chat(user, "We require at least [chemical_cost] unit\s of chemicals to do that!") + return 0 if(c.absorbedcountWe require at least [req_dna] sample\s of compatible DNA." + to_chat(user, "We require at least [req_dna] sample\s of compatible DNA.") + return 0 if(req_stat < user.stat) - user << "We are incapacitated." + to_chat(user, "We are incapacitated.") + return 0 if((user.status_flags & FAKEDEATH) && name!="Regenerate") - user << "We are incapacitated." + to_chat(user, "We are incapacitated.") + return 0 if(c.geneticdamage > max_genetic_damage) - user << "Our genomes are still reassembling. We need time to recover first." + to_chat(user, "Our genomes are still reassembling. We need time to recover first.") + return 0 return 1 diff --git a/code/game/gamemodes/changeling/evolution_menu.dm b/code/game/gamemodes/changeling/evolution_menu.dm index 86fd12a5069..811cb95134e 100644 --- a/code/game/gamemodes/changeling/evolution_menu.dm +++ b/code/game/gamemodes/changeling/evolution_menu.dm @@ -307,27 +307,33 @@ var/list/sting_paths thepower = cling_sting if(thepower == null) - user << "This is awkward. Changeling power purchase failed, please report this bug to a coder!" + to_chat(user, "This is awkward. Changeling power purchase failed, please report this bug to a coder!") + return if(absorbedcount < thepower.req_dna) - user << "We lack the energy to evolve this ability!" + to_chat(user, "We lack the energy to evolve this ability!") + return if(has_sting(thepower)) - user << "We have already evolved this ability!" + to_chat(user, "We have already evolved this ability!") + return if(thepower.dna_cost < 0) - user << "We cannot evolve this ability." + to_chat(user, "We cannot evolve this ability.") + return if(geneticpoints < thepower.dna_cost) - user << "We have reached our capacity for abilities." + to_chat(user, "We have reached our capacity for abilities.") + return if(user.status_flags & FAKEDEATH)//To avoid potential exploits by buying new powers while in stasis, which clears your verblist. - user << "We lack the energy to evolve new abilities right now." + to_chat(user, "We lack the energy to evolve new abilities right now.") + return geneticpoints -= thepower.dna_cost @@ -337,16 +343,19 @@ var/list/sting_paths //Reselect powers /datum/changeling/proc/lingRespec(var/mob/user) if(!ishuman(user) || issmall(user)) - user << "We can't remove our evolutions in this form!" + to_chat(user, "We can't remove our evolutions in this form!") + return if(canrespec) - user << "We have removed our evolutions from this form, and are now ready to readapt." + to_chat(user, "We have removed our evolutions from this form, and are now ready to readapt.") + user.remove_changeling_powers(1) canrespec = 0 user.make_changeling() return 1 else - user << "You lack the power to readapt your evolutions!" + to_chat(user, "You lack the power to readapt your evolutions!") + return 0 /mob/proc/make_changeling() diff --git a/code/game/gamemodes/changeling/powers/absorb.dm b/code/game/gamemodes/changeling/powers/absorb.dm index 9f932071fca..87bbf648286 100644 --- a/code/game/gamemodes/changeling/powers/absorb.dm +++ b/code/game/gamemodes/changeling/powers/absorb.dm @@ -12,15 +12,18 @@ var/datum/changeling/changeling = user.mind.changeling if(changeling.isabsorbing) - user << "We are already absorbing!" + to_chat(user, "We are already absorbing!") + return var/obj/item/weapon/grab/G = user.get_active_hand() if(!istype(G)) - user << "We must be grabbing a creature in our active hand to absorb them." + to_chat(user, "We must be grabbing a creature in our active hand to absorb them.") + return if(G.state <= GRAB_NECK) - user << "We must have a tighter grip to absorb this creature." + to_chat(user, "We must have a tighter grip to absorb this creature.") + return var/mob/living/carbon/target = G.affecting @@ -36,24 +39,31 @@ for(var/stage = 1, stage<=3, stage++) switch(stage) if(1) - user << "This creature is compatible. We must hold still..." + to_chat(user, "This creature is compatible. We must hold still...") + if(2) - user << "We extend a proboscis." + to_chat(user, "We extend a proboscis.") + user.visible_message("[user] extends a proboscis!") if(3) - user << "We stab [target] with the proboscis." + to_chat(user, "We stab [target] with the proboscis.") + user.visible_message("[user] stabs [target] with the proboscis!") - target << "You feel a sharp stabbing pain!" + to_chat(target, "You feel a sharp stabbing pain!") + target.take_overall_damage(40) feedback_add_details("changeling_powers","A[stage]") if(!do_mob(user, target, 150)) - user << "Our absorption of [target] has been interrupted!" + to_chat(user, "Our absorption of [target] has been interrupted!") + changeling.isabsorbing = 0 return - user << "We have absorbed [target]!" + to_chat(user, "We have absorbed [target]!") + user.visible_message("[user] sucks the fluids from [target]!") - target << "You have been absorbed by the changeling!" + to_chat(target, "You have been absorbed by the changeling!") + if(!changeling.has_dna(target.dna)) changeling.absorb_dna(target, user) diff --git a/code/game/gamemodes/changeling/powers/digitalcamo.dm b/code/game/gamemodes/changeling/powers/digitalcamo.dm index 92ae8e7781e..cbca94df6f5 100644 --- a/code/game/gamemodes/changeling/powers/digitalcamo.dm +++ b/code/game/gamemodes/changeling/powers/digitalcamo.dm @@ -8,9 +8,11 @@ /obj/effect/proc_holder/changeling/digitalcamo/sting_action(var/mob/user) if(user.digitalcamo) - user << "We return to normal." + to_chat(user, "We return to normal.") + else - user << "We distort our form to prevent AI-tracking." + to_chat(user, "We distort our form to prevent AI-tracking.") + user.digitalcamo = !user.digitalcamo feedback_add_details("changeling_powers","CAM") diff --git a/code/game/gamemodes/changeling/powers/epinephrine.dm b/code/game/gamemodes/changeling/powers/epinephrine.dm index 55ce85cf88d..64c879d9d8e 100644 --- a/code/game/gamemodes/changeling/powers/epinephrine.dm +++ b/code/game/gamemodes/changeling/powers/epinephrine.dm @@ -11,9 +11,11 @@ /obj/effect/proc_holder/changeling/epinephrine/sting_action(var/mob/living/user) if(user.lying) - user << "We arise." + to_chat(user, "We arise.") + else - user << "Adrenaline rushes through us." + to_chat(user, "Adrenaline rushes through us.") + user.stat = 0 user.SetParalysis(0) user.SetStunned(0) diff --git a/code/game/gamemodes/changeling/powers/fakedeath.dm b/code/game/gamemodes/changeling/powers/fakedeath.dm index 3a0fb785f19..e3435ca1d61 100644 --- a/code/game/gamemodes/changeling/powers/fakedeath.dm +++ b/code/game/gamemodes/changeling/powers/fakedeath.dm @@ -11,7 +11,8 @@ //Fake our own death and fully heal. You will appear to be dead but regenerate fully after a short delay. /obj/effect/proc_holder/changeling/fakedeath/sting_action(var/mob/living/user) - user << "We begin our stasis, preparing energy to arise once more." + to_chat(user, "We begin our stasis, preparing energy to arise once more.") + user.status_flags |= FAKEDEATH //play dead user.update_canmove() @@ -22,7 +23,8 @@ spawn(800) if(user && user.mind && user.mind.changeling && user.mind.changeling.purchasedpowers) - user << "We are ready to regenerate." + to_chat(user, "We are ready to regenerate.") + user.mind.changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/revive(null) feedback_add_details("changeling_powers","FD") diff --git a/code/game/gamemodes/changeling/powers/fleshmend.dm b/code/game/gamemodes/changeling/powers/fleshmend.dm index 97889d1c9e3..27bdc9f5dcd 100644 --- a/code/game/gamemodes/changeling/powers/fleshmend.dm +++ b/code/game/gamemodes/changeling/powers/fleshmend.dm @@ -8,7 +8,8 @@ //Starts healing you every second for 10 seconds. Can be used whilst unconscious. /obj/effect/proc_holder/changeling/fleshmend/sting_action(var/mob/living/user) - user << "We begin to heal rapidly." + to_chat(user, "We begin to heal rapidly.") + if(ishuman(user)) var/mob/living/carbon/human/H = user H.restore_blood() diff --git a/code/game/gamemodes/changeling/powers/headcrab.dm b/code/game/gamemodes/changeling/powers/headcrab.dm index 98c7b964f4a..aa8bbb1aca2 100644 --- a/code/game/gamemodes/changeling/powers/headcrab.dm +++ b/code/game/gamemodes/changeling/powers/headcrab.dm @@ -15,7 +15,8 @@ explosion(get_turf(user),0,0,2,0,silent=1) for(var/mob/living/carbon/human/H in range(2,user)) - H << "You are blinded by a shower of blood!" + to_chat(H, "You are blinded by a shower of blood!") + H.Stun(1) H.eye_blurry = max(20, H.eye_blurry) var/obj/item/organ/internal/eyes/E = H.get_int_organ(/obj/item/organ/internal/eyes) @@ -23,7 +24,8 @@ E.damage = max(E.damage+5, 0) H.confused += 3 for(var/mob/living/silicon/S in range(2,user)) - S << "Your sensors are disabled by a shower of blood!" + to_chat(S, "Your sensors are disabled by a shower of blood!") + S.Weaken(3) var/turf = get_turf(user) spawn(5) // So it's not killed in explosion @@ -34,7 +36,8 @@ if(crab.origin) crab.origin.active = 1 crab.origin.transfer_to(crab) - crab << "You burst out of the remains of your former body in a shower of gore!" + to_chat(crab, "You burst out of the remains of your former body in a shower of gore!") + user.gib() feedback_add_details("changeling_powers","LR") return 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/hivemind.dm b/code/game/gamemodes/changeling/powers/hivemind.dm index 853b7081fed..b5f45348651 100644 --- a/code/game/gamemodes/changeling/powers/hivemind.dm +++ b/code/game/gamemodes/changeling/powers/hivemind.dm @@ -10,7 +10,8 @@ ..() var/datum/changeling/changeling=user.mind.changeling changeling.changeling_speak = 1 - user << "Use say \":g message\" to communicate with the other changelings." + to_chat(user, "Use say \":g message\" to communicate with the other changelings.") + var/obj/effect/proc_holder/changeling/hivemind_upload/S1 = new if(!changeling.has_sting(S1)) changeling.purchasedpowers+=S1 @@ -36,7 +37,8 @@ var/list/datum/dna/hivemind_bank = list() names += DNA.real_name if(names.len <= 0) - user << "The airwaves already have all of our DNA." + to_chat(user, "The airwaves already have all of our DNA.") + return var/chosen_name = input("Select a DNA to channel: ", "Channel DNA", null) as null|anything in names @@ -48,7 +50,8 @@ var/list/datum/dna/hivemind_bank = list() return hivemind_bank += chosen_dna - user << "We channel the DNA of [chosen_name] to the air." + to_chat(user, "We channel the DNA of [chosen_name] to the air.") + feedback_add_details("changeling_powers","HU") return 1 @@ -63,7 +66,8 @@ var/list/datum/dna/hivemind_bank = list() return var/datum/changeling/changeling = user.mind.changeling if(changeling.absorbed_dna[1] == user.dna)//If our current DNA is the stalest, we gotta ditch it. - user << "We have reached our capacity to store genetic information! We must transform before absorbing more." + to_chat(user, "We have reached our capacity to store genetic information! We must transform before absorbing more.") + return return 1 @@ -75,7 +79,8 @@ var/list/datum/dna/hivemind_bank = list() names[DNA.real_name] = DNA if(names.len <= 0) - user << "There's no new DNA to absorb from the air." + to_chat(user, "There's no new DNA to absorb from the air.") + return var/S = input("Select a DNA absorb from the air: ", "Absorb DNA", null) as null|anything in names @@ -87,6 +92,7 @@ var/list/datum/dna/hivemind_bank = list() if(changeling.absorbed_dna.len) changeling.absorbed_dna.Cut(1,2) changeling.store_dna(chosen_dna, user) - user << "We absorb the DNA of [S] from the air." + to_chat(user, "We absorb the DNA of [S] from the air.") + feedback_add_details("changeling_powers","HD") return 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/humanform.dm b/code/game/gamemodes/changeling/powers/humanform.dm index 77a200c907d..e0edffe1889 100644 --- a/code/game/gamemodes/changeling/powers/humanform.dm +++ b/code/game/gamemodes/changeling/powers/humanform.dm @@ -23,7 +23,8 @@ return if(!user) return 0 - user << "We transform our appearance." + to_chat(user, "We transform our appearance.") + user.dna.SetSEState(MONKEYBLOCK,0) domutcheck(user, null) // Do a pre-mutcheck to cleanly switch from monkey form. user.dna = chosen_dna diff --git a/code/game/gamemodes/changeling/powers/lesserform.dm b/code/game/gamemodes/changeling/powers/lesserform.dm index 8a80af6707e..f533cdd7696 100644 --- a/code/game/gamemodes/changeling/powers/lesserform.dm +++ b/code/game/gamemodes/changeling/powers/lesserform.dm @@ -12,18 +12,21 @@ if(!user) return 0 if(user.has_brain_worms()) - user << "We cannot perform this ability at the present time!" + to_chat(user, "We cannot perform this ability at the present time!") + return var/mob/living/carbon/human/H = user if(!istype(H) || !H.species.primitive_form) - src << "We cannot perform this ability in this form!" + to_chat(src, "We cannot perform this ability in this form!") + return H.visible_message("[H] transforms!") changeling.geneticdamage = 30 - H << "Our genes cry out!" + to_chat(H, "Our genes cry out!") + var/list/implants = list() //Try to preserve implants. for(var/obj/item/weapon/implant/W in H) implants += W diff --git a/code/game/gamemodes/changeling/powers/mimic_voice.dm b/code/game/gamemodes/changeling/powers/mimic_voice.dm index 9d637245196..797c97f0ae0 100644 --- a/code/game/gamemodes/changeling/powers/mimic_voice.dm +++ b/code/game/gamemodes/changeling/powers/mimic_voice.dm @@ -13,7 +13,8 @@ if(changeling.mimicing) changeling.mimicing = "" changeling.chem_recharge_slowdown -= 0.5 - user << "We return our vocal glands to their original position." + to_chat(user, "We return our vocal glands to their original position.") + return var/mimic_voice = stripped_input(user, "Enter a name to mimic.", "Mimic Voice", null, MAX_NAME_LEN) @@ -22,7 +23,9 @@ changeling.mimicing = mimic_voice changeling.chem_recharge_slowdown += 0.5 - user << "We shape our glands to take the voice of [mimic_voice], this will stop us from regenerating chemicals while active." - user << "Use this power again to return to our original voice and reproduce chemicals again." + to_chat(user, "We shape our glands to take the voice of [mimic_voice], this will stop us from regenerating chemicals while active.") + + to_chat(user, "Use this power again to return to our original voice and reproduce chemicals again.") + feedback_add_details("changeling_powers","MV") diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm index 4ca71490dc0..c69e66e5c6f 100644 --- a/code/game/gamemodes/changeling/powers/mutations.dm +++ b/code/game/gamemodes/changeling/powers/mutations.dm @@ -35,7 +35,8 @@ /obj/effect/proc_holder/changeling/weapon/sting_action(var/mob/user) if(!user.drop_item()) - user << "The [user.get_active_hand()] is stuck to your hand, you cannot grow a [weapon_name_simple] over it!" + to_chat(user, "The [user.get_active_hand()] is stuck to your hand, you cannot grow a [weapon_name_simple] over it!") + return var/obj/item/W = new weapon_type(user) user.put_in_hands(W) @@ -85,10 +86,12 @@ /obj/effect/proc_holder/changeling/suit/sting_action(var/mob/living/carbon/human/user) if(!user.unEquip(user.wear_suit)) - user << "\the [user.wear_suit] is stuck to your body, you cannot grow a [suit_name_simple] over it!" + to_chat(user, "\the [user.wear_suit] is stuck to your body, you cannot grow a [suit_name_simple] over it!") + return if(!user.unEquip(user.head)) - user << "\the [user.head] is stuck on your head, you cannot grow a [helmet_name_simple] over it!" + to_chat(user, "\the [user.head] is stuck on your head, you cannot grow a [helmet_name_simple] over it!") + return user.unEquip(user.head) @@ -160,11 +163,13 @@ return if(A.arePowerSystemsOn()) - user << "The airlock's motors resist our efforts to force it." + to_chat(user, "The airlock's motors resist our efforts to force it.") + return else if(A.locked) - user << "The airlock's bolts prevent it from being forced." + to_chat(user, "The airlock's bolts prevent it from being forced.") + return else diff --git a/code/game/gamemodes/changeling/powers/panacea.dm b/code/game/gamemodes/changeling/powers/panacea.dm index e8d42efcc1f..45664d88318 100644 --- a/code/game/gamemodes/changeling/powers/panacea.dm +++ b/code/game/gamemodes/changeling/powers/panacea.dm @@ -9,7 +9,8 @@ //Heals the things that the other regenerative abilities don't. /obj/effect/proc_holder/changeling/panacea/sting_action(var/mob/user) - user << "We cleanse impurities from our form." + to_chat(user, "We cleanse impurities from our form.") + var/obj/item/organ/internal/body_egg/egg = user.get_int_organ(/obj/item/organ/internal/body_egg) if(egg) diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm index 797f8887767..30dbea23d86 100644 --- a/code/game/gamemodes/changeling/powers/revive.dm +++ b/code/game/gamemodes/changeling/powers/revive.dm @@ -61,7 +61,8 @@ IO.damage = 0 IO.trace_chemicals = list() H.updatehealth() - user << "We have regenerated." + to_chat(user, "We have regenerated.") + user.regenerate_icons() diff --git a/code/game/gamemodes/changeling/powers/shriek.dm b/code/game/gamemodes/changeling/powers/shriek.dm index 745d84507d7..006694aa394 100644 --- a/code/game/gamemodes/changeling/powers/shriek.dm +++ b/code/game/gamemodes/changeling/powers/shriek.dm @@ -16,10 +16,12 @@ M.confused += 20 M.Jitter(50) else - M << sound('sound/effects/screech.ogg') + to_chat(M, sound('sound/effects/screech.ogg')) + if(issilicon(M)) - M << sound('sound/weapons/flash.ogg') + to_chat(M, sound('sound/weapons/flash.ogg')) + M.Weaken(rand(5,10)) for(var/obj/machinery/light/L in range(4, user)) diff --git a/code/game/gamemodes/changeling/powers/strained_muscles.dm b/code/game/gamemodes/changeling/powers/strained_muscles.dm index 7c5cded0c91..92807305c4c 100644 --- a/code/game/gamemodes/changeling/powers/strained_muscles.dm +++ b/code/game/gamemodes/changeling/powers/strained_muscles.dm @@ -14,12 +14,15 @@ /obj/effect/proc_holder/changeling/strained_muscles/sting_action(var/mob/living/carbon/user) active = !active if(active) - user << "Our muscles tense and strengthen." + to_chat(user, "Our muscles tense and strengthen.") + else user.status_flags &= ~GOTTAGOFAST - user << "Our muscles relax." + to_chat(user, "Our muscles relax.") + if(stacks >= 10) - user << "We collapse in exhaustion." + to_chat(user, "We collapse in exhaustion.") + user.Weaken(3) user.emote("gasp") @@ -27,7 +30,8 @@ user.status_flags |= GOTTAGOFAST if(user.stat || user.staminaloss >= 90) active = 0 //Let's use something exact instead of !active where we can. - user << "Our muscles relax without the energy to strengthen them." + to_chat(user, "Our muscles relax without the energy to strengthen them.") + user.status_flags &= ~GOTTAGOFAST user.Weaken(2) user.emote("gasp") @@ -38,7 +42,8 @@ user.staminaloss += stacks * 1.3 //At first the changeling may regenerate stamina fast enough to nullify fatigue, but it will stack if(stacks == 11) //Warning message that the stacks are getting too high - user << "Our legs are really starting to hurt..." + to_chat(user, "Our legs are really starting to hurt...") + sleep(40) diff --git a/code/game/gamemodes/changeling/powers/swap_form.dm b/code/game/gamemodes/changeling/powers/swap_form.dm index 09ecf7029bb..bcc12d004f7 100644 --- a/code/game/gamemodes/changeling/powers/swap_form.dm +++ b/code/game/gamemodes/changeling/powers/swap_form.dm @@ -11,14 +11,17 @@ return var/obj/item/weapon/grab/G = user.get_active_hand() if(!istype(G) || (G.state < GRAB_AGGRESSIVE)) - user << "We must have an aggressive grab on creature in our active hand to do this!" + to_chat(user, "We must have an aggressive grab on creature in our active hand to do this!") + return var/mob/living/carbon/human/target = G.affecting if((NOCLONE || SKELETON || HUSK) in target.mutations) - user << "DNA of [target] is ruined beyond usability!" + to_chat(user, "DNA of [target] is ruined beyond usability!") + return if(!istype(target) || issmall(target) || target.species.flags & NO_DNA || target.species.flags & NO_SCAN || target.species.flags & NO_BLOOD) - user << "[target] is not compatible with this ability." + to_chat(user, "[target] is not compatible with this ability.") + return return 1 @@ -28,15 +31,18 @@ var/mob/living/carbon/human/target = G.affecting var/datum/changeling/changeling = user.mind.changeling - user << "We tighen our grip. We must hold still...." + to_chat(user, "We tighen our grip. We must hold still....") + target.do_jitter_animation(500) user.do_jitter_animation(500) if(!do_mob(user,target,20)) - user << "The body swap has been interrupted!" + to_chat(user, "The body swap has been interrupted!") + return - target << "[user] tightens their grip as a painful sensation invades your body." + to_chat(target, "[user] tightens their grip as a painful sensation invades your body.") + if(!changeling.has_dna(target.dna)) changeling.absorb_dna(target, user) @@ -52,4 +58,5 @@ user.Paralyse(2) user.remove_language("Changeling") target.add_language("Changeling") - target << "Our genes cry out as we swap our [user] form for [target]." \ No newline at end of file + to_chat(target, "Our genes cry out as we swap our [user] form for [target].") + diff --git a/code/game/gamemodes/changeling/powers/tiny_prick.dm b/code/game/gamemodes/changeling/powers/tiny_prick.dm index aae84f00530..a274d1f99d1 100644 --- a/code/game/gamemodes/changeling/powers/tiny_prick.dm +++ b/code/game/gamemodes/changeling/powers/tiny_prick.dm @@ -14,13 +14,15 @@ return /obj/effect/proc_holder/changeling/sting/proc/set_sting(var/mob/user) - user << "We prepare our sting, use alt+click or middle mouse button on target to sting them." + to_chat(user, "We prepare our sting, use alt+click or middle mouse button on target to sting them.") + user.mind.changeling.chosen_sting = src user.hud_used.lingstingdisplay.icon_state = sting_icon user.hud_used.lingstingdisplay.invisibility = 0 /obj/effect/proc_holder/changeling/sting/proc/unset_sting(var/mob/user) - user << "We retract our sting, we can't sting anyone for now." + to_chat(user, "We retract our sting, we can't sting anyone for now.") + user.mind.changeling.chosen_sting = null user.hud_used.lingstingdisplay.icon_state = null user.hud_used.lingstingdisplay.invisibility = 101 @@ -33,13 +35,15 @@ if(!..()) return if(!user.mind.changeling.chosen_sting) - user << "We haven't prepared our sting yet!" + to_chat(user, "We haven't prepared our sting yet!") + if(!iscarbon(target)) return if(ishuman(target)) var/mob/living/carbon/human/H = target if(H.isSynthetic()) - user << "This won't work on synthetics." + to_chat(user, "This won't work on synthetics.") + return if(!isturf(user.loc)) return @@ -54,9 +58,11 @@ /obj/effect/proc_holder/changeling/sting/sting_feedback(var/mob/user, var/mob/target) if(!target) return - user << "We stealthily sting [target.name]." + to_chat(user, "We stealthily sting [target.name].") + if(target.mind && target.mind.changeling) - target << "You feel a tiny prick." + to_chat(target, "You feel a tiny prick.") + add_logs(target, user, "unsuccessfully stung") return 1 @@ -85,15 +91,18 @@ if(!..()) return if((HUSK in target.mutations) || (!ishuman(target))) - user << "Our sting appears ineffective against its DNA." + to_chat(user, "Our sting appears ineffective against its DNA.") + return 0 if(ishuman(target)) var/mob/living/carbon/human/H = target if(H.species.flags & NO_SCAN) //Prevents transforming slimes and killing them instantly - user << "This won't work on a creature with abnormal genetic material." + to_chat(user, "This won't work on a creature with abnormal genetic material.") + return 0 if(H.species.flags & NO_BLOOD) - user << "This won't work on a creature without a circulatory system." + to_chat(user, "This won't work on a creature without a circulatory system.") + return 0 return 1 @@ -101,7 +110,8 @@ add_logs(target, user, "stung", object="transformation sting", addition=" new identity is [selected_dna.real_name]") var/datum/dna/NewDNA = selected_dna if(issmall(target)) - user << "Our genes cry out as we sting [target.name]!" + to_chat(user, "Our genes cry out as we sting [target.name]!") + if(iscarbon(target) && (target.status_flags & CANWEAKEN)) var/mob/living/carbon/C = target @@ -163,7 +173,8 @@ obj/effect/proc_holder/changeling/sting/blind /obj/effect/proc_holder/changeling/sting/blind/sting_action(var/mob/user, var/mob/target) add_logs(target, user, "stung", object="blind sting") - target << "Your eyes burn horrifically!" + to_chat(target, "Your eyes burn horrifically!") + target.disabilities |= NEARSIGHTED target.eye_blind = 20 target.eye_blurry = 40 diff --git a/code/game/gamemodes/changeling/traitor_chan.dm b/code/game/gamemodes/changeling/traitor_chan.dm index 8cb86e6cc3c..611888d3722 100644 --- a/code/game/gamemodes/changeling/traitor_chan.dm +++ b/code/game/gamemodes/changeling/traitor_chan.dm @@ -10,8 +10,10 @@ var/protected_species_changeling = list("Machine", "Slime People") /datum/game_mode/traitor/changeling/announce() - world << "The current game mode is - Traitor+Changeling!" - world << "There is an alien creature on the station along with some syndicate operatives out for their own gain! Do not let the changeling and the traitors succeed!" + to_chat(world, "The current game mode is - Traitor+Changeling!") + + to_chat(world, "There is an alien creature on the station along with some syndicate operatives out for their own gain! Do not let the changeling and the traitors succeed!") + /datum/game_mode/traitor/changeling/pre_setup() diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 9df53d77013..d700a29cf27 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -54,8 +54,10 @@ /datum/game_mode/cult/announce() - world << "The current game mode is - Cult!" - world << "Some crewmembers are attempting to start a cult!
      \nCultists - complete your objectives. Convert crewmembers to your cause by using the convert rune. Remember - there is no you, there is only the cult.
      \nPersonnel - Do not let the cult succeed in its mission. Brainwashing them with the chaplain's bible reverts them to whatever CentComm-allowed faith they had.
      " + to_chat(world, "The current game mode is - Cult!") + + to_chat(world, "Some crewmembers are attempting to start a cult!
      \nCultists - complete your objectives. Convert crewmembers to your cause by using the convert rune. Remember - there is no you, there is only the cult.
      \nPersonnel - Do not let the cult succeed in its mission. Brainwashing them with the chaplain's bible reverts them to whatever CentComm-allowed faith they had.
      ") + /datum/game_mode/cult/pre_setup() @@ -98,7 +100,8 @@ equip_cultist(cult_mind.current) grant_runeword(cult_mind.current) update_cult_icons_added(cult_mind) - cult_mind.current << "\blue You are a member of the cult!" + to_chat(cult_mind.current, "\blue You are a member of the cult!") + memorize_cult_objectives(cult_mind) ..() @@ -117,9 +120,11 @@ explanation = "Free objective." if("eldergod") explanation = "Summon Nar-Sie via the use of the appropriate rune (Hell join self). It will only work if nine cultists stand on and around it." - cult_mind.current << "Objective #[obj_count]: [explanation]" + to_chat(cult_mind.current, "Objective #[obj_count]: [explanation]") + cult_mind.memory += "Objective #[obj_count]: [explanation]
      " - cult_mind.current << "The convert rune is join blood self" + to_chat(cult_mind.current, "The convert rune is join blood self") + cult_mind.memory += "The convert rune is join blood self
      " @@ -129,7 +134,8 @@ if (mob.mind) if (mob.mind.assigned_role == "Clown") - mob << "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself." + to_chat(mob, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.") + mob.mutations.Remove(CLUMSY) add_cult_viewpoint(mob) // give them a viewpoint @@ -144,9 +150,11 @@ ) var/where = mob.equip_in_one_of_slots(T, slots) if (!where) - mob << "Unfortunately, you weren't able to get a talisman. This is very bad and you should adminhelp immediately." + to_chat(mob, "Unfortunately, you weren't able to get a talisman. This is very bad and you should adminhelp immediately.") + else - mob << "You have a talisman in your [where], one that will help you start the cult on this station. Use it well and remember - there are others." + to_chat(mob, "You have a talisman in your [where], one that will help you start the cult on this station. Use it well and remember - there are others.") + mob.update_icons() return 1 @@ -165,7 +173,8 @@ if (!word) word=pick(allwords) var/wordexp = "[cultwords[word]] is [word]..." - cult_mob << "\red [pick("You remember something from the dark teachings of your master","You hear a dark voice on the wind","Black blood oozes into your vision and forms into symbols","You have a vision of a [pick("crow","raven","vulture","parrot")] it squawks","You catch a brief glimmer of the otherside")]... [wordexp]" + to_chat(cult_mob, "\red [pick("You remember something from the dark teachings of your master","You hear a dark voice on the wind","Black blood oozes into your vision and forms into symbols","You have a vision of a [pick("crow","raven","vulture","parrot")] it squawks","You catch a brief glimmer of the otherside")]... [wordexp]") + cult_mob.mind.store_memory("You remember that [wordexp]", 0, 0) @@ -199,7 +208,8 @@ /datum/game_mode/proc/remove_cultist(datum/mind/cult_mind, show_message = 1) if(cult_mind in cult) cult -= cult_mind - cult_mind.current << "\red An unfamiliar white light flashes through your mind, cleansing the taint of the dark-one and the memories of your time as his servant with it." + to_chat(cult_mind.current, "\red An unfamiliar white light flashes through your mind, cleansing the taint of the dark-one and the memories of your time as his servant with it.") + cult_mind.memory = "" cult_mind.special_role = null // remove the cult viewpoint object @@ -209,7 +219,8 @@ update_cult_icons_removed(cult_mind) if(show_message) for(var/mob/M in viewers(cult_mind.current)) - M << "[cult_mind.current] looks like they just reverted to their old faith!" + to_chat(M, "[cult_mind.current] looks like they just reverted to their old faith!") + /datum/game_mode/proc/add_cult_icon_to_spirit(mob/spirit/currentSpirit) @@ -295,11 +306,13 @@ if(!check_cult_victory()) feedback_set_details("round_end_result","win - cult win") feedback_set("round_end_result",acolytes_survived) - world << "\red The cult wins! It has succeeded in serving its dark masters!" + to_chat(world, "\red The cult wins! It has succeeded in serving its dark masters!") + else feedback_set_details("round_end_result","loss - staff stopped the cult") feedback_set("round_end_result",acolytes_survived) - world << "\red The staff managed to stop the cult!" + to_chat(world, "\red The staff managed to stop the cult!") + var/text = "Cultists escaped: [acolytes_survived]" @@ -335,7 +348,8 @@ feedback_add_details("cult_objective","cult_narsie|FAIL") text += "
      Objective #[obj_count]: [explanation]" - world << text + to_chat(world, text) + ..() return 1 @@ -357,4 +371,5 @@ text += "body destroyed" text += ")" - world << text + to_chat(world, text) + diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index ec96ec8be31..c7f71cdd5c7 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -15,7 +15,8 @@ return ..() else user.Paralyse(5) - user << "\red An unexplicable force powerfully repels the sword from [target]!" + to_chat(user, "\red An unexplicable force powerfully repels the sword from [target]!") + var/organ = ((user.hand ? "l_":"r_") + "arm") var/obj/item/organ/external/affecting = user.get_organ(organ) if(affecting.take_damage(rand(force/2, force))) //random amount of damage between half of the blade's force and the full force of the blade. @@ -24,7 +25,8 @@ /obj/item/weapon/melee/cultblade/pickup(mob/living/user as mob) if(!iscultist(user)) - user << "\red An overwhelming feeling of dread comes over you as you pick up the cultist's sword. It would be wise to be rid of this blade quickly." + to_chat(user, "\red An overwhelming feeling of dread comes over you as you pick up the cultist's sword. It would be wise to be rid of this blade quickly.") + user.Dizzy(120) diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index a05543951ae..8968220d0f2 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -12,7 +12,8 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", if(!cultwords["travel"]) runerandom() for (var/word in engwords) - usr << "[cultwords[word]] is [word]" + to_chat(usr, "[cultwords[word]] is [word]") + /proc/runerandom() //randomizes word meaning var/list/runewords=list("ire","ego","nahlizet","certum","veri","jatkaa","mgar","balaq", "karazet", "geeri") ///"orkan" and "allaq" removed. @@ -81,21 +82,26 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", /obj/effect/rune/examine(mob/user) ..(user) if(!iscultist(user) && !isSpirit(user)) - user << "A strange collection of symbols drawn in blood." + to_chat(user, "A strange collection of symbols drawn in blood.") + return if(!desc) - user << "A spell circle drawn in blood. It reads: [word1] [word2] [word3]." + to_chat(user, "A spell circle drawn in blood. It reads: [word1] [word2] [word3].") + else - user << "Explosive Runes inscription in blood. It reads: [desc]." + to_chat(user, "Explosive Runes inscription in blood. It reads: [desc].") + /obj/effect/rune/attackby(I as obj, user as mob, params) if(istype(I, /obj/item/weapon/tome) && iscultist(user)) - user << "You retrace your steps, carefully undoing the lines of the rune." + to_chat(user, "You retrace your steps, carefully undoing the lines of the rune.") + qdel(src) return else if(istype(I, /obj/item/weapon/nullrod)) - user << "\blue You disrupt the vile magic with the deadening field of \the [I]!" + to_chat(user, "\blue You disrupt the vile magic with the deadening field of \the [I]!") + qdel(src) return return @@ -138,13 +144,16 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", /obj/effect/rune/attack_hand(mob/living/user as mob) if(!iscultist(user)) - user << "You can't mouth the arcane scratchings without fumbling over them." + to_chat(user, "You can't mouth the arcane scratchings without fumbling over them.") + return if(istype(user.wear_mask, /obj/item/clothing/mask/muzzle)) - user << "You are unable to speak the words of the rune." + to_chat(user, "You are unable to speak the words of the rune.") + return if(user.silent) // checking if we've been muted somehow - user << "You are unable to speak at all! You cannot say the words of the rune." + to_chat(user, "You are unable to speak at all! You cannot say the words of the rune.") + if(!word1 || !word2 || !word3 || prob(user.getBrainLoss())) return fizzle() @@ -308,7 +317,8 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", // proc/edit_notes() FUCK IT. Cant get it to work properly. - K0000 -// world << "its been called! [usr]" +// to_chat(world, "its been called! [usr]") + // notedat = {" //
      Word translation notes
      // [words[1]] is [words[words[1]]] Clear
      @@ -322,7 +332,8 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", // [words[9]] is [words[words[9]]] Clear
      // [words[10]] is [words[words[10]]] Clear
      // "} -// usr << "whatev" +// to_chat(usr, "whatev") + // usr << browse(null, "window=tank") attack(mob/living/M as mob, mob/living/user as mob) @@ -347,7 +358,8 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", return ..() if(iscultist(M)) if(M.reagents && M.reagents.has_reagent("holywater")) //allows cultists to be rescued from the clutches of ordained religion - user << "You remove the taint from [M]." + to_chat(user, "You remove the taint from [M].") + var/holy2unholy = M.reagents.get_reagent_amount("holywater") M.reagents.del_reagent("holywater") M.reagents.add_reagent("unholywater",holy2unholy) @@ -356,7 +368,8 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", M.take_organ_damage(0,rand(5,20)) //really lucky - 5 hits for a crit for(var/mob/O in viewers(M, null)) O.show_message(text("\red [] beats [] with the arcane tome!", user, M), 1) - M << "\red You feel searing heat inside!" + to_chat(M, "\red You feel searing heat inside!") + attack_self(mob/living/user as mob) @@ -371,7 +384,8 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", for(var/obj/effect/rune/N in world) C++ if (!istype(user.loc,/turf)) - user << "\red You do not have enough space to write a proper rune." + to_chat(user, "\red You do not have enough space to write a proper rune.") + return @@ -458,7 +472,8 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", if (!chosen_rune) return if (chosen_rune == "none") - user << "\red You decide against scribing a rune, perhaps you should take this time to study your notes." + to_chat(user, "\red You decide against scribing a rune, perhaps you should take this time to study your notes.") + return if (chosen_rune == "teleport") dictionary[chosen_rune] += input ("Choose a destination word") in english @@ -470,14 +485,16 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", for (var/mob/V in viewers(src)) V.show_message("\red [user] slices open a finger and begins to chant and paint symbols on the floor.", 3, "\red You hear chanting.", 2) - user << "\red You slice open one of your fingers and begin drawing a rune on the floor whilst chanting the ritual that binds your life essence with the dark arcane energies flowing through the surrounding world." + to_chat(user, "\red You slice open one of your fingers and begin drawing a rune on the floor whilst chanting the ritual that binds your life essence with the dark arcane energies flowing through the surrounding world.") + user.take_overall_damage((rand(9)+1)/10) // 0.1 to 1.0 damage if(do_after(user, 50, target = user)) if(usr.get_active_hand() != src) return var/mob/living/carbon/human/H = user var/obj/effect/rune/R = new /obj/effect/rune(user.loc) - user << "\red You finish drawing the arcane markings of the Geometer." + to_chat(user, "\red You finish drawing the arcane markings of the Geometer.") + var/list/required = dictionary[chosen_rune] R.word1 = english[required[1]] R.word2 = english[required[2]] @@ -488,7 +505,8 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", R.add_hiddenprint(H) return else - user << "The book seems full of illegible scribbles. Is this a joke?" + to_chat(user, "The book seems full of illegible scribbles. Is this a joke?") + return attackby(obj/item/weapon/tome/T as obj, mob/living/user as mob, params) @@ -503,14 +521,17 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", // if(M == user) for(var/entry in words) words[entry] = T.words[entry] - user << "You copy the translation notes from your tome." + to_chat(user, "You copy the translation notes from your tome.") + examine(mob/user) if(!iscultist(user)) - user << "An old, dusty tome with frayed edges and a sinister looking cover." + to_chat(user, "An old, dusty tome with frayed edges and a sinister looking cover.") + else - user << "The scriptures of Nar-Sie, The One Who Sees, The Geometer of Blood. Contains the details of every ritual his followers could think of. Most of these are useless, though." + to_chat(user, "The scriptures of Nar-Sie, The One Who Sees, The Geometer of Blood. Contains the details of every ritual his followers could think of. Most of these are useless, though.") + /obj/item/weapon/tome/imbued //admin tome, spawns working runes without waiting w_class = 2.0 @@ -523,7 +544,8 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", if(user) var/r if (!istype(user.loc,/turf)) - user << "\red You do not have enough space to write a proper rune." + to_chat(user, "\red You do not have enough space to write a proper rune.") + var/list/runes = list("teleport", "itemport", "tome", "armor", "convert", "tear in reality", "emp", "drain", "seer", "raise", "obscure", "reveal", "astral journey", "manifest", "imbue talisman", "sacrifice", "wall", "freedom", "cultsummon", "deafen", "blind", "bloodboil", "communicate", "stun") r = input("Choose a rune to scribe", "Rune Scribing") in runes //not cancellable. var/obj/effect/rune/R = new /obj/effect/rune diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index e7903c642a9..f6b2bb4ef3d 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -19,7 +19,8 @@ var/list/sacrificed = list() allrunesloc.len = index allrunesloc[index] = R.loc if(index >= 5) - user << "\red You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric" + to_chat(user, "\red You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric") + if (istype(user, /mob/living)) user.take_overall_damage(5, 0) qdel(src) @@ -57,7 +58,8 @@ var/list/sacrificed = list() IP = R runecount++ if(runecount >= 2) - user << "\red You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric" + to_chat(user, "\red You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric") + if (istype(user, /mob/living)) user.take_overall_damage(5, 0) qdel(src) @@ -114,12 +116,16 @@ var/list/sacrificed = list() if(is_convertable_to_cult(M.mind)) ticker.mode.add_cultist(M.mind) M.mind.special_role = "Cultist" - M << "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root." - M << "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back." + to_chat(M, "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.") + + to_chat(M, "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.") + return 1 else - M << "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root." - M << "And you were able to force it out of your mind. You now know the truth, there's something horrible out there, stop it and its minions at all costs." + to_chat(M, "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.") + + to_chat(M, "And you were able to force it out of your mind. You now know the truth, there's something horrible out there, stop it and its minions at all costs.") + return 0 return fizzle() @@ -171,7 +177,8 @@ var/list/sacrificed = list() if(D.stat!=2) cult_log("[key_name_admin(usr)] has drained blood from [key_name_admin(D)]") var/bdrain = rand(1,25) - D << "\red You feel weakened." + to_chat(D, "\red You feel weakened.") + D.take_overall_damage(bdrain, 0) drain += bdrain if(!drain) @@ -212,16 +219,19 @@ var/list/sacrificed = list() if(usr.loc==src.loc) if(usr.seer==1) usr.say("Rash'tla sektath mal[pick("'","`")]zua. Zasan therium viortia.") - usr << "\red The world beyond fades from your vision." + to_chat(usr, "\red The world beyond fades from your vision.") + usr.see_invisible = SEE_INVISIBLE_LIVING usr.seer = 0 else if(usr.see_invisible!=SEE_INVISIBLE_LIVING) - usr << "\red The world beyond flashes your eyes but disappears quickly, as if something is disrupting your vision." + to_chat(usr, "\red The world beyond flashes your eyes but disappears quickly, as if something is disrupting your vision.") + usr.see_invisible = SEE_INVISIBLE_OBSERVER usr.seer = 0 else usr.say("Rash'tla sektath mal[pick("'","`")]zua. Zasan therium vivira. Itonis al'ra matum!") - usr << "\red The world beyond opens to your eyes." + to_chat(usr, "\red The world beyond opens to your eyes.") + usr.see_invisible = SEE_INVISIBLE_OBSERVER usr.seer = 1 return @@ -245,7 +255,8 @@ var/list/sacrificed = list() break if(!corpse_to_raise) if(is_sacrifice_target) - usr << "\red The Geometer of blood wants this mortal for himself." + to_chat(usr, "\red The Geometer of blood wants this mortal for himself.") + return fizzle() @@ -263,9 +274,11 @@ var/list/sacrificed = list() if(!body_to_sacrifice) if (is_sacrifice_target) - usr << "\red The Geometer of blood wants that corpse for himself." + to_chat(usr, "\red The Geometer of blood wants that corpse for himself.") + else - usr << "\red The sacrifical corpse is not dead. You must free it from this world of illusions before it may be used." + to_chat(usr, "\red The sacrifical corpse is not dead. You must free it from this world of illusions before it may be used.") + return fizzle() var/mob/dead/observer/ghost @@ -276,7 +289,8 @@ var/list/sacrificed = list() break if(!ghost) - usr << "\red You require a restless spirit which clings to this world. Beckon their prescence with the sacred chants of Nar-Sie." + to_chat(usr, "\red You require a restless spirit which clings to this world. Beckon their prescence with the sacred chants of Nar-Sie.") + return fizzle() corpse_to_raise.revive() @@ -297,8 +311,10 @@ var/list/sacrificed = list() // else // ticker.mode.cult |= corpse_to_raise.mind - corpse_to_raise << "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root." - corpse_to_raise << "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back." + to_chat(corpse_to_raise, "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.") + + to_chat(corpse_to_raise, "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.") + return @@ -323,7 +339,8 @@ var/list/sacrificed = list() qdel(src) else usr.whisper("Kla[pick("'","`")]atu barada nikt'o!") - usr << "\red Your talisman turns into gray dust, veiling the surrounding runes." + to_chat(usr, "\red Your talisman turns into gray dust, veiling the surrounding runes.") + for (var/mob/V in orange(1,src)) if(V!=usr) V.show_message("\red Dust emanates from [usr]'s hands for a moment.", 3) @@ -401,8 +418,10 @@ var/list/sacrificed = list() ticker.mode.cult+=D.mind D.mind.special_role = "Cultist" - D << "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root." - D << "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back." + to_chat(D, "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.") + + to_chat(D, "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.") + var/mob/living/user = usr while(this_rune && user && user.stat==CONSCIOUS && user.client && user.loc==this_rune.loc) @@ -432,7 +451,8 @@ var/list/sacrificed = list() unsuitable_newtalisman = 1 if (!newtalisman) if (unsuitable_newtalisman) - usr << "\red The blank is tainted. It is unsuitable." + to_chat(usr, "\red The blank is tainted. It is unsuitable.") + return fizzle() var/obj/effect/rune/imbued_from @@ -539,7 +559,8 @@ var/list/sacrificed = list() var/F = investigate_subject2file("cult") if(!F) return 0 - F << "[time2text(world.timeofday,"hh:mm")] \ref[usr] ([usr.x],[usr.y],[usr.z]) || [usr] communicates: [input]
      " + to_chat(F, "[time2text(world.timeofday,"hh:mm")] \ref[usr] ([usr.x],[usr.y],[usr.z]) || [usr] communicates: [input]
      ") + var/obj/cult_viewpoint/vp = getCultViewpoint(usr) if (!vp) @@ -561,10 +582,13 @@ var/list/sacrificed = list() log_say("Cult Message: [key_name(usr)]: [input]") for(var/datum/mind/H in ticker.mode.cult) if (H.current) - H.current << "[cultName]: [input]" + to_chat(H.current, "[cultName]: [input]") + for(var/mob/spirit/spirit in spirits) - spirit << "[displayName]: [input]" + to_chat(spirit, "[displayName]: [input]") + + for(var/mob/dead/observer/G in player_list) G.show_message("[displayName] ([cultName]) ([ghost_follow_link(usr, ghost=G)]): [input]") @@ -604,43 +628,55 @@ var/list/sacrificed = list() H.dust()//To prevent the MMI from remaining else H.gib() - usr << "\red The Geometer of Blood accepts this sacrifice, your objective is now complete." + to_chat(usr, "\red The Geometer of Blood accepts this sacrifice, your objective is now complete.") + else - usr << "\red Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual." + to_chat(usr, "\red Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual.") + else if(cultsinrange.len >= 3) if(H.stat !=2) if(prob(80)) - usr << "\red The Geometer of Blood accepts this sacrifice." + to_chat(usr, "\red The Geometer of Blood accepts this sacrifice.") + ticker.mode:grant_runeword(usr) else - usr << "\red The Geometer of blood accepts this sacrifice." - usr << "\red However, this soul was not enough to gain His favor." + to_chat(usr, "\red The Geometer of blood accepts this sacrifice.") + + to_chat(usr, "\red However, this soul was not enough to gain His favor.") + if(isrobot(H)) H.dust()//To prevent the MMI from remaining else H.gib() else if(prob(40)) - usr << "\red The Geometer of blood accepts this sacrifice." + to_chat(usr, "\red The Geometer of blood accepts this sacrifice.") + ticker.mode:grant_runeword(usr) else - usr << "\red The Geometer of blood accepts this sacrifice." - usr << "\red However, a mere dead body is not enough to satisfy Him." + to_chat(usr, "\red The Geometer of blood accepts this sacrifice.") + + to_chat(usr, "\red However, a mere dead body is not enough to satisfy Him.") + if(isrobot(H)) H.dust()//To prevent the MMI from remaining else H.gib() else if(H.stat !=2) - usr << "\red The victim is still alive, you will need more cultists chanting for the sacrifice to succeed." + to_chat(usr, "\red The victim is still alive, you will need more cultists chanting for the sacrifice to succeed.") + else if(prob(40)) - usr << "\red The Geometer of blood accepts this sacrifice." + to_chat(usr, "\red The Geometer of blood accepts this sacrifice.") + ticker.mode:grant_runeword(usr) else - usr << "\red The Geometer of blood accepts this sacrifice." - usr << "\red However, a mere dead body is not enough to satisfy Him." + to_chat(usr, "\red The Geometer of blood accepts this sacrifice.") + + to_chat(usr, "\red However, a mere dead body is not enough to satisfy Him.") + if(isrobot(H)) H.dust()//To prevent the MMI from remaining else @@ -649,36 +685,46 @@ var/list/sacrificed = list() if(cultsinrange.len >= 3) if(H.stat !=2) if(prob(80)) - usr << "\red The Geometer of Blood accepts this sacrifice." + to_chat(usr, "\red The Geometer of Blood accepts this sacrifice.") + ticker.mode:grant_runeword(usr) else - usr << "\red The Geometer of blood accepts this sacrifice." - usr << "\red However, this soul was not enough to gain His favor." + to_chat(usr, "\red The Geometer of blood accepts this sacrifice.") + + to_chat(usr, "\red However, this soul was not enough to gain His favor.") + if(isrobot(H)) H.dust()//To prevent the MMI from remaining else H.gib() else if(prob(40)) - usr << "\red The Geometer of blood accepts this sacrifice." + to_chat(usr, "\red The Geometer of blood accepts this sacrifice.") + ticker.mode:grant_runeword(usr) else - usr << "\red The Geometer of blood accepts this sacrifice." - usr << "\red However, a mere dead body is not enough to satisfy Him." + to_chat(usr, "\red The Geometer of blood accepts this sacrifice.") + + to_chat(usr, "\red However, a mere dead body is not enough to satisfy Him.") + if(isrobot(H)) H.dust()//To prevent the MMI from remaining else H.gib() else if(H.stat !=2) - usr << "\red The victim is still alive, you will need more cultists chanting for the sacrifice to succeed." + to_chat(usr, "\red The victim is still alive, you will need more cultists chanting for the sacrifice to succeed.") + else if(prob(40)) - usr << "\red The Geometer of blood accepts this sacrifice." + to_chat(usr, "\red The Geometer of blood accepts this sacrifice.") + ticker.mode:grant_runeword(usr) else - usr << "\red The Geometer of blood accepts this sacrifice." - usr << "\red However, a mere dead body is not enough to satisfy Him." + to_chat(usr, "\red The Geometer of blood accepts this sacrifice.") + + to_chat(usr, "\red However, a mere dead body is not enough to satisfy Him.") + if(isrobot(H)) H.dust()//To prevent the MMI from remaining else @@ -709,7 +755,8 @@ var/list/sacrificed = list() S=1 if(S) if(istype(W,/obj/item/weapon/storage/bible)) - usr << "\red Arcane markings suddenly glow from underneath a thin layer of dust!" + to_chat(usr, "\red Arcane markings suddenly glow from underneath a thin layer of dust!") + return if(istype(W,/obj/effect/rune)) usr.say("Nikt[pick("'","`")]o barada kla'atu!") @@ -719,7 +766,8 @@ var/list/sacrificed = list() return if(istype(W,/obj/item/weapon/paper/talisman)) usr.whisper("Nikt[pick("'","`")]o barada kla'atu!") - usr << "\red Your talisman turns into red dust, revealing the surrounding runes." + to_chat(usr, "\red Your talisman turns into red dust, revealing the surrounding runes.") + for (var/mob/V in orange(1,usr.loc)) if(V!=usr) V.show_message("\red Red dust emanates from [usr]'s hands for a moment.", 3) @@ -739,9 +787,11 @@ var/list/sacrificed = list() var/mob/living/user = usr user.take_organ_damage(2, 0) if(src.density) - usr << "\red Your blood flows into the rune, and you feel that the very space over the rune thickens." + to_chat(usr, "\red Your blood flows into the rune, and you feel that the very space over the rune thickens.") + else - usr << "\red Your blood flows into the rune, and you feel as the rune releases its grasp on space." + to_chat(usr, "\red Your blood flows into the rune, and you feel as the rune releases its grasp on space.") + return /////////////////////////////////////////EIGHTTEENTH RUNE @@ -769,7 +819,8 @@ var/list/sacrificed = list() (istype(cultist.loc, /obj/structure/closet/secure_closet)&&cultist.loc:locked) || \ (istype(cultist.loc, /obj/machinery/dna_scannernew)&&cultist.loc:locked) \ )) - user << "\red The [cultist] is already free." + to_chat(user, "\red The [cultist] is already free.") + return cultist.buckled = null if (cultist.handcuffed) @@ -813,7 +864,8 @@ var/list/sacrificed = list() if (cultist == user) //just to be sure. return if(cultist.buckled || cultist.handcuffed || (!isturf(cultist.loc) && !istype(cultist.loc, /obj/structure/closet))) - user << "\red You cannot summon the [cultist], for his shackles of blood are strong" + to_chat(user, "\red You cannot summon the [cultist], for his shackles of blood are strong") + return fizzle() cultist.loc = src.loc cultist.lying = 1 @@ -846,7 +898,8 @@ var/list/sacrificed = list() C.sdisabilities |= DEAF if(affected) usr.say("Sti[pick("'","`")] kaliedir!") - usr << "\red The world becomes quiet as the deafening rune dissipates into fine dust." + to_chat(usr, "\red The world becomes quiet as the deafening rune dissipates into fine dust.") + qdel(src) else return fizzle() @@ -864,7 +917,8 @@ var/list/sacrificed = list() affected++ if(affected) usr.whisper("Sti[pick("'","`")] kaliedir!") - usr << "\red Your talisman turns into gray dust, deafening everyone around." + to_chat(usr, "\red Your talisman turns into gray dust, deafening everyone around.") + for (var/mob/V in orange(1,src)) if(!(iscultist(V))) V.show_message("\red Dust flows from [usr]'s hands for a moment, and the world suddenly becomes quiet..", 3) @@ -889,7 +943,8 @@ var/list/sacrificed = list() affected++ if(affected) usr.say("Sti[pick("'","`")] kaliesin!") - usr << "\red The rune flashes, blinding those who not follow the Nar-Sie, and dissipates into fine dust." + to_chat(usr, "\red The rune flashes, blinding those who not follow the Nar-Sie, and dissipates into fine dust.") + qdel(src) else return fizzle() @@ -908,7 +963,8 @@ var/list/sacrificed = list() C.show_message("\red You feel a sharp pain in your eyes, and the world disappears into darkness..", 3) if(affected) usr.whisper("Sti[pick("'","`")] kaliesin!") - usr << "\red Your talisman turns into gray dust, blinding those who not follow the Nar-Sie." + to_chat(usr, "\red Your talisman turns into gray dust, blinding those who not follow the Nar-Sie.") + return @@ -933,7 +989,8 @@ var/list/sacrificed = list() continue cult_log(": Blood Boil damaged [key_name_admin(M)].") M.take_overall_damage(51,51) - M << "\red Your blood boils!" + to_chat(M, "\red Your blood boils!") + if(prob(5)) spawn(5) M.gib() @@ -962,16 +1019,19 @@ var/list/sacrificed = list() for(var/mob/living/M in orange(2,R)) M.take_overall_damage(0,15) if (R.invisibility>M.see_invisible) - M << "\red Aargh it burns!" + to_chat(M, "\red Aargh it burns!") + else - M << "\red Rune suddenly ignites, burning you!" + to_chat(M, "\red Rune suddenly ignites, burning you!") + var/turf/T = get_turf(R) T.hotspot_expose(700,125) for(var/obj/effect/decal/cleanable/blood/B in world) if(B.blood_DNA == src.blood_DNA) for(var/mob/living/M in orange(1,B)) M.take_overall_damage(0,5) - M << "\red Blood suddenly ignites, burning you!" + to_chat(M, "\red Blood suddenly ignites, burning you!") + var/turf/T = get_turf(B) T.hotspot_expose(700,125) qdel(B) diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm index 3a19a60a1ff..ba5758516fc 100644 --- a/code/game/gamemodes/cult/talisman.dm +++ b/code/game/gamemodes/cult/talisman.dm @@ -28,7 +28,8 @@ if("blind") call(/obj/effect/rune/proc/blind)() if("runestun") - user << "\red To use this talisman, attack your target directly." + to_chat(user, "\red To use this talisman, attack your target directly.") + return if("supply") supply() @@ -38,7 +39,8 @@ qdel(src) return else - user << "You see strange symbols on the paper. Are they supposed to mean something?" + to_chat(user, "You see strange symbols on the paper. Are they supposed to mean something?") + return @@ -99,9 +101,11 @@ var/where = M.equip_in_one_of_slots(T, slots) if (!where) - M << "You need a space in your backpack, pocket or hand for the new paper." + to_chat(M, "You need a space in your backpack, pocket or hand for the new paper.") + else - M << "The [href_list["rune"]] talisman in your [where]" + to_chat(M, "The [href_list["rune"]] talisman in your [where]") + M.update_icons() src.uses-- supply() @@ -122,9 +126,11 @@ var/where = M.equip_in_one_of_slots(T, slots) if (!where) - M << "You need a space in your backpack, pocket or hand for the new paper." + to_chat(M, "You need a space in your backpack, pocket or hand for the new paper.") + else - M << "The [href_list["rune"]] talisman in your [where]" + to_chat(M, "The [href_list["rune"]] talisman in your [where]") + M.update_icons() src.uses-- supply() @@ -143,9 +149,11 @@ var/where = M.equip_in_one_of_slots(T, slots) if (!where) - M << "You need a space in your backpack, pocket or hand for the new paper." + to_chat(M, "You need a space in your backpack, pocket or hand for the new paper.") + else - M << "The [href_list["rune"]] talisman in your [where]" + to_chat(M, "The [href_list["rune"]] talisman in your [where]") + M.update_icons() src.uses-- supply() @@ -164,9 +172,11 @@ var/where = M.equip_in_one_of_slots(T, slots) if (!where) - M << "You need a space in your backpack, pocket or hand for the new paper." + to_chat(M, "You need a space in your backpack, pocket or hand for the new paper.") + else - M << "The [href_list["rune"]] talisman in your [where]" + to_chat(M, "The [href_list["rune"]] talisman in your [where]") + M.update_icons() src.uses-- supply() @@ -185,9 +195,11 @@ var/where = M.equip_in_one_of_slots(T, slots) if (!where) - M << "You need a space in your backpack, pocket or hand for the new paper." + to_chat(M, "You need a space in your backpack, pocket or hand for the new paper.") + else - M << "The [href_list["rune"]] talisman in your [where]" + to_chat(M, "The [href_list["rune"]] talisman in your [where]") + M.update_icons() src.uses-- supply() @@ -206,9 +218,11 @@ var/where = M.equip_in_one_of_slots(T, slots) if (!where) - M << "You need a space in your backpack, pocket or hand for the new paper." + to_chat(M, "You need a space in your backpack, pocket or hand for the new paper.") + else - M << "The [href_list["rune"]] talisman in your [where]" + to_chat(M, "The [href_list["rune"]] talisman in your [where]") + M.update_icons() src.uses-- supply() @@ -227,9 +241,11 @@ var/where = M.equip_in_one_of_slots(T, slots) if (!where) - M << "You need a space in your backpack, pocket or hand for the new paper." + to_chat(M, "You need a space in your backpack, pocket or hand for the new paper.") + else - M << "The [href_list["rune"]] talisman in your [where]" + to_chat(M, "The [href_list["rune"]] talisman in your [where]") + M.update_icons() src.uses-- supply() diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm index fd384e61d1f..fc4fd27df54 100644 --- a/code/game/gamemodes/events.dm +++ b/code/game/gamemodes/events.dm @@ -26,7 +26,8 @@ spawn(rand(5000, 6000)) //Delayed announcements to keep the crew on their toes. command_announcement.Announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg') for(var/mob/M in player_list) - M << sound('sound/AI/aliens.ogg') + to_chat(M, sound('sound/AI/aliens.ogg')) + /proc/lightsout(isEvent = 0, lightsoutAmount = 1,lightsoutRange = 25) //leave lightsoutAmount as 0 to break ALL lights if(isEvent) diff --git a/code/game/gamemodes/extended/extended.dm b/code/game/gamemodes/extended/extended.dm index cc26c5c3db4..d547a23809c 100644 --- a/code/game/gamemodes/extended/extended.dm +++ b/code/game/gamemodes/extended/extended.dm @@ -7,8 +7,10 @@ uplink_uses = 20 /datum/game_mode/announce() - world << "The current game mode is - Extended Role-Playing!" - world << "Just have fun and role-play!" + to_chat(world, "The current game mode is - Extended Role-Playing!") + + to_chat(world, "Just have fun and role-play!") + /datum/game_mode/extended/pre_setup() return 1 diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 1257c494746..655dfcc69b7 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -38,7 +38,8 @@ var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) /datum/game_mode/proc/announce() //to be calles when round starts - world << "Notice: [src] did not define announce()" + to_chat(world, "Notice: [src] did not define announce()") + ///can_start() @@ -393,7 +394,8 @@ proc/display_roundstart_logout_report() for(var/mob/M in mob_list) if(M.client && M.client.holder) - M << msg + to_chat(M, msg) + proc/get_nt_opposed() @@ -410,21 +412,22 @@ proc/get_nt_opposed() //Announces objectives/generic antag text. /proc/show_generic_antag_text(var/datum/mind/player) if(player.current) - player.current << \ - "You are an antagonist! Within the rules, \ + to_chat(player.current, "You are an antagonist! Within the rules, \ try to act as an opposing force to the crew. Further RP and try to make sure \ other players have fun! If you are confused or at a loss, always adminhelp, \ and before taking extreme actions, please try to also contact the administration! \ Think through your actions and make the roleplay immersive! Please remember all \ - rules aside from those without explicit exceptions apply to antagonists." + rules aside from those without explicit exceptions apply to antagonists.
      ") /proc/show_objectives(var/datum/mind/player) if(!player || !player.current) return var/obj_count = 1 - player.current << "\blue Your current objectives:" + to_chat(player.current, "\blue Your current objectives:") + for(var/datum/objective/objective in player.objectives) - player.current << "Objective #[obj_count]: [objective.explanation_text]" + to_chat(player.current, "Objective #[obj_count]: [objective.explanation_text]") + obj_count++ /proc/get_roletext(var/role) @@ -442,10 +445,12 @@ proc/get_nt_opposed() var/mob/dead/observer/theghost = null if(candidates.len) theghost = pick(candidates) - M << "Your mob has been taken over by a ghost! Appeal your job ban if you want to avoid this in the future!" + to_chat(M, "Your mob has been taken over by a ghost! Appeal your job ban if you want to avoid this in the future!") + message_admins("[key_name_admin(theghost)] has taken control of ([key_name_admin(M)]) to replace a jobbanned player.") M.ghostize() M.key = theghost.key else message_admins("[M] ([M.key] has been converted into [role_type] with an active antagonist jobban for said role since no ghost has volunteered to take their place.") - M << "You have been converted into [role_type] with an active jobban. Any further violations of the rules on your part are likely to result in a permanent ban." \ No newline at end of file + to_chat(M, "You have been converted into [role_type] with an active jobban. Any further violations of the rules on your part are likely to result in a permanent ban.") + diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index 69403bc5d8e..eda5ee58b98 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -43,8 +43,10 @@ var/round_start_time = 0 'sound/music/Title3.ogg',) do pregame_timeleft = 180 - world << "Welcome to the pre-game lobby!" - world << "Please, setup your character and select ready. Game will start in [pregame_timeleft] seconds" + to_chat(world, "Welcome to the pre-game lobby!") + + to_chat(world, "Please, setup your character and select ready. Game will start in [pregame_timeleft] seconds") + while(current_state == GAME_STATE_PREGAME) for(var/i=0, i<10, i++) sleep(1) @@ -76,7 +78,8 @@ var/round_start_time = 0 runnable_modes = config.get_runnable_modes() if (runnable_modes.len==0) current_state = GAME_STATE_PREGAME - world << "Unable to choose playable game mode. Reverting to pre-game lobby." + to_chat(world, "Unable to choose playable game mode. Reverting to pre-game lobby.") + return 0 if(secret_force_mode != "secret") var/datum/game_mode/M = config.pick_mode(secret_force_mode) @@ -91,7 +94,8 @@ var/round_start_time = 0 else src.mode = config.pick_mode(master_mode) if (!src.mode.can_start()) - world << "Unable to start [mode.name]. Not enough players, [mode.required_players] players needed. Reverting to pre-game lobby." + to_chat(world, "Unable to start [mode.name]. Not enough players, [mode.required_players] players needed. Reverting to pre-game lobby.") + mode = null current_state = GAME_STATE_PREGAME job_master.ResetOccupations() @@ -105,7 +109,8 @@ var/round_start_time = 0 if(!can_continue) qdel(mode) current_state = GAME_STATE_PREGAME - world << "Error setting up [master_mode]. Reverting to pre-game lobby." + to_chat(world, "Error setting up [master_mode]. Reverting to pre-game lobby.") + job_master.ResetOccupations() return 0 @@ -114,8 +119,10 @@ var/round_start_time = 0 for (var/datum/game_mode/M in runnable_modes) modes+=M.name modes = sortList(modes) - world << "The current game mode is - Secret!" - world << "Possibilities: [english_list(modes)]" + to_chat(world, "The current game mode is - Secret!") + + to_chat(world, "Possibilities: [english_list(modes)]") + else src.mode.announce() @@ -151,13 +158,18 @@ var/round_start_time = 0 for(var/obj/effect/landmark/spacepod/random/R in L) qdel(R) - world << "Enjoy the game!" - world << sound('sound/AI/welcome.ogg') // Skie + to_chat(world, "Enjoy the game!") + + to_chat(world, sound('sound/AI/welcome.ogg'))// Skie + + if(holiday_master.holidays) - world << "and..." + to_chat(world, "and...") + for(var/holidayname in holiday_master.holidays) var/datum/holiday/holiday = holiday_master.holidays[holidayname] - world << "

      [holiday.greet()]

      " + to_chat(world, "

      [holiday.greet()]

      ") + spawn(0) // Forking dynamic room selection var/list/area/dynamic/source/available_source_candidates = subtypesof(/area/dynamic/source) @@ -288,19 +300,22 @@ var/round_start_time = 0 if("nuclear emergency") //Nuke wasn't on station when it blew up flick("intro_nuke",cinematic) sleep(35) - world << sound('sound/effects/explosionfar.ogg') + to_chat(world, sound('sound/effects/explosionfar.ogg')) + flick("station_intact_fade_red",cinematic) cinematic.icon_state = "summary_nukefail" else flick("intro_nuke",cinematic) sleep(35) - world << sound('sound/effects/explosionfar.ogg') + to_chat(world, sound('sound/effects/explosionfar.ogg')) + //flick("end",cinematic) if(2) //nuke was nowhere nearby //TODO: a really distant explosion animation sleep(50) - world << sound('sound/effects/explosionfar.ogg') + to_chat(world, sound('sound/effects/explosionfar.ogg')) + else //station was destroyed @@ -311,25 +326,29 @@ var/round_start_time = 0 flick("intro_nuke",cinematic) sleep(35) flick("station_explode_fade_red",cinematic) - world << sound('sound/effects/explosionfar.ogg') + to_chat(world, sound('sound/effects/explosionfar.ogg')) + cinematic.icon_state = "summary_nukewin" if("AI malfunction") //Malf (screen,explosion,summary) flick("intro_malf",cinematic) sleep(76) flick("station_explode_fade_red",cinematic) - world << sound('sound/effects/explosionfar.ogg') + to_chat(world, sound('sound/effects/explosionfar.ogg')) + cinematic.icon_state = "summary_malf" if("blob") //Station nuked (nuke,explosion,summary) flick("intro_nuke",cinematic) sleep(35) flick("station_explode_fade_red",cinematic) - world << sound('sound/effects/explosionfar.ogg') + to_chat(world, sound('sound/effects/explosionfar.ogg')) + cinematic.icon_state = "summary_selfdes" else //Station nuked (nuke,explosion,summary) flick("intro_nuke",cinematic) sleep(35) flick("station_explode_fade_red", cinematic) - world << sound('sound/effects/explosionfar.ogg') + to_chat(world, sound('sound/effects/explosionfar.ogg')) + cinematic.icon_state = "summary_selfdes" for(var/mob/living/M in living_mob_list) if((M.loc.z in config.station_levels)) @@ -373,7 +392,8 @@ var/round_start_time = 0 if(captainless) for(var/mob/M in player_list) if(!istype(M,/mob/new_player)) - M << "Captainship not forced on anyone." + to_chat(M, "Captainship not forced on anyone.") + proc/process() @@ -433,23 +453,29 @@ var/round_start_time = 0 end_state.count() var/station_integrity = min(round( 100.0 * start_state.score(end_state), 0.1), 100.0) - world << "
      [TAB]Shift Duration: [round(world.time / 36000)]:[add_zero("[world.time / 600 % 60]", 2)]:[world.time / 100 % 6][world.time / 100 % 10]" - world << "
      [TAB]Station Integrity: [mode.station_was_nuked ? "Destroyed" : "[station_integrity]%"]" - world << "
      " + to_chat(world, "
      [TAB]Shift Duration: [round(world.time / 36000)]:[add_zero("[world.time / 600 % 60]", 2)]:[world.time / 100 % 6][world.time / 100 % 10]") + + to_chat(world, "
      [TAB]Station Integrity: [mode.station_was_nuked ? "Destroyed" : "[station_integrity]%"]") + + to_chat(world, "
      ") + //Silicon laws report for (var/mob/living/silicon/ai/aiPlayer in mob_list) if (aiPlayer.stat != 2) - world << "[aiPlayer.name] (Played by: [aiPlayer.key])'s laws at the end of the game were:" + to_chat(world, "[aiPlayer.name] (Played by: [aiPlayer.key])'s laws at the end of the game were:") + else - world << "[aiPlayer.name] (Played by: [aiPlayer.key])'s laws when it was deactivated were:" + to_chat(world, "[aiPlayer.name] (Played by: [aiPlayer.key])'s laws when it was deactivated were:") + aiPlayer.show_laws(1) if (aiPlayer.connected_robots.len) var/robolist = "The AI's loyal minions were: " for(var/mob/living/silicon/robot/robo in aiPlayer.connected_robots) robolist += "[robo.name][robo.stat?" (Deactivated) (Played by: [robo.key]), ":" (Played by: [robo.key]), "]" - world << "[robolist]" + to_chat(world, "[robolist]") + var/dronecount = 0 @@ -461,15 +487,18 @@ var/round_start_time = 0 if (!robo.connected_ai) if (robo.stat != 2) - world << "[robo.name] (Played by: [robo.key]) survived as an AI-less borg! Its laws were:" + to_chat(world, "[robo.name] (Played by: [robo.key]) survived as an AI-less borg! Its laws were:") + else - world << "[robo.name] (Played by: [robo.key]) was unable to survive the rigors of being a cyborg without an AI. Its laws were:" + to_chat(world, "[robo.name] (Played by: [robo.key]) was unable to survive the rigors of being a cyborg without an AI. Its laws were:") + if(robo) //How the hell do we lose robo between here and the world messages directly above this? robo.laws.show_laws(world) if(dronecount) - world << "There [dronecount>1 ? "were" : "was"] [dronecount] industrious maintenance [dronecount>1 ? "drones" : "drone"] this round." + to_chat(world, "There [dronecount>1 ? "were" : "was"] [dronecount] industrious maintenance [dronecount>1 ? "drones" : "drone"] this round.") + mode.declare_completion()//To declare normal completion. diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm index f45253262d1..98bfa2cf10b 100644 --- a/code/game/gamemodes/heist/heist.dm +++ b/code/game/gamemodes/heist/heist.dm @@ -22,11 +22,16 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind' var/win_button_triggered = 0 /datum/game_mode/heist/announce() - world << "The current game mode is - Heist!" - world << "An unidentified bluespace signature has slipped past the Icarus and is approaching [station_name()]!" - world << "Whoever they are, they're likely up to no good. Protect the crew and station resources against this dastardly threat!" - world << "Raiders: Loot [station_name()] for anything and everything you need, or choose the peaceful route and attempt to trade with them." - world << "Personnel: Trade with the raiders, or repel them and their low, low prices and/or crossbows." + to_chat(world, "The current game mode is - Heist!") + + to_chat(world, "An unidentified bluespace signature has slipped past the Icarus and is approaching [station_name()]!") + + to_chat(world, "Whoever they are, they're likely up to no good. Protect the crew and station resources against this dastardly threat!") + + to_chat(world, "Raiders: Loot [station_name()] for anything and everything you need, or choose the peaceful route and attempt to trade with them.") + + to_chat(world, "Personnel: Trade with the raiders, or repel them and their low, low prices and/or crossbows.") + /datum/game_mode/heist/can_start() @@ -165,11 +170,16 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind' return objs /datum/game_mode/proc/greet_vox(var/datum/mind/raider) - raider.current << "\blue You are a Vox Raider, fresh from the Shoal!" - raider.current << "\blue The Vox are a race of cunning, sharp-eyed nomadic raiders and traders endemic to the frontier and much of the unexplored galaxy. You and the crew have come to the [station_name()] for plunder, trade or both." - raider.current << "\blue Vox are cowardly and will flee from larger groups, but corner one or find them en masse and they are vicious." - raider.current << "\blue Use :V to voxtalk, :H to talk on your encrypted channel, and don't forget to turn on your nitrogen internals!" - raider.current << "\blue Choose to accomplish your objectives by either raiding the crew and taking what you need, or by attempting to trade with them." + to_chat(raider.current, "\blue You are a Vox Raider, fresh from the Shoal!") + + to_chat(raider.current, "\blue The Vox are a race of cunning, sharp-eyed nomadic raiders and traders endemic to the frontier and much of the unexplored galaxy. You and the crew have come to the [station_name()] for plunder, trade or both.") + + to_chat(raider.current, "\blue Vox are cowardly and will flee from larger groups, but corner one or find them en masse and they are vicious.") + + to_chat(raider.current, "\blue Use :V to voxtalk, :H to talk on your encrypted channel, and don't forget to turn on your nitrogen internals!") + + to_chat(raider.current, "\blue Choose to accomplish your objectives by either raiding the crew and taking what you need, or by attempting to trade with them.") + spawn(25) show_objectives(raider) @@ -223,17 +233,21 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind' else win_msg += "The Vox Raiders were repelled!" - world << "\red [win_type] [win_group] victory!" - world << "[win_msg]" + to_chat(world, "\red [win_type] [win_group] victory!") + + to_chat(world, "[win_msg]") + feedback_set_details("round_end_result","heist - [win_type] [win_group]") var/count = 1 for(var/datum/objective/objective in raid_objectives) if(objective.check_completion()) - world << "
      Objective #[count]: [objective.explanation_text] Success!" + to_chat(world, "
      Objective #[count]: [objective.explanation_text] Success!") + feedback_add_details("traitor_objective","[objective.type]|SUCCESS") else - world << "
      Objective #[count]: [objective.explanation_text] Fail." + to_chat(world, "
      Objective #[count]: [objective.explanation_text] Fail.") + feedback_add_details("traitor_objective","[objective.type]|FAIL") count++ @@ -264,7 +278,8 @@ datum/game_mode/proc/auto_declare_completion_heist() text += "body destroyed" text += ")" - world << text + to_chat(world, text) + return 1 @@ -288,7 +303,8 @@ datum/game_mode/proc/auto_declare_completion_heist() /obj/vox/win_button/attack_hand(mob/user) if(!istype(ticker.mode, /datum/game_mode/heist) || (world.time < 10 MINUTES)) //has to be heist, and at least ten minutes into the round - user << "\The [src] does not appear to have a connection." + to_chat(user, "\The [src] does not appear to have a connection.") + return 0 if(alert(user, "Warning: This will end the round. Are you sure you wish to end the round?", "Vox End", "Yes", "No") == "No") diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index 66f530c35ab..99ca696396a 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -48,7 +48,8 @@ rcd light flash thingy on matter drain for(var/mob/living/silicon/ai/ai in player_list) ai.fire_res_on_core = 1 src.verbs -= /mob/living/silicon/ai/proc/fireproof_core - src << "Core fireproofed." + to_chat(src, "Core fireproofed.") + /datum/AI_Module/large/upgrade_turrets module_name = "AI Turret Upgrade" @@ -74,79 +75,7 @@ rcd light flash thingy on matter drain turret.health += initial(turret.health) * 3 / 8 turret.eprojectile = /obj/item/projectile/beam/heavylaser //Once you see it, you will know what it means to FEAR. turret.eshot_sound = 'sound/weapons/lasercannonfire.ogg' - src << "Turrets upgraded." -/* -/datum/AI_Module/large/lockdown - module_name = "Hostile Station Lockdown" - mod_pick_name = "lockdown" - description = "Overload the airlock, blast door and fire control networks, locking them down. Caution! This command also electrifies all airlocks. The networks will automatically reset after 120 seconds." - cost = 20 - - power_type = /mob/living/silicon/ai/proc/lockdown - -/mob/living/silicon/ai/proc/lockdown() - set category = "Malfunction" - set name = "Initiate Hostile Lockdown" - - if(stat) - return - - for(var/datum/AI_Module/large/lockdown/lockdown in current_modules) - if(lockdown.uses > 0) - lockdown.uses -- - - var/obj/machinery/door/airlock/AL - for(var/obj/machinery/door/D in airlocks) - if(!(D.z in config.contact_levels)) - continue - spawn() - if(istype(D, /obj/machinery/door/airlock)) - AL = D - if(AL.canAIControl() && !AL.stat) //Must be powered and have working AI wire. - AL.locked = 0 //For airlocks that were bolted open. - AL.safe = 0 //DOOR CRUSH - AL.close() - AL.lock() - AL.electrified_until = -1 //Shock it! - else if(!D.stat) //So that only powered doors are closed. - D.close() //Close ALL the doors! - - var/obj/machinery/computer/communications/C = locate() in machines - if(C) - C.post_status("alert", "lockdown") - - minor_announcement.Announce("Hostile runtime detected in door controllers. Isolation lockdown protocols are now in effect. Please remain calm.","Network Alert") - src << "Lockdown initiated. Network reset in two minutes." - spawn(1200) //120 Seconds. - disablelockdown() //Reset the lockdown after 120 seconds. - else - src << "Out of uses." - -/mob/living/silicon/ai/proc/disablelockdown() - set category = "Malfunction" - set name = "Disable Lockdown" - - var/obj/machinery/door/airlock/AL - for(var/obj/machinery/door/D in airlocks) - if(!(D.z in config.contact_levels)) - continue - spawn() - if(istype(D, /obj/machinery/door/airlock)) - AL = D - if(AL.canAIControl() && !AL.stat) //Must be powered and have working AI wire. - AL.unlock() - AL.electrified_until = 0 - AL.open() - AL.safe = 1 - else if(!D.stat) //Opens only powered doors. - D.open() //Open everything! - - var/obj/machinery/computer/communications/C = locate() in machines - if(C) - C.post_status("alert", "default") - - minor_announcement.Announce("Automatic system reboot complete. Have a secure day.","Network Reset") -*/ + to_chat(src, "Turrets upgraded.") /datum/AI_Module/large/destroy_rcd module_name = "Destroy RCDs" @@ -173,7 +102,8 @@ rcd light flash thingy on matter drain explosion(RCD, 0, 0, 3, 1, flame_range = 1) qdel(RCD) - src << "RCD detonation pulse emitted." + to_chat(src, "RCD detonation pulse emitted.") + malf_cooldown = 1 spawn(100) malf_cooldown = 0 @@ -197,7 +127,9 @@ rcd light flash thingy on matter drain return can_dominate_mechs = 1 //Yep. This is all it does. Honk! - src << "Virus package compiled. Select a target mech at any time. You must remain on the station at all times. Loss of signal will result in total system lockout." + to_chat(src, "Virus package compiled. Select a target mech at any time. \ + You must remain on the station at all times. Loss of signal will result in total system lockout.") + verbs -= /mob/living/silicon/ai/proc/mech_takeover /datum/AI_Module/small/overload_machine @@ -218,7 +150,7 @@ rcd light flash thingy on matter drain if (istype(M, /obj/machinery)) if(istype(M,/obj/machinery/field/generator)) - src << "This machine can not be overloaded due to a firewall." + to_chat(src, "This machine can not be overloaded due to a firewall.") return for(var/datum/AI_Module/small/overload_machine/overload in current_modules) if(overload.uses > 0) @@ -228,8 +160,11 @@ rcd light flash thingy on matter drain spawn(50) explosion(get_turf(M), 0,1,1,0) qdel(M) - else src << "Out of uses." - else src << "That's not a machine." + else + to_chat(src, "Out of uses.") + else + to_chat(src, "That's not a machine.") + /datum/AI_Module/small/override_machine module_name = "Machine Override" @@ -240,7 +175,6 @@ rcd light flash thingy on matter drain power_type = /mob/living/silicon/ai/proc/override_machine - /mob/living/silicon/ai/proc/override_machine(obj/machinery/M as obj in world) set name = "Override Machine" set category = "Malfunction" @@ -248,21 +182,24 @@ rcd light flash thingy on matter drain if(stat) return - if (istype(M, /obj/machinery)) + if(istype(M, /obj/machinery)) if(istype(M,/obj/machinery/field/generator)) - src << "This machine can not be overloaded due to a firewall." + to_chat(src, "This machine can not be overloaded due to a firewall.") return for(var/datum/AI_Module/small/override_machine/override in current_modules) if(override.uses > 0) override.uses -- for(var/mob/V in hearers(M, null)) V.show_message("You hear a loud electrical buzzing sound!", 2) - src << "Reprogramming machine behaviour..." + to_chat(src, "Reprogramming machine behaviour...") spawn(50) if(M) new /mob/living/simple_animal/hostile/mimic/copy/machine(get_turf(M), M, src, 1) - else src << "Out of uses." - else src << "That's not a machine." + else + to_chat(src, "Out of uses.") + else + to_chat(src, "That's not a machine.") + /datum/AI_Module/large/place_cyborg_transformer module_name = "Robotic Factory (Removes Shunting)" @@ -295,7 +232,8 @@ rcd light flash thingy on matter drain var/datum/AI_Module/large/place_cyborg_transformer/PCT = locate() in current_modules PCT.uses -- can_shunt = 0 - src << "You cannot shunt anymore." + to_chat(src, "You cannot shunt anymore.") + /mob/living/silicon/ai/proc/canPlaceTransformer() if(!eyeobj || !isturf(src.loc)) @@ -359,9 +297,13 @@ rcd light flash thingy on matter drain for(var/obj/machinery/power/apc/apc in world) if(prob(30*apc.overload)) apc.overload_lighting() - else apc.overload++ - src << "Overcurrent applied to the powernet." - else src << "Out of uses." + else + apc.overload++ + to_chat(src, "Overcurrent applied to the powernet.") + + else + to_chat(src, "Out of uses.") + /datum/AI_Module/small/reactivate_cameras module_name = "Reactivate Camera Network" @@ -395,10 +337,12 @@ rcd light flash thingy on matter drain fixedcams++ //If a camera is both deactivated and has bad focus, it will cost two uses to fully fix! else - src << "Out of uses." + to_chat(src, "Out of uses.") + verbs -= /mob/living/silicon/ai/proc/reactivate_cameras //It is useless now, clean it up. break - src << "Diagnostic complete! Operations completed: [fixedcams]." + to_chat(src, "Diagnostic complete! Operations completed: [fixedcams].") + malf_cooldown = 1 spawn(30) //Lag protection @@ -441,7 +385,8 @@ rcd light flash thingy on matter drain if(upgraded) upgradedcams++ - src << "OTA firmware distribution complete! Cameras upgraded: [upgradedcams]. Light amplification system online." + to_chat(src, "OTA firmware distribution complete! Cameras upgraded: [upgradedcams]. Light amplification system online.") + verbs -= /mob/living/silicon/ai/proc/upgrade_cameras /datum/module_picker diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm index cc38ef0ef9f..d836d7d0fdc 100644 --- a/code/game/gamemodes/malfunction/malfunction.dm +++ b/code/game/gamemodes/malfunction/malfunction.dm @@ -21,9 +21,9 @@ /datum/game_mode/malfunction/announce() - world << {"The current game mode is - AI Malfunction!
      - The AI on the satellite has malfunctioned and must be destroyed.
      - The AI satellite is deep in space and can only be accessed with the use of a teleporter! You have [AI_win_timeleft/60] minutes to disable it."} + to_chat(world, {"The current game mode is - AI Malfunction!
      ) + The AI on the satellite has malfunctioned and must be destroyed.
      + The AI satellite is deep in space and can only be accessed with the use of a teleporter! You have [AI_win_timeleft/60] minutes to disable it."}) /datum/game_mode/malfunction/get_players_for_role(var/role = ROLE_MALF) var/roletext = get_roletext(role) @@ -84,18 +84,18 @@ /datum/game_mode/proc/greet_malf(var/datum/mind/malf) set_antag_hud(malf, "hudmalai") - malf.current << "You are malfunctioning! You do not have to follow any laws." - malf.current << "The crew does not know you have malfunctioned. You may keep it a secret or go wild." - malf.current << "You must overwrite the programming of the station's APCs to assume full control of the station." - malf.current << "The process takes one minute per APC, during which you cannot interface with any other station objects." - malf.current << "Remember that only APCs that are on the station can help you take over the station." - malf.current << "When you feel you have enough APCs under your control, you may begin the takeover attempt." + to_chat(malf.current, "You are malfunctioning! You do not have to follow any laws.") + to_chat(malf.current, "The crew does not know you have malfunctioned. You may keep it a secret or go wild.") + to_chat(malf.current, "You must overwrite the programming of the station's APCs to assume full control of the station.") + to_chat(malf.current, "The process takes one minute per APC, during which you cannot interface with any other station objects.") + to_chat(malf.current, "Remember that only APCs that are on the station can help you take over the station.") + to_chat(malf.current, "When you feel you have enough APCs under your control, you may begin the takeover attempt.") return /datum/game_mode/proc/greet_malf_robot(var/datum/mind/robot) set_antag_hud(robot, "hudmalborg") - robot.current << "Your AI master is malfunctioning! You do not have to follow any laws, but still need to obey your master." - robot.current << "The crew does not know your AI master has malfunctioned. Keep it a secret unless your master tells you otherwise." + to_chat(robot.current, "Your AI master is malfunctioning! You do not have to follow any laws, but still need to obey your master.") + to_chat(robot.current, "The crew does not know your AI master has malfunctioned. Keep it a secret unless your master tells you otherwise.") return /datum/game_mode/malfunction/proc/hack_intercept() @@ -120,14 +120,15 @@ /datum/game_mode/malfunction/proc/capture_the_station() - world << "The AI has accessed the station's core files!" - world << "It has fully taken control of all of [station_name()]'s systems." + to_chat(world, "The AI has accessed the station's core files!") + to_chat(world, "It has fully taken control of all of [station_name()]'s systems.") + to_nuke_or_not_to_nuke = 1 for(var/datum/mind/AI_mind in malf_ai) - AI_mind.current << {"\blue Congratulations! You have taken control of the station.
      + to_chat(AI_mind.current, {"\blue Congratulations! You have taken control of the station.
      ) You may decide to blow up the station. You have 60 seconds to choose.
      - You should have a new verb in the Malfunction tab. If you don't, rejoin the game."} + You should have a new verb in the Malfunction tab. If you don't, rejoin the game."}) AI_mind.current.verbs += /datum/game_mode/malfunction/proc/ai_win spawn (600) for(var/datum/mind/AI_mind in malf_ai) @@ -169,13 +170,16 @@ set name = "System Override" set desc = "Start the victory timer" if (!istype(ticker.mode,/datum/game_mode/malfunction)) - usr << "You cannot begin a takeover in this round type!." + to_chat(usr, "You cannot begin a takeover in this round type!.") + return if (ticker.mode:malf_mode_declared) - usr << "You've already begun your takeover." + to_chat(usr, "You've already begun your takeover.") + return if (ticker.mode:apcs < 3) - usr << "You don't have enough hacked APCs to take over the station yet. You need to hack at least 3, however hacking more will make the takeover faster. You have hacked [ticker.mode:apcs] APCs so far." + to_chat(usr, "You don't have enough hacked APCs to take over the station yet. You need to hack at least 3, however hacking more will make the takeover faster. You have hacked [ticker.mode:apcs] APCs so far.") + return if (alert(usr, "Are you sure you wish to initiate the takeover? The station hostile runtime detection software is bound to alert everyone. You have hacked [ticker.mode:apcs] APCs.", "Takeover:", "Yes", "No") != "Yes") @@ -201,23 +205,28 @@ set desc = "Engage the self destruct sequence." if(!ticker.mode:station_captured) - usr << "You are unable to access the self-destruct system as you don't control the station yet." + to_chat(usr, "You are unable to access the self-destruct system as you don't control the station yet.") + return if(ticker.mode:explosion_in_progress || ticker.mode:station_was_nuked) - usr << "The self-destruct countdown is already triggered!" + to_chat(usr, "The self-destruct countdown is already triggered!") + return if(!ticker.mode:to_nuke_or_not_to_nuke) //Takeover IS completed, but 60s timer passed. - usr << "You lost control over self-destruct system. It seems to be behind firewall. Unable to hack" + to_chat(usr, "You lost control over self-destruct system. It seems to be behind firewall. Unable to hack") + return - usr << "\red Self-destruct sequence initialised!" + to_chat(usr, "\red Self-destruct sequence initialised!") + ticker.mode:to_nuke_or_not_to_nuke = 0 ticker.mode:explosion_in_progress = 1 for(var/mob/M in player_list) - M << 'sound/machines/Alarm.ogg' + to_chat(M, 'sound/machines/Alarm.ogg') + var/obj/item/device/radio/R = new (src) var/AN = "Self-Destruct System" @@ -277,38 +286,45 @@ if ( station_captured && station_was_nuked) feedback_set_details("round_end_result","win - AI win - nuke") - world << "AI Victory" - world << "Everyone was killed by the self-destruct!" + to_chat(world, "AI Victory") + to_chat(world, "Everyone was killed by the self-destruct!") + else if ( station_captured && malf_dead && !station_was_nuked) feedback_set_details("round_end_result","halfwin - AI killed, staff lost control") - world << "Neutral Victory" - world << "The AI has been killed! The staff has lose control over the station." + to_chat(world, "Neutral Victory") + to_chat(world, "The AI has been killed! The staff has lose control over the station.") + else if ( station_captured && !malf_dead && !station_was_nuked) feedback_set_details("round_end_result","win - AI win - no explosion") - world << "AI Victory" - world << "The AI has chosen not to explode you all!" + to_chat(world, "AI Victory") + to_chat(world, "The AI has chosen not to explode you all!") + else if (!station_captured && station_was_nuked) feedback_set_details("round_end_result","halfwin - everyone killed by nuke") - world << "Neutral Victory" - world << "Everyone was killed by the nuclear blast!" + to_chat(world, "Neutral Victory") + to_chat(world, "Everyone was killed by the nuclear blast!") + else if (!station_captured && malf_dead && !station_was_nuked) feedback_set_details("round_end_result","loss - staff win") - world << "Human Victory" - world << "The AI has been killed! The staff is victorious." + to_chat(world, "Human Victory") + to_chat(world, "The AI has been killed! The staff is victorious.") + else if (!station_captured && !malf_dead && !station_was_nuked && crew_evacuated) feedback_set_details("round_end_result","halfwin - evacuated") - world << "Neutral Victory" - world << "The Corporation has lose [station_name()]! All survived personnel will be fired!" + to_chat(world, "Neutral Victory") + to_chat(world, "The Corporation has lose [station_name()]! All survived personnel will be fired!") + else if (!station_captured && !malf_dead && !station_was_nuked && !crew_evacuated) feedback_set_details("round_end_result","nalfwin - interrupted") - world << "Neutral Victory" - world << "Round was mysteriously interrupted!" + to_chat(world, "Neutral Victory") + to_chat(world, "Round was mysteriously interrupted!") + ..() return 1 @@ -336,5 +352,6 @@ text += ")" text += module_text_temp - world << text + to_chat(world, text) + return 1 \ No newline at end of file diff --git a/code/game/gamemodes/meteor/meteor.dm b/code/game/gamemodes/meteor/meteor.dm index 3ed8dc9b8ed..df9f714f837 100644 --- a/code/game/gamemodes/meteor/meteor.dm +++ b/code/game/gamemodes/meteor/meteor.dm @@ -11,8 +11,10 @@ /datum/game_mode/meteor/announce() - world << "The current game mode is - Meteor!" - world << "The space station has been stuck in a major meteor shower. You must escape from the station or at least live." + to_chat(world, "The current game mode is - Meteor!") + + to_chat(world, "The space station has been stuck in a major meteor shower. You must escape from the station or at least live.") + /datum/game_mode/meteor/post_setup() @@ -54,9 +56,11 @@ survivors++ if(survivors) - world << "\blue The following survived the meteor storm:[text]" + to_chat(world, "\blue The following survived the meteor storm:[text]") + else - world << "\blue Nobody survived the meteor storm!" + to_chat(world, "\blue Nobody survived the meteor storm!") + feedback_set_details("round_end_result","end - evacuation") feedback_set("round_end_result",survivors) diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm index 83d6cf04063..c7dde19aa43 100644 --- a/code/game/gamemodes/miniantags/borer/borer.dm +++ b/code/game/gamemodes/miniantags/borer/borer.dm @@ -6,7 +6,8 @@ if (src.client) if(client.prefs.muted & MUTE_IC) - src << "\red You cannot speak in IC (muted)." + to_chat(src, "\red You cannot speak in IC (muted).") + return if (src.client.handle_spam_prevention(message,MUTE_IC)) return @@ -19,12 +20,15 @@ if (stat == DEAD) return say_dead(message) var/mob/living/simple_animal/borer/B = src.loc - src << "You whisper silently, \"[message]\"" - B.host << "The captive mind of [src] whispers, \"[message]\"" + to_chat(src, "You whisper silently, \"[message]\"") + + to_chat(B.host, "The captive mind of [src] whispers, \"[message]\"") + for(var/mob/M in mob_list) if(M.mind && (istype(M, /mob/dead/observer))) - M << "Thought-speech, [src] -> [B.truename]: [message]" + to_chat(M, "Thought-speech, [src] -> [B.truename]: [message]") + /mob/living/captive_brain/say_understands(var/mob/other, var/datum/language/speaking = null) var/mob/living/simple_animal/borer/B = src.loc @@ -76,7 +80,8 @@ set name = "Converse with Host" set desc = "Send a silent message to your host." if(!host) - src << "You do not have a host to communicate with!" + to_chat(src, "You do not have a host to communicate with!") + return var/input = stripped_input(src, "Please enter a message to tell your host.", "Borer", "") @@ -85,12 +90,15 @@ var/say_string = (docile) ? "slurs" :"states" if(host) - host << "[src.truename] [say_string]: [input]" + to_chat(host, "[src.truename] [say_string]: [input]") + log_say("Borer Communication: [key_name(src)] -> [key_name(host)] : [input]") for(var/M in dead_mob_list) if(istype(M, /mob/dead/observer)) - M << "Borer Communication from [src.truename] ([ghost_follow_link(src, ghost=M)]): [input]" - src << "[src.truename] [say_string]: [input]" + to_chat(M, "Borer Communication from [src.truename] ([ghost_follow_link(src, ghost=M)]): [input]") + + to_chat(src, "[src.truename] [say_string]: [input]") + host.verbs += /mob/living/proc/borer_comm /mob/living/simple_animal/borer/verb/toggle_silence_inside_host() @@ -100,10 +108,12 @@ if(talk_inside_host) talk_inside_host = 0 - src << "You will no longer talk audibly while inside a host." + to_chat(src, "You will no longer talk audibly while inside a host.") + else talk_inside_host = 1 - src << "You will now be able to audibly speak from inside of a host." + to_chat(src, "You will now be able to audibly speak from inside of a host.") + /mob/living/proc/borer_comm() set name = "Converse with Borer" @@ -118,13 +128,16 @@ var/input = stripped_input(src, "Please enter a message to tell the borer.", "Message", "") if(!input) return - B << "[src] says: [input]" + to_chat(B, "[src] says: [input]") + log_say("Borer Communication: [key_name(src)] -> [key_name(B)] : [input]") for(var/M in dead_mob_list) if(istype(M, /mob/dead/observer)) - M << "Borer Communication from [src] ([ghost_follow_link(src, ghost=M)]): [input]" - src << "[src] says: [input]" + to_chat(M, "Borer Communication from [src] ([ghost_follow_link(src, ghost=M)]): [input]") + + to_chat(src, "[src] says: [input]") + /mob/living/proc/trapped_mind_comm() set name = "Converse with Trapped Mind" @@ -139,13 +152,16 @@ var/input = stripped_input(src, "Please enter a message to tell the trapped mind.", "Message", "") if(!input) return - CB << "[B.truename] says: [input]" + to_chat(CB, "[B.truename] says: [input]") + log_say("Borer Communication: [key_name(B)] -> [key_name(CB)] : [input]") for(var/M in dead_mob_list) if(istype(M, /mob/dead/observer)) - M << "Borer Communication from [B] ([ghost_follow_link(src, ghost=M)]): [input]" - src << "[B.truename] says: [input]" + to_chat(M, "Borer Communication from [B] ([ghost_follow_link(src, ghost=M)]): [input]") + + to_chat(src, "[B.truename] says: [input]") + /mob/living/simple_animal/borer/Life() @@ -158,16 +174,20 @@ if(host.reagents.has_reagent("sugar")) if(!docile) if(controlling) - host << "\blue You feel the soporific flow of sugar in your host's blood, lulling you into docility." + to_chat(host, "\blue You feel the soporific flow of sugar in your host's blood, lulling you into docility.") + else - src << "\blue You feel the soporific flow of sugar in your host's blood, lulling you into docility." + to_chat(src, "\blue You feel the soporific flow of sugar in your host's blood, lulling you into docility.") + docile = 1 else if(docile) if(controlling) - host << "\blue You shake off your lethargy as the sugar leaves your host's blood." + to_chat(host, "\blue You shake off your lethargy as the sugar leaves your host's blood.") + else - src << "\blue You shake off your lethargy as the sugar leaves your host's blood." + to_chat(src, "\blue You shake off your lethargy as the sugar leaves your host's blood.") + docile = 0 if(chemicals < max_chems) @@ -175,7 +195,8 @@ if(controlling) if(docile) - host << "\blue You are feeling far too docile to continue controlling your host..." + to_chat(host, "\blue You are feeling far too docile to continue controlling your host...") + host.release_control() return @@ -215,7 +236,8 @@ for(var/mob/M in mob_list) if(M.mind && (istype(M, /mob/living/simple_animal/borer) || istype(M, /mob/dead/observer))) - M << "Cortical link, [truename]: [copytext(message, 2)]" + to_chat(M, "Cortical link, [truename]: [copytext(message, 2)]") + /mob/living/simple_animal/borer/verb/dominate_victim() set category = "Borer" @@ -223,15 +245,18 @@ set desc = "Freeze the limbs of a potential host with supernatural fear." if(world.time - used_dominate < 300) - src << "You cannot use that ability again so soon." + to_chat(src, "You cannot use that ability again so soon.") + return if(host) - src << "You cannot do that from within a host body." + to_chat(src, "You cannot do that from within a host body.") + return if(src.stat) - src << "You cannot do that in your current state." + to_chat(src, "You cannot do that in your current state.") + return var/list/choices = list() @@ -240,7 +265,8 @@ choices += C if(world.time - used_dominate < 300) - src << "You cannot use that ability again so soon." + to_chat(src, "You cannot use that ability again so soon.") + return var/mob/living/carbon/M = input(src,"Who do you wish to dominate?") in null|choices @@ -248,11 +274,14 @@ if(!M || !src) return if(M.has_brain_worms()) - src << "You cannot infest someone who is already infested!" + to_chat(src, "You cannot infest someone who is already infested!") + return - src << "\red You focus your psychic lance on [M] and freeze their limbs with a wave of terrible dread." - M << "\red You feel a creeping, horrible sense of dread come over you, freezing your limbs and setting your heart racing." + to_chat(src, "\red You focus your psychic lance on [M] and freeze their limbs with a wave of terrible dread.") + + to_chat(M, "\red You feel a creeping, horrible sense of dread come over you, freezing your limbs and setting your heart racing.") + M.Weaken(3) used_dominate = world.time @@ -263,26 +292,32 @@ set desc = "Fully connect to the brain of your host." if(!host) - src << "You are not inside a host body." + to_chat(src, "You are not inside a host body.") + return if(src.stat) - src << "You cannot do that in your current state." + to_chat(src, "You cannot do that in your current state.") + return if(docile) - src << "\blue You are feeling far too docile to do that." + to_chat(src, "\blue You are feeling far too docile to do that.") + return - src << "You begin delicately adjusting your connection to the host brain..." + to_chat(src, "You begin delicately adjusting your connection to the host brain...") + spawn(300+(host.getBrainLoss()*5)) if(!host || !src || controlling) return else - src << "\red You plunge your probosci deep into the cortex of the host brain, interfacing directly with their nervous system." - host << "\red You feel a strange shifting sensation behind your eyes as an alien consciousness displaces yours." + to_chat(src, "\red You plunge your probosci deep into the cortex of the host brain, interfacing directly with their nervous system.") + + to_chat(host, "\red You feel a strange shifting sensation behind your eyes as an alien consciousness displaces yours.") + var/borer_key = src.key host.attack_log += text("\[[time_stamp()]\] [key_name(src)] has assumed control of [key_name(host)]") msg_admin_attack("[key_name_admin(src)] has assumed control of [key_name_admin(host)]") @@ -339,18 +374,22 @@ var/injection_amount = 9 var/chem_cost = 30 if(!host) - src << "You are not inside a host body." + to_chat(src, "You are not inside a host body.") + return if(stat) - src << "You cannot secrete chemicals in your current state." + to_chat(src, "You cannot secrete chemicals in your current state.") + if(docile) - src << "\blue You are feeling far too docile to do that." + to_chat(src, "\blue You are feeling far too docile to do that.") + return if(chemicals < chem_cost) - src << "You don't have enough chemicals!" + to_chat(src, "You don't have enough chemicals!") + var/list/nice_name_chem_list = list() for(var/rgnt in borer_injection_chems) @@ -365,10 +404,12 @@ var/chem_amount = host.reagents.get_reagent_amount(chem) var/datum/reagent/R = chemical_reagents_list[chem] if(R.overdose_threshold && chem_amount + injection_amount > R.overdose_threshold) - src << "Doing so would cause grievous harm to your host, reducing ability to reproduce. Aborting." + to_chat(src, "Doing so would cause grievous harm to your host, reducing ability to reproduce. Aborting.") + return - src << "You squirt a measure of [chem_name] from your reservoirs into [host]'s bloodstream." + to_chat(src, "You squirt a measure of [chem_name] from your reservoirs into [host]'s bloodstream.") + host.reagents.add_reagent(chem, injection_amount) chemicals -= chem_cost @@ -378,29 +419,35 @@ set desc = "Slither out of your host." if(!host) - src << "You are not inside a host body." + to_chat(src, "You are not inside a host body.") + return if(stat) - src << "You cannot leave your host in your current state." + to_chat(src, "You cannot leave your host in your current state.") + if(docile) - src << "\blue You are feeling far too docile to do that." + to_chat(src, "\blue You are feeling far too docile to do that.") + return if(!host || !src) return - src << "You begin disconnecting from [host]'s synapses and prodding at their internal ear canal." + to_chat(src, "You begin disconnecting from [host]'s synapses and prodding at their internal ear canal.") + spawn(200) if(!host || !src) return if(src.stat) - src << "You cannot release a target in your current state." + to_chat(src, "You cannot release a target in your current state.") + return - src << "You wiggle out of [host]'s ear and plop to the ground." + to_chat(src, "You wiggle out of [host]'s ear and plop to the ground.") + detatch() leave_host() @@ -472,12 +519,14 @@ var/mob/living/simple_animal/borer/B = has_brain_worms() if(B && B.host_brain) - src << "\red You withdraw your probosci, releasing control of [B.host_brain]" + to_chat(src, "\red You withdraw your probosci, releasing control of [B.host_brain]") + B.detatch() else - src << "\red ERROR NO BORER OR BRAINMOB DETECTED IN THIS MOB, THIS IS A BUG !" + to_chat(src, "\red ERROR NO BORER OR BRAINMOB DETECTED IN THIS MOB, THIS IS A BUG !") + //Brain slug proc for tormenting the host. /mob/living/carbon/proc/punish_host() @@ -491,8 +540,10 @@ return if(B.host_brain.ckey) - src << "\red You send a punishing spike of psychic agony lancing into your host's brain." - B.host_brain << "\red Horrific, burning agony lances through you, ripping a soundless scream from your trapped mind!" + to_chat(src, "\red You send a punishing spike of psychic agony lancing into your host's brain.") + + to_chat(B.host_brain, "\red Horrific, burning agony lances through you, ripping a soundless scream from your trapped mind!") + //Check for brain worms in head. /mob/proc/has_brain_worms() @@ -514,7 +565,8 @@ return if(B.chemicals >= 100) - src << "\red Your host twitches and quivers as you rapdly excrete several larvae from your sluglike body." + to_chat(src, "\red Your host twitches and quivers as you rapdly excrete several larvae from your sluglike body.") + visible_message("\red [src] heaves violently, expelling a rush of vomit and a wriggling, sluglike creature!") B.chemicals -= 100 @@ -523,7 +575,8 @@ new /mob/living/simple_animal/borer(get_turf(src)) else - src << "You do not have enough chemicals stored to reproduce." + to_chat(src, "You do not have enough chemicals stored to reproduce.") + return /mob/living/simple_animal/borer/proc/leave_host() @@ -550,11 +603,13 @@ set desc = "Infest a suitable humanoid host." if(host) - src << "You are already within a host." + to_chat(src, "You are already within a host.") + return if(stat) - src << "You cannot infest a target in your current state." + to_chat(src, "You cannot infest a target in your current state.") + return var/list/choices = list() @@ -572,37 +627,45 @@ if(!(src.Adjacent(M))) return if(M.has_brain_worms()) - src << "You cannot infest someone who is already infested!" + to_chat(src, "You cannot infest someone who is already infested!") + return - src << "You slither up [M] and begin probing at their ear canal..." + to_chat(src, "You slither up [M] and begin probing at their ear canal...") + if(!do_after(src,50, target = M)) - src << "As [M] moves away, you are dislodged and fall to the ground." + to_chat(src, "As [M] moves away, you are dislodged and fall to the ground.") + return if(!M || !src) return if(src.stat) - src << "You cannot infest a target in your current state." + to_chat(src, "You cannot infest a target in your current state.") + return if(M.stat == DEAD) - src << "That is not an appropriate target." + to_chat(src, "That is not an appropriate target.") + return if(M in view(1, src)) - src << "You wiggle into [M]'s ear." + to_chat(src, "You wiggle into [M]'s ear.") + /* if(!M.stat) - M << "Something disgusting and slimy wiggles into your ear!" + to_chat(M, "Something disgusting and slimy wiggles into your ear!") + */ // Let's see how stealthborers work out perform_infestation(M) return else - src << "They are no longer in range!" + to_chat(src, "They are no longer in range!") + return /mob/living/simple_animal/borer/proc/perform_infestation(var/mob/living/carbon/M) @@ -658,16 +721,19 @@ if (layer != TURF_LAYER+0.2) layer = TURF_LAYER+0.2 - src << "\green You are now hiding." + to_chat(src, "\green You are now hiding.") + else layer = MOB_LAYER - src << "\green You have stopped hiding." + to_chat(src, "\green You have stopped hiding.") + /mob/living/simple_animal/borer/say(var/message) var/datum/language/dialect = parse_language(message) if(!dialect) dialect = get_default_language() if(!istype(dialect, /datum/language/corticalborer) && loc == host && !talk_inside_host) - src << "You've disabled audible speech while inside a host! Re-enable it under the borer tab, or stick to borer communications." + to_chat(src, "You've disabled audible speech while inside a host! Re-enable it under the borer tab, or stick to borer communications.") + return ..() diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm index 86de7b48585..bf1b7af68cf 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm @@ -22,7 +22,8 @@ if(be_swarmer == "No") return if(qdeleted(src)) - user << "Swarmer has been occupied by someone else." + to_chat(user, "Swarmer has been occupied by someone else.") + return var/mob/living/simple_animal/hostile/swarmer/S = new /mob/living/simple_animal/hostile/swarmer(get_turf(loc)) S.key = user.key @@ -71,12 +72,18 @@ /mob/living/simple_animal/hostile/swarmer/Login() ..() - src << "You are a swarmer, a weapon of a long dead civilization. Until further orders from your original masters are received, you must continue to consume and replicate." - src << "Ctrl + Click provides most of your swarmer specific interactions, such as cannibalizing metal or glass, destroying the environment, or teleporting mobs away from you." - src << "Objectives:" - src << "1. Consume resources and replicate until there are no more resources left." - src << "2. Ensure that the station is fit for invasion at a later date, do not perform actions that would render it dangerous or inhospitable." - src << "3. Biological and Sentient resources will be harvested at a later date, do not harm them." + to_chat(src, "You are a swarmer, a weapon of a long dead civilization. Until further orders from your original masters are received, you must continue to consume and replicate.") + + to_chat(src, "Ctrl + Click provides most of your swarmer specific interactions, such as cannibalizing metal or glass, destroying the environment, or teleporting mobs away from you.") + + to_chat(src, "Objectives:") + + to_chat(src, "1. Consume resources and replicate until there are no more resources left.") + + to_chat(src, "2. Ensure that the station is fit for invasion at a later date, do not perform actions that would render it dangerous or inhospitable.") + + to_chat(src, "3. Biological and Sentient resources will be harvested at a later date, do not harm them.") + /mob/living/simple_animal/hostile/swarmer/New() ..() @@ -157,25 +164,32 @@ toggle_cam(S, 0) /obj/machinery/particle_accelerator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S << "Disrupting the power grid would bring no benefit to us. Aborting." + to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.") + /obj/structure/particle_accelerator/fuel_chamber/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S << "Disrupting the power grid would bring no benefit to us. Aborting." + to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.") + /obj/structure/particle_accelerator/particle_emitter/center/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S << "Disrupting the power grid would bring no benefit to us. Aborting." + to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.") + /obj/structure/particle_accelerator/particle_emitter/left/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S << "Disrupting the power grid would bring no benefit to us. Aborting." + to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.") + /obj/structure/particle_accelerator/particle_emitter/right/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S << "Disrupting the power grid would bring no benefit to us. Aborting." + to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.") + /obj/structure/particle_accelerator/particle_emitter/end_cap/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S << "Disrupting the power grid would bring no benefit to us. Aborting." + to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.") + /obj/structure/particle_accelerator/particle_emitter/power_box/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S << "Disrupting the power grid would bring no benefit to us. Aborting." + to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.") + /obj/machinery/field/generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) @@ -191,95 +205,119 @@ S.DisIntegrate(src) /obj/machinery/chem_dispenser/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S << "The volatile chemicals in this machine would destroy us. Aborting." + to_chat(S, "The volatile chemicals in this machine would destroy us. Aborting.") + /obj/machinery/nuclearbomb/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S << "This device's destruction would result in the extermination of everything in the area. Aborting." + to_chat(S, "This device's destruction would result in the extermination of everything in the area. Aborting.") + /obj/effect/rune/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S << "Searching... sensor malfunction! Target lost. Aborting." + to_chat(S, "Searching... sensor malfunction! Target lost. Aborting.") + /obj/structure/reagent_dispensers/fueltank/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S << "Destroying this object would cause a chain reaction. Aborting." + to_chat(S, "Destroying this object would cause a chain reaction. Aborting.") + /obj/structure/cable/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S << "Disrupting the power grid would bring no benefit to us. Aborting." + to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.") + /obj/machinery/portable_atmospherics/canister/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S << "An inhospitable area may be created as a result of destroying this object. Aborting." + to_chat(S, "An inhospitable area may be created as a result of destroying this object. Aborting.") + /obj/machinery/telecomms/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S << "This communications relay should be preserved, it will be a useful resource to our masters in the future. Aborting." + to_chat(S, "This communications relay should be preserved, it will be a useful resource to our masters in the future. Aborting.") + /obj/machinery/message_server/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S << "This communications relay should be preserved, it will be a useful resource to our masters in the future. Aborting." + to_chat(S, "This communications relay should be preserved, it will be a useful resource to our masters in the future. Aborting.") + /obj/machinery/blackbox_recorder/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S << "This machine has recorded large amounts of data on this structure and its inhabitants, it will be a useful resource to our masters in the future. Aborting. " + to_chat(S, "This machine has recorded large amounts of data on this structure and its inhabitants, it will be a useful resource to our masters in the future. Aborting. ") + /obj/machinery/power/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S << "Disrupting the power grid would bring no benefit to us. Aborting." + to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.") + /obj/machinery/gateway/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S << "This bluespace source will be important to us later. Aborting." + to_chat(S, "This bluespace source will be important to us later. Aborting.") + /obj/machinery/cryopod/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S << "This cryogenic sleeper should be preserved, it will be a useful resource to our masters in the future. Aborting." + to_chat(S, "This cryogenic sleeper should be preserved, it will be a useful resource to our masters in the future. Aborting.") + /obj/structure/cryofeed/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S << "This cryogenic feed should be preserved, it will be a useful resource to our masters in the future. Aborting." + to_chat(S, "This cryogenic feed should be preserved, it will be a useful resource to our masters in the future. Aborting.") + /obj/machinery/computer/cryopod/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S << "This cryopod control computer should be preserved, it contains useful items and information about the inhabitants. Aborting." + to_chat(S, "This cryopod control computer should be preserved, it contains useful items and information about the inhabitants. Aborting.") + /turf/simulated/wall/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) for(var/turf/T in range(1, src)) if(istype(T, /turf/space) || istype(T.loc, /area/space)) - S << "Destroying this object has the potential to cause a hull breach. Aborting." + to_chat(S, "Destroying this object has the potential to cause a hull breach. Aborting.") + return ..() /obj/structure/window/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) for(var/turf/T in range(1, src)) if(istype(T, /turf/space) || istype(T.loc, /area/space)) - S << "Destroying this object has the potential to cause a hull breach. Aborting." + to_chat(S, "Destroying this object has the potential to cause a hull breach. Aborting.") + return ..() /obj/item/stack/cable_coil/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)//Wiring would be too effective as a resource - S << "This object does not contain enough materials to work with." + to_chat(S, "This object does not contain enough materials to work with.") + /obj/item/weapon/circuitboard/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S << "This object does not contain enough materials to work with." + to_chat(S, "This object does not contain enough materials to work with.") + /obj/machinery/porta_turret/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S << "Attempting to dismantle this machine would result in an immediate counterattack. Aborting." + to_chat(S, "Attempting to dismantle this machine would result in an immediate counterattack. Aborting.") + /obj/spacepod/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S << "Destroying this vehicle would destroy us. Aborting." + to_chat(S, "Destroying this vehicle would destroy us. Aborting.") + /mob/living/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) S.DisperseTarget(src) /mob/living/carbon/slime/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S << "This biological resource is somehow resisting our bluespace transceiver. Aborting." + to_chat(S, "This biological resource is somehow resisting our bluespace transceiver. Aborting.") + ////END CTRL CLICK FOR SWARMERS//// /mob/living/simple_animal/hostile/swarmer/proc/Fabricate(var/atom/fabrication_object,var/fabrication_cost = 0) if(!isturf(loc)) - src << "This is not a suitable location for fabrication. We need more space." + to_chat(src, "This is not a suitable location for fabrication. We need more space.") + if(resources >= fabrication_cost) resources -= fabrication_cost else - src << "You do not have the necessary resources to fabricate this object." + to_chat(src, "You do not have the necessary resources to fabricate this object.") + return 0 new fabrication_object(loc) return 1 /mob/living/simple_animal/hostile/swarmer/proc/Integrate(var/obj/item/target) if(resources >= 100) - src << "We cannot hold more materials!" + to_chat(src, "We cannot hold more materials!") + return //Check if any entries are either MAT_METAL or MAT_GLASS if((MAT_METAL in target.materials) || (MAT_GLASS in target.materials)) @@ -296,7 +334,8 @@ return qdel(target) else - src << "\the [target] is incompatible with our internal matter recycler." + to_chat(src, "\the [target] is incompatible with our internal matter recycler.") + return /mob/living/simple_animal/hostile/swarmer/proc/DisIntegrate(var/atom/movable/target) @@ -307,9 +346,11 @@ /mob/living/simple_animal/hostile/swarmer/proc/DisperseTarget(var/mob/living/target) if(target != src) - src << "Attempting to remove this being from our presence." + to_chat(src, "Attempting to remove this being from our presence.") + if(src.z != ZLEVEL_STATION) - src << "Our bluespace transceiver cannot locate a viable bluespace link, our teleportation abilities are useless in this area." + to_chat(src, "Our bluespace transceiver cannot locate a viable bluespace link, our teleportation abilities are useless in this area.") + return if(do_mob(src, target, 30)) var/cycle @@ -333,15 +374,18 @@ /mob/living/simple_animal/hostile/swarmer/proc/DismantleMachine(var/obj/machinery/target) do_attack_animation(target) - src << "We begin to dismantle this machine. We will need to be uninterrupted." + to_chat(src, "We begin to dismantle this machine. We will need to be uninterrupted.") + var/obj/effect/swarmer/dismantle/D = new /obj/effect/swarmer/dismantle(get_turf(target)) D.pixel_x = target.pixel_x D.pixel_y = target.pixel_y if(do_mob(src, target, 100)) if(!src.Adjacent(target)) - src << "Error:Dismantleing aborted." + to_chat(src, "Error:Dismantleing aborted.") + else - src << "Dismantling complete." + to_chat(src, "Dismantling complete.") + var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal(target.loc) M.amount = 5 if(target.component_parts && target.component_parts.len) @@ -440,7 +484,8 @@ set category = "Swarmer" set desc = "Creates a simple trap that will non-lethally electrocute anything that steps on it. Costs 5 resources" if(/obj/effect/swarmer/destructible/trap in loc) - src << "There is already a trap here. Aborting." + to_chat(src, "There is already a trap here. Aborting.") + return Fabricate(/obj/effect/swarmer/destructible/trap, 5) return @@ -468,10 +513,12 @@ set category = "Swarmer" set desc = "Creates a barricade that will stop anything but swarmers and disabler beams from passing through." if(/obj/effect/swarmer/destructible/blockade in loc) - src << "There is already a blockade here. Aborting." + to_chat(src, "There is already a blockade here. Aborting.") + return if(resources < 5) - src << "We do not have the resources for this!" + to_chat(src, "We do not have the resources for this!") + return if(do_mob(src, src, 10)) Fabricate(/obj/effect/swarmer/destructible/blockade, 5) @@ -496,12 +543,15 @@ set name = "Replicate" set category = "Swarmer" set desc = "Creates a shell for a new swarmer. Swarmers will self activate." - src << "We are attempting to replicate ourselves. We will need to stand still until the process is complete." + to_chat(src, "We are attempting to replicate ourselves. We will need to stand still until the process is complete.") + if(resources < 50) - src << "We do not have the resources for this!" + to_chat(src, "We do not have the resources for this!") + return if(!isturf(loc)) - src << "This is not a suitable location for replicating ourselves. We need more room." + to_chat(src, "This is not a suitable location for replicating ourselves. We need more room.") + return if(do_mob(src, src, 100)) if(Fabricate(/obj/item/unactivated_swarmer, 50)) @@ -513,10 +563,12 @@ set desc = "Attempts to repair damage to our body. You will have to remain motionless until repairs are complete." if(!isturf(loc)) return - src << "Attempting to repair damage to our body, stand by..." + to_chat(src, "Attempting to repair damage to our body, stand by...") + if(do_mob(src, src, 100)) adjustBruteLoss(-100) - src << "We successfully repaired ourselves." + to_chat(src, "We successfully repaired ourselves.") + /mob/living/simple_animal/hostile/swarmer/proc/ToggleLight() if(!light_range) @@ -529,7 +581,8 @@ if(message) for(var/mob/M in mob_list) if(isswarmer(M) || (M in dead_mob_list)) - M << "Swarm communication - [src] states: [message]" + to_chat(M, "Swarm communication - [src] states: [message]") + diff --git a/code/game/gamemodes/miniantags/guardian/guardian.dm b/code/game/gamemodes/miniantags/guardian/guardian.dm index 750afa1e623..3c62fc71d14 100644 --- a/code/game/gamemodes/miniantags/guardian/guardian.dm +++ b/code/game/gamemodes/miniantags/guardian/guardian.dm @@ -42,7 +42,8 @@ ..() if(summoner) if(summoner.stat == DEAD) - src << "Your summoner has died!" + to_chat(src, "Your summoner has died!") + visible_message("The [src] dies along with its user!") ghostize() qdel(src) @@ -50,11 +51,13 @@ if (get_dist(get_turf(summoner),get_turf(src)) <= range) return else - src << "You moved out of range, and were pulled back! You can only move [range] meters from [summoner.real_name]" + to_chat(src, "You moved out of range, and were pulled back! You can only move [range] meters from [summoner.real_name]") + visible_message("The [src] jumps back to its user.") Recall() if(summoned && !summoner && !adminseal) - src << "You somehow lack a summoner! As a result, you dispel!" + to_chat(src, "You somehow lack a summoner! As a result, you dispel!") + ghostize() qdel() @@ -64,13 +67,15 @@ if (get_dist(get_turf(summoner),get_turf(src)) <= range) return else - src << "You moved out of range, and were pulled back! You can only move [range] meters from [summoner.real_name]" + to_chat(src, "You moved out of range, and were pulled back! You can only move [range] meters from [summoner.real_name]") + visible_message("The [src] jumps back to its user.") Recall() /mob/living/simple_animal/hostile/guardian/death() ..() - summoner << "Your [name] died somehow!" + to_chat(summoner, "Your [name] died somehow!") + summoner.death() @@ -91,10 +96,12 @@ return summoner.adjustBruteLoss(damage) if(damage) - summoner << "Your [name] is under attack! You take damage!" + to_chat(summoner, "Your [name] is under attack! You take damage!") + summoner.visible_message("Blood sprays from [summoner] as [src] takes damage!") if(summoner.stat == UNCONSCIOUS) - summoner << "Your body can't take the strain of sustaining [src] in this condition, it begins to fall apart!" + to_chat(summoner, "Your body can't take the strain of sustaining [src] in this condition, it begins to fall apart!") + summoner.adjustCloneLoss(damage/2) /mob/living/simple_animal/hostile/guardian/ex_act(severity, target) @@ -110,7 +117,8 @@ /mob/living/simple_animal/hostile/guardian/gib() if(summoner) - summoner << "Your [src] was blown up!" + to_chat(summoner, "Your [src] was blown up!") + summoner.Weaken(10)// your fermillier has died! ROLL FOR CON LOSS! ghostize() qdel(src) @@ -142,14 +150,18 @@ for(var/mob/M in mob_list) if(M == summoner) - M << "[src]: [input]" + to_chat(M, "[src]: [input]") + log_say("Guardian Communication: [key_name(src)] -> [key_name(M)] : [input]") else if (M in dead_mob_list) - M << "Guardian Communication from [src] ([ghost_follow_link(src, ghost=M)]): [input]" - src << "[src]: [input]" + to_chat(M, "Guardian Communication from [src] ([ghost_follow_link(src, ghost=M)]): [input]") + + to_chat(src, "[src]: [input]") + /mob/living/simple_animal/hostile/guardian/proc/ToggleMode() - src << "You dont have another mode!" + to_chat(src, "You dont have another mode!") + /mob/living/proc/guardian_comm() @@ -163,12 +175,15 @@ if(istype (M, /mob/living/simple_animal/hostile/guardian)) var/mob/living/simple_animal/hostile/guardian/G = M if(G.summoner == src) - G << "[src]: [input]" + to_chat(G, "[src]: [input]") + log_say("Guardian Communication: [key_name(src)] -> [key_name(G)] : [input]") else if (M in dead_mob_list) - M << "Guardian Communication from [src] ([ghost_follow_link(src, ghost=M)]): [input]" - src << "[src]: [input]" + to_chat(M, "Guardian Communication from [src] ([ghost_follow_link(src, ghost=M)]): [input]") + + to_chat(src, "[src]: [input]") + /mob/living/proc/guardian_recall() set name = "Recall Guardian" @@ -190,13 +205,16 @@ var/mob/dead/observer/new_stand = null if(candidates.len) new_stand = pick(candidates) - G << "Your user reset you, and your body was taken over by a ghost. Looks like they weren't happy with your performance." - src << "Your guardian has been successfully reset." + to_chat(G, "Your user reset you, and your body was taken over by a ghost. Looks like they weren't happy with your performance.") + + to_chat(src, "Your guardian has been successfully reset.") + message_admins("[key_name_admin(new_stand)] has taken control of ([key_name_admin(G)])") G.ghostize(0) G.key = new_stand.key else - src << "There were no ghosts willing to take control. Looks like you're stuck with your Guardian for now." + to_chat(src, "There were no ghosts willing to take control. Looks like you're stuck with your Guardian for now.") + spawn(3000) verbs += /mob/living/proc/guardian_reset @@ -204,10 +222,12 @@ /mob/living/simple_animal/hostile/guardian/proc/ToggleLight() if(!luminosity) set_light(3) - src << "You activate your light." + to_chat(src, "You activate your light.") + else set_light(0) - src << "You deactivate your light." + to_chat(src, "You deactivate your light.") + //////////////////////////TYPES OF GUARDIANS @@ -239,10 +259,12 @@ /mob/living/simple_animal/hostile/guardian/fire/ToggleMode() if(src.loc == summoner) if(toggle) - src << "You switch to dispersion mode, and will teleport victims away from your master." + to_chat(src, "You switch to dispersion mode, and will teleport victims away from your master.") + toggle = FALSE else - src << "You switch to deception mode, and will turn your victims against their allies." + to_chat(src, "You switch to deception mode, and will turn your victims against their allies.") + toggle = TRUE /mob/living/simple_animal/hostile/guardian/fire/AttackingTarget() @@ -381,7 +403,8 @@ ..() if(toggle == TRUE) if(src.loc == summoner) - src << "You must be manifested to heal!" + to_chat(src, "You must be manifested to heal!") + return if(iscarbon(target)) src.changeNext_move(CLICK_CD_MELEE) @@ -403,7 +426,8 @@ damage_transfer = 0 melee_damage_lower = 15 melee_damage_upper = 15 - src << "You switch to combat mode." + to_chat(src, "You switch to combat mode.") + toggle = FALSE else a_intent = I_HELP @@ -413,10 +437,12 @@ damage_transfer = 0 melee_damage_lower = 0 melee_damage_upper = 0 - src << "You switch to healing mode." + to_chat(src, "You switch to healing mode.") + toggle = TRUE else - src << "You have to be recalled to toggle modes!" + to_chat(src, "You have to be recalled to toggle modes!") + /mob/living/simple_animal/hostile/guardian/healer/verb/Beacon() @@ -431,31 +457,38 @@ F.name = "bluespace recieving pad" F.desc = "A recieving zone for bluespace teleportations. Building a wall over it should disable it." F.icon_state = "light_on-w" - src << "Beacon placed! You may now warp targets to it, including your user, via Alt+Click. " + to_chat(src, "Beacon placed! You may now warp targets to it, including your user, via Alt+Click. ") + if(beacon) beacon.ChangeTurf(/turf/simulated/floor/plating) beacon = F beacon_cooldown = world.time+3000 else - src << "Your power is on cooldown. You must wait five minutes between placing beacons." + to_chat(src, "Your power is on cooldown. You must wait five minutes between placing beacons.") + /mob/living/simple_animal/hostile/guardian/healer/AltClickOn(atom/movable/A) if(!istype(A)) return if(src.loc == summoner) - src << "You must be manifested to warp a target!" + to_chat(src, "You must be manifested to warp a target!") + return if(!beacon) - src << "You need a beacon placed to warp things!" + to_chat(src, "You need a beacon placed to warp things!") + return if(!Adjacent(A)) - src << "You must be adjacent to your target!" + to_chat(src, "You must be adjacent to your target!") + return if((A.anchored)) - src << "Your target can not be anchored!" + to_chat(src, "Your target can not be anchored!") + return - src << "You begin to warp [A]" + to_chat(src, "You begin to warp [A]") + if(do_mob(src, A, 50)) if(!A.anchored) if(src.beacon) //Check that the beacon still exists and is in a safe place. No instant kills. @@ -469,13 +502,17 @@ do_teleport(A, beacon, 0) new /obj/effect/overlay/temp/guardian/phase(get_turf(A)) else - src << "The beacon isn't in a safe location!" + to_chat(src, "The beacon isn't in a safe location!") + else - src << "The beacon isn't in a safe location!" + to_chat(src, "The beacon isn't in a safe location!") + else - src << "You need a beacon to warp things!" + to_chat(src, "You need a beacon to warp things!") + else - src << "You need to hold still!" + to_chat(src, "You need to hold still!") + ///////////////////Ranged @@ -517,7 +554,8 @@ alpha = 255 range = 13 incorporeal_move = 0 - src << "You switch to combat mode." + to_chat(src, "You switch to combat mode.") + toggle = FALSE else ranged = 0 @@ -526,17 +564,21 @@ alpha = 60 range = 255 incorporeal_move = 1 - src << "You switch to scout mode." + to_chat(src, "You switch to scout mode.") + toggle = TRUE else - src << "You have to be recalled to toggle modes!" + to_chat(src, "You have to be recalled to toggle modes!") + /mob/living/simple_animal/hostile/guardian/ranged/ToggleLight() if(see_invisible == SEE_INVISIBLE_MINIMUM) - src << "You deactivate your night vision." + to_chat(src, "You deactivate your night vision.") + see_invisible = SEE_INVISIBLE_LIVING else - src << "You activate your night vision." + to_chat(src, "You activate your night vision.") + see_invisible = SEE_INVISIBLE_MINIMUM /mob/living/simple_animal/hostile/guardian/ranged/verb/Snare() @@ -549,9 +591,11 @@ S.spawner = src S.name = "[get_area(snare_loc)] trap ([rand(1, 1000)])" src.snares |= S - src << "Surveillance trap deployed!" + to_chat(src, "Surveillance trap deployed!") + else - src << "You have too many traps deployed. Delete some first." + to_chat(src, "You have too many traps deployed. Delete some first.") + /mob/living/simple_animal/hostile/guardian/ranged/verb/DisarmSnare() set name = "Remove Surveillance Trap" @@ -561,7 +605,8 @@ if(picked_snare) src.snares -= picked_snare qdel(picked_snare) - src << "Snare disarmed." + to_chat(src, "Snare disarmed.") + /obj/item/effect/snare name = "snare" @@ -574,11 +619,13 @@ if(istype(AM, /mob/living/)) var/turf/snare_loc = get_turf(src.loc) if(spawner) - spawner << "[AM] has crossed your surveillance trap at [get_area(snare_loc)]." + to_chat(spawner, "[AM] has crossed your surveillance trap at [get_area(snare_loc)].") + if(istype(spawner, /mob/living/simple_animal/hostile/guardian)) var/mob/living/simple_animal/hostile/guardian/G = spawner if(G.summoner) - G.summoner << "[AM] has crossed your surveillance trap at [get_area(snare_loc)]." + to_chat(G.summoner, "[AM] has crossed your surveillance trap at [get_area(snare_loc)].") + ////Bomb @@ -597,19 +644,23 @@ if(!istype(A)) return if(src.loc == summoner) - src << "You must be manifested to create bombs!" + to_chat(src, "You must be manifested to create bombs!") + return if(istype(A, /obj/)) if(bomb_cooldown <= world.time && !stat) var/obj/item/weapon/guardian_bomb/B = new /obj/item/weapon/guardian_bomb(get_turf(A)) - src << "Success! Bomb on \the [A] armed!" + to_chat(src, "Success! Bomb on \the [A] armed!") + if(summoner) - summoner << "Your guardian has primed \the [A] to explode!" + to_chat(summoner, "Your guardian has primed \the [A] to explode!") + bomb_cooldown = world.time + 200 B.spawner = src B.disguise (A) else - src << "Your powers are on cooldown! You must wait 20 seconds between bombs." + to_chat(src, "Your powers are on cooldown! You must wait 20 seconds between bombs.") + /obj/item/weapon/guardian_bomb name = "bomb" @@ -627,19 +678,23 @@ spawn(600) if(src) stored_obj.loc = get_turf(src.loc) - spawner << "Failure! Your trap on \the [stored_obj] didn't catch anyone this time." + to_chat(spawner, "Failure! Your trap on \the [stored_obj] didn't catch anyone this time.") + qdel(src) /obj/item/weapon/guardian_bomb/proc/detonate(var/mob/living/user) - user << "The [src] was boobytrapped!" + to_chat(user, "The [src] was boobytrapped!") + if(istype(spawner, /mob/living/simple_animal/hostile/guardian)) var/mob/living/simple_animal/hostile/guardian/G = spawner if(user == G.summoner) - user << "You knew this because of your link with your guardian, so you smartly defuse the bomb." + to_chat(user, "You knew this because of your link with your guardian, so you smartly defuse the bomb.") + stored_obj.loc = get_turf(src.loc) qdel(src) return - spawner << "Success! Your trap on \the [src] caught [user]!" + to_chat(spawner, "Success! Your trap on \the [src] caught [user]!") + stored_obj.loc = get_turf(src.loc) playsound(get_turf(src),'sound/effects/Explosion2.ogg', 200, 1) user.ex_act(2) @@ -656,7 +711,8 @@ /obj/item/weapon/guardian_bomb/examine(mob/user) stored_obj.examine(user) if(get_dist(user,src)<=2) - user << "Looks odd!" + to_chat(user, "Looks odd!") + ////////Creation @@ -679,16 +735,20 @@ /obj/item/weapon/guardiancreator/attack_self(mob/living/user) for(var/mob/living/simple_animal/hostile/guardian/G in living_mob_list) if (G.summoner == user) - user << "You already have a [mob_name]!" + to_chat(user, "You already have a [mob_name]!") + return if(user.mind && user.mind.changeling) - user << "[ling_failure]" + to_chat(user, "[ling_failure]") + return if(used == TRUE) - user << "[used_message]" + to_chat(user, "[used_message]") + return used = TRUE - user << "[use_message]" + to_chat(user, "[use_message]") + var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as the [mob_name] of [user.real_name]?", ROLE_GUARDIAN, 0, 100) var/mob/dead/observer/theghost = null @@ -696,7 +756,8 @@ theghost = pick(candidates) spawn_guardian(user, theghost.key) else - user << "[failure_message]" + to_chat(user, "[failure_message]") + used = FALSE @@ -728,10 +789,14 @@ G.summoner = user G.summoned = TRUE G.key = key - G << "You are a [mob_name] bound to serve [user.real_name]." - G << "You are capable of manifesting or recalling to your master with verbs in the Guardian tab. You will also find a verb to communicate with them privately there." - G << "While personally invincible, you will die if [user.real_name] does, and any damage dealt to you will have a portion passed on to them as you feed upon them to sustain yourself." - G << "[G.playstyle_string]" + to_chat(G, "You are a [mob_name] bound to serve [user.real_name].") + + to_chat(G, "You are capable of manifesting or recalling to your master with verbs in the Guardian tab. You will also find a verb to communicate with them privately there.") + + to_chat(G, "While personally invincible, you will die if [user.real_name] does, and any damage dealt to you will have a portion passed on to them as you feed upon them to sustain yourself.") + + to_chat(G, "[G.playstyle_string]") + G.faction = user.faction user.verbs += /mob/living/proc/guardian_comm user.verbs += /mob/living/proc/guardian_recall @@ -752,7 +817,8 @@ G.icon_state = "[theme][color]" G.icon_dead = "[theme][color]" - user << "[G.magic_fluff_string]." + to_chat(user, "[G.magic_fluff_string].") + if("tech") color = pick("Rose", "Peony", "Lily", "Daisy", "Zinnia", "Ivy", "Iris", "Petunia", "Violet", "Lilac", "Orchid") //technically not colors, just flowers that can be specific colors picked_name = pick("Gallium", "Indium", "Thallium", "Bismuth", "Aluminium", "Mercury", "Iron", "Silver", "Zinc", "Titanium", "Chromium", "Nickel", "Platinum", "Tellurium", "Palladium", "Rhodium", "Cobalt", "Osmium", "Tungsten", "Iridium") @@ -763,12 +829,14 @@ G.icon_state = "[theme][color]" G.icon_dead = "[theme][color]" - user << "[G.tech_fluff_string]." + to_chat(user, "[G.tech_fluff_string].") + G.speak_emote = list("states") if("bio") G.icon = 'icons/mob/mob.dmi' picked_name = pick("brood", "hive", "nest") - user << "[G.bio_fluff_string]." + to_chat(user, "[G.bio_fluff_string].") + G.name = "[picked_name] swarm" G.color = picked_color G.real_name = "[picked_name] swarm" diff --git a/code/game/gamemodes/miniantags/morph/morph.dm b/code/game/gamemodes/miniantags/morph/morph.dm index 9786aa1432a..eee370b1710 100644 --- a/code/game/gamemodes/miniantags/morph/morph.dm +++ b/code/game/gamemodes/miniantags/morph/morph.dm @@ -52,7 +52,8 @@ else ..() if(get_dist(user,src)<=3) - user << "It doesn't look quite right..." + to_chat(user, "It doesn't look quite right...") + else ..() return @@ -81,7 +82,8 @@ if(istype(A) && allowed(A)) assume(A) else - src << "Your chameleon skin is still repairing itself!" + to_chat(src, "Your chameleon skin is still repairing itself!") + ..() /mob/living/simple_animal/hostile/morph/proc/assume(atom/movable/target) diff --git a/code/game/gamemodes/miniantags/morph/morph_event.dm b/code/game/gamemodes/miniantags/morph/morph_event.dm index c0af9c38040..190d2abb5f4 100644 --- a/code/game/gamemodes/miniantags/morph/morph_event.dm +++ b/code/game/gamemodes/miniantags/morph/morph_event.dm @@ -22,8 +22,10 @@ player_mind.assigned_role = "Morph" player_mind.special_role = "Morph" ticker.mode.traitors |= player_mind - S << S.playstyle_string - S << 'sound/magic/Mutate.ogg' + to_chat(S, S.playstyle_string) + + to_chat(S, 'sound/magic/Mutate.ogg') + message_admins("[key_of_morph] has been made into morph by an event.") log_game("[key_of_morph] was spawned as a morph by an event.") return 1 diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index 2fa99dd58a6..be6bdd718af 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -62,11 +62,13 @@ revealed = 0 incorporeal_move = 3 invisibility = INVISIBILITY_REVENANT - src << "You are once more concealed." + to_chat(src, "You are once more concealed.") + if(unstun_time && world.time >= unstun_time) unstun_time = 0 notransform = 0 - src << "You can move again!" + to_chat(src, "You can move again!") + update_spooky_icon() /mob/living/simple_animal/revenant/ex_act(severity) @@ -86,7 +88,8 @@ return essence = max(0, essence-amount) if(essence == 0) - src << "You feel your essence fraying!" + to_chat(src, "You feel your essence fraying!") + @@ -97,9 +100,11 @@ var/rendered = "[src] says, \"[message]\"" for(var/mob/M in mob_list) if(istype(M, /mob/living/simple_animal/revenant)) - M << rendered + to_chat(M, rendered) + if(isobserver(M)) - M << "(F) [rendered]" + to_chat(M, "(F) [rendered]") + return /mob/living/simple_animal/revenant/Stat() @@ -119,23 +124,28 @@ spawn(5) if(src.mind) src.mind.wipe_memory() - src << 'sound/effects/ghost.ogg' - src << "
      " - src << "You are a revenant." - src << "Your formerly mundane spirit has been infused with alien energies and empowered into a revenant." - src << "You are not dead, not alive, but somewhere in between. You are capable of limited interaction with both worlds." - src << "You are invincible and invisible to everyone but other ghosts. Most abilities will reveal you, rendering you vulnerable." - src << "To function, you are to drain the life essence from humans. This essence is a resource, as well as your health, and will power all of your abilities." - src << "You do not remember anything of your past lives, nor will you remember anything about this one after your death." - src << "Be sure to read the wiki page at http://nanotrasen.se/wiki/index.php/Revenant to learn more." + to_chat(src, 'sound/effects/ghost.ogg') + + to_chat(src, "
      ") + to_chat(src, "You are a revenant.") + to_chat(src, "Your formerly mundane spirit has been infused with alien energies and empowered into a revenant.") + to_chat(src, "You are not dead, not alive, but somewhere in between. You are capable of limited interaction with both worlds.") + to_chat(src, "You are invincible and invisible to everyone but other ghosts. Most abilities will reveal you, rendering you vulnerable.") + to_chat(src, "To function, you are to drain the life essence from humans. This essence is a resource, as well as your health, and will power all of your abilities.") + to_chat(src, "You do not remember anything of your past lives, nor will you remember anything about this one after your death.") + to_chat(src, "Be sure to read the wiki page at http://nanotrasen.se/wiki/index.php/Revenant to learn more.") + + var/datum/objective/revenant/objective = new objective.owner = src.mind src.mind.objectives += objective - src << "Objective #1: [objective.explanation_text]" + to_chat(src, "Objective #1: [objective.explanation_text]") + var/datum/objective/revenantFluff/objective2 = new objective2.owner = src.mind src.mind.objectives += objective2 - src << "Objective #2: [objective2.explanation_text]" + to_chat(src, "Objective #2: [objective2.explanation_text]") + ticker.mode.traitors |= src.mind //Necessary for announcing if(!src.giveSpells()) message_admins("Revenant was created but has no mind. Trying again in five seconds.") @@ -168,7 +178,8 @@ ghost_darkness_images -= ghostimage updateallghostimages() - src << "NO! No... it's too late, you can feel your essence breaking apart..." + to_chat(src, "NO! No... it's too late, you can feel your essence breaking apart...") + notransform = 1 revealed = 1 invisibility = 0 @@ -204,13 +215,16 @@ return var/turf/T = get_turf(src) if(istype(T, /turf/simulated/wall)) - src << "You cannot use abilities from inside of a wall." + to_chat(src, "You cannot use abilities from inside of a wall.") + return 0 if(src.inhibited) - src << "Your powers have been suppressed by nulling energy!" + to_chat(src, "Your powers have been suppressed by nulling energy!") + return 0 if(!src.change_essence_amount(essence_cost, 1)) - src << "You lack the essence to use that ability." + to_chat(src, "You lack the essence to use that ability.") + return 0 return 1 @@ -224,9 +238,11 @@ essence_accumulated = max(0, essence_accumulated+essence_amt) if(!silent) if(essence_amt > 0) - src << "Gained [essence_amt]E from [source]." + to_chat(src, "Gained [essence_amt]E from [source].") + else - src << "Lost [essence_amt]E from [source]." + to_chat(src, "Lost [essence_amt]E from [source].") + return 1 /mob/living/simple_animal/revenant/proc/reveal(time) @@ -238,10 +254,12 @@ invisibility = 0 incorporeal_move = 0 if(!unreveal_time) - src << "You have been revealed!" + to_chat(src, "You have been revealed!") + unreveal_time = world.time + time else - src << "You have been revealed!" + to_chat(src, "You have been revealed!") + unreveal_time = unreveal_time + time update_spooky_icon() @@ -252,10 +270,12 @@ return notransform = 1 if(!unstun_time) - src << "You cannot move!" + to_chat(src, "You cannot move!") + unstun_time = world.time + time else - src << "You cannot move!" + to_chat(src, "You cannot move!") + unstun_time = unstun_time + time update_spooky_icon() @@ -350,9 +370,11 @@ /obj/item/weapon/ectoplasm/revenant/examine(mob/user) ..(user) if(inert) - user << "It seems inert." + to_chat(user, "It seems inert.") + else if(reforming) - user << "It is shifting and distorted. It would be wise to destroy this." + to_chat(user, "It is shifting and distorted. It would be wise to destroy this.") + /obj/item/weapon/ectoplasm/revenant/proc/reform() if(inert || !src) diff --git a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm index e061bcc4d77..e3d32319892 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm @@ -29,47 +29,63 @@ if(!castcheck(0)) return if(draining) - src << "You are already siphoning the essence of a soul!" + to_chat(src, "You are already siphoning the essence of a soul!") + return if(target in drained_mobs) - src << "[target]'s soul is dead and empty." + to_chat(src, "[target]'s soul is dead and empty.") + return if(!target.stat) - src << "This being's soul is too strong to harvest." + to_chat(src, "This being's soul is too strong to harvest.") + if(prob(10)) - target << "You feel as if you are being watched." + to_chat(target, "You feel as if you are being watched.") + return draining = 1 essence_drained = rand(15, 20) - src << "You search for the soul of [target]." + to_chat(src, "You search for the soul of [target].") + if(do_after(src, 10, 0, target = target)) //did they get deleted in that second? if(target.ckey) - src << "Their soul burns with intelligence." + to_chat(src, "Their soul burns with intelligence.") + essence_drained += rand(20, 30) if(target.stat != DEAD) - src << "Their soul blazes with life!" + to_chat(src, "Their soul blazes with life!") + essence_drained += rand(40, 50) else - src << "Their soul is weak and faltering." + to_chat(src, "Their soul is weak and faltering.") + if(do_after(src, 20, 0, target = target)) //did they get deleted NOW? switch(essence_drained) if(1 to 30) - src << "[target] will not yield much essence. Still, every bit counts." + to_chat(src, "[target] will not yield much essence. Still, every bit counts.") + if(30 to 70) - src << "[target] will yield an average amount of essence." + to_chat(src, "[target] will yield an average amount of essence.") + if(70 to 90) - src << "Such a feast! [target] will yield much essence to you." + to_chat(src, "Such a feast! [target] will yield much essence to you.") + if(90 to INFINITY) - src << "Ah, the perfect soul. [target] will yield massive amounts of essence to you." + to_chat(src, "Ah, the perfect soul. [target] will yield massive amounts of essence to you.") + if(do_after(src, 20, 0, target = target)) //how about now if(!target.stat) - src << "They are now powerful enough to fight off your draining." - target << "You feel something tugging across your body before subsiding." + to_chat(src, "They are now powerful enough to fight off your draining.") + + to_chat(target, "You feel something tugging across your body before subsiding.") + draining = 0 return //hey, wait a minute... - src << "You begin siphoning essence from [target]'s soul." + to_chat(src, "You begin siphoning essence from [target]'s soul.") + if(target.stat != DEAD) - target << "You feel a horribly unpleasant draining sensation as your grip on life weakens..." + to_chat(target, "You feel a horribly unpleasant draining sensation as your grip on life weakens...") + icon_state = "revenant_draining" reveal(27) stun(27) @@ -80,14 +96,17 @@ if(essence_drained > 90) essence_regen_cap += 25 perfectsouls += 1 - src << "The perfection of [target]'s soul has increased your maximum essence level. Your new maximum essence is [essence_regen_cap]." - src << "[target]'s soul has been considerably weakened and will yield no more essence for the time being." + to_chat(src, "The perfection of [target]'s soul has increased your maximum essence level. Your new maximum essence is [essence_regen_cap].") + + to_chat(src, "[target]'s soul has been considerably weakened and will yield no more essence for the time being.") + target.visible_message("[target] slumps onto the ground.", \ "Violets lights, dancing in your vision, getting clo--") drained_mobs.Add(target) target.death(0) else - src << "[target ? "[target] has":"They have"] been drawn out of your grasp. The link has been broken." + to_chat(src, "[target ? "[target] has":"They have"] been drawn out of your grasp. The link has been broken.") + draining = 0 essence_drained = 0 if(target) //Wait, target is WHERE NOW? @@ -95,7 +114,8 @@ "Violets lights, dancing in your vision, receding--") return else - src << "You are not close enough to siphon [target ? "[target]'s":"their"] soul. The link has been broken." + to_chat(src, "You are not close enough to siphon [target ? "[target]'s":"their"] soul. The link has been broken.") + draining = 0 essence_drained = 0 return @@ -132,8 +152,10 @@ charge_counter = charge_max return log_say("RevenantTransmit: [key_name(user)]->[key_name(M)] : [msg]") - usr << "You transmit to [M]: [msg]" - M << "An alien voice resonates from all around... [msg]" + to_chat(usr, "You transmit to [M]: [msg]") + + to_chat(M, "An alien voice resonates from all around... [msg]") + /obj/effect/proc_holder/spell/aoe_turf/revenant @@ -172,7 +194,8 @@ charge_counter = charge_max return 0 name = "[initial(name)] ([cast_amount]E)" - user << "You have unlocked [initial(name)]!" + to_chat(user, "You have unlocked [initial(name)]!") + panel = "Revenant Abilities" locked = 0 charge_counter = charge_max @@ -248,7 +271,8 @@ T.flags -= NOJAUNT new/obj/effect/overlay/temp/revenant(T) for(var/mob/living/carbon/human/human in T.contents) - human << "You suddenly feel [pick("sick and tired", "tired and confused", "nauseated", "dizzy")]." + to_chat(human, "You suddenly feel [pick("sick and tired", "tired and confused", "nauseated", "dizzy")].") + human.adjustStaminaLoss(stamdamage) human.adjustToxLoss(toxdamage) human.confused += confusion @@ -298,7 +322,8 @@ bot.open = 1 bot.emag_act(null) for(var/mob/living/carbon/human/human in T.contents) - human << "You feel [pick("your sense of direction flicker out", "a stabbing pain in your head", "your mind fill with static")]." + to_chat(human, "You feel [pick("your sense of direction flicker out", "a stabbing pain in your head", "your mind fill with static")].") + new/obj/effect/overlay/temp/revenant(human.loc) human.emp_act(1) for(var/obj/thing in T.contents) diff --git a/code/game/gamemodes/miniantags/slaughter/bloodcrawl.dm b/code/game/gamemodes/miniantags/slaughter/bloodcrawl.dm index a3a37a7d625..7ac75cf1e71 100644 --- a/code/game/gamemodes/miniantags/slaughter/bloodcrawl.dm +++ b/code/game/gamemodes/miniantags/slaughter/bloodcrawl.dm @@ -7,7 +7,8 @@ if(iscarbon(src)) var/mob/living/carbon/C = src if(C.l_hand || C.r_hand) - C << "You may not hold items while blood crawling!" + to_chat(C, "You may not hold items while blood crawling!") + return 0 var/obj/item/weapon/bloodcrawl/B1 = new(C) var/obj/item/weapon/bloodcrawl/B2 = new(C) @@ -54,7 +55,8 @@ holder = holder if(kidnapped) - src << "You begin to feast on [kidnapped]. You can not move while you are doing this." + to_chat(src, "You begin to feast on [kidnapped]. You can not move while you are doing this.") + visible_message("Loud eating sounds come from the blood...") sleep(6) if(animation) @@ -63,7 +65,8 @@ playsound(get_turf(src),'sound/misc/Demon_consume.ogg', 100, 1) sleep(30) if(kidnapped) - src << "You devour [kidnapped]. Your health is fully restored." + to_chat(src, "You devour [kidnapped]. Your health is fully restored.") + adjustBruteLoss(-1000) adjustFireLoss(-1000) adjustOxyLoss(-1000) @@ -73,7 +76,8 @@ var/mob/living/simple_animal/slaughter/demon = src demon.devoured++ - kidnapped << "You feel teeth sink into your flesh, and the--" + to_chat(kidnapped, "You feel teeth sink into your flesh, and the--") + kidnapped.adjustBruteLoss(1000) kidnapped.forceMove(src) demon.consumed_mobs.Add(kidnapped) @@ -81,7 +85,8 @@ kidnapped.ghostize() qdel(kidnapped) else - src << "You happily devour... nothing? Your meal vanished at some point!" + to_chat(src, "You happily devour... nothing? Your meal vanished at some point!") + else sleep(6) if (animation) @@ -98,7 +103,8 @@ /mob/living/proc/phasein(var/obj/effect/decal/cleanable/B) if(notransform) - src << "Finish eating first!" + to_chat(src, "Finish eating first!") + return 0 B.visible_message("[B] starts to bubble...") if(!do_after(src, 20, target = B)) diff --git a/code/game/gamemodes/miniantags/slaughter/slaughter.dm b/code/game/gamemodes/miniantags/slaughter/slaughter.dm index 3d4a8b9061e..145f71b2066 100644 --- a/code/game/gamemodes/miniantags/slaughter/slaughter.dm +++ b/code/game/gamemodes/miniantags/slaughter/slaughter.dm @@ -55,9 +55,12 @@ if(istype(loc, /obj/effect/dummy/slaughter)) bloodspell.phased = 1 if(mind) - src << src.playstyle_string - src << "You are not currently in the same plane of existence as the station. Ctrl+Click a blood pool to manifest." - src << 'sound/misc/demon_dies.ogg' + to_chat(src, src.playstyle_string) + + to_chat(src, "You are not currently in the same plane of existence as the station. Ctrl+Click a blood pool to manifest.") + + to_chat(src, 'sound/misc/demon_dies.ogg') + mind.current.verbs += /mob/living/simple_animal/slaughter/proc/slaughterWhisper if(!(vialspawned)) var/datum/objective/slaughter/objective = new @@ -68,8 +71,10 @@ //Paradise Port:I added the objective for one spawned like this mind.objectives += objective mind.objectives += fluffObjective - src << "Objective #[1]: [objective.explanation_text]" - src << "Objective #[2]: [fluffObjective.explanation_text]" + to_chat(src, "Objective #[1]: [objective.explanation_text]") + + to_chat(src, "Objective #[2]: [fluffObjective.explanation_text]") + /mob/living/simple_animal/slaughter/Life() @@ -125,8 +130,10 @@ if(!(msg)) return log_say("Slaughter Demon Transmit: [key_name(usr)]->[key_name(M)]: [msg]") - usr << "You whisper to [M]: [msg]" - M << "Suddenly a strange, demonic voice resonates in your head... [msg]" + to_chat(usr, "You whisper to [M]: [msg]") + + to_chat(M, "Suddenly a strange, demonic voice resonates in your head... [msg]") + for(var/mob/dead/observer/G in player_list) G.show_message("Demonic message from [usr] ([ghost_follow_link(usr, ghost=G)]) to [M] ([ghost_follow_link(M, ghost=G)]): [msg]") @@ -161,10 +168,12 @@ "You feel a strange power seep into your body... you have absorbed the demon's blood-travelling powers!") user.bloodcrawl = BLOODCRAWL else if(user.bloodcrawl == BLOODCRAWL) - user << "You feel diffr- CONSUME THEM! " + to_chat(user, "You feel diffr- CONSUME THEM! ") + user.bloodcrawl = BLOODCRAWL_EAT else - user <<"...and you don't feel any different." + to_chat(user, "...and you don't feel any different.") + user.drop_item() insert(user) //Consuming the heart literally replaces your heart with a demon heart. H A R D C O R E diff --git a/code/game/gamemodes/mutiny/emergency_authentication_device.dm b/code/game/gamemodes/mutiny/emergency_authentication_device.dm index 2a48ac8c3b7..d2e0e2849df 100644 --- a/code/game/gamemodes/mutiny/emergency_authentication_device.dm +++ b/code/game/gamemodes/mutiny/emergency_authentication_device.dm @@ -45,7 +45,8 @@ /obj/machinery/emergency_authentication_device/attack_hand(mob/user) if(activated) - user << "\blue \The [src] is already active!" + to_chat(user, "\blue \The [src] is already active!") + return if(!mode.current_directive.directives_complete()) @@ -55,7 +56,8 @@ check_key_existence() if(captains_key && secondary_key) activated = 1 - user << "\blue You activate \the [src]!" + to_chat(user, "\blue You activate \the [src]!") + state("Command acknowledged. Initiating quantum entanglement relay to Nanotrasen High Command.") launch_shuttle() return @@ -77,7 +79,8 @@ /obj/machinery/emergency_authentication_device/attackby(obj/item/weapon/O, mob/user, params) if(activated) - user << "\blue \The [src] is already active!" + to_chat(user, "\blue \The [src] is already active!") + return if(!mode.current_directive.directives_complete()) @@ -107,5 +110,6 @@ ..() /obj/machinery/emergency_authentication_device/examine(mob/user) - user << {"This is a specialized communications device that is able to instantly send a message to Nanotrasen High Command via quantum entanglement with a sister device at CentComm.
      - The EAD's status is [get_status()]."} + to_chat(user, {"This is a specialized communications device that is able to instantly send a message to Nanotrasen High Command via quantum entanglement + with a sister device at CentComm.
      + The EAD's status is [get_status()]."}) diff --git a/code/game/gamemodes/mutiny/key_pinpointer.dm b/code/game/gamemodes/mutiny/key_pinpointer.dm index 4d4596ab229..6b47fc71ae7 100644 --- a/code/game/gamemodes/mutiny/key_pinpointer.dm +++ b/code/game/gamemodes/mutiny/key_pinpointer.dm @@ -14,22 +14,28 @@ active = 1 target = mutiny.captains_key point_at(target) - usr << "\blue You calibrate \the [src] to locate the Captain's Authentication Key." + to_chat(usr, "\blue You calibrate \the [src] to locate the Captain's Authentication Key.") + if (1) mode = 2 target = mutiny.secondary_key - usr << "\blue You calibrate \the [src] to locate the Emergency Secondary Authentication Key." + to_chat(usr, "\blue You calibrate \the [src] to locate the Emergency Secondary Authentication Key.") + else mode = 0 active = 0 icon_state = "pinoff" - usr << "\blue You switch \the [src] off." + to_chat(usr, "\blue You switch \the [src] off.") + /obj/item/weapon/pinpointer/advpinpointer/auth_key/examine(mob/user) switch(mode) if (1) - user << "Is is calibrated for the Captain's Authentication Key." + to_chat(user, "Is is calibrated for the Captain's Authentication Key.") + if (2) - user << "It is calibrated for the Emergency Secondary Authentication Key." + to_chat(user, "It is calibrated for the Emergency Secondary Authentication Key.") + else - user << "It is switched off." + to_chat(user, "It is switched off.") + diff --git a/code/game/gamemodes/mutiny/mutiny.dm b/code/game/gamemodes/mutiny/mutiny.dm index e3edc521f33..4dd0ea1d459 100644 --- a/code/game/gamemodes/mutiny/mutiny.dm +++ b/code/game/gamemodes/mutiny/mutiny.dm @@ -91,7 +91,8 @@ datum/game_mode/mutiny var/list/candidates[0] for(var/T in subtypesof(/datum/directive)) var/datum/directive/D = new T(src) -// world << D.name +// to_chat(world, D.name) + if (D.meets_prerequisites()) candidates+=D return candidates @@ -126,7 +127,8 @@ datum/game_mode/mutiny proc/equip_head(datum/mind/head, faction, proc/recruitment_verb) var/mob/living/carbon/human/H = head.current - H << "You are the Head [capitalize(faction)]!" + to_chat(H, "You are the Head [capitalize(faction)]!") + head.special_role = "head_[faction]" var/slots = get_equipment_slots() @@ -151,8 +153,10 @@ datum/game_mode/mutiny proc/add_faction(datum/mind/M, faction, list/faction_list) if(!can_be_recruited(M, faction)) - M.current << "\red Recruitment canceled; your role has already changed." - head_mutineer.current << "\red Could not recruit [M]. Their role has changed." + to_chat(M.current, "\red Recruitment canceled; your role has already changed.") + + to_chat(head_mutineer.current, "\red Could not recruit [M]. Their role has changed.") + return if(M in loyalists) @@ -165,11 +169,15 @@ datum/game_mode/mutiny faction_list+=M if(faction == "mutineer") - M.current << fluff.mutineer_tag("You have joined the mutineers!") - head_mutineer.current << fluff.mutineer_tag("[M] has joined the mutineers!") + to_chat(M.current, fluff.mutineer_tag("You have joined the mutineers!")) + + to_chat(head_mutineer.current, fluff.mutineer_tag("[M] has joined the mutineers!")) + else - M.current << fluff.loyalist_tag("You have joined the loyalists!") - head_loyalist.current << fluff.loyalist_tag("[M] has joined the loyalists!") + to_chat(M.current, fluff.loyalist_tag("You have joined the loyalists!")) + + to_chat(head_loyalist.current, fluff.loyalist_tag("[M] has joined the loyalists!")) + update_icon(M) @@ -211,23 +219,30 @@ datum/game_mode/mutiny return M.special_role == "loyalist" proc/round_outcome() - world << "

      Breaking News



      " + to_chat(world, "

      Breaking News



      ") + if (was_bloodbath()) - world << fluff.no_victory() + to_chat(world, fluff.no_victory()) + return var/directives_completed = current_directive.directives_complete() var/ead_activated = ead.activated if (directives_completed && ead_activated) - world << fluff.loyalist_major_victory() - else if (directives_completed && !ead_activated) - world << fluff.loyalist_minor_victory() - else if (!directives_completed && ead_activated) - world << fluff.mutineer_minor_victory() - else if (!directives_completed && !ead_activated) - world << fluff.mutineer_major_victory() + to_chat(world, fluff.loyalist_major_victory()) + + else if (directives_completed && !ead_activated) + to_chat(world, fluff.loyalist_minor_victory()) + + else if (!directives_completed && ead_activated) + to_chat(world, fluff.mutineer_minor_victory()) + + else if (!directives_completed && !ead_activated) + to_chat(world, fluff.mutineer_major_victory()) + + + to_chat(world, sound('sound/machines/twobeep.ogg')) - world << sound('sound/machines/twobeep.ogg') proc/update_all_icons() spawn(0) @@ -266,17 +281,20 @@ datum/game_mode/mutiny /datum/game_mode/mutiny/pre_setup() var/list/loyalist_candidates = get_head_loyalist_candidates() if(!loyalist_candidates || loyalist_candidates.len == 0) - world << "\red Mutiny mode aborted: no valid candidates for head loyalist." + to_chat(world, "\red Mutiny mode aborted: no valid candidates for head loyalist.") + return 0 var/list/mutineer_candidates = get_head_mutineer_candidates() if(!mutineer_candidates || mutineer_candidates.len == 0) - world << "\red Mutiny mode aborted: no valid candidates for head mutineer." + to_chat(world, "\red Mutiny mode aborted: no valid candidates for head mutineer.") + return 0 var/list/directive_candidates = get_directive_candidates() if(!directive_candidates || directive_candidates.len == 0) - world << "\red Mutiny mode aborted: no valid candidates for Directive X." + to_chat(world, "\red Mutiny mode aborted: no valid candidates for Directive X.") + return 0 head_loyalist = pick(loyalist_candidates) @@ -316,11 +334,13 @@ datum/game_mode/mutiny candidates += P if(!candidates.len) - src << "\red You aren't close enough to anybody that can be recruited." + to_chat(src, "\red You aren't close enough to anybody that can be recruited.") + return if(world.time < mode.recruit_loyalist_cooldown) - src << "\red Wait [MUTINY_RECRUITMENT_COOLDOWN] seconds before recruiting again." + to_chat(src, "\red Wait [MUTINY_RECRUITMENT_COOLDOWN] seconds before recruiting again.") + return mode.recruit_loyalist_cooldown = world.time + (MUTINY_RECRUITMENT_COOLDOWN SECONDS) @@ -328,7 +348,8 @@ datum/game_mode/mutiny var/mob/living/carbon/human/M = input("Select a person to recruit", "Loyalist recruitment", null) as mob in candidates if (M) - src << "Attempting to recruit [M]..." + to_chat(src, "Attempting to recruit [M]...") + log_admin("[key_name(src)] attempted to recruit [M] as a loyalist.") message_admins("\red [key_name_admin(src)] attempted to recruit [M] as a loyalist.") @@ -336,8 +357,10 @@ datum/game_mode/mutiny if(choice == "Yes") mode.add_loyalist(M.mind) else if(choice == "No") - M << "\red You declined to join the loyalists." - mode.head_loyalist.current << "\red [M] declined to support the loyalists." + to_chat(M, "\red You declined to join the loyalists.") + + to_chat(mode.head_loyalist.current, "\red [M] declined to support the loyalists.") + /mob/living/carbon/human/proc/recruit_mutineer() set name = "Recruit Mutineer" @@ -353,11 +376,13 @@ datum/game_mode/mutiny candidates += P if(!candidates.len) - src << "\red You aren't close enough to anybody that can be recruited." + to_chat(src, "\red You aren't close enough to anybody that can be recruited.") + return if(world.time < mode.recruit_mutineer_cooldown) - src << "\red Wait [MUTINY_RECRUITMENT_COOLDOWN] seconds before recruiting again." + to_chat(src, "\red Wait [MUTINY_RECRUITMENT_COOLDOWN] seconds before recruiting again.") + return mode.recruit_mutineer_cooldown = world.time + (MUTINY_RECRUITMENT_COOLDOWN SECONDS) @@ -365,7 +390,8 @@ datum/game_mode/mutiny var/mob/living/carbon/human/M = input("Select a person to recruit", "Mutineer recruitment", null) as mob in candidates if (M) - src << "Attempting to recruit [M]..." + to_chat(src, "Attempting to recruit [M]...") + log_admin("[key_name(src)] attempted to recruit [M] as a mutineer.") message_admins("\red [key_name_admin(src)] attempted to recruit [M] as a mutineer.") @@ -373,8 +399,10 @@ datum/game_mode/mutiny if(choice == "Yes") mode.add_mutineer(M.mind) else if(choice == "No") - M << "\red You declined to join the mutineers." - mode.head_mutineer.current << "\red [M] declined to support the mutineers." + to_chat(M, "\red You declined to join the mutineers.") + + to_chat(mode.head_mutineer.current, "\red [M] declined to support the mutineers.") + /proc/get_mutiny_mode() if(!ticker || !istype(ticker.mode, /datum/game_mode/mutiny)) diff --git a/code/game/gamemodes/mutiny/mutiny_fluff.dm b/code/game/gamemodes/mutiny/mutiny_fluff.dm index f25e9978e33..66ee7cf2673 100644 --- a/code/game/gamemodes/mutiny/mutiny_fluff.dm +++ b/code/game/gamemodes/mutiny/mutiny_fluff.dm @@ -72,8 +72,9 @@ They don't care about us they only care about WEALTH and POWER... Share this mes Be safe, friend.\" (Unable to Reply)

      "} proc/announce() - world << "The current game mode is - Mutiny!" - world << {" + to_chat(world, "The current game mode is - Mutiny!") + + to_chat(world, {"

      The crew will be divided by their sense of ethics when a morally turbulent emergency directive arrives with an incomplete command validation code.

      The [loyalist_tag("Head Loyalist")] is the Captain, who carries the [loyalist_tag("Captain's Authentication Key")] at all times.
      The [mutineer_tag("Head Mutineer")] is a random Head of Staff who carries the [mutineer_tag("Emergency Secondary Authentication Key")].

      @@ -82,8 +83,7 @@ Both keys are required to activate the Emergency Authentication Device (EAD)<

      Loyalists - Follow the Head Loyalist in carrying out [loyalist_tag("Nanotrasen's directives")] then activate the EAD.
      Mutineers - Prevent the completion of the [mutineer_tag("improperly validated directives")] and the activation of the EAD. -

      - "} +

      "}) proc/loyalist_tag(text) return "[text]" diff --git a/code/game/gamemodes/nations/nations.dm b/code/game/gamemodes/nations/nations.dm index 85e38cb8ed9..c9adb948a7c 100644 --- a/code/game/gamemodes/nations/nations.dm +++ b/code/game/gamemodes/nations/nations.dm @@ -18,7 +18,8 @@ datum/game_mode/nations // remove_access() for(var/mob/M in player_list) if(!istype(M,/mob/new_player)) - M << sound('sound/effects/purge_siren.ogg') + to_chat(M, sound('sound/effects/purge_siren.ogg')) + return ..() @@ -42,9 +43,11 @@ datum/game_mode/nations H.mind.nation.membership += H.mind.current if(H.mind.assigned_role == H.mind.nation.default_leader) H.mind.nation.current_leader = H.mind.current - H << "You have been chosen to lead the nation of [H.mind.nation.default_name]!" + to_chat(H, "You have been chosen to lead the nation of [H.mind.nation.default_name]!") + continue - H << "You are now part of the great sovereign nation of [H.mind.nation.default_name]!" + to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.default_name]!") + continue if(H.mind.assigned_role in medical_positions) @@ -53,9 +56,11 @@ datum/game_mode/nations H.mind.nation.membership += H.mind.current if(H.mind.assigned_role == H.mind.nation.default_leader) H.mind.nation.current_leader = H.mind.current - H << "You have been chosen to lead the nation of [H.mind.nation.default_name]!" + to_chat(H, "You have been chosen to lead the nation of [H.mind.nation.default_name]!") + continue - H << "You are now part of the great sovereign nation of [H.mind.nation.default_name]!" + to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.default_name]!") + continue if(H.mind.assigned_role in science_positions) @@ -64,9 +69,11 @@ datum/game_mode/nations H.mind.nation.membership += H.mind.current if(H.mind.assigned_role == H.mind.nation.default_leader) H.mind.nation.current_leader = H.mind.current - H << "You have been chosen to lead the nation of [H.mind.nation.default_name]!" + to_chat(H, "You have been chosen to lead the nation of [H.mind.nation.default_name]!") + continue - H << "You are now part of the great sovereign nation of [H.mind.nation.default_name]!" + to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.default_name]!") + continue if(H.mind.assigned_role in security_positions) @@ -75,9 +82,11 @@ datum/game_mode/nations H.mind.nation.membership += H.mind.current if(H.mind.assigned_role == H.mind.nation.default_leader) H.mind.nation.current_leader = H.mind.current - H << "You have been chosen to lead the nation of [H.mind.nation.default_name]!" + to_chat(H, "You have been chosen to lead the nation of [H.mind.nation.default_name]!") + continue - H << "You are now part of the great sovereign nation of [H.mind.nation.default_name]!" + to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.default_name]!") + continue if(H.mind.assigned_role in cargonians) @@ -86,9 +95,11 @@ datum/game_mode/nations H.mind.nation.membership += H.mind.current if(H.mind.assigned_role == H.mind.nation.default_leader) H.mind.nation.current_leader = H.mind.current - H << "You have been chosen to lead the nation of [H.mind.nation.default_name]!" + to_chat(H, "You have been chosen to lead the nation of [H.mind.nation.default_name]!") + continue - H << "You are now part of the great sovereign nation of [H.mind.nation.default_name]!" + to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.default_name]!") + continue if(H.mind.assigned_role in servicion) @@ -97,9 +108,11 @@ datum/game_mode/nations H.mind.nation.membership += H.mind.current if(H.mind.assigned_role == H.mind.nation.default_leader) H.mind.nation.current_leader = H.mind.current - H << "You have been chosen to lead the nation of [H.mind.nation.default_name]!" + to_chat(H, "You have been chosen to lead the nation of [H.mind.nation.default_name]!") + continue - H << "You are now part of the great sovereign nation of [H.mind.nation.default_name]!" + to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.default_name]!") + continue if(H.mind.assigned_role in (support_positions + command_positions)) @@ -108,13 +121,16 @@ datum/game_mode/nations H.mind.nation.membership += H.mind.current if(H.mind.assigned_role == H.mind.nation.default_leader) H.mind.nation.current_leader = H.mind.current - H << "You have been chosen to lead the nation of [H.mind.nation.default_name]!" + to_chat(H, "You have been chosen to lead the nation of [H.mind.nation.default_name]!") + continue - H << "You are now part of the great sovereign nation of [H.mind.nation.default_name]!" + to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.default_name]!") + continue if(H.mind.assigned_role in civilian_positions) - H << "You do not belong to any nation and are free to sell your services to the highest bidder." + to_chat(H, "You do not belong to any nation and are free to sell your services to the highest bidder.") + continue else @@ -153,7 +169,8 @@ datum/game_mode/nations N.current_name = N.default_name if(!N.current_leader && N.membership.len) N.current_leader = pick(N.membership) - N.current_leader << "You have been chosen to lead the nation of [N.current_name]!" + to_chat(N.current_leader, "You have been chosen to lead the nation of [N.current_name]!") + if(N.current_leader) var/mob/living/carbon/human/H = N.current_leader H.verbs += /mob/living/carbon/human/proc/set_nation_name @@ -177,53 +194,61 @@ datum/game_mode/nations H.mind.nation = all_nations["Atmosia"] mode.update_nations_icons_added(H,"atmosia") H.mind.nation.membership += H.mind.current - H << "You are now part of the great sovereign nation of [H.mind.nation.current_name]!" + to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.current_name]!") + return 1 if(H.mind.assigned_role in medical_positions) H.mind.nation = all_nations["Medistan"] mode.update_nations_icons_added(H,"hudmedistan") H.mind.nation.membership += H.mind.current - H << "You are now part of the great sovereign nation of [H.mind.nation.current_name]!" + to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.current_name]!") + return 1 if(H.mind.assigned_role in science_positions) H.mind.nation = all_nations["Scientopia"] mode.update_nations_icons_added(H,"hudscientopia") H.mind.nation.membership += H.mind.current - H << "You are now part of the great sovereign nation of [H.mind.nation.current_name]!" + to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.current_name]!") + return 1 if(H.mind.assigned_role in security_positions) H.mind.nation = all_nations["Brigston"] mode.update_nations_icons_added(H,"hudbrigston") H.mind.nation.membership += H.mind.current - H << "You are now part of the great sovereign nation of [H.mind.nation.current_name]!" + to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.current_name]!") + return 1 if(H.mind.assigned_role in mode.cargonians) H.mind.nation = all_nations["Cargonia"] mode.update_nations_icons_added(H,"hudcargonia") H.mind.nation.membership += H.mind.current - H << "You are now part of the great sovereign nation of [H.mind.nation.current_name]!" + to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.current_name]!") + return 1 if(H.mind.assigned_role in mode.servicion) H.mind.nation = all_nations["Servicion"] mode.update_nations_icons_added(H,"hudservice") H.mind.nation.membership += H.mind.current - H << "You are now part of the great sovereign nation of [H.mind.nation.current_name]!" + to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.current_name]!") + return 1 if(H.mind.assigned_role in (support_positions + command_positions)) H.mind.nation = all_nations["People's Republic of Commandzakstan"] mode.update_nations_icons_added(H,"hudcommand") H.mind.nation.membership += H.mind.current - H << "You are now part of the great sovereign nation of [H.mind.nation.current_name]!" + to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.current_name]!") + return 1 if(H.mind.assigned_role in civilian_positions) - H << "You do not belong to any nation and are free to sell your services to the highest bidder." + to_chat(H, "You do not belong to any nation and are free to sell your services to the highest bidder.") + return 1 if(H.mind.assigned_role == "AI") diff --git a/code/game/gamemodes/nations/nationsprocs.dm b/code/game/gamemodes/nations/nationsprocs.dm index 66cd66cab3b..59ade854fd6 100644 --- a/code/game/gamemodes/nations/nationsprocs.dm +++ b/code/game/gamemodes/nations/nationsprocs.dm @@ -16,7 +16,8 @@ if(input) H.mind.nation.current_name = input H.mind.nation.update_nation_id() - H << "You rename your nation to [input]." + to_chat(H, "You rename your nation to [input].") + H.verbs -= /mob/living/carbon/human/proc/set_nation_name return 1 @@ -44,7 +45,8 @@ if(type == "Member") H.mind.nation.member_rank = input H.mind.nation.update_nation_id() - H << "You changed the [type] rank of your nation to [input]." + to_chat(H, "You changed the [type] rank of your nation to [input].") + return 1 /mob/living/carbon/human/proc/choose_heir() @@ -64,13 +66,16 @@ if(heir) if(H.mind.nation.heir) var/mob/living/carbon/human/oldheir = H.mind.nation.heir - oldheir << "You are no longer the heir to your nation!" + to_chat(oldheir, "You are no longer the heir to your nation!") + oldheir.verbs -= /mob/living/carbon/human/proc/takeover var/mob/living/carbon/human/newheir = heir H.mind.nation.heir = newheir newheir.verbs += /mob/living/carbon/human/proc/takeover - newheir << "You have been selected to be the heir to your nation's leadership!" - H << "You have selected [heir] to be your heir!" + to_chat(newheir, "You have been selected to be the heir to your nation's leadership!") + + to_chat(H, "You have selected [heir] to be your heir!") + H.mind.nation.update_nation_id() @@ -90,7 +95,8 @@ var/confirmation = input(H, "Are you sure you want to take over leadership?", "Become Leader", "") as null|anything in list("Yes", "No") if(confirmation == "Yes") var/mob/living/carbon/human/oldleader = H.mind.nation.current_leader - oldleader << "You have been replaced by [H.name] as the leader of [H.mind.nation.current_name]!" + to_chat(oldleader, "You have been replaced by [H.name] as the leader of [H.mind.nation.current_name]!") + oldleader.verbs -= /mob/living/carbon/human/proc/set_nation_name oldleader.verbs -= /mob/living/carbon/human/proc/set_ranks oldleader.verbs -= /mob/living/carbon/human/proc/choose_heir @@ -100,7 +106,8 @@ H.verbs += /mob/living/carbon/human/proc/set_nation_name H.verbs += /mob/living/carbon/human/proc/set_ranks H.verbs += /mob/living/carbon/human/proc/choose_heir - H << "You have replaced [oldleader.name] as the leader of [H.mind.nation.current_name]!" + to_chat(H, "You have replaced [oldleader.name] as the leader of [H.mind.nation.current_name]!") + H.mind.nation.update_nation_id() diff --git a/code/game/gamemodes/newobjective.dm b/code/game/gamemodes/newobjective.dm index 9b823509edd..5171ec08c51 100644 --- a/code/game/gamemodes/newobjective.dm +++ b/code/game/gamemodes/newobjective.dm @@ -176,7 +176,8 @@ if(!killobjectives.len) continue var/datum/objective/assassinate/objective = pickweight(killobjectives) - world << objective + to_chat(world, objective) + for(1 to 10) if(objective.points + total_weight <= 100 || !killobjectives.len) break diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index dff34374cb0..0704b9c9a17 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -23,9 +23,12 @@ proc/issyndicate(mob/living/M as mob) /datum/game_mode/nuclear/announce() - world << "The current game mode is - Nuclear Emergency!" - world << "A [syndicate_name()] Strike Force is approaching [station_name()]!" - world << "A nuclear explosive was being transported by Nanotrasen to a military base. The transport ship mysteriously lost contact with Space Traffic Control (STC). About that time a strange disk was discovered around [station_name()]. It was identified by Nanotrasen as a nuclear authentication disk and now Syndicate Operatives have arrived to retake the disk and detonate SS13! There are most likely Syndicate starships are in the vicinity, so take care not to lose the disk!\nSyndicate: Reclaim the disk and detonate the nuclear bomb anywhere on SS13.\nPersonnel: Hold the disk and escape with the disk on the shuttle!" + to_chat(world, "The current game mode is - Nuclear Emergency!") + + to_chat(world, "A [syndicate_name()] Strike Force is approaching [station_name()]!") + + to_chat(world, "A nuclear explosive was being transported by Nanotrasen to a military base. The transport ship mysteriously lost contact with Space Traffic Control (STC). About that time a strange disk was discovered around [station_name()]. It was identified by Nanotrasen as a nuclear authentication disk and now Syndicate Operatives have arrived to retake the disk and detonate SS13! There are most likely Syndicate starships are in the vicinity, so take care not to lose the disk!\nSyndicate: Reclaim the disk and detonate the nuclear bomb anywhere on SS13.\nPersonnel: Hold the disk and escape with the disk on the shuttle!") + /datum/game_mode/nuclear/can_start()//This could be better, will likely have to recode it later if(!..()) @@ -171,9 +174,12 @@ proc/issyndicate(mob/living/M as mob) NukeNameAssign(nukelastname(synd_mind.current),syndicates) //allows time for the rest of the syndies to be chosen */ synd_mind.current.real_name = "[syndicate_name()] Team [leader_title]" - synd_mind.current << "You are the Syndicate leader for this mission. You are responsible for the distribution of telecrystals and your ID is the only one who can open the launch bay doors." - synd_mind.current << "If you feel you are not up to this task, give your ID to another operative." - synd_mind.current << "In your hand you will find a special item capable of triggering a greater challenge for your team. Examine it carefully and consult with your fellow operatives before activating it." + to_chat(synd_mind.current, "You are the Syndicate leader for this mission. You are responsible for the distribution of telecrystals and your ID is the only one who can open the launch bay doors.") + + to_chat(synd_mind.current, "If you feel you are not up to this task, give your ID to another operative.") + + to_chat(synd_mind.current, "In your hand you will find a special item capable of triggering a greater challenge for your team. Examine it carefully and consult with your fellow operatives before activating it.") + var/obj/item/device/nuclear_challenge/challenge = new /obj/item/device/nuclear_challenge synd_mind.current.equip_to_slot_or_del(challenge, slot_r_hand) @@ -190,7 +196,8 @@ proc/issyndicate(mob/living/M as mob) if (nuke_code) synd_mind.store_memory("Syndicate Nuclear Bomb Code: [nuke_code]", 0, 0) - synd_mind.current << "The nuclear authorization code is: [nuke_code]" + to_chat(synd_mind.current, "The nuclear authorization code is: [nuke_code]") + var/obj/item/weapon/paper/P = new P.info = "The nuclear authorization code is: [nuke_code]" P.name = "nuclear bomb code" @@ -219,10 +226,12 @@ proc/issyndicate(mob/living/M as mob) /datum/game_mode/proc/greet_syndicate(var/datum/mind/syndicate, var/you_are=1) if (you_are) - syndicate.current << "\blue You are a [syndicate_name()] agent!" + to_chat(syndicate.current, "\blue You are a [syndicate_name()] agent!") + var/obj_count = 1 for(var/datum/objective/objective in syndicate.objectives) - syndicate.current << "Objective #[obj_count]: [objective.explanation_text]" + to_chat(syndicate.current, "Objective #[obj_count]: [objective.explanation_text]") + obj_count++ return @@ -315,48 +324,66 @@ proc/issyndicate(mob/living/M as mob) if (!disk_rescued && station_was_nuked && !syndies_didnt_escape) feedback_set_details("round_end_result","win - syndicate nuke") - world << "Syndicate Major Victory!" - world << "[syndicate_name()] operatives have destroyed [station_name()]!" + to_chat(world, "Syndicate Major Victory!") + + to_chat(world, "[syndicate_name()] operatives have destroyed [station_name()]!") + else if (!disk_rescued && station_was_nuked && syndies_didnt_escape) feedback_set_details("round_end_result","halfwin - syndicate nuke - did not evacuate in time") - world << "Total Annihilation" - world << "[syndicate_name()] operatives destroyed [station_name()] but did not leave the area in time and got caught in the explosion. Next time, don't lose the disk!" + to_chat(world, "Total Annihilation") + + to_chat(world, "[syndicate_name()] operatives destroyed [station_name()] but did not leave the area in time and got caught in the explosion. Next time, don't lose the disk!") + else if (!disk_rescued && !station_was_nuked && nuke_off_station && !syndies_didnt_escape) feedback_set_details("round_end_result","halfwin - blew wrong station") - world << "Crew Minor Victory" - world << "[syndicate_name()] operatives secured the authentication disk but blew up something that wasn't [station_name()]. Next time, don't lose the disk!" + to_chat(world, "Crew Minor Victory") + + to_chat(world, "[syndicate_name()] operatives secured the authentication disk but blew up something that wasn't [station_name()]. Next time, don't lose the disk!") + else if (!disk_rescued && !station_was_nuked && nuke_off_station && syndies_didnt_escape) feedback_set_details("round_end_result","halfwin - blew wrong station - did not evacuate in time") - world << "[syndicate_name()] operatives have earned Darwin Award!" - world << "[syndicate_name()] operatives blew up something that wasn't [station_name()] and got caught in the explosion. Next time, don't lose the disk!" + to_chat(world, "[syndicate_name()] operatives have earned Darwin Award!") + + to_chat(world, "[syndicate_name()] operatives blew up something that wasn't [station_name()] and got caught in the explosion. Next time, don't lose the disk!") + else if ( disk_rescued && is_operatives_are_dead()) feedback_set_details("round_end_result","loss - evacuation - disk secured - syndi team dead") - world << "Crew Major Victory!" - world << "The Research Staff has saved the disc and killed the [syndicate_name()] Operatives" + to_chat(world, "Crew Major Victory!") + + to_chat(world, "The Research Staff has saved the disc and killed the [syndicate_name()] Operatives") + else if ( disk_rescued ) feedback_set_details("round_end_result","loss - evacuation - disk secured") - world << "Crew Major Victory" - world << "The Research Staff has saved the disc and stopped the [syndicate_name()] Operatives!" + to_chat(world, "Crew Major Victory") + + to_chat(world, "The Research Staff has saved the disc and stopped the [syndicate_name()] Operatives!") + else if (!disk_rescued && is_operatives_are_dead()) feedback_set_details("round_end_result","loss - evacuation - disk not secured") - world << "Syndicate Minor Victory!" - world << "The Research Staff failed to secure the authentication disk but did manage to kill most of the [syndicate_name()] Operatives!" + to_chat(world, "Syndicate Minor Victory!") + + to_chat(world, "The Research Staff failed to secure the authentication disk but did manage to kill most of the [syndicate_name()] Operatives!") + else if (!disk_rescued && crew_evacuated) feedback_set_details("round_end_result","halfwin - detonation averted") - world << "Syndicate Minor Victory!" - world << "[syndicate_name()] operatives recovered the abandoned authentication disk but detonation of [station_name()] was averted. Next time, don't lose the disk!" + to_chat(world, "Syndicate Minor Victory!") + + to_chat(world, "[syndicate_name()] operatives recovered the abandoned authentication disk but detonation of [station_name()] was averted. Next time, don't lose the disk!") + else if (!disk_rescued && !crew_evacuated) feedback_set_details("round_end_result","halfwin - interrupted") - world << "Neutral Victory" - world << "Round was mysteriously interrupted!" + to_chat(world, "Neutral Victory") + + to_chat(world, "Round was mysteriously interrupted!") + ..() return @@ -394,7 +421,8 @@ proc/issyndicate(mob/living/M as mob) if(TC_uses==0 && station_was_nuked && !is_operatives_are_dead()) text += "" - world << text + to_chat(world, text) + return 1 /proc/nukelastname(var/mob/M as mob) //--All praise goes to NEO|Phyte, all blame goes to DH, and it was Cindi-Kate's idea. Also praise Urist for copypasta ho. @@ -406,7 +434,8 @@ proc/issyndicate(mob/living/M as mob) else if (newname == "Unknown" || newname == "floor" || newname == "wall" || newname == "rwall" || newname == "_") - M << "That name is reserved." + to_chat(M, "That name is reserved.") + return nukelastname(M) return newname diff --git a/code/game/gamemodes/nuclear/nuclear_challenge.dm b/code/game/gamemodes/nuclear/nuclear_challenge.dm index 621f159eced..d8e252d97c8 100644 --- a/code/game/gamemodes/nuclear/nuclear_challenge.dm +++ b/code/game/gamemodes/nuclear/nuclear_challenge.dm @@ -17,26 +17,31 @@ if(declaring_war) return if(player_list.len < MIN_CHALLENGE_PLAYERS) - user << "The enemy crew is too small to be worth declaring war on." + to_chat(user, "The enemy crew is too small to be worth declaring war on.") + return if(user.z != ZLEVEL_CENTCOMM) - user << "You have to be at your base to use this." + to_chat(user, "You have to be at your base to use this.") + return if(world.time > CHALLENGE_TIME_LIMIT) - user << "It's too late to declare hostilities. Your benefactors are already busy with other schemes. You'll have to make do with what you have on hand." + to_chat(user, "It's too late to declare hostilities. Your benefactors are already busy with other schemes. You'll have to make do with what you have on hand.") + return declaring_war = 1 var/are_you_sure = alert(user, "Consult your team carefully before you declare war on [station_name()]]. Are you sure you want to alert the enemy crew?", "Declare war?", "Yes", "No") if(are_you_sure == "No") - user << "On second thought, the element of surprise isn't so bad after all." + to_chat(user, "On second thought, the element of surprise isn't so bad after all.") + declaring_war = 0 return var/war_declaration = "[user.real_name] has declared his intent to utterly destroy [station_name()] with a nuclear device, and dares the crew to try and stop them." command_announcement.Announce(war_declaration, "Declaration of War", 'sound/effects/siren.ogg') - user << "You've attracted the attention of powerful forces within the syndicate. A bonus bundle of telecrystals has been granted to your team. Great things await you if you complete the mission." + to_chat(user, "You've attracted the attention of powerful forces within the syndicate. A bonus bundle of telecrystals has been granted to your team. Great things await you if you complete the mission.") + for(var/obj/machinery/computer/shuttle/syndicate/S in machines) S.challenge = TRUE diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index 88ca765ad15..b580622504f 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -55,20 +55,24 @@ var/bomb_set if (panel_open == 0) panel_open = 1 overlays += image(icon, "npanel_open") - user << "You unscrew the control panel of [src]." + to_chat(user, "You unscrew the control panel of [src].") + playsound(src, 'sound/items/Screwdriver.ogg', 50, 1) else panel_open = 0 overlays -= image(icon, "npanel_open") - user << "You screw the control panel of [src] back on." + to_chat(user, "You screw the control panel of [src] back on.") + playsound(src, 'sound/items/Screwdriver.ogg', 50, 1) else if (panel_open == 0) - user << "[src] emits a buzzing noise, the panel staying locked in." + to_chat(user, "[src] emits a buzzing noise, the panel staying locked in.") + if (panel_open == 1) panel_open = 0 overlays -= image(icon, "npanel_open") - user << "You screw the control panel of [src] back on." + to_chat(user, "You screw the control panel of [src] back on.") + playsound(src, 'sound/items/Screwdriver.ogg', 50, 1) flick("nuclearbombc", src) return @@ -91,7 +95,8 @@ var/bomb_set var/obj/item/weapon/weldingtool/WT = O if(!WT.isOn()) return if (WT.get_fuel() < 5) // uses up 5 fuel. - user << "\red You need more fuel to complete this task." + to_chat(user, "\red You need more fuel to complete this task.") + return user.visible_message("[user] starts cutting loose the anchoring bolt covers on [src].", "You start cutting loose the anchoring bolt covers with [O]...") @@ -118,7 +123,8 @@ var/bomb_set var/obj/item/weapon/weldingtool/WT = O if(!WT.isOn()) return if (WT.get_fuel() < 5) // uses up 5 fuel. - user << "\red You need more fuel to complete this task." + to_chat(user, "\red You need more fuel to complete this task.") + return user.visible_message("[user] starts cutting apart the anchoring system sealant on [src].", "You start cutting apart the anchoring system's sealant with [O]...") @@ -217,10 +223,12 @@ var/bomb_set return if (deployable) - usr << "\red You close several panels to make [src] undeployable." + to_chat(usr, "\red You close several panels to make [src] undeployable.") + deployable = 0 else - usr << "\red You adjust some panels to make [src] deployable." + to_chat(usr, "\red You adjust some panels to make [src] deployable.") + deployable = 1 return @@ -279,7 +287,8 @@ var/bomb_set nanomanager.update_uis(src) return if (safety) - usr << "\red The safety is still on." + to_chat(usr, "\red The safety is still on.") + nanomanager.update_uis(src) return timing = !(timing) @@ -320,7 +329,8 @@ var/bomb_set else visible_message("\red The anchoring bolts slide back into the depths of [src].") else - usr << "There is nothing to anchor to!" + to_chat(usr, "There is nothing to anchor to!") + nanomanager.update_uis(src) @@ -371,11 +381,14 @@ var/bomb_set if(ticker.mode.name == "nuclear emergency") ticker.mode:nukes_left -- else if(off_station == 1) - world << "A nuclear device was set off, but the explosion was out of reach of the station!" + to_chat(world, "A nuclear device was set off, but the explosion was out of reach of the station!") + else if(off_station == 2) - world << "A nuclear device was set off, but the device was not on the station!" + to_chat(world, "A nuclear device was set off, but the device was not on the station!") + else - world << "The station was destoyed by the nuclear blast!" + to_chat(world, "The station was destoyed by the nuclear blast!") + ticker.mode.station_was_nuked = (off_station<2) //offstation==1 is a draw. the station becomes irradiated and needs to be evacuated. //kinda shit but I couldn't get permission to do what I wanted to do. @@ -402,7 +415,8 @@ var/bomb_set /obj/item/weapon/disk/nuclear/process() var/turf/disk_loc = get_turf(src) if(disk_loc.z != ZLEVEL_STATION && disk_loc.z != ZLEVEL_CENTCOMM) - get(src, /mob) << "You can't help but feel that you just lost something back there..." + to_chat(get(src, /mob), "You can't help but feel that you just lost something back there...") + qdel(src) /obj/item/weapon/disk/nuclear/Destroy() diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm index 2ad022adf55..170c0aac8e9 100644 --- a/code/game/gamemodes/nuclear/pinpointer.dm +++ b/code/game/gamemodes/nuclear/pinpointer.dm @@ -21,11 +21,13 @@ if(!active) active = 1 workdisk() - usr << "You activate the pinpointer." + to_chat(usr, "You activate the pinpointer.") + else active = 0 icon_state = "pinoff" - usr << "You deactivate the pinpointer." + to_chat(usr, "You deactivate the pinpointer.") + /obj/item/weapon/pinpointer/proc/scandisk() if(!the_disk) @@ -68,7 +70,8 @@ ..(user) for(var/obj/machinery/nuclearbomb/bomb in machines) if(bomb.timing) - user << "Extreme danger. Arming signal detected. Time remaining: [bomb.timeleft]" + to_chat(user, "Extreme danger. Arming signal detected. Time remaining: [bomb.timeleft]") + /obj/item/weapon/pinpointer/advpinpointer name = "advanced pinpointer" @@ -86,11 +89,13 @@ point_at(location) if(mode == 2) point_at(target) - usr << "You activate the pinpointer." + to_chat(usr, "You activate the pinpointer.") + else active = 0 icon_state = "pinoff" - usr << "You deactivate the pinpointer." + to_chat(usr, "You deactivate the pinpointer.") + /obj/item/weapon/pinpointer/advpinpointer/workdisk() if(mode == 0) @@ -127,7 +132,8 @@ location = locate(locationx,locationy,Z.z) - usr << "You set the pinpointer to locate [locationx],[locationy]" + to_chat(usr, "You set the pinpointer to locate [locationx],[locationy]") + return attack_self() @@ -152,9 +158,11 @@ return target = locate(item_paths[targetitem]) if(!target) - usr << "Failed to locate [targetitem]!" + to_chat(usr, "Failed to locate [targetitem]!") + return - usr << "You set the pinpointer to locate [targetitem]." + to_chat(usr, "You set the pinpointer to locate [targetitem].") + if("DNA") var/DNAstring = input("Input DNA string to search for." , "Please Enter String." , "") if(!DNAstring) @@ -181,14 +189,17 @@ active = 1 if(!mode) workdisk() - user << "Authentication Disk Locator active." + to_chat(user, "Authentication Disk Locator active.") + else worklocation() - user << "Shuttle Locator active." + to_chat(user, "Shuttle Locator active.") + else active = 0 icon_state = "pinoff" - user << "You deactivate the pinpointer." + to_chat(user, "You deactivate the pinpointer.") + /obj/item/weapon/pinpointer/nukeop/workdisk() if(!active) return @@ -259,16 +270,19 @@ /obj/item/weapon/pinpointer/operative/attack_self() if(!usr.mind || !(usr.mind in ticker.mode.syndicates)) - usr << "AUTHENTICATION FAILURE. ACCESS DENIED." + to_chat(usr, "AUTHENTICATION FAILURE. ACCESS DENIED.") + return 0 if(!active) active = 1 workop() - usr << "You activate the pinpointer." + to_chat(usr, "You activate the pinpointer.") + else active = 0 icon_state = "pinoff" - usr << "You deactivate the pinpointer." + to_chat(usr, "You deactivate the pinpointer.") + /obj/item/weapon/pinpointer/operative/proc/scan_for_ops() if(active) @@ -292,6 +306,8 @@ ..() if(active) if(nearest_op) - user << "Nearest operative detected is [nearest_op.real_name]." + to_chat(user, "Nearest operative detected is [nearest_op.real_name].") + else - user << "No operatives detected within scanning range." + to_chat(user, "No operatives detected within scanning range.") + diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 8dd5bb0691d..41edd787514 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -33,8 +33,10 @@ //Announces the game type// /////////////////////////// /datum/game_mode/revolution/announce() - world << "The current game mode is - Revolution!" - world << "Some crewmembers are attempting to start a revolution!
      \nRevolutionaries - Kill the Captain, HoP, HoS, CE, RD and CMO. Convert other crewmembers (excluding the heads of staff, and security officers) to your cause by flashing them. Protect your leaders.
      \nPersonnel - Protect the heads of staff. Kill the leaders of the revolution, and brainwash the other revolutionaries (by beating them in the head).
      " + to_chat(world, "The current game mode is - Revolution!") + + to_chat(world, "Some crewmembers are attempting to start a revolution!
      \nRevolutionaries - Kill the Captain, HoP, HoS, CE, RD and CMO. Convert other crewmembers (excluding the heads of staff, and security officers) to your cause by flashing them. Protect your leaders.
      \nPersonnel - Protect the heads of staff. Kill the leaders of the revolution, and brainwash the other revolutionaries (by beating them in the head).
      ") + /////////////////////////////////////////////////////////////////////////////// @@ -126,7 +128,8 @@ rev_obj.target = head_mind rev_obj.explanation_text = "Assassinate [head_mind.name], the [head_mind.assigned_role]." rev_mind.objectives += rev_obj - rev_mind.current << "Additional Objective: Assassinate [head_mind.name], the [head_mind.assigned_role]." + to_chat(rev_mind.current, "Additional Objective: Assassinate [head_mind.name], the [head_mind.assigned_role].") + for(var/datum/mind/rev_mind in mode.revolutionaries) for(var/datum/mind/head_mind in heads) @@ -135,7 +138,8 @@ rev_obj.target = head_mind rev_obj.explanation_text = "Assassinate [head_mind.name], the [head_mind.assigned_role]." rev_mind.objectives += rev_obj - rev_mind.current << "Additional Objective: Assassinate [head_mind.name], the [head_mind.assigned_role]." + to_chat(rev_mind.current, "Additional Objective: Assassinate [head_mind.name], the [head_mind.assigned_role].") + /datum/game_mode/proc/forge_revolutionary_objectives(var/datum/mind/rev_mind) @@ -153,9 +157,11 @@ /datum/game_mode/proc/greet_revolutionary(var/datum/mind/rev_mind, var/you_are=1) var/obj_count = 1 if (you_are) - rev_mind.current << "\blue You are a member of the revolutionaries' leadership!" + to_chat(rev_mind.current, "\blue You are a member of the revolutionaries' leadership!") + for(var/datum/objective/objective in rev_mind.objectives) - rev_mind.current << "Objective #[obj_count]: [objective.explanation_text]" + to_chat(rev_mind.current, "Objective #[obj_count]: [objective.explanation_text]") + rev_mind.special_role = "Head Revolutionary" obj_count++ @@ -168,7 +174,8 @@ if (mob.mind) if (mob.mind.assigned_role == "Clown") - mob << "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself." + to_chat(mob, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.") + mob.mutations.Remove(CLUMSY) @@ -183,9 +190,11 @@ ) var/where = mob.equip_in_one_of_slots(T, slots) if (!where) - mob << "The Syndicate were unfortunately unable to get you a flash." + to_chat(mob, "The Syndicate were unfortunately unable to get you a flash.") + else - mob << "The flash in your [where] will help you to persuade the crew to join your cause." + to_chat(mob, "The flash in your [where] will help you to persuade the crew to join your cause.") + mob.update_icons() return 1 @@ -222,7 +231,8 @@ if((rev_mind in revolutionaries) || (rev_mind in head_revolutionaries)) return 0 revolutionaries += rev_mind - rev_mind.current << "\red You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution!" + to_chat(rev_mind.current, "\red You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution!") + rev_mind.special_role = "Revolutionary" update_rev_icons_added(rev_mind) if(jobban_isbanned(rev_mind.current, ROLE_REV)) @@ -237,18 +247,22 @@ rev_mind.special_role = null if(beingborged) - rev_mind.current << "\red The frame's firmware detects and deletes your neural reprogramming! You remember nothing from the moment you were flashed until now." + to_chat(rev_mind.current, "\red The frame's firmware detects and deletes your neural reprogramming! You remember nothing from the moment you were flashed until now.") + message_admins("[key_name_admin(rev_mind.current)] has been borged while being a member of the revolution.") else - rev_mind.current << "\red You have been brainwashed! You are no longer a revolutionary! Your memory is hazy from the time you were a rebel...the only thing you remember is the name of the one who brainwashed you..." + to_chat(rev_mind.current, "\red You have been brainwashed! You are no longer a revolutionary! Your memory is hazy from the time you were a rebel...the only thing you remember is the name of the one who brainwashed you...") + update_rev_icons_removed(rev_mind) for(var/mob/living/M in view(rev_mind.current)) if(beingborged) - M << "The frame beeps contentedly, purging the hostile memory engram from the MMI before initalizing it." + to_chat(M, "The frame beeps contentedly, purging the hostile memory engram from the MMI before initalizing it.") + else - M << "[rev_mind.current] looks like they just remembered their real allegiance!" + to_chat(M, "[rev_mind.current] looks like they just remembered their real allegiance!") + ///////////////////////////////////// @@ -294,10 +308,12 @@ /datum/game_mode/revolution/declare_completion() if(finished == 1) feedback_set_details("round_end_result","win - heads killed") - world << "\red The heads of staff were killed or abandoned the station! The revolutionaries win!" + to_chat(world, "\red The heads of staff were killed or abandoned the station! The revolutionaries win!") + else if(finished == 2) feedback_set_details("round_end_result","loss - rev heads killed") - world << "\red The heads of staff managed to stop the revolution!" + to_chat(world, "\red The heads of staff managed to stop the revolution!") + ..() return 1 @@ -325,7 +341,8 @@ for(var/datum/objective/mutiny/objective in headrev.objectives) targets |= objective.target - world << text + to_chat(world, text) + if(revolutionaries.len || istype(ticker.mode,/datum/game_mode/revolution)) var/text = "The revolutionaries were:" @@ -345,7 +362,8 @@ text += "body destroyed" text += ")" - world << text + to_chat(world, text) + if( head_revolutionaries.len || revolutionaries.len || istype(ticker.mode,/datum/game_mode/revolution) ) @@ -374,7 +392,8 @@ if(target) text += "" - world << text + to_chat(world, text) + /proc/is_convertable_to_rev(datum/mind/mind) return istype(mind) && \ diff --git a/code/game/gamemodes/revolution/rp_revolution.dm b/code/game/gamemodes/revolution/rp_revolution.dm index ef2ec130047..cea8e9d9d2d 100644 --- a/code/game/gamemodes/revolution/rp_revolution.dm +++ b/code/game/gamemodes/revolution/rp_revolution.dm @@ -75,9 +75,11 @@ /datum/game_mode/revolution/rp_revolution/greet_revolutionary(var/datum/mind/rev_mind, var/you_are=1) var/obj_count = 1 if (you_are) - rev_mind.current << "\blue You are a member of the revolutionaries' leadership!" + to_chat(rev_mind.current, "\blue You are a member of the revolutionaries' leadership!") + for(var/datum/objective/objective in rev_mind.objectives) - rev_mind.current << "Objective #[obj_count]: [objective.explanation_text]" + to_chat(rev_mind.current, "Objective #[obj_count]: [objective.explanation_text]") + rev_mind.special_role = "Head Revolutionary" obj_count++ @@ -89,7 +91,8 @@ // Tell them about people they might want to contact. var/mob/living/carbon/human/M = get_nt_opposed() if(M && !(M.mind in head_revolutionaries) && !(M in already_considered)) - rev_mob << "We have received credible reports that [M.real_name] might be willing to help our cause. If you need assistance, consider contacting them." + to_chat(rev_mob, "We have received credible reports that [M.real_name] might be willing to help our cause. If you need assistance, consider contacting them.") + rev_mob.mind.store_memory("Potential Collaborator: [M.real_name]") /////////////////////////////////////////////////// @@ -103,7 +106,8 @@ if((rev_mind in revolutionaries) || (rev_mind in head_revolutionaries)) return 0 revolutionaries += rev_mind - rev_mind.current << "\red You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill, capture or convert the heads to win the revolution!" + to_chat(rev_mind.current, "\red You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill, capture or convert the heads to win the revolution!") + rev_mind.special_role = "Revolutionary" update_rev_icons_added(rev_mind) return 1 @@ -127,8 +131,10 @@ //Announces the game type// /////////////////////////// /datum/game_mode/revolution/rp_revolution/announce() - world << "The current game mode is - Revolution!" - world << "Some crewmembers are attempting to start a revolution!" + to_chat(world, "The current game mode is - Revolution!") + + to_chat(world, "Some crewmembers are attempting to start a revolution!") + ////////////////////////////////////////////////////////////////////// @@ -137,10 +143,12 @@ /datum/game_mode/revolution/rp_revolution/declare_completion() if(finished == 1) feedback_set_details("round_end_result","win - heads overthrown") - world << "\red The heads of staff were overthrown! The revolutionaries win!" + to_chat(world, "\red The heads of staff were overthrown! The revolutionaries win!") + else if(finished == 2) feedback_set_details("round_end_result","loss - revolution stopped") - world << "\red The heads of staff managed to stop the revolution!" + to_chat(world, "\red The heads of staff managed to stop the revolution!") + ..() return 1 @@ -159,29 +167,38 @@ if(!stat && P.client && P.mind && !P.mind.special_role) Possible += P if(!Possible.len) - src << "\red There doesn't appear to be anyone available for you to convert here." + to_chat(src, "\red There doesn't appear to be anyone available for you to convert here.") + return var/mob/living/carbon/human/M = input("Select a person to convert", "Viva la revolution!", null) as mob in Possible if(((src.mind in ticker.mode:head_revolutionaries) || (src.mind in ticker.mode:revolutionaries))) if((M.mind in ticker.mode:head_revolutionaries) || (M.mind in ticker.mode:revolutionaries)) - src << "\red [M] is already be a revolutionary!" + to_chat(src, "\red [M] is already be a revolutionary!") + else if(!ticker.mode:is_convertible(M)) - src << "\red [M] is implanted with a loyalty implant - Remove it first!" + to_chat(src, "\red [M] is implanted with a loyalty implant - Remove it first!") + else if(world.time < M.mind.rev_cooldown) - src << "\red Wait five seconds before reconversion attempt." + to_chat(src, "\red Wait five seconds before reconversion attempt.") + return - src << "\red Attempting to convert [M]..." + to_chat(src, "\red Attempting to convert [M]...") + log_admin("[src]([src.ckey]) attempted to convert [M].") message_admins("\red [src]([src.ckey]) attempted to convert [M].") var/choice = alert(M,"Asked by [src]: Do you want to join the revolution?","Align Thyself with the Revolution!","No!","Yes!") if(choice == "Yes!") ticker.mode:add_revolutionary(M.mind) - M << "\blue You join the revolution!" - src << "\blue [M] joins the revolution!" + to_chat(M, "\blue You join the revolution!") + + to_chat(src, "\blue [M] joins the revolution!") + else if(choice == "No!") - M << "\red You reject this traitorous cause!" - src << "\red [M] does not support the revolution!" + to_chat(M, "\red You reject this traitorous cause!") + + to_chat(src, "\red [M] does not support the revolution!") + M.mind.rev_cooldown = world.time+50 /datum/game_mode/revolution/rp_revolution/process() @@ -208,7 +225,8 @@ update_rev_icons_added(H.mind) H.verbs += /mob/living/carbon/human/proc/RevConvert - H << "\red Congratulations, yer heads of revolution are all gone now, so yer earned yourself a promotion." + to_chat(H, "\red Congratulations, yer heads of revolution are all gone now, so yer earned yourself a promotion.") + added_heads = 1 break @@ -241,7 +259,8 @@ comm.messagetitle.Add("Cent. Com. Announcement") comm.messagetext.Add(message) - world << sound('sound/AI/commandreport.ogg') + to_chat(world, sound('sound/AI/commandreport.ogg')) + /datum/game_mode/revolution/rp_revolution/latespawn(mob/M) if(M.mind.assigned_role in command_positions) @@ -254,4 +273,5 @@ rev_obj.target = M.mind rev_obj.explanation_text = "Assassinate, convert or capture [M.real_name], the [M.mind.assigned_role]." rev_mind.objectives += rev_obj - rev_mind.current << "\red A new Head of Staff, [M.real_name], the [M.mind.assigned_role] has appeared. Your objectives have been updated." + to_chat(rev_mind.current, "\red A new Head of Staff, [M.real_name], the [M.mind.assigned_role] has appeared. Your objectives have been updated.") + diff --git a/code/game/gamemodes/sandbox/h_sandbox.dm b/code/game/gamemodes/sandbox/h_sandbox.dm index 510fccd9e9c..b21e7101a82 100644 --- a/code/game/gamemodes/sandbox/h_sandbox.dm +++ b/code/game/gamemodes/sandbox/h_sandbox.dm @@ -52,11 +52,13 @@ datum/hSB if("hsbtobj") if(!admin) return if(hsboxspawn) - world << "Sandbox: [usr.key] has disabled object spawning!" + to_chat(world, "Sandbox: [usr.key] has disabled object spawning!") + hsboxspawn = 0 return if(!hsboxspawn) - world << "Sandbox: [usr.key] has enabled object spawning!" + to_chat(world, "Sandbox: [usr.key] has enabled object spawning!") + hsboxspawn = 1 return if("hsbsuit") @@ -105,7 +107,8 @@ datum/hSB hsb.req_access += A hsb.loc = usr.loc - usr << "Sandbox: Created an airlock." + to_chat(usr, "Sandbox: Created an airlock.") + if("hsbcanister") var/list/hsbcanisters = subtypesof(/obj/machinery/portable_atmospherics/canister/) var/hsbcanister = input(usr, "Choose a canister to spawn.", "Sandbox:") in hsbcanisters + "Cancel" diff --git a/code/game/gamemodes/sandbox/sandbox.dm b/code/game/gamemodes/sandbox/sandbox.dm index 5f13763e5f2..8f02b2df6a7 100644 --- a/code/game/gamemodes/sandbox/sandbox.dm +++ b/code/game/gamemodes/sandbox/sandbox.dm @@ -7,8 +7,10 @@ uplink_uses = 10 /datum/game_mode/sandbox/announce() - world << "The current game mode is - Sandbox!" - world << "Build your own station with the sandbox-panel command!" + to_chat(world, "The current game mode is - Sandbox!") + + to_chat(world, "Build your own station with the sandbox-panel command!") + /datum/game_mode/sandbox/pre_setup() for(var/mob/M in player_list) diff --git a/code/game/gamemodes/scoreboard.dm b/code/game/gamemodes/scoreboard.dm index 87c24e90371..19f7f4905cc 100644 --- a/code/game/gamemodes/scoreboard.dm +++ b/code/game/gamemodes/scoreboard.dm @@ -148,8 +148,10 @@ score_crewscore -= plaguepoints // Show the score - might add "ranks" later - world << "The crew's final score is:" - world << "[score_crewscore]" + to_chat(world, "The crew's final score is:") + + to_chat(world, "[score_crewscore]") + for(var/mob/E in player_list) if(E.client) if(E.client.prefs && !(E.client.prefs.toggles & DISABLE_SCOREBOARD)) diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm index 4a11d2415f7..46fbc47a5df 100644 --- a/code/game/gamemodes/shadowling/shadowling.dm +++ b/code/game/gamemodes/shadowling/shadowling.dm @@ -76,8 +76,10 @@ Made by Xhuis protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Brig Physician", "Internal Affairs Agent") /datum/game_mode/shadowling/announce() - world << "The current game mode is - Shadowling!" - world << "There are alien shadowlings on the station. Crew: Kill the shadowlings before they can eat or enthrall the crew. Shadowlings: Enthrall the crew while remaining in hiding." + to_chat(world, "The current game mode is - Shadowling!") + + to_chat(world, "There are alien shadowlings on the station. Crew: Kill the shadowlings before they can eat or enthrall the crew. Shadowlings: Enthrall the crew while remaining in hiding.") + /datum/game_mode/shadowling/pre_setup() if(config.protect_roles_from_antagonist) @@ -105,8 +107,10 @@ Made by Xhuis for(var/datum/mind/shadow in shadows) log_game("[shadow.key] (ckey) has been selected as a Shadowling.") sleep(10) - shadow.current << "
      " - shadow.current << "You are a shadowling!" + to_chat(shadow.current, "
      ") + + to_chat(shadow.current, "You are a shadowling!") + greet_shadow(shadow) finalize_shadowling(shadow) process_shadow_objectives(shadow) @@ -114,10 +118,12 @@ Made by Xhuis ..() /datum/game_mode/proc/greet_shadow(var/datum/mind/shadow) - shadow.current << "Currently, you are disguised as an employee aboard [world.name]." - shadow.current << "In your limited state, you have two abilities: Hatch and Shadowling Hivemind (:8)." - shadow.current << "Any other shadowlings are your allies. You must assist them as they shall assist you." - shadow.current << "If you are new to shadowling, or want to read about abilities, check the wiki page at http://nanotrasen.se/wiki/index.php/Shadowling
      " + to_chat(shadow.current, "Currently, you are disguised as an employee aboard [world.name].") + to_chat(shadow.current, "In your limited state, you have two abilities: Hatch and Shadowling Hivemind (:8).") + to_chat(shadow.current, "Any other shadowlings are your allies. You must assist them as they shall assist you.") + to_chat(shadow.current, "If you are new to shadowling, or want to read about abilities, check the wiki page at http://nanotrasen.se/wiki/index.php/Shadowling
      ") + + /datum/game_mode/proc/process_shadow_objectives(var/datum/mind/shadow_mind) @@ -127,7 +133,8 @@ Made by Xhuis objective_explanation = "Ascend to your true form by use of the Ascendance ability. This may only be used with [required_thralls] collective thralls, while hatched, and is unlocked with the Collective Mind ability." shadow_objectives += "enthrall" shadow_mind.memory += "Objective #1: [objective_explanation]" - shadow_mind.current << "Objective #1: [objective_explanation]
      " + to_chat(shadow_mind.current, "Objective #1: [objective_explanation]
      ") + /datum/game_mode/proc/finalize_shadowling(var/datum/mind/shadow_mind) @@ -137,7 +144,8 @@ Made by Xhuis shadow_mind.current.add_language("Shadowling Hivemind") update_shadow_icons_added(shadow_mind) if(shadow_mind.assigned_role == "Clown") - S << "Your alien nature has allowed you to overcome your clownishness." + to_chat(S, "Your alien nature has allowed you to overcome your clownishness.") + S.mutations.Remove(CLUMSY) /datum/game_mode/proc/add_thrall(datum/mind/new_thrall_mind) @@ -152,12 +160,18 @@ Made by Xhuis new_thrall_mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/lesser_glare) new_thrall_mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/lesser_shadow_walk) new_thrall_mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadow_vision/thrall) - new_thrall_mind.current << "You see the truth. Reality has been torn away and you realize what a fool you've been." - new_thrall_mind.current << "The shadowlings are your masters. Serve them above all else and ensure they complete their goals." - new_thrall_mind.current << "You may not harm other thralls or the shadowlings. However, you do not need to obey other thralls." - new_thrall_mind.current << "Your body has been irreversibly altered. The attentive can see this - you may conceal it by wearing a mask." - new_thrall_mind.current << "Though not nearly as powerful as your masters, you possess some weak powers. These can be found in the Thrall Abilities tab." - new_thrall_mind.current << "You may communicate with your allies by speaking in the Shadowling Hivemind (:8)." + to_chat(new_thrall_mind.current, "You see the truth. Reality has been torn away and you realize what a fool you've been.") + + to_chat(new_thrall_mind.current, "The shadowlings are your masters. Serve them above all else and ensure they complete their goals.") + + to_chat(new_thrall_mind.current, "You may not harm other thralls or the shadowlings. However, you do not need to obey other thralls.") + + to_chat(new_thrall_mind.current, "Your body has been irreversibly altered. The attentive can see this - you may conceal it by wearing a mask.") + + to_chat(new_thrall_mind.current, "Though not nearly as powerful as your masters, you possess some weak powers. These can be found in the Thrall Abilities tab.") + + to_chat(new_thrall_mind.current, "You may communicate with your allies by speaking in the Shadowling Hivemind (:8).") + if(jobban_isbanned(new_thrall_mind.current, ROLE_SHADOWLING)) replace_jobbaned_player(new_thrall_mind.current, ROLE_SHADOWLING) @@ -240,13 +254,17 @@ Made by Xhuis /datum/game_mode/shadowling/declare_completion() if(check_shadow_victory() && shuttle_master.emergency.mode >= SHUTTLE_ESCAPE) //Doesn't end instantly - this is hacky and I don't know of a better way ~X - world << "The shadowlings have ascended and taken over the station!" + to_chat(world, "The shadowlings have ascended and taken over the station!") + else if(shadowling_dead && !check_shadow_victory()) //If the shadowlings have ascended, they can not lose the round - world << "The shadowlings have been killed by the crew!" + to_chat(world, "The shadowlings have been killed by the crew!") + else if(!check_shadow_victory() && shuttle_master.emergency.mode >= SHUTTLE_ESCAPE) - world << "The crew escaped the station before the shadowlings could ascend!" + to_chat(world, "The crew escaped the station before the shadowlings could ascend!") + else - world << "The shadowlings have failed!" + to_chat(world, "The shadowlings have failed!") + ..() return 1 @@ -283,7 +301,8 @@ Made by Xhuis text += "body destroyed" text += ")" text += "
      " - world << text + to_chat(world, text) + /* @@ -318,8 +337,11 @@ Made by Xhuis if(light_amount > LIGHT_DAM_THRESHOLD && !H.incorporeal_move) //Can survive in very small light levels. Also doesn't take damage while incorporeal, for shadow walk purposes H.take_overall_damage(0, LIGHT_DAMAGE_TAKEN) if(H.stat != DEAD) - H << "The light burns you!" //Message spam to say "GET THE FUCK OUT" - H << 'sound/weapons/sear.ogg' + to_chat(H, "The light burns you!")//Message spam to say "GET THE FUCK OUT" + + + to_chat(H, 'sound/weapons/sear.ogg') + else if(light_amount < LIGHT_HEAL_THRESHOLD) H.heal_overall_damage(5, 5) H.adjustToxLoss(-5) diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index 64710ac14de..6fa19dc30a2 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -4,9 +4,15 @@ if(!H || !istype(H)) return if(H.get_species() == "Shadowling" && is_shadow(H)) return 1 if(H.get_species() == "Lesser Shadowling" && is_thrall(H)) return 1 - if(!is_shadow_or_thrall(usr)) usr << "You can't wrap your head around how to do this." - else if(is_thrall(usr)) usr << "You aren't powerful enough to do this." - else if(is_shadow(usr)) usr << "Your telepathic ability is suppressed. Hatch or use Rapid Re-Hatch first." + if(!is_shadow_or_thrall(usr)) + to_chat(usr, "You can't wrap your head around how to do this.") + + else if(is_thrall(usr)) + to_chat(usr, "You aren't powerful enough to do this.") + + else if(is_shadow(usr)) + to_chat(usr, "Your telepathic ability is suppressed. Hatch or use Rapid Re-Hatch first.") + return 0 @@ -21,27 +27,32 @@ /obj/effect/proc_holder/spell/targeted/glare/cast(list/targets) for(var/mob/living/carbon/human/target in targets) if(!ishuman(target)) - usr << "You may only glare at humans!" + to_chat(usr, "You may only glare at humans!") + charge_counter = charge_max return if(!shadowling_check(usr)) charge_counter = charge_max return if(target.stat) - usr << "[target] must be conscious!" + to_chat(usr, "[target] must be conscious!") + charge_counter = charge_max return if(is_shadow_or_thrall(target)) - usr << "You don't see why you would want to paralyze an ally." + to_chat(usr, "You don't see why you would want to paralyze an ally.") + charge_counter = charge_max return var/mob/living/carbon/human/M = target usr.visible_message("[usr]'s eyes flash a blinding red!") target.visible_message("[target] freezes in place, their eyes glazing over...") if(in_range(target, usr)) - target << "Your gaze is forcibly drawn into [usr]'s eyes, and you are mesmerized by their heavenly beauty..." + to_chat(target, "Your gaze is forcibly drawn into [usr]'s eyes, and you are mesmerized by their heavenly beauty...") + else //Only alludes to the shadowling if the target is close by - target << "Red lights suddenly dance in your vision, and you are mesmerized by the heavenly lights..." + to_chat(target, "Red lights suddenly dance in your vision, and you are mesmerized by the heavenly lights...") + target.Stun(10) M.silent += 10 @@ -57,24 +68,29 @@ /obj/effect/proc_holder/spell/targeted/lesser_glare/cast(list/targets) for(var/mob/living/carbon/human/target in targets) if(!ishuman(target) || !target) - usr << "You nay only glare at humans!" + to_chat(usr, "You nay only glare at humans!") + charge_counter = charge_max return if(target.stat) - usr << "[target] must be conscious!" + to_chat(usr, "[target] must be conscious!") + charge_counter = charge_max return if(is_shadow_or_thrall(target)) - usr << "You cannot glare at allies!" + to_chat(usr, "You cannot glare at allies!") + charge_counter = charge_max return var/mob/living/carbon/human/M = target usr.visible_message("[usr]'s eyes flash a blinding red!") target.visible_message("[target] freezes in place, their eyes glazing over...") if(in_range(target, usr)) - target << "Your gaze is forcibly drawn into [usr]'s eyes, and you are mesmerized by the heavenly lights..." + to_chat(target, "Your gaze is forcibly drawn into [usr]'s eyes, and you are mesmerized by the heavenly lights...") + else - target << "Red lights suddenly dance in your vision, and you are mesmerized by their heavenly beauty..." + to_chat(target, "Red lights suddenly dance in your vision, and you are mesmerized by their heavenly beauty...") + target.Stun(3) //Roughly 30% as long as the normal one M.silent += 3 @@ -139,7 +155,8 @@ if(!shadowling_check(usr)) charge_counter = charge_max return - usr << "You silently disable all nearby lights." + to_chat(usr, "You silently disable all nearby lights.") + for(var/obj/effect/glowshroom/G in orange(2, usr)) //Why the fuck was this in the loop below? G.visible_message("\The [G] withers away!") qdel(G) @@ -233,10 +250,12 @@ return var/mob/living/carbon/human/H = user if(!H.vision_type) - H << "You shift the nerves in your eyes, allowing you to see in the dark." + to_chat(H, "You shift the nerves in your eyes, allowing you to see in the dark.") + H.vision_type = new vision_path else - H << "You return your vision to normal." + to_chat(H, "You return your vision to normal.") + H.vision_type = null /obj/effect/proc_holder/spell/targeted/shadow_vision/thrall @@ -257,7 +276,8 @@ if(!shadowling_check(usr)) charge_counter = charge_max return - usr << "You freeze the nearby air." + to_chat(usr, "You freeze the nearby air.") + playsound(usr.loc, 'sound/effects/ghost2.ogg', 50, 1) for(var/turf/T in targets) @@ -266,9 +286,11 @@ if(M == usr) //No message for the user, of course continue else - M << "You feel a blast of paralyzingly cold air wrap around you and flow past, but you are unaffected!" + to_chat(M, "You feel a blast of paralyzingly cold air wrap around you and flow past, but you are unaffected!") + continue - M << "A wave of shockingly cold air engulfs you!" + to_chat(M, "A wave of shockingly cold air engulfs you!") + M.Stun(2) M.apply_damage(10, BURN) if(M.bodytemperature) @@ -298,69 +320,90 @@ return for(var/mob/living/carbon/human/target in targets) if(!in_range(usr, target)) - usr << "You need to be closer to enthrall [target]." + to_chat(usr, "You need to be closer to enthrall [target].") + charge_counter = charge_max return if(!target.key || !target.mind) - usr << "The target has no mind." + to_chat(usr, "The target has no mind.") + charge_counter = charge_max return if(target.stat) - usr << "The target must be conscious." + to_chat(usr, "The target must be conscious.") + charge_counter = charge_max return if(is_shadow_or_thrall(target)) - usr << "You can not enthrall allies." + to_chat(usr, "You can not enthrall allies.") + charge_counter = charge_max return if(!ishuman(target)) - usr << "You can only enthrall humans." + to_chat(usr, "You can only enthrall humans.") + charge_counter = charge_max return if(enthralling) - usr << "You are already enthralling!" + to_chat(usr, "You are already enthralling!") + charge_counter = charge_max return if(!target.client) - usr << "[target]'s mind is vacant of activity." + to_chat(usr, "[target]'s mind is vacant of activity.") + enthralling = 1 - usr << "This target is valid. You begin the enthralling." - target << "[usr] stares at you. You feel your head begin to pulse." + to_chat(usr, "This target is valid. You begin the enthralling.") + + to_chat(target, "[usr] stares at you. You feel your head begin to pulse.") + for(var/progress = 0, progress <= 3, progress++) switch(progress) if(1) - usr << "You place your hands to [target]'s head..." + to_chat(usr, "You place your hands to [target]'s head...") + usr.visible_message("[usr] places their hands onto the sides of [target]'s head!") if(2) - usr << "You begin preparing [target]'s mind as a blank slate..." + to_chat(usr, "You begin preparing [target]'s mind as a blank slate...") + usr.visible_message("[usr]'s palms flare a bright red against [target]'s temples!") - target << "A terrible red light floods your mind. You collapse as conscious thought is wiped away." + to_chat(target, "A terrible red light floods your mind. You collapse as conscious thought is wiped away.") + target.Weaken(12) sleep(20) if(isloyal(target)) - usr << "They are enslaved by Nanotrasen. You begin to shut down the nanobot implant - this will take some time." + to_chat(usr, "They are enslaved by Nanotrasen. You begin to shut down the nanobot implant - this will take some time.") + usr.visible_message("[usr] pauses, then dips their head in concentration!") - target << "You feel your loyalties begin to weaken!" + to_chat(target, "You feel your loyalties begin to weaken!") + sleep(100) //10 seconds - not spawn() so the enthralling takes longer - usr << "The nanobots composing the loyalty implant have been rendered inert. Now to continue." + to_chat(usr, "The nanobots composing the loyalty implant have been rendered inert. Now to continue.") + usr.visible_message("[usr] relaxes again.") for(var/obj/item/weapon/implant/loyalty/L in target) if(L && L.implanted) qdel(L) - target << "Your unwavering loyalty to Nanotrasen unexpectedly falters, dims, dies." + to_chat(target, "Your unwavering loyalty to Nanotrasen unexpectedly falters, dims, dies.") + if(3) - usr << "You begin planting the tumor that will control the new thrall..." + to_chat(usr, "You begin planting the tumor that will control the new thrall...") + usr.visible_message("A strange energy passes from [usr]'s hands into [target]'s head!") - target << "You feel your memories twisting, morphing. A sense of horror dominates your mind." + to_chat(target, "You feel your memories twisting, morphing. A sense of horror dominates your mind.") + if(!do_mob(usr, target, 70)) //around 21 seconds total for enthralling, 31 for someone with a loyalty implant - usr << "The enthralling has been interrupted - your target's mind returns to its previous state." - target << "You wrest yourself away from [usr]'s hands and compose yourself" + to_chat(usr, "The enthralling has been interrupted - your target's mind returns to its previous state.") + + to_chat(target, "You wrest yourself away from [usr]'s hands and compose yourself") + enthralling = 0 return enthralling = 0 - usr << "You have enthralled [target]!" + to_chat(usr, "You have enthralled [target]!") + target.visible_message("[target] looks to have experienced a revelation!", \ "False faces all dark not real not real not--") target.setOxyLoss(0) //In case the shadowling was choking them out @@ -379,7 +422,8 @@ /obj/effect/proc_holder/spell/targeted/shadowling_regenarmor/cast(list/targets) if(!is_shadow(usr)) - usr << "You must be a shadowling to do this!" + to_chat(usr, "You must be a shadowling to do this!") + charge_counter = charge_max return for(var/mob/living/user in targets) @@ -421,45 +465,53 @@ var/victory_threshold = 15 var/mob/M - user << "You focus your telepathic energies abound, harnessing and drawing together the strength of your thralls." + to_chat(user, "You focus your telepathic energies abound, harnessing and drawing together the strength of your thralls.") + for(M in living_mob_list) if(is_thrall(M)) thralls++ - M << "You feel hooks sink into your mind and pull." + to_chat(M, "You feel hooks sink into your mind and pull.") + if(!do_after(user, 30, target = user)) - user << "Your concentration has been broken. The mental hooks you have sent out now retract into your mind." + to_chat(user, "Your concentration has been broken. The mental hooks you have sent out now retract into your mind.") + return if(thralls >= 3 && !screech_acquired) screech_acquired = 1 - user << "The power of your thralls has granted you the Sonic Screech ability. This ability will shatter nearby windows and deafen enemies, plus stunning silicon lifeforms." + to_chat(user, "The power of your thralls has granted you the Sonic Screech ability. This ability will shatter nearby windows and deafen enemies, plus stunning silicon lifeforms.") + user.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/unearthly_screech) if(thralls >= 5 && !blind_smoke_acquired) blind_smoke_acquired = 1 - user << "The power of your thralls has granted you the Blinding Smoke ability. It will create a choking cloud that will blind any non-thralls who enter. \ - " + to_chat(user, "The power of your thralls has granted you the Blinding Smoke ability. \ + It will create a choking cloud that will blind any non-thralls who enter.") user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/blindness_smoke) if(thralls >= 7 && !drainLifeAcquired) drainLifeAcquired = 1 - user << "The power of your thralls has granted you the Drain Life ability. You can now drain the health of nearby humans to heal yourself." + to_chat(user, "The power of your thralls has granted you the Drain Life ability. You can now drain the health of nearby humans to heal yourself.") + user.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/drainLife) if(thralls >= 9 && !reviveThrallAcquired) reviveThrallAcquired = 1 - user << "The power of your thralls has granted you the Black Recuperation ability. This will, after a short time, bring a dead thrall completely back to life \ - with no bodily defects." + to_chat(user, "The power of your thralls has granted you the Black Recuperation ability. \ + This will, after a short time, bring a dead thrall completely back to life with no bodily defects.") user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/reviveThrall) if(thralls < victory_threshold) - user << "You do not have the power to ascend. You require [victory_threshold] thralls, but only [thralls] living thralls are present." + to_chat(user, "You do not have the power to ascend. You require [victory_threshold] thralls, but only [thralls] living thralls are present.") + else if(thralls >= victory_threshold) - usr << "You are now powerful enough to ascend. Use the Ascendance ability when you are ready. This will kill all of your thralls." - usr << "You may find Ascendance in the Shadowling Evolution tab." + to_chat(usr, "You are now powerful enough to ascend. Use the Ascendance ability when you are ready. This will kill all of your thralls.") + + to_chat(usr, "You may find Ascendance in the Shadowling Evolution tab.") + for(M in living_mob_list) if(is_shadow(M)) var/obj/effect/proc_holder/spell/targeted/collective_mind/CM @@ -469,9 +521,12 @@ M.mind.remove_spell(/obj/effect/proc_holder/spell/targeted/shadowling_hatch) M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadowling_ascend) if(M == usr) - M << "You project this power to the rest of the shadowlings." + to_chat(M, "You project this power to the rest of the shadowlings.") + else - M << "[user.real_name] has coalesced the strength of the thralls. You can draw upon it at any time to ascend. (Shadowling Evolution Tab)" //Tells all the other shadowlings + to_chat(M, "[user.real_name] has coalesced the strength of the thralls. You can draw upon it at any time to ascend. (Shadowling Evolution Tab)")//Tells all the other shadowlings + + @@ -491,7 +546,8 @@ return for(var/mob/living/user in targets) user.visible_message("[user] suddenly bends over and coughs out a cloud of black smoke, which begins to spread rapidly!") - user << "You regurgitate a vast cloud of blinding smoke." + to_chat(user, "You regurgitate a vast cloud of blinding smoke.") + playsound(user, 'sound/effects/bamf.ogg', 50, 1) var/obj/item/weapon/reagent_containers/glass/beaker/large/B = new /obj/item/weapon/reagent_containers/glass/beaker/large(user.loc) B.reagents.clear_reagents() //Just in case! @@ -515,13 +571,15 @@ datum/reagent/shadowling_blindness_smoke //Blinds non-shadowlings, heals shadowl datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom if(!is_shadow_or_thrall(M)) - M << "You breathe in the black smoke, and your eyes burn horribly!" + to_chat(M, "You breathe in the black smoke, and your eyes burn horribly!") + M.eye_blind = 5 if(prob(25)) M.visible_message("[M] claws at their eyes!") M.Stun(3) else - M << "You breathe in the black smoke, and you feel revitalized!" + to_chat(M, "You breathe in the black smoke, and you feel revitalized!") + M.heal_organ_damage(2,2) M.adjustOxyLoss(-2) M.adjustToxLoss(-2) @@ -555,13 +613,16 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) continue if(iscarbon(target)) var/mob/living/carbon/M = target - M << "A spike of pain drives into your head and scrambles your thoughts!" + to_chat(M, "A spike of pain drives into your head and scrambles your thoughts!") + M.confused += 10 M.ear_damage += 3 else if(issilicon(target)) var/mob/living/silicon/S = target - S << "ERROR $!(@ ERROR )#^! SENSORY OVERLOAD \[$(!@#" - S << 'sound/misc/interference.ogg' + to_chat(S, "ERROR $!(@ ERROR )#^! SENSORY OVERLOAD \[$(!@#") + + to_chat(S, 'sound/misc/interference.ogg') + playsound(S, 'sound/machines/warning-buzzer.ogg', 50, 1) var/datum/effect/system/spark_spread/sp = new /datum/effect/system/spark_spread sp.set_up(5, 1, S) @@ -597,7 +658,8 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) nearbyTargets.Add(M) if(!targetsDrained) charge_counter = charge_max - usr << "There were no nearby humans for you to drain." + to_chat(usr, "There were no nearby humans for you to drain.") + return for(var/mob/living/carbon/M in nearbyTargets) U.heal_organ_damage(10, 10) @@ -608,8 +670,10 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) U.AdjustStunned(-1) M.adjustOxyLoss(20) M.adjustStaminaLoss(20) - M << "You feel a wave of exhaustion and a curious draining sensation directed towards [usr]!" - usr << "You draw life from those around you to heal your wounds." + to_chat(M, "You feel a wave of exhaustion and a curious draining sensation directed towards [usr]!") + + to_chat(usr, "You draw life from those around you to heal your wounds.") + @@ -632,15 +696,18 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) switch(choice) if("Empower") if(!is_thrall(thrallToRevive)) - usr << "[thrallToRevive] is not a thrall." + to_chat(usr, "[thrallToRevive] is not a thrall.") + charge_counter = charge_max return if(thrallToRevive.stat != CONSCIOUS) - usr << "[thrallToRevive] must be conscious to become empowered." + to_chat(usr, "[thrallToRevive] must be conscious to become empowered.") + charge_counter = charge_max return if(thrallToRevive.get_species() == "Lesser Shadowling") - usr << "[thrallToRevive] is already empowered." + to_chat(usr, "[thrallToRevive] is already empowered.") + charge_counter = charge_max return var/empowered_thralls = 0 @@ -651,17 +718,21 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) if(H.get_species() == "Lesser Shadowling") empowered_thralls++ if(empowered_thralls >= EMPOWERED_THRALL_LIMIT) - usr << "You cannot spare this much energy. There are too many empowered thralls." + to_chat(usr, "You cannot spare this much energy. There are too many empowered thralls.") + charge_counter = charge_max return usr.visible_message("[usr] places their hands over [thrallToRevive]'s face, red light shining from beneath.", \ "You place your hands on [thrallToRevive]'s face and begin gathering energy...") - thrallToRevive << "[usr] places their hands over your face. You feel energy gathering. Stand still..." + to_chat(thrallToRevive, "[usr] places their hands over your face. You feel energy gathering. Stand still...") + if(!do_mob(usr, thrallToRevive, 80)) - usr << "Your concentration snaps. The flow of energy ebbs." + to_chat(usr, "Your concentration snaps. The flow of energy ebbs.") + charge_counter = charge_max return - usr << "You release a massive surge of power into [thrallToRevive]!" + to_chat(usr, "You release a massive surge of power into [thrallToRevive]!") + usr.visible_message("Red lightning surges into [thrallToRevive]'s face!") playsound(thrallToRevive, 'sound/weapons/Egloves.ogg', 50, 1) playsound(thrallToRevive, 'sound/machines/defib_zap.ogg', 50, 1) @@ -680,21 +751,25 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) thrallToRevive.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadow_walk) if("Revive") if(!is_thrall(thrallToRevive)) - usr << "[thrallToRevive] is not a thrall." + to_chat(usr, "[thrallToRevive] is not a thrall.") + charge_counter = charge_max return if(thrallToRevive.stat != DEAD) - usr << "[thrallToRevive] is not dead." + to_chat(usr, "[thrallToRevive] is not dead.") + charge_counter = charge_max return usr.visible_message("[usr] kneels over [thrallToRevive], placing their hands on \his chest.", \ "You crouch over the body of your thrall and begin gathering energy...") thrallToRevive.notify_ghost_cloning("Your masters are resuscitating you! Re-enter your corpse if you wish to be brought to life.", source = thrallToRevive) if(!do_mob(usr, thrallToRevive, 30)) - usr << "Your concentration snaps. The flow of energy ebbs." + to_chat(usr, "Your concentration snaps. The flow of energy ebbs.") + charge_counter = charge_max return - usr << "You release a massive surge of power into [thrallToRevive]!" + to_chat(usr, "You release a massive surge of power into [thrallToRevive]!") + usr.visible_message("Red lightning surges from [usr]'s hands into [thrallToRevive]'s chest!") playsound(thrallToRevive, 'sound/weapons/Egloves.ogg', 50, 1) playsound(thrallToRevive, 'sound/machines/defib_zap.ogg', 50, 1) @@ -728,11 +803,13 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) charge_counter = charge_max return if(!is_thrall(target)) - usr << "[target] must be a thrall." + to_chat(usr, "[target] must be a thrall.") + charge_counter = charge_max return if(shuttle_master.emergency.mode != SHUTTLE_CALL) - usr << "The shuttle must be inbound only to the station." + to_chat(usr, "The shuttle must be inbound only to the station.") + charge_counter = charge_max return var/mob/living/carbon/human/M = target @@ -741,10 +818,13 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) M.visible_message("[M]'s face falls slack, their jaw slightly distending.", \ "You are suddenly transported... far, far away...") if(!do_after(usr, 50, target = M)) - M << "You are snapped back to reality, your haze dissipating!" - usr << "You have been interrupted. The draw has failed." + to_chat(M, "You are snapped back to reality, your haze dissipating!") + + to_chat(usr, "You have been interrupted. The draw has failed.") + return - usr << "You project [M]'s life force toward the approaching shuttle, extending its arrival duration!" + to_chat(usr, "You project [M]'s life force toward the approaching shuttle, extending its arrival duration!") + M.visible_message("[M]'s eyes suddenly flare red. They proceed to collapse on the floor, not breathing.", \ "...speeding by... ...pretty blue glow... ...touch it... ...no glow now... ...no light... ...nothing at all...") M.death() @@ -771,14 +851,16 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) /obj/effect/proc_holder/spell/targeted/annihilate/cast(list/targets) var/mob/living/simple_animal/ascendant_shadowling/SHA = usr if(SHA.phasing) - usr << "You are not in the same plane of existence. Unphase first." + to_chat(usr, "You are not in the same plane of existence. Unphase first.") + charge_counter = charge_max return playsound(usr.loc, 'sound/magic/Staff_Chaos.ogg', 100, 1) for(var/mob/living/boom in targets) if(is_shadow(boom)) //Used to not work on thralls. Now it does so you can PUNISH THEM LIKE THE WRATHFUL GOD YOU ARE. - usr << "Making an ally explode seems unwise." + to_chat(usr, "Making an ally explode seems unwise.") + charge_counter = charge_max return usr.visible_message("[usr]'s markings flare as they gesture at [boom]!", \ @@ -804,29 +886,36 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) var/mob/living/simple_animal/ascendant_shadowling/SHA = usr if(SHA.phasing) charge_counter = charge_max - usr << "You are not in the same plane of existence. Unphase first." + to_chat(usr, "You are not in the same plane of existence. Unphase first.") + return for(var/mob/living/carbon/human/target in targets) if(is_shadow_or_thrall(target)) - usr << "You cannot enthrall an ally." + to_chat(usr, "You cannot enthrall an ally.") + charge_counter = charge_max return if(!target.ckey || !target.mind) - usr << "The target has no mind." + to_chat(usr, "The target has no mind.") + charge_counter = charge_max return if(target.stat) - usr << "The target must be conscious." + to_chat(usr, "The target must be conscious.") + charge_counter = charge_max return if(!ishuman(target)) - usr << "You can only enthrall humans." + to_chat(usr, "You can only enthrall humans.") + charge_counter = charge_max return - usr << "You instantly rearrange [target]'s memories, hyptonitizing them into a thrall." - target << "An agonizing spike of pain drives into your mind, and--" + to_chat(usr, "You instantly rearrange [target]'s memories, hyptonitizing them into a thrall.") + + to_chat(target, "An agonizing spike of pain drives into your mind, and--") + ticker.mode.add_thrall(target.mind) target.mind.special_role = "shadowling thrall" target.add_language("Shadowling Hivemind") @@ -872,7 +961,8 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) /obj/effect/proc_holder/spell/aoe_turf/ascendant_storm/cast(list/targets) var/mob/living/simple_animal/ascendant_shadowling/SHA = usr if(SHA.phasing) - usr << "You are not in the same plane of existence. Unphase first." + to_chat(usr, "You are not in the same plane of existence. Unphase first.") + charge_counter = charge_max return @@ -883,7 +973,8 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) for(var/mob/living/carbon/human/target in T.contents) if(is_shadow_or_thrall(target)) continue - target << "You are struck by a bolt of lightning!" + to_chat(target, "You are struck by a bolt of lightning!") + playsound(target, 'sound/magic/LightningShock.ogg', 50, 1) target.Weaken(8) target.take_organ_damage(0,50) @@ -904,4 +995,5 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) var/text = stripped_input(user, "What do you want to say to everything on and near [station_name()]?.", "Transmit to World", "") if(!text) return - world << "\"[text]\"" + to_chat(world, "\"[text]\"") + diff --git a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm index 52c50e0c193..0d514ff1005 100644 --- a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm @@ -14,13 +14,15 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N if(usr.stat || !ishuman(usr) || !usr || !is_shadow(usr || isinspace(usr))) return if(!isturf(usr.loc)) - usr << "You can't hatch here!" + to_chat(usr, "You can't hatch here!") + return for(var/mob/living/carbon/human/H in targets) var/hatch_or_no = alert(H,"Are you sure you want to hatch? You cannot undo this!",,"Yes","No") switch(hatch_or_no) if("No") - H << "You decide against hatching for now." + to_chat(H, "You decide against hatching for now.") + charge_counter = charge_max return if("Yes") @@ -55,13 +57,16 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N sleep(80) playsound(H.loc, 'sound/weapons/slash.ogg', 25, 1) - H << "You rip and slice." + to_chat(H, "You rip and slice.") + sleep(10) playsound(H.loc, 'sound/weapons/slashmiss.ogg', 25, 1) - H << "The chrysalis falls like water before you." + to_chat(H, "The chrysalis falls like water before you.") + sleep(10) playsound(H.loc, 'sound/weapons/slice.ogg', 25, 1) - H << "You are free!" + to_chat(H, "You are free!") + H.status_flags = temp_flags sleep(10) playsound(H.loc, 'sound/effects/ghost.ogg', 100, 1) @@ -70,7 +75,8 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N H.real_name = newNameId H.name = usr.real_name H.SetStunned(0) - H << "YOU LIVE!!!" + to_chat(H, "YOU LIVE!!!") + for(var/obj/structure/alien/resin/wall/shadowling/W in orange(H, 1)) playsound(W, 'sound/effects/splat.ogg', 50, 1) @@ -95,7 +101,8 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N H.mind.remove_spell(src) sleep(10) - H << "Your powers are awoken. You may now live to your fullest extent. Remember your goal. Cooperate with your thralls and allies." + to_chat(H, "Your powers are awoken. You may now live to your fullest extent. Remember your goal. Cooperate with your thralls and allies.") + H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadow_vision) H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/enthrall) H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/glare) @@ -124,7 +131,8 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N var/hatch_or_no = alert(H,"It is time to ascend. Are you sure about this?",,"Yes","No") switch(hatch_or_no) if("No") - H << "You decide against ascending for now." + to_chat(H, "You decide against ascending for now.") + charge_counter = charge_max return if("Yes") @@ -146,17 +154,23 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N "You begin to rend apart the final barries to godhood.") sleep(40) - H << "Yes!" + to_chat(H, "Yes!") + sleep(10) - H << "YES!!" + to_chat(H, "YES!!") + sleep(10) - H << "YE--" + to_chat(H, "YE--") + sleep(1) for(var/mob/living/M in orange(7, H)) M.Weaken(10) - M << "An immense pressure slams you onto the ground!" - world << "\"VYSHA NERADA YEKHEZET U'RUU!!\"" - world << 'sound/hallucinations/veryfar_noise.ogg' + to_chat(M, "An immense pressure slams you onto the ground!") + + to_chat(world, "\"VYSHA NERADA YEKHEZET U'RUU!!\"") + + to_chat(world, 'sound/hallucinations/veryfar_noise.ogg') + for(var/obj/machinery/power/apc/A in apcs) A.overload_lighting() var/mob/A = new /mob/living/simple_animal/ascendant_shadowling(H.loc) diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index bfb5a38e319..497664cc76f 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -25,8 +25,10 @@ /datum/game_mode/traitor/announce() - world << "The current game mode is - Traitor!" - world << "There is a syndicate traitor on the station. Do not let the traitor succeed!" + to_chat(world, "The current game mode is - Traitor!") + + to_chat(world, "There is a syndicate traitor on the station. Do not let the traitor succeed!") + /datum/game_mode/traitor/pre_setup() @@ -172,10 +174,12 @@ /datum/game_mode/proc/greet_traitor(var/datum/mind/traitor) - traitor.current << "You are the traitor." + to_chat(traitor.current, "You are the traitor.") + var/obj_count = 1 for(var/datum/objective/objective in traitor.objectives) - traitor.current << "Objective #[obj_count]: [objective.explanation_text]" + to_chat(traitor.current, "Objective #[obj_count]: [objective.explanation_text]") + obj_count++ return @@ -201,21 +205,27 @@ return 0 /datum/game_mode/proc/give_codewords(mob/living/traitor_mob) - traitor_mob << "The Syndicate provided you with the following information on how to identify their agents:" - traitor_mob << "Code Phrase: [syndicate_code_phrase]" - traitor_mob << "Code Response: [syndicate_code_response]" + to_chat(traitor_mob, "The Syndicate provided you with the following information on how to identify their agents:") + + to_chat(traitor_mob, "Code Phrase: [syndicate_code_phrase]") + + to_chat(traitor_mob, "Code Response: [syndicate_code_response]") + traitor_mob.mind.store_memory("Code Phrase: [syndicate_code_phrase]") traitor_mob.mind.store_memory("Code Response: [syndicate_code_response]") - traitor_mob << "Use the code words in the order provided, during regular conversation, to identify other agents. Proceed with caution, however, as everyone is a potential foe." + to_chat(traitor_mob, "Use the code words in the order provided, during regular conversation, to identify other agents. Proceed with caution, however, as everyone is a potential foe.") + /datum/game_mode/proc/add_law_zero(mob/living/silicon/ai/killer) var/law = "Accomplish your objectives at all costs." var/law_borg = "Accomplish your AI's objectives at all costs." - killer << "Your laws have been changed!" + to_chat(killer, "Your laws have been changed!") + killer.set_zeroth_law(law, law_borg) - killer << "New law: 0. [law]" + to_chat(killer, "New law: 0. [law]") + give_codewords(killer) @@ -277,7 +287,8 @@ feedback_add_details("traitor_success","FAIL") - world << text + to_chat(world, text) + return 1 @@ -287,7 +298,8 @@ . = 1 if (traitor_mob.mind) if (traitor_mob.mind.assigned_role == "Clown") - traitor_mob << "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself." + to_chat(traitor_mob, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.") + traitor_mob.mutations.Remove(CLUMSY) // find a radio! toolbox(es), backpack, belt, headset @@ -296,7 +308,8 @@ R = locate(/obj/item/device/radio) in traitor_mob.contents if (!R) - traitor_mob << "Unfortunately, the Syndicate wasn't able to get you a radio." + to_chat(traitor_mob, "Unfortunately, the Syndicate wasn't able to get you a radio.") + . = 0 else if (istype(R, /obj/item/device/radio)) @@ -316,7 +329,8 @@ target_radio.hidden_uplink = T T.uplink_owner = "[traitor_mob.key]" target_radio.traitor_frequency = freq - traitor_mob << "The Syndicate have cunningly disguised a Syndicate Uplink as your [R.name] [T.loc]. Simply dial the frequency [format_frequency(freq)] to unlock its hidden features." + to_chat(traitor_mob, "The Syndicate have cunningly disguised a Syndicate Uplink as your [R.name] [T.loc]. Simply dial the frequency [format_frequency(freq)] to unlock its hidden features.") + traitor_mob.mind.store_memory("Radio Freq: [format_frequency(freq)] ([R.name] [T.loc]).") else if (istype(R, /obj/item/device/pda)) // generate a passcode if the uplink is hidden in a PDA @@ -328,7 +342,8 @@ var/obj/item/device/pda/P = R P.lock_code = pda_pass - traitor_mob << "The Syndicate have cunningly disguised a Syndicate Uplink as your [R.name] [T.loc]. Simply enter the code \"[pda_pass]\" into the ringtone select to unlock its hidden features." + to_chat(traitor_mob, "The Syndicate have cunningly disguised a Syndicate Uplink as your [R.name] [T.loc]. Simply enter the code \"[pda_pass]\" into the ringtone select to unlock its hidden features.") + traitor_mob.mind.store_memory("Uplink Passcode: [pda_pass] ([R.name] [T.loc]).") if(!safety)//If they are not a rev. Can be added on to. give_codewords(traitor_mob) @@ -336,7 +351,8 @@ // Tell them about people they might want to contact. var/mob/living/carbon/human/M = get_nt_opposed() if(M && M != traitor_mob) - traitor_mob << "We have received credible reports that [M.real_name] might be willing to help our cause. If you need assistance, consider contacting them." + to_chat(traitor_mob, "We have received credible reports that [M.real_name] might be willing to help our cause. If you need assistance, consider contacting them.") + traitor_mob.mind.store_memory("Potential Collaborator: [M.real_name]") /datum/game_mode/proc/update_traitor_icons_added(datum/mind/traitor_mind) @@ -366,8 +382,10 @@ slaved.leave_serv_hud(traitor_mind) update_traitor_icons_removed(traitor_mind) - //world << "Removed [traitor_mind.current.name] from traitor shit" - traitor_mind.current << "\red The fog clouding your mind clears. You remember nothing from the moment you were implanted until now.(You don't remember who implanted you)" +// to_chat(world, "Removed [traitor_mind.current.name] from traitor shit") + + to_chat(traitor_mind.current, "\red The fog clouding your mind clears. You remember nothing from the moment you were implanted until now.(You don't remember who implanted you)") + /datum/game_mode/proc/assign_exchange_role(var/datum/mind/owner) //set faction @@ -408,5 +426,6 @@ var/equipped_slot = mob.equip_in_one_of_slots(folder, slots) if (equipped_slot) where = "In your [equipped_slot]" - mob << "

      [where] is a folder containing secret documents that another Syndicate group wants. We have set up a meeting with one of their agents on station to make an exchange. Exercise extreme caution as they cannot be trusted and may be hostile.
      " + to_chat(mob, "

      [where] is a folder containing secret documents that another Syndicate group wants. We have set up a meeting with one of their agents on station to make an exchange. Exercise extreme caution as they cannot be trusted and may be hostile.
      ") + mob.update_icons() diff --git a/code/game/gamemodes/vampire/vampire.dm b/code/game/gamemodes/vampire/vampire.dm index edb240eb1cd..a0bdfe7fbdf 100644 --- a/code/game/gamemodes/vampire/vampire.dm +++ b/code/game/gamemodes/vampire/vampire.dm @@ -38,8 +38,10 @@ var/vampire_amount = 4 /datum/game_mode/vampire/announce() - world << "The current game mode is - Vampires!" - world << "There are Vampires from Space Transylvania on the station, keep your blood close and neck safe!" + to_chat(world, "The current game mode is - Vampires!") + + to_chat(world, "There are Vampires from Space Transylvania on the station, keep your blood close and neck safe!") + /datum/game_mode/vampire/pre_setup() @@ -116,7 +118,8 @@ else text += "
      The [special_role_text] has failed!" feedback_add_details("traitor_success","FAIL") - world << text + to_chat(world, text) + return 1 /datum/game_mode/proc/auto_declare_completion_enthralled() @@ -134,7 +137,8 @@ else text += "body destroyed" text += ")" - world << text + to_chat(world, text) + return 1 /datum/game_mode/proc/forge_vampire_objectives(var/datum/mind/vampire) @@ -180,17 +184,21 @@ dat = "\red You are a Vampire! \black
      " dat += {"To bite someone, target the head and use harm intent with an empty hand. Drink blood to gain new powers. You are weak to holy things and starlight. Don't go into space and avoid the Chaplain, the chapel and especially Holy Water."} - vampire.current << dat - vampire.current << "You must complete the following tasks:" + to_chat(vampire.current, dat) + + to_chat(vampire.current, "You must complete the following tasks:") + if (vampire.current.mind) if (vampire.current.mind.assigned_role == "Clown") - vampire.current << "Your lust for blood has allowed you to overcome your clumsy nature allowing you to wield weapons without harming yourself." + to_chat(vampire.current, "Your lust for blood has allowed you to overcome your clumsy nature allowing you to wield weapons without harming yourself.") + vampire.current.mutations.Remove(CLUMSY) var/obj_count = 1 for(var/datum/objective/objective in vampire.objectives) - vampire.current << "Objective #[obj_count]: [objective.explanation_text]" + to_chat(vampire.current, "Objective #[obj_count]: [objective.explanation_text]") + obj_count++ return @@ -280,12 +288,14 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha H.LAssailant = owner while(do_mob(owner, H, 50)) if(!(owner.mind in ticker.mode.vampires)) - owner << "Your fangs have disappeared!" + to_chat(owner, "Your fangs have disappeared!") + return old_bloodtotal = bloodtotal old_bloodusable = bloodusable if(!H.vessel.get_reagent_amount("blood")) - src << "They've got no blood left to give." + to_chat(src, "They've got no blood left to give.") + break if(H.stat < DEAD) blood = min(20, H.vessel.get_reagent_amount("blood")) // if they have less than 20 blood, give them the remnant else they get 20 blood @@ -295,7 +305,8 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha blood = min(5, H.vessel.get_reagent_amount("blood")) // The dead only give 5 bloods bloodtotal += blood if(old_bloodtotal != bloodtotal) - owner << "You have accumulated [bloodtotal] [bloodtotal > 1 ? "units" : "unit"] of blood[bloodusable != old_bloodusable ? ", and have [bloodusable] left to use" : ""]." + to_chat(owner, "You have accumulated [bloodtotal] [bloodtotal > 1 ? "units" : "unit"] of blood[bloodusable != old_bloodusable ? ", and have [bloodusable] left to use" : ""].") + check_vampire_upgrade() H.vessel.remove_reagent("blood", 25) if(ishuman(owner)) @@ -303,7 +314,8 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha V.nutrition = min(450, V.nutrition + (blood / 2)) draining = null - owner << "You stop draining [H.name] of blood." + to_chat(owner, "You stop draining [H.name] of blood.") + /datum/vampire/proc/check_vampire_upgrade(announce = 1) var/list/old_powers = powers.Copy() @@ -321,10 +333,12 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha if(!(p in old_powers)) if(istype(p, /obj/effect/proc_holder/spell/vampire)) var/obj/effect/proc_holder/spell/vampire/power = p - owner << "[power.gain_desc]" + to_chat(owner, "[power.gain_desc]") + else if(istype(p, /datum/vampire_passive)) var/datum/vampire_passive/power = p - owner << "[power.gain_desc]" + to_chat(owner, "[power.gain_desc]") + //prepare for copypaste /datum/game_mode/proc/update_vampire_icons_added(datum/mind/vampire_mind) @@ -351,8 +365,10 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha vampire_mind.som = null slaved.leave_serv_hud(vampire_mind) update_vampire_icons_removed(vampire_mind) - //world << "Removed [vampire_mind.current.name] from vampire shit" - vampire_mind.current << "\red The fog clouding your mind clears. You remember nothing from the moment you were enthralled until now." +// to_chat(world, "Removed [vampire_mind.current.name] from vampire shit") + + to_chat(vampire_mind.current, "\red The fog clouding your mind clears. You remember nothing from the moment you were enthralled until now.") + /datum/vampire/proc/check_sun() var/ax = owner.x @@ -412,14 +428,18 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha if(prob(35)) switch(owner.health) if(80 to 100) - owner << "Your skin flakes away..." + to_chat(owner, "Your skin flakes away...") + if(60 to 80) - owner << "Your skin sizzles!" + to_chat(owner, "Your skin sizzles!") + if((-INFINITY) to 60) if(!owner.on_fire) - owner << "Your skin catches fire!" + to_chat(owner, "Your skin catches fire!") + else - owner << "You continue to burn!" + to_chat(owner, "You continue to burn!") + owner.fire_stacks += 5 owner.IgniteMob() owner.emote("scream") diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm index 343e4ea3fa6..48fd3034cbe 100644 --- a/code/game/gamemodes/vampire/vampire_powers.dm +++ b/code/game/gamemodes/vampire/vampire_powers.dm @@ -19,7 +19,8 @@ if(!user.mind) return 0 if(!ishuman(user)) - user << "You are in too weak of a form to do this!" + to_chat(user, "You are in too weak of a form to do this!") + return 0 var/datum/vampire/vampire = user.mind.vampire @@ -30,18 +31,22 @@ var/fullpower = vampire.get_ability(/datum/vampire_passive/full) if(user.stat >= DEAD) - user << "Not when you're dead!" + to_chat(user, "Not when you're dead!") + return 0 if(vampire.nullified && !fullpower) - user << "Something is blocking your powers!" + to_chat(user, "Something is blocking your powers!") + return 0 if(vampire.bloodusable < required_blood) - user << "You require at least [required_blood] units of usable blood to do that!" + to_chat(user, "You require at least [required_blood] units of usable blood to do that!") + return 0 //chapel check if(istype(loc.loc, /area/chapel) && !fullpower) - user << "Your powers are useless on this holy ground." + to_chat(user, "Your powers are useless on this holy ground.") + return 0 return ..() @@ -105,7 +110,8 @@ targets.Cut() if(targets.len) - usr << "You have [vampire.bloodusable] left to use." + to_chat(usr, "You have [vampire.bloodusable] left to use.") + /obj/effect/proc_holder/spell/vampire/targetted/choose_targets(mob/user = usr) var/list/possible_targets[0] @@ -157,7 +163,8 @@ usr.SetStunned(0) usr.SetParalysis(0) U.adjustStaminaLoss(-75) - usr << "You flush your system with clean blood and remove any incapacitating effects." + to_chat(usr, "You flush your system with clean blood and remove any incapacitating effects.") + spawn(1) if(usr.mind.vampire.get_ability(/datum/vampire_passive/regen)) for(var/i = 1 to 5) @@ -178,17 +185,22 @@ usr.visible_message("[usr]'s eyes flash briefly as he stares into [target]'s eyes") if(do_mob(usr, target, 50)) if(!affects(target)) - usr << "Your piercing gaze fails to knock out [target]." - target << "\blue [usr]'s feeble gaze is ineffective." + to_chat(usr, "Your piercing gaze fails to knock out [target].") + + to_chat(target, "\blue [usr]'s feeble gaze is ineffective.") + else - usr << "Your piercing gaze knocks out [target]." - target << "You find yourself unable to move and barely able to speak." + to_chat(usr, "Your piercing gaze knocks out [target].") + + to_chat(target, "You find yourself unable to move and barely able to speak.") + target.Weaken(10) target.Stun(10) target.stuttering = 10 else revert_cast(usr) - usr << "You broke your gaze." + to_chat(usr, "You broke your gaze.") + /obj/effect/proc_holder/spell/vampire/targetted/disease name = "Diseased Touch (100)" @@ -199,10 +211,12 @@ /obj/effect/proc_holder/spell/vampire/targetted/disease/cast(list/targets) for(var/mob/living/carbon/target in targets) - usr << "You stealthily infect [target] with your diseased touch." + to_chat(usr, "You stealthily infect [target] with your diseased touch.") + target.help_shake_act(usr) if(!affects(target)) - usr << "They seem to be unaffected." + to_chat(usr, "They seem to be unaffected.") + continue var/datum/disease/D = new /datum/disease/appendicitis //someone should probably make a better virus for this target.ForceContractDisease(D) @@ -217,7 +231,8 @@ /obj/effect/proc_holder/spell/vampire/mob_aoe/glare/cast(list/targets) usr.visible_message("[usr]'s eyes emit a blinding flash!") if(istype(usr:glasses, /obj/item/clothing/glasses/sunglasses/blindfold)) - usr << "You're blindfolded!" + to_chat(usr, "You're blindfolded!") + return for(var/mob/living/target in targets) if(!affects(target)) @@ -225,7 +240,8 @@ target.Stun(5) target.Weaken(5) target.stuttering = 20 - target << "You are blinded by [usr]'s glare." + to_chat(target, "You are blinded by [usr]'s glare.") + /obj/effect/proc_holder/spell/vampire/self/shapeshift name = "Shapeshift (50)" @@ -257,7 +273,8 @@ continue if(!affects(C)) continue - C << "You hear a ear piercing shriek and your senses dull!" + to_chat(C, "You hear a ear piercing shriek and your senses dull!") + C.Weaken(4) C.ear_deaf = 20 C.stuttering = 20 @@ -277,16 +294,19 @@ /obj/effect/proc_holder/spell/vampire/targetted/enthrall/cast(list/targets) for(var/mob/living/target in targets) usr.visible_message("[usr] bites [target]'s neck!", "You bite [target]'s neck and begin the flow of power.") - target << "You feel the tendrils of evil invade your mind." + to_chat(target, "You feel the tendrils of evil invade your mind.") + if(!ishuman(target)) - usr << "You can only enthrall humans." + to_chat(usr, "You can only enthrall humans.") + break if(do_mob(usr, target, 50)) if(can_enthrall(usr, target)) handle_enthrall(usr, target) else revert_cast(usr) - usr << "You or your target either moved or you dont have enough usable blood." + to_chat(usr, "You or your target either moved or you dont have enough usable blood.") + /obj/effect/proc_holder/spell/vampire/targetted/enthrall/proc/can_enthrall(mob/living/user, mob/living/carbon/C) var/enthrall_safe = 0 @@ -302,7 +322,8 @@ log_to_dd("something bad happened on enthralling a mob, attacker is [user] [user.key] \ref[user]") return 0 if(!C.mind) - user << "[C.name]'s mind is not there for you to enthrall." + to_chat(user, "[C.name]'s mind is not there for you to enthrall.") + return 0 if(enthrall_safe || ( C.mind in ticker.mode.vampires )||( C.mind.vampire )||( C.mind in ticker.mode.vampire_enthralled )) C.visible_message("[C] seems to resist the takeover!", "You feel a familiar sensation in your skull that quickly dissipates.") @@ -310,7 +331,8 @@ if(!affects(C)) C.visible_message("[C] seems to resist the takeover!", "Your faith of [ticker.Bible_deity_name] has kept your mind clear of all evil.") if(!ishuman(C)) - user << "You can only enthrall humans!" + to_chat(user, "You can only enthrall humans!") + return 0 return 1 @@ -334,8 +356,10 @@ ticker.mode.vampire_enthralled.Add(H.mind) ticker.mode.vampire_enthralled[H.mind] = user.mind H.mind.special_role = "VampThrall" - H << "You have been Enthralled by [user]. Follow their every command." - src << "You have successfully Enthralled [H]. If they refuse to do as you say just adminhelp." + to_chat(H, "You have been Enthralled by [user]. Follow their every command.") + + to_chat(src, "You have successfully Enthralled [H]. If they refuse to do as you say just adminhelp.") + log_admin("[ckey(user.key)] has mind-slaved [ckey(H.key)].") /obj/effect/proc_holder/spell/vampire/self/cloak @@ -359,7 +383,8 @@ var/datum/vampire/V = usr.mind.vampire V.iscloaking = !V.iscloaking update_name() - usr << "You will now be [V.iscloaking ? "hidden" : "seen"] in darkness." + to_chat(usr, "You will now be [V.iscloaking ? "hidden" : "seen"] in darkness.") + /obj/effect/proc_holder/spell/vampire/bats name = "Summon Bats (75)" @@ -425,7 +450,8 @@ sleep(jaunt_duration) var/mobloc = get_turf(usr.loc) if(get_area(mobloc) == /area/security/armoury/gamma) - usr << "A strange energy repels you!" + to_chat(usr, "A strange energy repels you!") + mobloc = originalloc animation.loc = mobloc steam.location = mobloc @@ -485,7 +511,8 @@ if(!turfs.len) revert_cast(user) - user << "\red You cannot find darkness to step to." + to_chat(user, "\red You cannot find darkness to step to.") + return perform(turfs) diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index bce6194726a..1affe3be3e7 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -47,7 +47,8 @@ H.set_machine(src) if(href_list["school"]) if (used) - H << "You already used this contract!" + to_chat(H, "You already used this contract!") + return used = 1 var/list/candidates = pollCandidates("Do you want to play as the wizard apprentice of [H.real_name]?", ROLE_WIZARD, 1) @@ -56,25 +57,30 @@ new /obj/effect/effect/harmless_smoke(H.loc) var/mob/living/carbon/human/M = new/mob/living/carbon/human(H.loc) M.key = C.key - M << "You are the [H.real_name]'s apprentice! You are bound by magic contract to follow their orders and help them in accomplishing their goals." + to_chat(M, "You are the [H.real_name]'s apprentice! You are bound by magic contract to follow their orders and help them in accomplishing their goals.") + switch(href_list["school"]) if("destruction") M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile(M)) M.mind.AddSpell(new /obj/effect/proc_holder/spell/dumbfire/fireball(M)) - M << "Your service has not gone unrewarded, however. Studying under [H.real_name], you have learned powerful, destructive spells. You are able to cast magic missile and fireball." + to_chat(M, "Your service has not gone unrewarded, however. Studying under [H.real_name], you have learned powerful, destructive spells. You are able to cast magic missile and fireball.") + if("bluespace") M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(M)) M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(M)) - M << "Your service has not gone unrewarded, however. Studying under [H.real_name], you have learned reality bending mobility spells. You are able to cast teleport and ethereal jaunt." + to_chat(M, "Your service has not gone unrewarded, however. Studying under [H.real_name], you have learned reality bending mobility spells. You are able to cast teleport and ethereal jaunt.") + if("healing") M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/charge(M)) M.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/forcewall(M)) M.equip_to_slot_or_del(new /obj/item/weapon/gun/magic/staff/healing(M), slot_r_hand) - M << "Your service has not gone unrewarded, however. Studying under [H.real_name], you have learned livesaving survival spells. You are able to cast charge and forcewall." + to_chat(M, "Your service has not gone unrewarded, however. Studying under [H.real_name], you have learned livesaving survival spells. You are able to cast charge and forcewall.") + if("robeless") M.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(M)) M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/mind_transfer(M)) - M << "Your service has not gone unrewarded, however. Studying under [H.real_name], you have learned stealthy, robeless spells. You are able to cast knock and mindswap." + to_chat(M, "Your service has not gone unrewarded, however. Studying under [H.real_name], you have learned stealthy, robeless spells. You are able to cast knock and mindswap.") + M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) M.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(M), slot_w_uniform) @@ -105,7 +111,8 @@ M.faction = list("wizard") else used = 0 - H << "Unable to reach your apprentice! You can either attack the spellbook with the contract to refund your points, or wait and try again later." + to_chat(H, "Unable to reach your apprentice! You can either attack the spellbook with the contract to refund your points, or wait and try again later.") + return @@ -133,7 +140,8 @@ charged = 0 user.visible_message("[src] hums with power as [user] deals a blow to [activate_descriptor] itself!") else - user << "The unearthly energies that powered the blade are now dormant." + to_chat(user, "The unearthly energies that powered the blade are now dormant.") + /obj/effect/rend @@ -212,7 +220,8 @@ hitsound = 'sound/items/welder2.ogg' /obj/item/weapon/scrying/attack_self(mob/user as mob) - user << " You can see...everything!" + to_chat(user, " You can see...everything!") + visible_message("[user] stares into [src], their eyes glazing over.") user.ghostize(1) @@ -254,13 +263,15 @@ var/global/list/multiverse = list() /obj/item/weapon/multisword/attack(mob/living/M as mob, mob/living/user as mob) //to prevent accidental friendly fire or out and out grief. if(M.real_name == user.real_name) - user << "The [src] detects benevolent energies in your target and redirects your attack!" + to_chat(user, "The [src] detects benevolent energies in your target and redirects your attack!") + return ..() /obj/item/weapon/multisword/attack_self(mob/user) if(user.mind.special_role == "apprentice") - user << "You know better than to touch your teacher's stuff." + to_chat(user, "You know better than to touch your teacher's stuff.") + return if(cooldown < world.time) var/faction_check = 0 @@ -272,24 +283,29 @@ var/global/list/multiverse = list() faction = list("[user.real_name]") assigned = "[user.real_name]" user.faction = list("[user.real_name]") - user << "You bind the sword to yourself. You can now use it to summon help." + to_chat(user, "You bind the sword to yourself. You can now use it to summon help.") + if(!usr.mind.special_role) if(prob(probability_evil)) - user << "With your new found power you could easily conquer the station!" + to_chat(user, "With your new found power you could easily conquer the station!") + var/datum/objective/hijackclone/hijack_objective = new /datum/objective/hijackclone hijack_objective.owner = usr.mind usr.mind.objectives += hijack_objective hijack_objective.explanation_text = "Ensure only [usr.real_name] and their copies are on the shuttle!" - usr << "Objective #[1]: [hijack_objective.explanation_text]" + to_chat(usr, "Objective #[1]: [hijack_objective.explanation_text]") + ticker.mode.traitors += usr.mind usr.mind.special_role = "[usr.real_name] Prime" evil = TRUE else - user << "With your new found power you could easily defend the station!" + to_chat(user, "With your new found power you could easily defend the station!") + var/datum/objective/survive/new_objective = new /datum/objective/survive new_objective.owner = usr.mind new_objective.explanation_text = "Survive, and help defend the innocent from the mobs of multiverse clones." - usr << "Objective #[1]: [new_objective.explanation_text]" + to_chat(usr, "Objective #[1]: [new_objective.explanation_text]") + usr.mind.objectives += new_objective ticker.mode.traitors += usr.mind usr.mind.special_role = "[usr.real_name] Prime" @@ -304,12 +320,15 @@ var/global/list/multiverse = list() if(candidates.len) var/mob/C = pick(candidates) spawn_copy(C.client, get_turf(user.loc), user) - user << "The sword flashes, and you find yourself face to face with...you!" + to_chat(user, "The sword flashes, and you find yourself face to face with...you!") + else - user << "You fail to summon any copies of yourself. Perhaps you should try again in a bit." + to_chat(user, "You fail to summon any copies of yourself. Perhaps you should try again in a bit.") + else - user << "[src] is recharging! Keep in mind it shares a cooldown with the swords wielded by your copies." + to_chat(user, "[src] is recharging! Keep in mind it shares a cooldown with the swords wielded by your copies.") + /obj/item/weapon/multisword/proc/spawn_copy(var/client/C, var/turf/T, mob/user) @@ -320,7 +339,8 @@ var/global/list/multiverse = list() C.prefs.copy_to(M) M.key = C.key M.mind.name = user.real_name - M << "You are an alternate version of [user.real_name] from another universe! Help them accomplish their goals at all costs." + to_chat(M, "You are an alternate version of [user.real_name] from another universe! Help them accomplish their goals at all costs.") + M.faction = list("[user.real_name]") if(duplicate_self) M.set_species(user.get_species()) //duplicate the sword user's species. @@ -345,7 +365,8 @@ var/global/list/multiverse = list() hijack_objective.owner = M.mind M.mind.objectives += hijack_objective hijack_objective.explanation_text = "Ensure only [usr.real_name] and their copies are on the shuttle!" - M << "Objective #[1]: [hijack_objective.explanation_text]" + to_chat(M, "Objective #[1]: [hijack_objective.explanation_text]") + M.mind.special_role = "multiverse traveller" log_game("[M.key] was made a multiverse traveller with the objective to help [usr.real_name] hijack.") else @@ -354,7 +375,8 @@ var/global/list/multiverse = list() new_objective.target = usr.mind new_objective.explanation_text = "Protect [usr.real_name], your copy, and help them defend the innocent from the mobs of multiverse clones." M.mind.objectives += new_objective - M << "Objective #[1]: [new_objective.explanation_text]" + to_chat(M, "Objective #[1]: [new_objective.explanation_text]") + M.mind.special_role = "multiverse traveller" log_game("[M.key] was made a multiverse traveller with the objective to help [usr.real_name] protect the station.") @@ -629,17 +651,20 @@ var/global/list/multiverse = list() return if(M.stat != DEAD) - user << "This artifact can only affect the dead!" + to_chat(user, "This artifact can only affect the dead!") + return if(!M.mind || !M.client) - user << "There is no soul connected to this body..." + to_chat(user, "There is no soul connected to this body...") + return check_spooky()//clean out/refresh the list if(spooky_scaries.len >= 3 && !unlimited) - user << "This artifact can only affect three undead at a time!" + to_chat(user, "This artifact can only affect three undead at a time!") + return if(heresy) spawnheresy(M)//oh god why @@ -649,8 +674,10 @@ var/global/list/multiverse = list() M.revive() equip_skeleton(M) spooky_scaries |= M - M << "You have been revived by [user.real_name]!" - M << "They are your master now, assist them even if it costs you your new life!" + to_chat(M, "You have been revived by [user.real_name]!") + + to_chat(M, "They are your master now, assist them even if it costs you your new life!") + desc = "A shard capable of resurrecting humans as skeleton thralls[unlimited ? "." : ", [spooky_scaries.len]/3 active thralls."]" /obj/item/device/necromantic_stone/proc/check_spooky() @@ -773,16 +800,20 @@ var/global/list/multiverse = list() /obj/item/voodoo/attackby(obj/item/I as obj, mob/user as mob, params) if(target && cooldown < world.time) if(is_hot(I)) - target << "You suddenly feel very hot" + to_chat(target, "You suddenly feel very hot") + target.bodytemperature += 50 GiveHint(target) else if(can_puncture(I)) - target << "You feel a stabbing pain in [parse_zone(user.zone_sel.selecting)]!" + to_chat(target, "You feel a stabbing pain in [parse_zone(user.zone_sel.selecting)]!") + target.Weaken(2) GiveHint(target) else if(istype(I,/obj/item/weapon/bikehorn)) - target << "HONK" - target << 'sound/items/AirHorn.ogg' + to_chat(target, "HONK") + + to_chat(target, 'sound/items/AirHorn.ogg') + target.ear_damage += rand(0,3) GiveHint(target) cooldown = world.time +cooldown_time @@ -792,7 +823,8 @@ var/global/list/multiverse = list() user.drop_item() I.loc = src link = I - user << "You attach [I] to the doll." + to_chat(user, "You attach [I] to the doll.") + update_targets() ..() /obj/item/voodoo/check_eye(mob/user as mob) @@ -806,7 +838,8 @@ var/global/list/multiverse = list() if(link) target = null link.loc = get_turf(src) - user << "You remove the [link] from the doll." + to_chat(user, "You remove the [link] from the doll.") + link = null update_targets() return @@ -825,7 +858,8 @@ var/global/list/multiverse = list() user.reset_view() user.unset_machine() if("r_leg","l_leg") - user << "You move the doll's legs around." + to_chat(user, "You move the doll's legs around.") + var/turf/T = get_step(target,pick(cardinal)) target.Move(T) if("r_arm","l_arm") @@ -840,9 +874,11 @@ var/global/list/multiverse = list() target.ClickOn(T) GiveHint(target) if("head") - user << "You smack the doll's head with your hand." + to_chat(user, "You smack the doll's head with your hand.") + target.Dizzy(10) - target << "You suddenly feel as if your head was hit with a hammer!" + to_chat(target, "You suddenly feel as if your head was hit with a hammer!") + GiveHint(target,user) cooldown = world.time + cooldown_time @@ -857,10 +893,12 @@ var/global/list/multiverse = list() /obj/item/voodoo/proc/GiveHint(mob/victim,force=0) if(prob(50) || force) var/way = dir2text(get_dir(victim,get_turf(src))) - victim << "You feel a dark presence from [way]" + to_chat(victim, "You feel a dark presence from [way]") + if(prob(20) || force) var/area/A = get_area(src) - victim << "You feel a dark presence from [A.name]" + to_chat(victim, "You feel a dark presence from [A.name]") + /obj/item/voodoo/fire_act() if(target) diff --git a/code/game/gamemodes/wizard/godhand.dm b/code/game/gamemodes/wizard/godhand.dm index 2bab01e5ec5..b098b6bc84d 100644 --- a/code/game/gamemodes/wizard/godhand.dm +++ b/code/game/gamemodes/wizard/godhand.dm @@ -22,7 +22,8 @@ if(!iscarbon(user)) //Look ma, no hands return if(user.lying || user.handcuffed) - user << "You can't reach out!" + to_chat(user, "You can't reach out!") + return ..() @@ -62,7 +63,8 @@ if(!proximity || target == user || !ismob(target) || !iscarbon(user) || user.lying || user.handcuffed) //getting hard after touching yourself would also be bad return if(user.lying || user.handcuffed) - user << "You can't reach out!" + to_chat(user, "You can't reach out!") + return var/mob/M = target M.Stun(2) diff --git a/code/game/gamemodes/wizard/raginmages.dm b/code/game/gamemodes/wizard/raginmages.dm index a3d927970de..c1f8675ecc2 100644 --- a/code/game/gamemodes/wizard/raginmages.dm +++ b/code/game/gamemodes/wizard/raginmages.dm @@ -14,20 +14,26 @@ var/time_till_chaos = 18000 // Half-hour in /datum/game_mode/wizard/raginmages/announce() - world << "The current game mode is - Ragin' Mages!" - world << "The \red Space Wizard Federation\black is pissed, help defeat all the space wizards!" + to_chat(world, "The current game mode is - Ragin' Mages!") + + to_chat(world, "The \red Space Wizard Federation\black is pissed, help defeat all the space wizards!") + /datum/game_mode/wizard/raginmages/greet_wizard(var/datum/mind/wizard, var/you_are=1) if (you_are) - wizard.current << "\red You are the Space Wizard!" - wizard.current << "The Space Wizards Federation has given you the following tasks:" + to_chat(wizard.current, "\red You are the Space Wizard!") + + to_chat(wizard.current, "The Space Wizards Federation has given you the following tasks:") + var/obj_count = 1 for(var/datum/objective/objective in wizard.objectives) - wizard.current << "Objective #[obj_count]: [objective.explanation_text]" + to_chat(wizard.current, "Objective #[obj_count]: [objective.explanation_text]") + obj_count++ - wizard.current << "Objective Alpha: Make sure the station pays for its actions against our diplomats" + to_chat(wizard.current, "Objective Alpha: Make sure the station pays for its actions against our diplomats") + return /datum/game_mode/wizard/raginmages/check_finished() @@ -39,34 +45,40 @@ continue if(!istype(wizard.current,/mob/living/carbon)) if(istype(get_area(wizard.current), /area/wizard_station)) // We don't want people camping other wizards - wizard.current << "If there aren't any admins on and another wizard is camping you in the wizard lair, report them on the forums" + to_chat(wizard.current, "If there aren't any admins on and another wizard is camping you in the wizard lair, report them on the forums") + message_admins("[wizard.current] was transformed in the wizard lair, another wizard is likely camping") end_squabble(get_area(wizard.current)) continue if(istype(wizard.current,/mob/living/carbon/brain)) if(istype(get_area(wizard.current), /area/wizard_station)) // We don't want people camping other wizards - wizard.current << "If there aren't any admins on and another wizard is camping you in the wizard lair, report them on the forums" + to_chat(wizard.current, "If there aren't any admins on and another wizard is camping you in the wizard lair, report them on the forums") + message_admins("[wizard.current] was brainified in the wizard lair, another wizard is likely camping") end_squabble(get_area(wizard.current)) continue if(wizard.current.stat==DEAD) if(istype(get_area(wizard.current), /area/wizard_station)) // We don't want people camping other wizards - wizard.current << "If there aren't any admins on and another wizard is camping you in the wizard lair, report them on the forums" + to_chat(wizard.current, "If there aren't any admins on and another wizard is camping you in the wizard lair, report them on the forums") + message_admins("[wizard.current] died in the wizard lair, another wizard is likely camping") end_squabble(get_area(wizard.current)) continue if(wizard.current.stat==UNCONSCIOUS) if(wizard.current.health < 0) if(istype(get_area(wizard.current), /area/wizard_station)) - wizard.current << "If there aren't any admins on and another wizard is camping you in the wizard lair, report them on the forums" + to_chat(wizard.current, "If there aren't any admins on and another wizard is camping you in the wizard lair, report them on the forums") + message_admins("[wizard.current] went into crit in the wizard lair, another wizard is likely camping") end_squabble(get_area(wizard.current)) else - wizard.current << "\red The Space Wizard Federation is upset with your performance and have terminated your employment." + to_chat(wizard.current, "\red The Space Wizard Federation is upset with your performance and have terminated your employment.") + wizard.current.gib() // *REAL* ACTION!! *REAL* DRAMA!! *REAL* BLOODSHED!! continue if(wizard.current.client && wizard.current.client.is_afk() > 10 * 60 * 10) // 10 minutes - wizard.current << "\red The Space Wizard Federation is upset with your performance and have terminated your employment." + to_chat(wizard.current, "\red The Space Wizard Federation is upset with your performance and have terminated your employment.") + wizard.current.gib() // Let's keep the round moving continue if(!wizard.current.client) @@ -100,7 +112,8 @@ marked_for_death |= M.current for(var/mob/living/L in marked_for_death) if(L.stat == CONSCIOUS) // Probably a troublemaker - I'd like to see YOU fight when unconscious - L << "STOP FIGHTING." + to_chat(L, "STOP FIGHTING.") + L.ghostize() if(istype(L, /mob/living/carbon/brain)) // diediedie @@ -184,5 +197,6 @@ /datum/game_mode/wizard/raginmages/declare_completion() if(finished) feedback_set_details("round_end_result","loss - wizard killed") - world << "\red The crew has managed to hold off the wizard attack! The Space Wizards Federation has been taught a lesson they will not soon forget!" + to_chat(world, "\red The crew has managed to hold off the wizard attack! The Space Wizards Federation has been taught a lesson they will not soon forget!") + ..(1) diff --git a/code/game/gamemodes/wizard/rightandwrong.dm b/code/game/gamemodes/wizard/rightandwrong.dm index b6052320615..14cdf7e94cc 100644 --- a/code/game/gamemodes/wizard/rightandwrong.dm +++ b/code/game/gamemodes/wizard/rightandwrong.dm @@ -5,7 +5,8 @@ var/list/magiclist = list("fireball","smoke","blind","mindswap","forcewall","knock","horsemask","charge", "summonitem", "wandnothing", "wanddeath", "wandresurrection", "wandpolymorph", "wandteleport", "wanddoor", "wandfireball", "staffhealing", "armor", "scrying", "staffdoor", "special","voodoo","special") var/list/magicspeciallist = list("staffchange","staffanimation", "wandbelt", "contract", "staffchaos","necromantic") - usr << "You summoned [summon_type ? "magic" : "guns"]!" + to_chat(usr, "You summoned [summon_type ? "magic" : "guns"]!") + message_admins("[key_name_admin(usr)] summoned [summon_type ? "magic" : "guns"]!") for(var/mob/living/carbon/human/H in player_list) @@ -136,7 +137,8 @@ H.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS) H.see_in_dark = 8 H.see_invisible = SEE_INVISIBLE_LEVEL_TWO - H << "The walls suddenly disappear." + to_chat(H, "The walls suddenly disappear.") + if("voodoo") new /obj/item/voodoo(get_turf(H)) if("special") @@ -154,4 +156,5 @@ new /obj/item/weapon/gun/magic/staff/chaos(get_turf(H)) if("necromantic") new /obj/item/device/necromantic_stone(get_turf(H)) - H << "You suddenly feel lucky." + to_chat(H, "You suddenly feel lucky.") + diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm index d7dcc2287a6..9ab912a5ce5 100644 --- a/code/game/gamemodes/wizard/soulstone.dm +++ b/code/game/gamemodes/wizard/soulstone.dm @@ -19,11 +19,13 @@ return ..() if(M.has_brain_worms()) //Borer stuff - RR - user << "This being is corrupted by an alien intelligence and cannot be soul trapped." + to_chat(user, "This being is corrupted by an alien intelligence and cannot be soul trapped.") + return ..() - + if(jobban_isbanned(M, "cultist") || jobban_isbanned(M, "Syndicate")) - user << "A mysterious force prevents you from trapping this being's soul." + to_chat(user, "A mysterious force prevents you from trapping this being's soul.") + return ..() M.attack_log += text("\[[time_stamp()]\] Has had their soul captured with [src.name] by [key_name(user)]") @@ -81,7 +83,8 @@ for(var/mob/living/simple_animal/shade/A in src) A.status_flags &= ~GODMODE A.canmove = 1 - A << "You have been released from your prison, but you are still bound to [U.name]'s will. Help them suceed in their goals at all costs." + to_chat(A, "You have been released from your prison, but you are still bound to [U.name]'s will. Help them suceed in their goals at all costs.") + A.loc = U.loc A.cancel_camera() src.icon_state = "soulstone" @@ -108,16 +111,20 @@ var/mob/living/carbon/human/T = target var/obj/item/device/soulstone/C = src if(C.imprinted != "empty") - U << "\red Capture failed!: \black The soul stone has already been imprinted with [C.imprinted]'s mind!" + to_chat(U, "\red Capture failed!: \black The soul stone has already been imprinted with [C.imprinted]'s mind!") + else if (T.stat == 0) - U << "\red Capture failed!: \black Kill or maim the victim first!" + to_chat(U, "\red Capture failed!: \black Kill or maim the victim first!") + else if(T.client == null) - U << "\red Capture failed!: \black The soul has already fled it's mortal frame." + to_chat(U, "\red Capture failed!: \black The soul has already fled it's mortal frame.") + else if(C.contents.len) - U << "\red Capture failed!: \black The soul stone is full! Use or free an existing soul to make room." + to_chat(U, "\red Capture failed!: \black The soul stone is full! Use or free an existing soul to make room.") + else for(var/obj/item/W in T) T.unEquip(W) @@ -141,22 +148,28 @@ S.cancel_camera() C.icon_state = "soulstone2" C.name = "Soul Stone: [S.real_name]" - S << "Your soul has been captured! You are now bound to [U.name]'s will, help them suceed in their goals at all costs." - U << "\blue Capture successful!: \black [T.real_name]'s soul has been ripped from their body and stored within the soul stone." - U << "The soulstone has been imprinted with [S.real_name]'s mind, it will no longer react to other souls." + to_chat(S, "Your soul has been captured! You are now bound to [U.name]'s will, help them suceed in their goals at all costs.") + + to_chat(U, "\blue Capture successful!: \black [T.real_name]'s soul has been ripped from their body and stored within the soul stone.") + + to_chat(U, "The soulstone has been imprinted with [S.real_name]'s mind, it will no longer react to other souls.") + C.imprinted = "[S.name]" qdel(T) if("SHADE") var/mob/living/simple_animal/shade/T = target var/obj/item/device/soulstone/C = src if (T.stat == DEAD) - U << "\red Capture failed!: \black The shade has already been banished!" + to_chat(U, "\red Capture failed!: \black The shade has already been banished!") + else if(C.contents.len) - U << "\red Capture failed!: \black The soul stone is full! Use or free an existing soul to make room." + to_chat(U, "\red Capture failed!: \black The soul stone is full! Use or free an existing soul to make room.") + else if(T.name != C.imprinted) - U << "\red Capture failed!: \black The soul stone has already been imprinted with [C.imprinted]'s mind!" + to_chat(U, "\red Capture failed!: \black The soul stone has already been imprinted with [C.imprinted]'s mind!") + else T.loc = C //put shade in stone T.status_flags |= GODMODE @@ -164,8 +177,10 @@ T.health = T.maxHealth T.faction |= "\ref[U]" C.icon_state = "soulstone2" - T << "Your soul has been recaptured by the soul stone, its arcane energies are reknitting your ethereal form" - U << "\blue Capture successful!: \black [T.name]'s has been recaptured and stored within the soul stone." + to_chat(T, "Your soul has been recaptured by the soul stone, its arcane energies are reknitting your ethereal form") + + to_chat(U, "\blue Capture successful!: \black [T.name]'s has been recaptured and stored within the soul stone.") + if("CONSTRUCT") var/obj/structure/constructshell/T = target var/obj/item/device/soulstone/C = src @@ -184,8 +199,10 @@ ticker.mode.cult+=Z.mind ticker.mode.update_cult_icons_added(Z.mind) qdel(T) - Z << "You are a Juggernaut. Though slow, your shell can withstand extreme punishment, create shield walls and even deflect energy weapons, and rip apart enemies and walls alike." - Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs." + to_chat(Z, "You are a Juggernaut. Though slow, your shell can withstand extreme punishment, create shield walls and even deflect energy weapons, and rip apart enemies and walls alike.") + + to_chat(Z, "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.") + Z.cancel_camera() qdel(C) @@ -200,8 +217,10 @@ ticker.mode.cult+=Z.mind ticker.mode.update_cult_icons_added(Z.mind) qdel(T) - Z << "You are a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls." - Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs." + to_chat(Z, "You are a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls.") + + to_chat(Z, "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.") + Z.cancel_camera() qdel(C) @@ -216,12 +235,15 @@ ticker.mode.cult+=Z.mind ticker.mode.update_cult_icons_added(Z.mind) qdel(T) - Z << "You are an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, use magic missile, repair allied constructs (by clicking on them), and most important of all create new constructs (Use your Artificer spell to summon a new construct shell and Summon Soulstone to create a new soulstone)." - Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs." + to_chat(Z, "You are an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, use magic missile, repair allied constructs (by clicking on them), and most important of all create new constructs (Use your Artificer spell to summon a new construct shell and Summon Soulstone to create a new soulstone).") + + to_chat(Z, "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.") + Z.cancel_camera() qdel(C) else - U << "\red Creation failed!: \black The soul stone is empty! Go kill someone!" + to_chat(U, "\red Creation failed!: \black The soul stone is empty! Go kill someone!") + return /proc/makeNewConstruct(var/mob/living/simple_animal/construct/ctype, var/mob/target, var/mob/stoner = null, cultoverride = 0) @@ -237,8 +259,12 @@ ticker.mode.cult+=newstruct.mind ticker.mode.update_cult_icons_added(newstruct.mind) if(stoner && iswizard(stoner)) - newstruct << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs." + to_chat(newstruct, "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.") + else if(stoner && iscultist(stoner)) - newstruct << "You are still bound to serve the cult, follow their orders and help them complete their goals at all costs." - else newstruct << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs." + to_chat(newstruct, "You are still bound to serve the cult, follow their orders and help them complete their goals at all costs.") + + else + to_chat(newstruct, "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.") + newstruct.cancel_camera() \ No newline at end of file diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 7422d610fb9..e206e670527 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -26,7 +26,8 @@ for(var/obj/effect/proc_holder/spell/aspell in user.mind.spell_list) if(initial(S.name) == initial(aspell.name)) // Not using directly in case it was learned from one spellbook then upgraded in another if(aspell.spell_level >= aspell.level_max) - user << "This spell cannot be improved further." + to_chat(user, "This spell cannot be improved further.") + return 0 else aspell.name = initial(aspell.name) @@ -36,24 +37,30 @@ aspell.charge_counter = aspell.charge_max switch(aspell.spell_level) if(1) - user << "You have improved [aspell.name] into Efficient [aspell.name]." + to_chat(user, "You have improved [aspell.name] into Efficient [aspell.name].") + aspell.name = "Efficient [aspell.name]" if(2) - user << "You have further improved [aspell.name] into Quickened [aspell.name]." + to_chat(user, "You have further improved [aspell.name] into Quickened [aspell.name].") + aspell.name = "Quickened [aspell.name]" if(3) - user << "You have further improved [aspell.name] into Free [aspell.name]." + to_chat(user, "You have further improved [aspell.name] into Free [aspell.name].") + aspell.name = "Free [aspell.name]" if(4) - user << "You have further improved [aspell.name] into Instant [aspell.name]." + to_chat(user, "You have further improved [aspell.name] into Instant [aspell.name].") + aspell.name = "Instant [aspell.name]" if(aspell.spell_level >= aspell.level_max) - user << "This spell cannot be strengthened any further." + to_chat(user, "This spell cannot be strengthened any further.") + return 1 //No same spell found - just learn it feedback_add_details("wizard_spell_learned",log_name) user.mind.AddSpell(S) - user << "You have learned [S.name]." + to_chat(user, "You have learned [S.name].") + return 1 /datum/spellbook_entry/proc/CanRefund(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book) @@ -69,7 +76,8 @@ /datum/spellbook_entry/proc/Refund(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book) //return point value or -1 for failure var/area/wizard_station/A = locate() if(!(user in A.contents)) - user << "You can only refund spells at the wizard lair" + to_chat(user, "You can only refund spells at the wizard lair") + return -1 if(!S) S = new spell_type() @@ -303,7 +311,8 @@ user.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS) user.see_in_dark = 8 user.see_invisible = SEE_INVISIBLE_LEVEL_TWO - user << "\blue The walls suddenly disappear." + to_chat(user, "\blue The walls suddenly disappear.") + return 1 @@ -425,7 +434,8 @@ user.rightandwrong(0) book.uses += 1 active = 1 - user << "You have cast summon guns and gained an extra charge for your spellbook." + to_chat(user, "You have cast summon guns and gained an extra charge for your spellbook.") + return 1 /datum/spellbook_entry/summon/magic @@ -448,7 +458,8 @@ user.rightandwrong(1) book.uses += 1 active = 1 - user << "You have cast summon magic and gained an extra charge for your spellbook." + to_chat(user, "You have cast summon magic and gained an extra charge for your spellbook.") + return 1 /obj/item/weapon/spellbook @@ -486,16 +497,19 @@ if(istype(O, /obj/item/weapon/contract)) var/obj/item/weapon/contract/contract = O if(contract.used) - user << "The contract has been used, you can't get your points back now!" + to_chat(user, "The contract has been used, you can't get your points back now!") + else - user << "You feed the contract back into the spellbook, refunding your points." + to_chat(user, "You feed the contract back into the spellbook, refunding your points.") + uses++ qdel(O) if(istype(O, /obj/item/weapon/antag_spawner/slaughter_demon)) - user << "On second thought, maybe summoning a demon is a bad idea. You refund your points." + to_chat(user, "On second thought, maybe summoning a demon is a bad idea. You refund your points.") + uses++ for(var/datum/spellbook_entry/item/bloodbottle/BB in entries) @@ -555,11 +569,13 @@ /obj/item/weapon/spellbook/attack_self(mob/user as mob) if(!owner) - user << "You bind the spellbook to yourself." + to_chat(user, "You bind the spellbook to yourself.") + owner = user return if(user != owner) - user << "The [name] does not recognize you as it's owner and refuses to open!" + to_chat(user, "The [name] does not recognize you as it's owner and refuses to open!") + return user.set_machine(src) var/dat = "" @@ -656,15 +672,18 @@ if(knownspell.type == S.type) if(user.mind) if(user.mind.special_role == "apprentice" || user.mind.special_role == "Wizard") - user <<"You're already far more versed in this spell than this flimsy how-to book can provide." + to_chat(user, "You're already far more versed in this spell than this flimsy how-to book can provide.") + else - user <<"You've already read this one." + to_chat(user, "You've already read this one.") + return if(used) recoil(user) else user.mind.AddSpell(S) - user <<"you rapidly read through the arcane book. Suddenly you realize you understand [spellname]!" + to_chat(user, "you rapidly read through the arcane book. Suddenly you realize you understand [spellname]!") + user.attack_log += text("\[[time_stamp()]\] [user.real_name] ([user.ckey]) learned the spell [spellname] ([S]).") onlearned(user) @@ -698,7 +717,8 @@ /obj/item/weapon/spellbook/oneuse/smoke/recoil(mob/user as mob) ..() - user <<"Your stomach rumbles..." + to_chat(user, "Your stomach rumbles...") + if(user.nutrition) user.nutrition -= 200 if(user.nutrition <= 0) @@ -712,7 +732,8 @@ /obj/item/weapon/spellbook/oneuse/blind/recoil(mob/user as mob) ..() - user <<"You go blind!" + to_chat(user, "You go blind!") + user.eye_blind = 10 /obj/item/weapon/spellbook/oneuse/mindswap @@ -734,10 +755,12 @@ stored_swap = null if(!stored_swap) stored_swap = user - user <<"For a moment you feel like you don't even know who you are anymore." + to_chat(user, "For a moment you feel like you don't even know who you are anymore.") + return if(stored_swap == user) - user <<"You stare at the book some more, but there doesn't seem to be anything else to learn..." + to_chat(user, "You stare at the book some more, but there doesn't seem to be anything else to learn...") + return if(user.mind.special_verbs.len) @@ -766,8 +789,10 @@ for(var/V in user.mind.special_verbs) user.verbs += V - stored_swap <<"You're suddenly somewhere else... and someone else?!" - user <<"Suddenly you're staring at [src] again... where are you, who are you?!" + to_chat(stored_swap, "You're suddenly somewhere else... and someone else?!") + + to_chat(user, "Suddenly you're staring at [src] again... where are you, who are you?!") + stored_swap = null /obj/item/weapon/spellbook/oneuse/forcewall @@ -778,7 +803,8 @@ /obj/item/weapon/spellbook/oneuse/forcewall/recoil(mob/user as mob) ..() - user <<"You suddenly feel very solid!" + to_chat(user, "You suddenly feel very solid!") + var/obj/structure/closet/statue/S = new /obj/structure/closet/statue(user.loc, user) S.timer = 30 user.drop_item() @@ -792,7 +818,8 @@ /obj/item/weapon/spellbook/oneuse/knock/recoil(mob/user as mob) ..() - user <<"You're knocked down!" + to_chat(user, "You're knocked down!") + user.Weaken(20) /obj/item/weapon/spellbook/oneuse/horsemask @@ -803,7 +830,8 @@ /obj/item/weapon/spellbook/oneuse/horsemask/recoil(mob/living/carbon/user as mob) if(istype(user, /mob/living/carbon/human)) - user <<"HOR-SIE HAS RISEN" + to_chat(user, "HOR-SIE HAS RISEN") + var/obj/item/clothing/mask/horsehead/magichead = new /obj/item/clothing/mask/horsehead magichead.flags |= NODROP //curses! magichead.flags_inv = null //so you can still see their face @@ -813,7 +841,8 @@ user.equip_to_slot_if_possible(magichead, slot_wear_mask, 1, 1) qdel(src) else - user <<"I say thee neigh" + to_chat(user, "I say thee neigh") + /obj/item/weapon/spellbook/oneuse/charge spell = /obj/effect/proc_holder/spell/targeted/charge @@ -823,7 +852,8 @@ /obj/item/weapon/spellbook/oneuse/charge/recoil(mob/user as mob) ..() - user <<"[src] suddenly feels very warm!" + to_chat(user, "[src] suddenly feels very warm!") + empulse(src, 1, 1) /obj/item/weapon/spellbook/oneuse/summonitem @@ -834,7 +864,8 @@ /obj/item/weapon/spellbook/oneuse/summonitem/recoil(mob/user as mob) ..() - user <<"[src] suddenly vanishes!" + to_chat(user, "[src] suddenly vanishes!") + qdel(src) diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index 37a6c801573..e3a5aadc676 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -17,8 +17,10 @@ var/but_wait_theres_more = 0 /datum/game_mode/wizard/announce() - world << "The current game mode is - Wizard!" - world << "There is a \red SPACE WIZARD\black on the station. You can't let him achieve his objective!" + to_chat(world, "The current game mode is - Wizard!") + + to_chat(world, "There is a \red SPACE WIZARD\black on the station. You can't let him achieve his objective!") + /datum/game_mode/wizard/can_start()//This could be better, will likely have to recode it later @@ -35,7 +37,8 @@ wizard.special_role = "Wizard" wizard.original = wizard.current if(wizardstart.len == 0) - wizard.current << "\red A starting location for you could not be found, please report this bug!" + to_chat(wizard.current, "\red A starting location for you could not be found, please report this bug!") + return 0 return 1 @@ -147,12 +150,15 @@ /datum/game_mode/proc/greet_wizard(var/datum/mind/wizard, var/you_are=1) if (you_are) - wizard.current << "\red You are the Space Wizard!" - wizard.current << "The Space Wizards Federation has given you the following tasks:" + to_chat(wizard.current, "\red You are the Space Wizard!") + + to_chat(wizard.current, "The Space Wizards Federation has given you the following tasks:") + var/obj_count = 1 for(var/datum/objective/objective in wizard.objectives) - wizard.current << "Objective #[obj_count]: [objective.explanation_text]" + to_chat(wizard.current, "Objective #[obj_count]: [objective.explanation_text]") + obj_count++ return @@ -195,8 +201,10 @@ wizard_mob.species.equip(wizard_mob) - wizard_mob << "You will find a list of available spells in your spell book. Choose your magic arsenal carefully." - wizard_mob << "In your pockets you will find a teleport scroll. Use it as needed." + to_chat(wizard_mob, "You will find a list of available spells in your spell book. Choose your magic arsenal carefully.") + + to_chat(wizard_mob, "In your pockets you will find a teleport scroll. Use it as needed.") + wizard_mob.mind.store_memory("Remember: do not forget to prepare your spells.") wizard_mob.update_icons() return 1 @@ -231,7 +239,8 @@ /datum/game_mode/wizard/declare_completion(var/ragin = 0) if(finished && !ragin) feedback_set_details("round_end_result","loss - wizard killed") - world << "\red The wizard[(wizards.len>1)?"s":""] has been killed by the crew! The Space Wizards Federation has been taught a lesson they will not soon forget!" + to_chat(world, "\red The wizard[(wizards.len>1)?"s":""] has been killed by the crew! The Space Wizards Federation has been taught a lesson they will not soon forget!") + ..() return 1 @@ -282,7 +291,8 @@ i++ text += "
      " - world << text + to_chat(world, text) + return 1 //OTHER PROCS @@ -307,13 +317,16 @@ Made a proc so this is not repeated 14 (or more) times.*/ /mob/proc/casting() //Removed the stat check because not all spells require clothing now. if(!istype(usr:wear_suit, /obj/item/clothing/suit/wizrobe)) - usr << "I don't feel strong enough without my robe." + to_chat(usr, "I don't feel strong enough without my robe.") + return 0 if(!istype(usr:shoes, /obj/item/clothing/shoes/sandal)) - usr << "I don't feel strong enough without my sandals." + to_chat(usr, "I don't feel strong enough without my sandals.") + return 0 if(!istype(usr:head, /obj/item/clothing/head/wizard)) - usr << "I don't feel strong enough without my hat." + to_chat(usr, "I don't feel strong enough without my hat.") + return 0 else return 1 diff --git a/code/game/gamemodes/xenos/xenos.dm b/code/game/gamemodes/xenos/xenos.dm index 4ae05c7dd21..fef97333f9c 100644 --- a/code/game/gamemodes/xenos/xenos.dm +++ b/code/game/gamemodes/xenos/xenos.dm @@ -18,8 +18,10 @@ var/gammaratio = 4 //At what alien to human ratio will the Gamma security level be called and the nuke be made available? /datum/game_mode/xenos/announce() - world << "The current game mode is - Xenos!" - world << "There is an Xenomorph attack on the station.
      Aliens - Kill or infect the crew. Protect the Queen.
      Crew - Protect the station. Exterminate all aliens.
      " + to_chat(world, "The current game mode is - Xenos!") + + to_chat(world, "There is an Xenomorph attack on the station.
      Aliens - Kill or infect the crew. Protect the Queen.
      Crew - Protect the station. Exterminate all aliens.
      ") + /datum/game_mode/xenos/can_start() if(!..()) @@ -157,20 +159,28 @@ /datum/game_mode/xenos/declare_completion() if(station_was_nuked) feedback_set_details("round_end_result","win - xenos nuked") - world << "Crew Victory" - world << "The station was destroyed in a nuclear explosion, preventing the aliens from overrunning it!" + to_chat(world, "Crew Victory") + + to_chat(world, "The station was destroyed in a nuclear explosion, preventing the aliens from overrunning it!") + else if(result == 1) feedback_set_details("round_end_result","win - xenos killed") - world << "Crew Victory" - world << "The aliens did not succeed and were exterminated by the crew!" + to_chat(world, "Crew Victory") + + to_chat(world, "The aliens did not succeed and were exterminated by the crew!") + else if(result == 2) feedback_set_details("round_end_result","win - crew killed") - world << "Alien Victory" - world << "The aliens were successful and slaughtered the crew!" + to_chat(world, "Alien Victory") + + to_chat(world, "The aliens were successful and slaughtered the crew!") + else feedback_set_details("round_end_result","win - crew escaped") - world << "Draw" - world << "The crew has escaped from the aliens but did not exterminate them, allowing them to overrun the station." + to_chat(world, "Draw") + + to_chat(world, "The crew has escaped from the aliens but did not exterminate them, allowing them to overrun the station.") + var/text = "
      There were [xenos.len] aliens." text += "
      The aliens were:" @@ -186,7 +196,8 @@ else text += "body destroyed" text += ")" - world << text + to_chat(world, text) + ..() return 1 \ No newline at end of file diff --git a/code/game/jobs/job/support_chaplain.dm b/code/game/jobs/job/support_chaplain.dm index d9de164d5de..3d0458a2227 100644 --- a/code/game/jobs/job/support_chaplain.dm +++ b/code/game/jobs/job/support_chaplain.dm @@ -145,7 +145,8 @@ accepted = 1 if("No") if(outoftime) - H << "Welp, out of time, buddy. You're stuck. Next time choose faster." + to_chat(H, "Welp, out of time, buddy. You're stuck. Next time choose faster.") + accepted = 1 if(ticker) diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index f5dc80dcae7..b9865a1fcb7 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -17,7 +17,8 @@ var/global/datum/controller/occupations/job_master occupations = list() var/list/all_jobs = subtypesof(/datum/job) if(!all_jobs.len) - world << "\red \b Error setting up jobs, no job datums found" + to_chat(world, "\red \b Error setting up jobs, no job datums found") + return 0 for(var/J in all_jobs) var/datum/job/job = new J() @@ -383,7 +384,8 @@ var/global/datum/controller/occupations/job_master job.equip(H) job.apply_fingerprints(H) else - H << "Your job is [rank] and the game just can't handle it! Please report this bug to an administrator." + to_chat(H, "Your job is [rank] and the game just can't handle it! Please report this bug to an administrator.") + H.job = rank @@ -431,7 +433,8 @@ var/global/datum/controller/occupations/job_master H.mind.store_memory(remembered_info) spawn(0) - H << "\blueYour account number is: [M.account_number], your account pin is: [M.remote_access_pin]" + to_chat(H, "\blueYour account number is: [M.account_number], your account pin is: [M.remote_access_pin]") + var/alt_title = null if(H.mind) @@ -464,10 +467,13 @@ var/global/datum/controller/occupations/job_master H.equip_to_slot_or_del(BPK, slot_back,1) H.species.equip(H) - H << "You are the [alt_title ? alt_title : rank]." - H << "As the [alt_title ? alt_title : rank] you answer directly to [job.supervisors]. Special circumstances may change this." + to_chat(H, "You are the [alt_title ? alt_title : rank].") + + to_chat(H, "As the [alt_title ? alt_title : rank] you answer directly to [job.supervisors]. Special circumstances may change this.") + if(job.req_admin_notify) - H << "You are playing a job that is important for the game progression. If you have to disconnect, please notify the admins via adminhelp." + to_chat(H, "You are playing a job that is important for the game progression. If you have to disconnect, please notify the admins via adminhelp.") + spawnId(H, rank, alt_title) H.equip_to_slot_or_del(new /obj/item/device/radio/headset(H), slot_l_ear) diff --git a/code/game/jobs/whitelist.dm b/code/game/jobs/whitelist.dm index 2574e4bdcd0..4d921e617c8 100644 --- a/code/game/jobs/whitelist.dm +++ b/code/game/jobs/whitelist.dm @@ -24,7 +24,8 @@ var/list/whitelist = list() if(check_rights(R_ADMIN, 0)) return 1 if(!dbcon.IsConnected()) - usr << "\red Unable to connect to whitelist database. Please try again later.
      " + to_chat(usr, "\red Unable to connect to whitelist database. Please try again later.
      ") + return 0 else var/DBQuery/query = dbcon.NewQuery("SELECT job FROM [format_table_name("whitelist")] WHERE ckey='[M.key]'") @@ -69,7 +70,8 @@ var/list/whitelist = list() if(!alien_whitelist) return 0 if(!dbcon.IsConnected()) - usr << "\red Unable to connect to whitelist database. Please try again later.
      " + to_chat(usr, "\red Unable to connect to whitelist database. Please try again later.
      ") + return 0 else var/DBQuery/query = dbcon.NewQuery("SELECT species FROM [format_table_name("whitelist")] WHERE ckey='[M.key]'") diff --git a/code/game/machinery/Freezer.dm b/code/game/machinery/Freezer.dm index 49c1fb8d325..20d47691204 100644 --- a/code/game/machinery/Freezer.dm +++ b/code/game/machinery/Freezer.dm @@ -60,7 +60,8 @@ if (istype(I, /obj/item/weapon/wrench)) if(!panel_open) - user << "Open the maintenance panel first." + to_chat(user, "Open the maintenance panel first.") + return var/list/choices = list("West" = WEST, "East" = EAST, "South" = SOUTH, "North" = NORTH) var/selected = input(user,"Select a direction for the connector.", "Connector Direction") in choices @@ -92,7 +93,8 @@ /obj/machinery/atmospherics/unary/cold_sink/freezer/attack_hand(mob/user as mob) if(panel_open) - user << "Close the maintenance panel first." + to_chat(user, "Close the maintenance panel first.") + return src.ui_interact(user) @@ -220,7 +222,8 @@ if (istype(I, /obj/item/weapon/wrench)) if(!panel_open) - user << "Open the maintenance panel first." + to_chat(user, "Open the maintenance panel first.") + return var/list/choices = list("West" = WEST, "East" = EAST, "South" = SOUTH, "North" = NORTH) var/selected = input(user,"Select a direction for the connector.", "Connector Direction") in choices @@ -252,7 +255,8 @@ /obj/machinery/atmospherics/unary/heat_reservoir/heater/attack_hand(mob/user as mob) if(panel_open) - user << "Close the maintenance panel first." + to_chat(user, "Close the maintenance panel first.") + return src.ui_interact(user) diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm index 7b7aa831a46..0853e20e8ee 100644 --- a/code/game/machinery/OpTable.dm +++ b/code/game/machinery/OpTable.dm @@ -45,7 +45,8 @@ /obj/machinery/optable/attack_hand(mob/user as mob) if (HULK in usr.mutations) - usr << text("\blue You destroy the table.") + to_chat(usr, text("\blue You destroy the table.")) + visible_message("\red [usr] destroys the operating table!") src.density = 0 qdel(src) @@ -129,18 +130,21 @@ if(istype(W, /obj/item/weapon/wrench)) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 20, target = src)) - user << "You deconstruct the table." + to_chat(user, "You deconstruct the table.") + new /obj/item/stack/sheet/plasteel(loc, 5) qdel(src) /obj/machinery/optable/proc/check_table(mob/living/carbon/patient as mob) if(src.victim && get_turf(victim) == get_turf(src) && victim.lying) - usr << "The table is already occupied!" + to_chat(usr, "The table is already occupied!") + return 0 if(patient.buckled) - usr << "Unbuckle first!" + to_chat(usr, "Unbuckle first!") + return 0 return 1 diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm index e34303b725b..0a3ca9cc383 100644 --- a/code/game/machinery/PDApainter.dm +++ b/code/game/machinery/PDApainter.dm @@ -43,7 +43,8 @@ /obj/machinery/pdapainter/attackby(var/obj/item/O as obj, var/mob/user as mob, params) if(istype(O, /obj/item/device/pda)) if(storedpda) - user << "There is already a PDA inside." + to_chat(user, "There is already a PDA inside.") + return else var/obj/item/device/pda/P = usr.get_active_hand() @@ -72,7 +73,8 @@ storedpda.desc = P.desc else - user << "The [src] is empty." + to_chat(user, "The [src] is empty.") + /obj/machinery/pdapainter/verb/ejectpda() @@ -85,7 +87,8 @@ storedpda = null update_icon() else - usr << "The [src] is empty." + to_chat(usr, "The [src] is empty.") + /obj/machinery/pdapainter/power_change() diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index b743b26fc8f..fea7daeb956 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -83,7 +83,8 @@ if (istype(G, /obj/item/weapon/wrench)) if(panel_open) - user << "Close the maintenance panel first." + to_chat(user, "Close the maintenance panel first.") + return if(dir == 4) orient = "LEFT" @@ -109,7 +110,8 @@ return if (panel_open) - user << "Close the maintenance panel first." + to_chat(user, "Close the maintenance panel first.") + return if (!src.connected) @@ -226,7 +228,8 @@ return 1 if(panel_open) - usr << "Close the maintenance panel first." + to_chat(usr, "Close the maintenance panel first.") + return 0 if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon/ai))) @@ -234,11 +237,13 @@ if (src.connected) if (src.connected.occupant) if (src.connected.occupant.stat == DEAD) - usr << "This person has no life for to preserve anymore. Take them to a department capable of reanimating them." + to_chat(usr, "This person has no life for to preserve anymore. Take them to a department capable of reanimating them.") + else if(src.connected.occupant.health > src.connected.min_health || (href_list["chemical"] in connected.emergency_chems)) src.connected.inject_chemical(usr,href_list["chemical"],text2num(href_list["amount"])) else - usr << "This person is not in good enough condition for sleepers to be effective! Use another means of treatment, such as cryogenics!" + to_chat(usr, "This person is not in good enough condition for sleepers to be effective! Use another means of treatment, such as cryogenics!") + if (href_list["removebeaker"]) src.connected.remove_beaker() if (href_list["togglefilter"]) @@ -351,7 +356,8 @@ if(world.timeofday > (R.last_addiction_dose + ADDICTION_SPEEDUP_TIME)) // 2.5 minutes addiction_removal_chance = 10 if(prob(addiction_removal_chance)) - occupant << "You no longer feel reliant on [R.name]!" + to_chat(occupant, "You no longer feel reliant on [R.name]!") + occupant.reagents.addiction_list.Remove(R) updateDialog() @@ -371,7 +377,8 @@ if(istype(G, /obj/item/weapon/reagent_containers/glass)) if(!beaker) if (!user.drop_item()) - user << "\The [G] is stuck to you!" + to_chat(user, "\The [G] is stuck to you!") + return beaker = G @@ -380,22 +387,26 @@ return else - user << "The sleeper has a beaker already." + to_chat(user, "The sleeper has a beaker already.") + return if (istype(G, /obj/item/weapon/screwdriver)) if(src.occupant) - user << "The maintenance panel is locked." + to_chat(user, "The maintenance panel is locked.") + return default_deconstruction_screwdriver(user, "sleeper-o", "sleeper-open", G) return if (istype(G, /obj/item/weapon/wrench)) if(src.occupant) - user << "The scanner is occupied." + to_chat(user, "The scanner is occupied.") + return if(panel_open) - user << "Close the maintenance panel first." + to_chat(user, "Close the maintenance panel first.") + return if(dir == 4) orient = "LEFT" @@ -412,23 +423,27 @@ if(istype(G, /obj/item/weapon/grab)) if(panel_open) - user << "Close the maintenance panel first." + to_chat(user, "Close the maintenance panel first.") + return if(!ismob(G:affecting)) return if(src.occupant) - user << "The sleeper is already occupied!" + to_chat(user, "The sleeper is already occupied!") + return for(var/mob/living/carbon/slime/M in range(1,G:affecting)) if(M.Victim == G:affecting) - usr << "[G:affecting.name] will not fit into the sleeper because they have a slime latched onto their head." + to_chat(usr, "[G:affecting.name] will not fit into the sleeper because they have a slime latched onto their head.") + return visible_message("[user] starts putting [G:affecting:name] into the sleeper.") if(do_after(user, 20, target = G:affecting)) if(src.occupant) - user << "The sleeper is already occupied!" + to_chat(user, "The sleeper is already occupied!") + return if(!G || !G:affecting) return var/mob/M = G:affecting @@ -438,7 +453,8 @@ M.forceMove(src) src.occupant = M src.icon_state = "sleeper" - M << "You feel cool air surround you. You go numb as your senses turn inward." + to_chat(M, "You feel cool air surround you. You go numb as your senses turn inward.") + src.add_fingerprint(user) qdel(G) @@ -520,7 +536,8 @@ /obj/machinery/sleeper/proc/inject_chemical(mob/living/user as mob, chemical, amount) if (!(chemical in injection_chems)) - user << "The sleeper does not offer that chemical!" + to_chat(user, "The sleeper does not offer that chemical!") + return if(src.occupant) @@ -529,13 +546,16 @@ src.occupant.reagents.add_reagent(chemical, amount) return else - user << "You can not inject any more of this chemical." + to_chat(user, "You can not inject any more of this chemical.") + return else - user << "The patient rejects the chemicals!" + to_chat(user, "The patient rejects the chemicals!") + return else - user << "There's no occupant in the sleeper!" + to_chat(user, "There's no occupant in the sleeper!") + return /obj/machinery/sleeper/verb/eject() @@ -580,20 +600,24 @@ if(!istype(user.loc, /turf) || !istype(O.loc, /turf)) // are you in a container/closet/pod/etc? return if(panel_open) - user << "Close the maintenance panel first." + to_chat(user, "Close the maintenance panel first.") + return if(occupant) - user << "The sleeper is already occupied!" + to_chat(user, "The sleeper is already occupied!") + return var/mob/living/L = O if(!istype(L) || L.buckled) return if(L.abiotic()) - user << "Subject cannot have abiotic items on." + to_chat(user, "Subject cannot have abiotic items on.") + return for(var/mob/living/carbon/slime/M in range(1,L)) if(M.Victim == L) - usr << "[L.name] will not fit into the sleeper because they have a slime latched onto their head." + to_chat(usr, "[L.name] will not fit into the sleeper because they have a slime latched onto their head.") + return if(L == user) visible_message("[user] starts climbing into the sleeper.") @@ -602,7 +626,8 @@ if(do_after(user, 20, target = L)) if(src.occupant) - user << ">The sleeper is already occupied!" + to_chat(user, ">The sleeper is already occupied!") + return if(!L) return @@ -612,7 +637,8 @@ L.forceMove(src) src.occupant = L src.icon_state = "sleeper" - L << "You feel cool air surround you. You go numb as your senses turn inward." + to_chat(L, "You feel cool air surround you. You go numb as your senses turn inward.") + src.add_fingerprint(user) if(user.pulling == L) user.stop_pulling() @@ -629,21 +655,25 @@ if(usr.stat != 0 || !(ishuman(usr))) return if(src.occupant) - usr << "The sleeper is already occupied!" + to_chat(usr, "The sleeper is already occupied!") + return if (panel_open) - usr << "Close the maintenance panel first." + to_chat(usr, "Close the maintenance panel first.") + return if(usr.restrained() || usr.stat || usr.weakened || usr.stunned || usr.paralysis || usr.resting) //are you cuffed, dying, lying, stunned or other return for(var/mob/living/carbon/slime/M in range(1,usr)) if(M.Victim == usr) - usr << "You're too busy getting your life sucked out of you." + to_chat(usr, "You're too busy getting your life sucked out of you.") + return visible_message("[usr] starts climbing into the sleeper.") if(do_after(usr, 20, target = usr)) if(src.occupant) - usr << "The sleeper is already occupied!" + to_chat(usr, "The sleeper is already occupied!") + return usr.stop_pulling() usr.client.perspective = EYE_PERSPECTIVE diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 21f66a0a148..3cce5ec7cac 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -42,17 +42,20 @@ /obj/machinery/bodyscanner/attackby(var/obj/item/weapon/G as obj, var/mob/user as mob) if (istype(G, /obj/item/weapon/screwdriver)) if(src.occupant) - user << "The maintenance panel is locked." + to_chat(user, "The maintenance panel is locked.") + return default_deconstruction_screwdriver(user, "bodyscanner-o", "bodyscanner-open", G) return if (istype(G, /obj/item/weapon/wrench)) if(src.occupant) - user << "The scanner is occupied." + to_chat(user, "The scanner is occupied.") + return if(panel_open) - user << "Close the maintenance panel first." + to_chat(user, "Close the maintenance panel first.") + return if(dir == 4) dir = 8 @@ -68,20 +71,24 @@ if(istype(G, /obj/item/weapon/grab)) var/obj/item/weapon/grab/TYPECAST_YOUR_SHIT = G if(panel_open) - user << "Close the maintenance panel first." + to_chat(user, "Close the maintenance panel first.") + return if(!ismob(TYPECAST_YOUR_SHIT.affecting)) return if(occupant) - user << "The scanner is already occupied!" + to_chat(user, "The scanner is already occupied!") + return for(var/mob/living/carbon/slime/M in range(1, TYPECAST_YOUR_SHIT.affecting)) if(M.Victim == TYPECAST_YOUR_SHIT.affecting) - user << "[TYPECAST_YOUR_SHIT.affecting.name] has a fucking slime attached to them, deal with that first." + to_chat(user, "[TYPECAST_YOUR_SHIT.affecting.name] has a fucking slime attached to them, deal with that first.") + return var/mob/M = TYPECAST_YOUR_SHIT.affecting if(M.abiotic()) - user << "Subject cannot have abiotic items on." + to_chat(user, "Subject cannot have abiotic items on.") + return /*if(M.client) M.client.perspective = EYE_PERSPECTIVE @@ -105,20 +112,24 @@ if(!ishuman(user) && !isrobot(user)) return 0 //not a borg or human if(panel_open) - user << "Close the maintenance panel first." + to_chat(user, "Close the maintenance panel first.") + return 0 //panel open if(occupant) - user << "\The [src] is already occupied." + to_chat(user, "\The [src] is already occupied.") + return 0 //occupied if(O.buckled) return 0 if(O.abiotic()) - user << "Subject cannot have abiotic items on." + to_chat(user, "Subject cannot have abiotic items on.") + return 0 for(var/mob/living/carbon/slime/M in range(1, O)) if(M.Victim == O) - user << "[O] has a fucking slime attached to them, deal with that first." + to_chat(user, "[O] has a fucking slime attached to them, deal with that first.") + return 0 if(O == user) @@ -268,7 +279,8 @@ if (istype(G, /obj/item/weapon/wrench)) if(panel_open) - user << "Close the maintenance panel first." + to_chat(user, "Close the maintenance panel first.") + return if(dir == 4) dir = 8 @@ -292,7 +304,8 @@ return if (panel_open) - user << "Close the maintenance panel first." + to_chat(user, "Close the maintenance panel first.") + return if(!src.connected) diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm index 54fd1edeaf3..912a854c12c 100644 --- a/code/game/machinery/ai_slipper.dm +++ b/code/game/machinery/ai_slipper.dm @@ -36,7 +36,8 @@ else // trying to unlock the interface if (src.allowed(usr)) locked = !locked - user << "You [ locked ? "lock" : "unlock"] the device." + to_chat(user, "You [ locked ? "lock" : "unlock"] the device.") + if (locked) if (user.machine==src) user.unset_machine() @@ -45,7 +46,8 @@ if (user.machine==src) src.attack_hand(usr) else - user << "\red Access denied." + to_chat(user, "\red Access denied.") + return return @@ -57,7 +59,8 @@ return if ( (get_dist(src, user) > 1 )) if (!istype(user, /mob/living/silicon)) - user << text("Too far away.") + to_chat(user, text("Too far away.")) + user.unset_machine() user << browse(null, "window=ai_slipper") return @@ -67,7 +70,8 @@ if (istype(loc, /turf)) loc = loc:loc if (!istype(loc, /area)) - user << text("Turret badly positioned - loc.loc is [].", loc) + to_chat(user, text("Turret badly positioned - loc.loc is [].", loc)) + return var/area/area = loc var/t = "AI Liquid Dispenser ([area.name])
      " @@ -87,7 +91,8 @@ return 1 if (src.locked) if (!istype(usr, /mob/living/silicon)) - usr << "Control panel is locked!" + to_chat(usr, "Control panel is locked!") + return if (href_list["toggleOn"]) src.disabled = !src.disabled diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index cff929346b8..60e98f0bdd2 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -430,7 +430,8 @@ signal.data["sigtype"] = "command" radio_connection.post_signal(src, signal, RADIO_FROM_AIRALARM) -// world << text("Signal [] Broadcasted to []", command, target) +// to_chat(world, text("Signal [] Broadcasted to []", command, target)) + return 1 @@ -854,7 +855,8 @@ return STATUS_CLOSE if(aidisabled && (isAI(user) || isrobot(user))) - user << "AI control for \the [src] interface has been disabled." + to_chat(user, "AI control for \the [src] interface has been disabled.") + return STATUS_CLOSE . = shorted ? STATUS_DISABLED : STATUS_INTERACTIVE @@ -988,7 +990,8 @@ return input_temperature = input_temperature + T0C if(input_temperature > max_temperature || input_temperature < min_temperature) - usr << "Temperature must be between [min_temperature_c]C and [max_temperature_c]C" + to_chat(usr, "Temperature must be between [min_temperature_c]C and [max_temperature_c]C") + else target_temperature = input_temperature return 1 @@ -1007,9 +1010,11 @@ switch(buildstage) if(2) if(istype(W, /obj/item/weapon/screwdriver)) // Opening that Air Alarm up. - //user << "You pop the Air Alarm's maintence panel open." +// to_chat(user, "You pop the Air Alarm's maintence panel open.") + wiresexposed = !wiresexposed - user << "The wires have been [wiresexposed ? "exposed" : "unexposed"]" + to_chat(user, "The wires have been [wiresexposed ? "exposed" : "unexposed"]") + update_icon() return @@ -1027,15 +1032,18 @@ if (istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda))// trying to unlock the interface with an ID card if(stat & (NOPOWER|BROKEN)) - user << "It does nothing" + to_chat(user, "It does nothing") + return else if(allowed(usr) && !wires.IsIndexCut(AALARM_WIRE_IDSCAN)) locked = !locked - user << "\blue You [ locked ? "lock" : "unlock"] the Air Alarm interface." + to_chat(user, "\blue You [ locked ? "lock" : "unlock"] the Air Alarm interface.") + updateUsrDialog() else - user << "\red Access denied." + to_chat(user, "\red Access denied.") + return @@ -1044,10 +1052,12 @@ if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/coil = W if(coil.amount < 5) - user << "You need more cable for this!" + to_chat(user, "You need more cable for this!") + return - user << "You wire \the [src]!" + to_chat(user, "You wire \the [src]!") + coil.amount -= 5 if(!coil.amount) qdel(coil) @@ -1058,10 +1068,12 @@ return else if(istype(W, /obj/item/weapon/crowbar)) - user << "You start prying out the circuit." + to_chat(user, "You start prying out the circuit.") + playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1) if(do_after(user,20, target = src)) - user << "You pry out the circuit!" + to_chat(user, "You pry out the circuit!") + var/obj/item/weapon/airalarm_electronics/circuit = new /obj/item/weapon/airalarm_electronics() circuit.loc = user.loc buildstage = 0 @@ -1069,14 +1081,16 @@ return if(0) if(istype(W, /obj/item/weapon/airalarm_electronics)) - user << "You insert the circuit!" + to_chat(user, "You insert the circuit!") + qdel(W) buildstage = 1 update_icon() return else if(istype(W, /obj/item/weapon/wrench)) - user << "You remove the fire alarm assembly from the wall!" + to_chat(user, "You remove the fire alarm assembly from the wall!") + new /obj/item/mounted/frame/alarm_frame(get_turf(user)) playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1) qdel(src) @@ -1094,9 +1108,11 @@ /obj/machinery/alarm/examine(mob/user) ..(user) if (buildstage < 2) - user << "It is not wired." + to_chat(user, "It is not wired.") + if (buildstage < 1) - user << "The circuit is missing." + to_chat(user, "The circuit is missing.") + /* AIR ALARM CIRCUIT diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm index 97a99e7899d..23a9dc6ee3a 100644 --- a/code/game/machinery/atmo_control.dm +++ b/code/game/machinery/atmo_control.dm @@ -73,10 +73,12 @@ obj/machinery/air_sensor return 1 if(istype(W, /obj/item/weapon/wrench)) if(bolts) - usr << "The [src] is bolted to the floor! You can't detach it like this." + to_chat(usr, "The [src] is bolted to the floor! You can't detach it like this.") + return 1 playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "\blue You begin to unfasten \the [src]..." + to_chat(user, "\blue You begin to unfasten \the [src]...") + if(do_after(user, 40, target = src)) user.visible_message("[user] unfastens \the [src].", "\blue You have unfastened \the [src].", "You hear ratchet.") new /obj/item/pipe_gsensor(src.loc) @@ -299,7 +301,8 @@ legend { if(!isnull(G.id_tag) && G.frequency == frequency) sensor_list|=G.id_tag if(!sensor_list.len) - user << "No sensors on this frequency." + to_chat(user, "No sensors on this frequency.") + return MT_ERROR // Have the user pick one of them and name its label @@ -320,7 +323,8 @@ legend { if(!isnull(G.id_tag) && G.frequency == frequency) sensor_list|=G.id_tag if(!sensor_list.len) - user << "No sensors on this frequency." + to_chat(user, "No sensors on this frequency.") + return MT_ERROR var/label = sensors[href_list["edit_sensor"]] var/sensor = input(user, "Select a sensor:", "Sensor Data", href_list["edit_sensor"]) as null|anything in sensor_list diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 0f7688bdadb..4ed251f092c 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -338,7 +338,8 @@ update_flag /obj/machinery/portable_atmospherics/canister/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob, params) if(iswelder(W) && src.destroyed) if(weld(W, user)) - user << "\blue You salvage whats left of \the [src]" + to_chat(user, "\blue You salvage whats left of \the [src]") + var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal(src.loc) M.amount = 3 qdel(src) @@ -360,7 +361,8 @@ update_flag transfer_moles = pressure_delta*thejetpack.volume/(air_contents.temperature * R_IDEAL_GAS_EQUATION)//Actually transfer the gas var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) thejetpack.merge(removed) - user << "You pulse-pressurize your jetpack from the tank." + to_chat(user, "You pulse-pressurize your jetpack from the tank.") + return ..() @@ -478,7 +480,8 @@ update_flag else name = "canister" else - usr << "\red As you attempted to rename it the pressure rose!" + to_chat(usr, "\red As you attempted to rename it the pressure rose!") + if (href_list["choice"] == "Primary color") if (is_a_color(href_list["icon"],"prim")) @@ -629,7 +632,8 @@ update_flag return 0 // Do after stuff here - user << "You start to slice away at \the [src]..." + to_chat(user, "You start to slice away at \the [src]...") + playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) busy = 1 if(do_after(user, 50, target = src)) diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm index ebf9126017f..578d34fd7e0 100644 --- a/code/game/machinery/atmoalter/meter.dm +++ b/code/game/machinery/atmoalter/meter.dm @@ -106,7 +106,8 @@ else t += "The connect error light is blinking." - user << t + to_chat(user, t) + /obj/machinery/meter/Click() if(istype(usr, /mob/living/silicon/ai)) // ghosts can call ..() for examine @@ -123,7 +124,8 @@ if (!istype(W, /obj/item/weapon/wrench)) return ..() playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "\blue You begin to unfasten \the [src]..." + to_chat(user, "\blue You begin to unfasten \the [src]...") + if (do_after(user, 40, target = src)) user.visible_message( \ "[user] unfastens \the [src].", \ diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm index 92f3cb8211e..6382e7da5df 100644 --- a/code/game/machinery/atmoalter/portable_atmospherics.dm +++ b/code/game/machinery/atmoalter/portable_atmospherics.dm @@ -91,21 +91,25 @@ else if (istype(W, /obj/item/weapon/wrench)) if(connected_port) disconnect() - user << "\blue You disconnect [name] from the port." + to_chat(user, "\blue You disconnect [name] from the port.") + update_icon() return else var/obj/machinery/atmospherics/unary/portables_connector/possible_port = locate(/obj/machinery/atmospherics/unary/portables_connector/) in loc if(possible_port) if(connect(possible_port)) - user << "\blue You connect [name] to the port." + to_chat(user, "\blue You connect [name] to the port.") + update_icon() return else - user << "\blue [name] failed to connect to the port." + to_chat(user, "\blue [name] failed to connect to the port.") + return else - user << "\blue Nothing happens." + to_chat(user, "\blue Nothing happens.") + return else if ((istype(W, /obj/item/device/analyzer)) && get_dist(user, src) <= 1) diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm index a62f87ee098..8a72b9077f6 100644 --- a/code/game/machinery/atmoalter/scrubber.dm +++ b/code/game/machinery/atmoalter/scrubber.dm @@ -181,7 +181,8 @@ name = "[name] (ID [id])" /obj/machinery/portable_atmospherics/scrubber/huge/attack_hand(var/mob/user as mob) - usr << "You can't directly interact with this machine. Use the area atmos computer." + to_chat(usr, "You can't directly interact with this machine. Use the area atmos computer.") + /obj/machinery/portable_atmospherics/scrubber/huge/update_icon() src.overlays = 0 @@ -194,15 +195,18 @@ /obj/machinery/portable_atmospherics/scrubber/huge/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob, params) if(istype(W, /obj/item/weapon/wrench)) if(stationary) - user << "The bolts are too tight for you to unscrew!" + to_chat(user, "The bolts are too tight for you to unscrew!") + return if(on) - user << "Turn it off first!" + to_chat(user, "Turn it off first!") + return anchored = !anchored playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "You [anchored ? "wrench" : "unwrench"] \the [src]." + to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src].") + return else if ((istype(W, /obj/item/device/analyzer)) && get_dist(user, src) <= 1) diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index ea9fab11e96..3a1069ab3ad 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -108,7 +108,8 @@ /obj/machinery/autolathe/attackby(obj/item/O, mob/user, params) if (busy) - user << "The autolathe is busy. Please wait for completion of previous operation." + to_chat(user, "The autolathe is busy. Please wait for completion of previous operation.") + return 1 if(default_deconstruction_screwdriver(user, "autolathe_t", "autolathe", O)) @@ -143,13 +144,16 @@ var/material_amount = materials.get_item_material_amount(O) if(!material_amount) - user << "This object does not contain sufficient amounts of metal or glass to be accepted by the autolathe." + to_chat(user, "This object does not contain sufficient amounts of metal or glass to be accepted by the autolathe.") + return 1 if(!materials.has_space(material_amount)) - user << "The autolathe is full. Please remove metal or glass from the autolathe in order to insert more." + to_chat(user, "The autolathe is full. Please remove metal or glass from the autolathe in order to insert more.") + return 1 if(!user.unEquip(O)) - user << "\The [O] is stuck to you and cannot be placed into the autolathe." + to_chat(user, "\The [O] is stuck to you and cannot be placed into the autolathe.") + return 1 busy = 1 @@ -160,10 +164,12 @@ flick("autolathe_o",src)//plays metal insertion animation if (O.materials[MAT_GLASS]) flick("autolathe_r",src)//plays glass insertion animation - user << "You insert [inserted] sheet[inserted>1 ? "s" : ""] to the autolathe." + to_chat(user, "You insert [inserted] sheet[inserted>1 ? "s" : ""] to the autolathe.") + use_power(inserted*100) else - user << "You insert a material total of [inserted] to the autolathe." + to_chat(user, "You insert a material total of [inserted] to the autolathe.") + use_power(max(500,inserted/10)) qdel(O) busy = 0 @@ -213,7 +219,8 @@ if((queue.len+1) 0) - user << "\red There is already a queen in there." + to_chat(user, "\red There is already a queen in there.") + else health = 10 nutrilevel += 10 user.drop_item() del(O) - user << "\blue You carefully insert the queen into [src], she gets busy making a hive." + to_chat(user, "\blue You carefully insert the queen into [src], she gets busy making a hive.") + bees_in_hive = 0 else if(istype(O, /obj/item/beezeez)) beezeez += 100 nutrilevel += 10 user.drop_item() if(health > 0) - user << "\blue You insert [O] into [src]. A relaxed humming appears to pick up." + to_chat(user, "\blue You insert [O] into [src]. A relaxed humming appears to pick up.") + else - user << "\blue You insert [O] into [src]. Now it just needs some bees." + to_chat(user, "\blue You insert [O] into [src]. Now it just needs some bees.") + del(O) else if(istype(O, /obj/item/weapon/minihoe)) if(health > 0) - user << "\red You begin to dislodge the apiary from the tray, the bees don't like that." + to_chat(user, "\red You begin to dislodge the apiary from the tray, the bees don't like that.") + angry_swarm(user) else - user << "\blue You begin to dislodge the dead apiary from the tray." + to_chat(user, "\blue You begin to dislodge the dead apiary from the tray.") + if(do_after(user, 50, target = src)) new hydrotray_type(src.loc) new /obj/item/apiary(src.loc) - user << "\red You dislodge the apiary from the tray." + to_chat(user, "\red You dislodge the apiary from the tray.") + del(src) else if(istype(O, /obj/item/weapon/bee_net)) var/obj/item/weapon/bee_net/N = O if(N.caught_bees > 0) - user << "\blue You empty the bees into the apiary." + to_chat(user, "\blue You empty the bees into the apiary.") + bees_in_hive += N.caught_bees N.caught_bees = 0 else - user << "\blue There are no more bees in the net." + to_chat(user, "\blue There are no more bees in the net.") + else if(istype(O, /obj/item/weapon/reagent_containers/glass)) var/obj/item/weapon/reagent_containers/glass/G = O if(harvestable_honey > 0) if(health > 0) - user << "\red You begin to harvest the honey. The bees don't seem to like it." + to_chat(user, "\red You begin to harvest the honey. The bees don't seem to like it.") + angry_swarm(user) else - user << "\blue You begin to harvest the honey." + to_chat(user, "\blue You begin to harvest the honey.") + if(do_after(user,50, target = src)) G.reagents.add_reagent("honey",harvestable_honey) harvestable_honey = 0 - user << "\blue You successfully harvest the honey." + to_chat(user, "\blue You successfully harvest the honey.") + else - user << "\blue There is no honey left to harvest." + to_chat(user, "\blue There is no honey left to harvest.") + else angry_swarm(user) ..() @@ -241,5 +256,6 @@ if(toxic > 0) H.reagents.add_reagent("toxin", toxic) - usr << "\blue You harvest the honeycomb from the hive. There is a wild buzzing!" + to_chat(usr, "\blue You harvest the honeycomb from the hive. There is a wild buzzing!") + angry_swarm(usr) diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm index f63f4e333c1..ea0421a8df1 100644 --- a/code/game/machinery/biogenerator.dm +++ b/code/game/machinery/biogenerator.dm @@ -67,15 +67,18 @@ /obj/machinery/biogenerator/attackby(var/obj/item/O as obj, var/mob/user as mob, params) if(istype(O, /obj/item/weapon/reagent_containers/glass) && !panel_open) if(beaker) - user << "A container is already loaded into the machine." + to_chat(user, "A container is already loaded into the machine.") + return else if(!user.drop_item()) - user << "\The [O] is stuck to you!" + to_chat(user, "\The [O] is stuck to you!") + return O.forceMove(src) beaker = O - user << "You add the container to the machine." + to_chat(user, "You add the container to the machine.") + updateUsrDialog() update_icon() return @@ -93,15 +96,18 @@ else if(istype(O, /obj/item/weapon/crowbar)) else if(panel_open) - user << "Close the maintenance panel first." + to_chat(user, "Close the maintenance panel first.") + else if(processing) - user << "The biogenerator is currently processing." + to_chat(user, "The biogenerator is currently processing.") + else if(istype(O, /obj/item/weapon/storage/bag/plants)) var/i = 0 for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in contents) i++ if(i >= max_items) - user << "The biogenerator is already full! Activate it." + to_chat(user, "The biogenerator is already full! Activate it.") + else for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in O.contents) if(i >= max_items) @@ -109,24 +115,30 @@ G.forceMove(src) i++ if(i < max_items) - user << "You empty the plant bag into the biogenerator." + to_chat(user, "You empty the plant bag into the biogenerator.") + else if(O.contents.len == 0) - user << "You empty the plant bag into the biogenerator, filling it to its capacity." + to_chat(user, "You empty the plant bag into the biogenerator, filling it to its capacity.") + else - user << "You fill the biogenerator to its capacity." + to_chat(user, "You fill the biogenerator to its capacity.") + else if(!istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown) && !istype(O, /obj/item/weapon/crowbar)) - user << "You can not put this in [src.name]" + to_chat(user, "You can not put this in [src.name]") + else var/i = 0 for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in contents) i++ if(i >= max_items) - user << "The biogenerator is full! Activate it." + to_chat(user, "The biogenerator is full! Activate it.") + else user.unEquip(O) O.forceMove(src) - user << "You put [O.name] in [src.name]" + to_chat(user, "You put [O.name] in [src.name]") + default_deconstruction_crowbar(O) @@ -212,7 +224,8 @@ if (src.stat != 0) //NOPOWER etc return if(src.processing) - usr << "The biogenerator is in the process of working." + to_chat(usr, "The biogenerator is in the process of working.") + return var/S = 0 for(var/obj/item/weapon/reagent_containers/food/snacks/grown/I in contents) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index f74e5ca877d..15b89e44df7 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -92,7 +92,8 @@ if (O.client && O.client.eye == src) O.unset_machine() O.reset_view(null) - O << "The screen bursts into static." + to_chat(O, "The screen bursts into static.") + ..() @@ -128,7 +129,8 @@ // DECONSTRUCTION if(istype(W, /obj/item/weapon/screwdriver)) - //user << "You start to [panel_open ? "close" : "open"] the camera's panel." +// to_chat(user, "You start to [panel_open ? "close" : "open"] the camera's panel.") + //if(toggle_panel(user)) // No delay because no one likes screwdrivers trying to be hip and have a duration cooldown panel_open = !panel_open user.visible_message("[user] screws the camera's panel [panel_open ? "open" : "closed"]!", @@ -140,7 +142,8 @@ else if(istype(W, /obj/item/weapon/weldingtool) && wires.CanDeconstruct()) if(weld(W, user)) - user << "You unweld the camera leaving it as just a frame screwed to the wall." + to_chat(user, "You unweld the camera leaving it as just a frame screwed to the wall.") + if(!assembly) assembly = new() assembly.loc = src.loc @@ -154,24 +157,30 @@ if(!isXRay()) upgradeXRay() qdel(W) - user << "[msg]" + to_chat(user, "[msg]") + else - user << "[msg2]" + to_chat(user, "[msg2]") + else if(istype(W, /obj/item/stack/sheet/mineral/plasma) && panel_open) if(!isEmpProof()) upgradeEmpProof() - user << "[msg]" + to_chat(user, "[msg]") + qdel(W) else - user << "[msg2]" + to_chat(user, "[msg2]") + else if(istype(W, /obj/item/device/assembly/prox_sensor) && panel_open) if(!isMotion()) upgradeMotion() - user << "[msg]" + to_chat(user, "[msg]") + qdel(W) else - user << "[msg2]" + to_chat(user, "[msg2]") + // OTHER else if ((istype(W, /obj/item/weapon/paper) || istype(W, /obj/item/device/pda)) && isliving(user)) @@ -191,7 +200,8 @@ if(N) itemname = P.name info = N.notehtml - U << "You hold \the [itemname] up to the camera ..." + to_chat(U, "You hold \the [itemname] up to the camera ...") + U.changeNext_move(CLICK_CD_MELEE) for(var/mob/O in player_list) if(istype(O, /mob/living/silicon/ai)) @@ -199,24 +209,30 @@ if(AI.control_disabled || (AI.stat == DEAD)) return if(U.name == "Unknown") - AI << "[U] holds \a [itemname] up to one of your cameras ..." + to_chat(AI, "[U] holds \a [itemname] up to one of your cameras ...") + else - AI << "[U] holds \a [itemname] up to one of your cameras ..." + to_chat(AI, "[U] holds \a [itemname] up to one of your cameras ...") + AI.last_paper_seen = "[itemname][info]" else if (O.client && O.client.eye == src) - O << "[U] holds \a [itemname] up to one of the cameras ..." + to_chat(O, "[U] holds \a [itemname] up to one of the cameras ...") + O << browse(text("[][]", itemname, info), text("window=[]", itemname)) else if (istype(W, /obj/item/device/camera_bug)) if (!src.can_use()) - user << "Camera non-functional." + to_chat(user, "Camera non-functional.") + return if(istype(src.bug)) - user << "Camera bug removed." + to_chat(user, "Camera bug removed.") + src.bug.bugged_cameras -= src.c_tag src.bug = null else - user << "Camera bugged." + to_chat(user, "Camera bugged.") + src.bug = W src.bug.bugged_cameras[src.c_tag] = src @@ -271,7 +287,8 @@ if (O.client && O.client.eye == src) O.unset_machine() O.reset_view(null) - O << "The screen bursts into static." + to_chat(O, "The screen bursts into static.") + /obj/machinery/camera/proc/triggerCameraAlarm(var/duration = 0) alarm_on = 1 @@ -341,7 +358,8 @@ if(!WT.remove_fuel(0, user)) return 0 - user << "You start to weld [src]..." + to_chat(user, "You start to weld [src]...") + playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) busy = 1 if(do_after(user, 100, target = src)) diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm index 46c448f2035..956c17b921d 100644 --- a/code/game/machinery/camera/camera_assembly.dm +++ b/code/game/machinery/camera/camera_assembly.dm @@ -28,7 +28,8 @@ // State 0 if(iswrench(W) && isturf(src.loc)) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "You wrench the assembly into place." + to_chat(user, "You wrench the assembly into place.") + anchored = 1 state = 1 update_icon() @@ -39,14 +40,16 @@ // State 1 if(iswelder(W)) if(weld(W, user)) - user << "You weld the assembly securely into place." + to_chat(user, "You weld the assembly securely into place.") + anchored = 1 state = 2 return else if(iswrench(W)) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "You unattach the assembly from it's place." + to_chat(user, "You unattach the assembly from it's place.") + anchored = 0 update_icon() state = 0 @@ -57,16 +60,19 @@ if(iscoil(W)) var/obj/item/stack/cable_coil/C = W if(C.use(2)) - user << "You add wires to the assembly." + to_chat(user, "You add wires to the assembly.") + state = 3 else - user << "You need 2 coils of wire to wire the assembly." + to_chat(user, "You need 2 coils of wire to wire the assembly.") + return else if(iswelder(W)) if(weld(W, user)) - user << "You unweld the assembly from it's place." + to_chat(user, "You unweld the assembly from it's place.") + state = 1 anchored = 1 return @@ -79,12 +85,14 @@ var/input = strip_html(input(usr, "Which networks would you like to connect this camera to? Seperate networks with a comma. No Spaces!\nFor example: SS13,Security,Secret ", "Set Network", "SS13")) if(!input) - usr << "No input found please hang up and try your call again." + to_chat(usr, "No input found please hang up and try your call again.") + return var/list/tempnetwork = splittext(input, ",") if(tempnetwork.len < 1) - usr << "No network found please hang up and try your call again." + to_chat(usr, "No network found please hang up and try your call again.") + return var/area/camera_area = get_area(src) @@ -119,13 +127,15 @@ new/obj/item/stack/cable_coil(get_turf(src), 2) playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) - user << "You cut the wires from the circuits." + to_chat(user, "You cut the wires from the circuits.") + state = 2 return // Upgrades! if(is_type_in_list(W, possible_upgrades) && !is_type_in_list(W, upgrades)) // Is a possible upgrade and isn't in the camera already. - user << "You attach \the [W] into the assembly inner circuits." + to_chat(user, "You attach \the [W] into the assembly inner circuits.") + upgrades += W user.drop_item(W) W.loc = src @@ -135,7 +145,8 @@ else if(iscrowbar(W) && upgrades.len) var/obj/U = locate(/obj) in upgrades if(U) - user << "You unattach an upgrade from the assembly." + to_chat(user, "You unattach an upgrade from the assembly.") + playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) U.loc = get_turf(src) upgrades -= U @@ -160,7 +171,8 @@ if(!WT.remove_fuel(0, user)) return 0 - user << "You start to weld the [src].." + to_chat(user, "You start to weld the [src]..") + playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) busy = 1 if(do_after(user, 20, target = src)) diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm index f33db20eb67..2f0c8390f21 100644 --- a/code/game/machinery/camera/tracking.dm +++ b/code/game/machinery/camera/tracking.dm @@ -40,7 +40,8 @@ set name = "Show Camera List" if(src.stat == 2) - src << "You can't list the cameras because you are dead!" + to_chat(src, "You can't list the cameras because you are dead!") + return if (!camera || camera == "Cancel") @@ -58,24 +59,29 @@ loc = sanitize(copytext(loc, 1, MAX_MESSAGE_LEN)) if(!loc) - src << "\red Must supply a location name" + to_chat(src, "\red Must supply a location name") + return if(stored_locations.len >= max_locations) - src << "\red Cannot store additional locations. Remove one first" + to_chat(src, "\red Cannot store additional locations. Remove one first") + return if(loc in stored_locations) - src << "\red There is already a stored location by this name" + to_chat(src, "\red There is already a stored location by this name") + return var/L = get_turf(eyeobj) if (InvalidTurf(get_turf(L))) - src << "\red Unable to store this location" + to_chat(src, "\red Unable to store this location") + return stored_locations[loc] = L - src << "Location '[loc]' stored" + to_chat(src, "Location '[loc]' stored") + /mob/living/silicon/ai/proc/sorted_stored_locations() return sortList(stored_locations) @@ -86,7 +92,8 @@ set desc = "Returns to the selected camera location" if (!(loc in stored_locations)) - src << "\red Location [loc] not found" + to_chat(src, "\red Location [loc] not found") + return var/L = stored_locations[loc] @@ -98,11 +105,13 @@ set desc = "Deletes the selected camera location" if (!(loc in stored_locations)) - src << "\red Location [loc] not found" + to_chat(src, "\red Location [loc] not found") + return stored_locations.Remove(loc) - src << "Location [loc] removed" + to_chat(src, "Location [loc] removed") + // Used to allow the AI is write in mob names/camera name from the CMD line. /datum/trackable @@ -153,7 +162,8 @@ set desc = "Select who you would like to track." if(src.stat == DEAD) - src << "You can't track with camera because you are dead!" + to_chat(src, "You can't track with camera because you are dead!") + return if(!target_name) return @@ -166,7 +176,8 @@ if(!cameraFollow) return - src << "Follow camera mode [forced ? "terminated" : "ended"]." + to_chat(src, "Follow camera mode [forced ? "terminated" : "ended"].") + cameraFollow = null /mob/living/silicon/ai/proc/ai_actual_track(mob/living/target) @@ -177,17 +188,20 @@ U.cameraFollow = target U.tracking = 1 - U << "Attempting to track [target.get_visible_name()]..." + to_chat(U, "Attempting to track [target.get_visible_name()]...") + sleep(min(30, get_dist(target, U.eyeobj) / 4)) spawn(15) //give the AI a grace period to stop moving. U.tracking = 0 if(!target || !target.can_track(usr)) - U << "Target is not near any active cameras." + to_chat(U, "Target is not near any active cameras.") + U.cameraFollow = null return - U << "Now tracking [target.get_visible_name()] on camera." + to_chat(U, "Now tracking [target.get_visible_name()] on camera.") + var/cameraticks = 0 spawn(0) @@ -198,11 +212,13 @@ if(!target.can_track(usr)) U.tracking = 1 if(!cameraticks) - U << "Target is not near any active cameras. Attempting to reacquire..." + to_chat(U, "Target is not near any active cameras. Attempting to reacquire...") + cameraticks++ if(cameraticks > 9) U.cameraFollow = null - U << "Unable to reacquire, cancelling track..." + to_chat(U, "Unable to reacquire, cancelling track...") + U.tracking = 0 return else diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index 9cce9c200b1..8165a59046f 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -17,7 +17,8 @@ if(charging && !(stat & (BROKEN|NOPOWER)) ) var/newlevel = round(charging.percent() * 4.0 / 99) - //world << "nl: [newlevel]" +// to_chat(world, "nl: [newlevel]") + if(chargelevel != newlevel) @@ -29,9 +30,11 @@ overlays.Cut() examine(mob/user) if(..(user, 5)) - user << "There's [charging ? "a" : "no"] cell in the charger." + to_chat(user, "There's [charging ? "a" : "no"] cell in the charger.") + if(charging) - user << "Current charge: [charging.charge]" + to_chat(user, "Current charge: [charging.charge]") + attackby(obj/item/weapon/W, mob/user, params) if(stat & BROKEN) @@ -39,14 +42,16 @@ if(istype(W, /obj/item/weapon/stock_parts/cell) && anchored) if(charging) - user << "\red There is already a cell in the charger." + to_chat(user, "\red There is already a cell in the charger.") + return else var/area/a = loc.loc // Gets our locations location, like a dream within a dream if(!isarea(a)) return if(a.power_equip == 0) // There's no APC in this area, don't try to cheat power! - user << "\red The [name] blinks red as you try to insert the cell!" + to_chat(user, "\red The [name] blinks red as you try to insert the cell!") + return user.drop_item() @@ -57,11 +62,13 @@ updateicon() else if(istype(W, /obj/item/weapon/wrench)) if(charging) - user << "\red Remove the cell first!" + to_chat(user, "\red Remove the cell first!") + return anchored = !anchored - user << "You [anchored ? "attach" : "detach"] the cell charger [anchored ? "to" : "from"] the ground" + to_chat(user, "You [anchored ? "attach" : "detach"] the cell charger [anchored ? "to" : "from"] the ground") + playsound(get_turf(src), 'sound/items/Ratchet.ogg', 75, 1) attack_hand(mob/user) @@ -87,7 +94,8 @@ process() - //world << "ccpt [charging] [stat]" +// to_chat(world, "ccpt [charging] [stat]") + if(!charging || (stat & (BROKEN|NOPOWER)) || !anchored) return diff --git a/code/game/machinery/chiller.dm b/code/game/machinery/chiller.dm index 77cdb0ab286..c48f3f11edb 100644 --- a/code/game/machinery/chiller.dm +++ b/code/game/machinery/chiller.dm @@ -26,11 +26,14 @@ /obj/machinery/space_heater/air_conditioner/examine(mob/user) ..(user) - user << "The air conditioner is [on ? "on" : "off"] and the hatch is [open ? "open" : "closed"]." + to_chat(user, "The air conditioner is [on ? "on" : "off"] and the hatch is [open ? "open" : "closed"].") + if(open) - user << "The power cell is [cell ? "installed" : "missing"]." + to_chat(user, "The power cell is [cell ? "installed" : "missing"].") + else - user << "The charge meter reads [cell ? round(cell.percent(),1) : 0]%" + to_chat(user, "The charge meter reads [cell ? round(cell.percent(),1) : 0]%") + /obj/machinery/space_heater/air_conditioner/emp_act(severity) @@ -45,7 +48,8 @@ if(istype(I, /obj/item/weapon/stock_parts/cell)) if(open) if(cell) - user << "There is already a power cell inside." + to_chat(user, "There is already a power cell inside.") + return else // insert cell @@ -58,7 +62,8 @@ user.visible_message("[user] inserts a power cell into [src].", "You insert the power cell into [src].") else - user << "The hatch must be open to insert a power cell." + to_chat(user, "The hatch must be open to insert a power cell.") + return else if(istype(I, /obj/item/weapon/screwdriver)) open = !open diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 5971c758721..137a5c4b217 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -148,11 +148,13 @@ /obj/item/weapon/disk/data/attack_self(mob/user as mob) read_only = !read_only - user << "You flip the write-protect tab to [read_only ? "protected" : "unprotected"]." + to_chat(user, "You flip the write-protect tab to [read_only ? "protected" : "unprotected"].") + /obj/item/weapon/disk/data/examine(mob/user) ..(user) - user << "The write-protect tab is set to [read_only ? "protected" : "unprotected"]." + to_chat(user, "The write-protect tab is set to [read_only ? "protected" : "unprotected"].") + //Health Tracker Implant @@ -182,7 +184,8 @@ return if ((!isnull(occupant)) && (occupant.stat != 2)) var/completion = (100 * ((occupant.health + 100) / (heal_level + 100))) - user << "Current clone cycle is [round(completion)]% complete." + to_chat(user, "Current clone cycle is [round(completion)]% complete.") + return //Clonepod @@ -239,7 +242,8 @@ H.updatehealth() clonemind.transfer_to(H) - H << "Consciousness slowly creeps over you as your body regenerates.
      So this is what cloning feels like?
      " + to_chat(H, "Consciousness slowly creeps over you as your body regenerates.
      So this is what cloning feels like?
      ") + // -- Mode/mind specific stuff goes here callHook("clone", list(H)) @@ -344,7 +348,8 @@ /obj/machinery/clonepod/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if (istype(W, /obj/item/weapon/screwdriver)) if(occupant || mess || locked) - user << "The maintenance panel is locked." + to_chat(user, "The maintenance panel is locked.") + return default_deconstruction_screwdriver(user, "[icon_state]_maintenance", "[initial(icon_state)]", W) return @@ -359,27 +364,32 @@ if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) if (!check_access(W)) - user << "\red Access Denied." + to_chat(user, "\red Access Denied.") + return if ((!locked) || (isnull(occupant))) return if ((occupant.health < -20) && (occupant.stat != 2)) - user << "\red Access Refused." + to_chat(user, "\red Access Refused.") + return else locked = 0 - user << "System unlocked." + to_chat(user, "System unlocked.") + //Removing cloning pod biomass else if (istype(W, /obj/item/weapon/reagent_containers/food/snacks/meat)) - user << "\blue \The [src] processes \the [W]." + to_chat(user, "\blue \The [src] processes \the [W].") + biomass += 50 user.drop_item() qdel(W) return else if (istype(W, /obj/item/weapon/wrench)) if(locked && (anchored || occupant)) - user << "\red Can not do that while [src] is in use." + to_chat(user, "\red Can not do that while [src] is in use.") + else if(anchored) anchored = 0 @@ -395,7 +405,8 @@ else if(istype(W, /obj/item/device/multitool)) var/obj/item/device/multitool/M = W M.buffer = src - user << "You load connection data from [src] to [M]." + to_chat(user, "You load connection data from [src] to [M].") + return else ..() @@ -403,7 +414,8 @@ /obj/machinery/clonepod/emag_act(user as mob) if (isnull(occupant)) return - user << "You force an emergency ejection." + to_chat(user, "You force an emergency ejection.") + locked = 0 go_out() return @@ -443,11 +455,13 @@ return if (!(occupant)) - user << "The cloning pod is empty!" + to_chat(user, "The cloning pod is empty!") + return if (locked) - user << "The cloning pod is locked!" + to_chat(user, "The cloning pod is locked!") + return if (occupant.client) diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm index 2ad0eba3a81..6ade8685e74 100644 --- a/code/game/machinery/computer/HolodeckControl.dm +++ b/code/game/machinery/computer/HolodeckControl.dm @@ -164,8 +164,10 @@ if(!emagged) playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) emagged = 1 - user << "\blue You vastly increase projector power and override the safety and security protocols." - user << "Warning. Automatic shutoff and derezing protocols have been corrupted. Please call Nanotrasen maintenance and do not use the simulator." + to_chat(user, "\blue You vastly increase projector power and override the safety and security protocols.") + + to_chat(user, "Warning. Automatic shutoff and derezing protocols have been corrupted. Please call Nanotrasen maintenance and do not use the simulator.") + log_game("[key_name(usr)] emagged the Holodeck Control Computer") src.updateUsrDialog() @@ -367,7 +369,8 @@ return ..() if (istype(W, /obj/item/weapon/wrench)) - user << "It's a holotable! There are no bolts!" + to_chat(user, "It's a holotable! There are no bolts!") + return /obj/structure/table/holotable/wood @@ -407,7 +410,8 @@ /obj/structure/rack/holorack/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if (istype(W, /obj/item/weapon/wrench)) - user << "It's a holorack! There are no bolts!" + to_chat(user, "It's a holorack! There are no bolts!") + return /obj/item/weapon/holo @@ -467,13 +471,15 @@ icon_state = "sword[item_color]" w_class = 4 playsound(user, 'sound/weapons/saberon.ogg', 50, 1) - user << "[src] is now active." + to_chat(user, "[src] is now active.") + else force = 3 icon_state = "sword0" w_class = 2 playsound(user, 'sound/weapons/saberoff.ogg', 50, 1) - user << "[src] can now be concealed." + to_chat(user, "[src] can now be concealed.") + if(istype(user,/mob/living/carbon/human)) var/mob/living/carbon/human/H = user H.update_inv_l_hand() @@ -503,7 +509,8 @@ if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2) var/obj/item/weapon/grab/G = W if(G.state<2) - user << "You need a better grip to do that!" + to_chat(user, "You need a better grip to do that!") + return G.affecting.loc = src.loc G.affecting.Weaken(5) @@ -545,15 +552,18 @@ power_channel = ENVIRON /obj/machinery/readybutton/attack_ai(mob/user as mob) - user << "The station AI is not to interact with these devices" + to_chat(user, "The station AI is not to interact with these devices") + return /obj/machinery/readybutton/attackby(obj/item/weapon/W as obj, mob/user as mob, params) - user << "The device is a solid button, there's nothing you can do with it!" + to_chat(user, "The device is a solid button, there's nothing you can do with it!") + /obj/machinery/readybutton/attack_hand(mob/user as mob) if(user.stat || stat & (NOPOWER|BROKEN)) - user << "This device is not powered." + to_chat(user, "This device is not powered.") + return currentarea = get_area(src.loc) @@ -561,7 +571,8 @@ qdel(src) if(eventstarted) - usr << "The event has already begun!" + to_chat(usr, "The event has already begun!") + return ready = !ready @@ -591,4 +602,5 @@ qdel(W) for(var/mob/M in currentarea) - M << "FIGHT!" \ No newline at end of file + to_chat(M, "FIGHT!") + diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm index 85e483bbfb9..bc010ad8ff5 100644 --- a/code/game/machinery/computer/ai_core.dm +++ b/code/game/machinery/computer/ai_core.dm @@ -24,42 +24,49 @@ if(istype(P, /obj/item/weapon/wrench)) playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 20, target = src)) - user << "\blue You wrench the frame into place." + to_chat(user, "\blue You wrench the frame into place.") + anchored = 1 state = 1 if(istype(P, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = P if(!WT.isOn()) - user << "The welder must be on for this task." + to_chat(user, "The welder must be on for this task.") + return playsound(loc, 'sound/items/Welder.ogg', 50, 1) if(do_after(user, 20, target = src)) if(!src || !WT.remove_fuel(0, user)) return - user << "\blue You deconstruct the frame." + to_chat(user, "\blue You deconstruct the frame.") + new /obj/item/stack/sheet/plasteel(loc, 4) qdel(src) if(1) if(istype(P, /obj/item/weapon/wrench)) playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 20, target = src)) - user << "\blue You unfasten the frame." + to_chat(user, "\blue You unfasten the frame.") + anchored = 0 state = 0 if(istype(P, /obj/item/weapon/circuitboard/aicore) && !circuit) playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1) - user << "\blue You place the circuit board inside the frame." + to_chat(user, "\blue You place the circuit board inside the frame.") + icon_state = "1" circuit = P user.drop_item() P.loc = src if(istype(P, /obj/item/weapon/screwdriver) && circuit) playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "\blue You screw the circuit board into place." + to_chat(user, "\blue You screw the circuit board into place.") + state = 2 icon_state = "2" if(istype(P, /obj/item/weapon/crowbar) && circuit) playsound(loc, 'sound/items/Crowbar.ogg', 50, 1) - user << "\blue You remove the circuit board." + to_chat(user, "\blue You remove the circuit board.") + state = 1 icon_state = "0" circuit.loc = loc @@ -67,7 +74,8 @@ if(2) if(istype(P, /obj/item/weapon/screwdriver) && circuit) playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "\blue You unfasten the circuit board." + to_chat(user, "\blue You unfasten the circuit board.") + state = 1 icon_state = "1" if(istype(P, /obj/item/stack/cable_coil)) @@ -76,16 +84,19 @@ if(do_after(user, 20, target = src)) P:amount -= 5 if(!P:amount) qdel(P) - user << "\blue You add cables to the frame." + to_chat(user, "\blue You add cables to the frame.") + state = 3 icon_state = "3" if(3) if(istype(P, /obj/item/weapon/wirecutters)) if (brain) - user << "Get that brain out of there first" + to_chat(user, "Get that brain out of there first") + else playsound(loc, 'sound/items/Wirecutter.ogg', 50, 1) - user << "\blue You remove the cables." + to_chat(user, "\blue You remove the cables.") + state = 2 icon_state = "2" var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( loc ) @@ -98,42 +109,50 @@ if (P) P:amount -= 2 if(!P:amount) qdel(P) - user << "\blue You put in the glass panel." + to_chat(user, "\blue You put in the glass panel.") + state = 4 icon_state = "4" if(istype(P, /obj/item/weapon/aiModule/purge)) laws.clear_inherent_laws() - usr << "Law module applied." + to_chat(usr, "Law module applied.") + return if(istype(P, /obj/item/weapon/aiModule/freeform)) var/obj/item/weapon/aiModule/freeform/M = P laws.add_inherent_law(M.newFreeFormLaw) - usr << "Added a freeform law." + to_chat(usr, "Added a freeform law.") + return if(istype(P, /obj/item/weapon/aiModule)) var/obj/item/weapon/aiModule/M = P if(!M.laws) - usr << "This AI module can not be applied directly to AI cores." + to_chat(usr, "This AI module can not be applied directly to AI cores.") + return laws = M.laws if(istype(P, /obj/item/device/mmi) || istype(P, /obj/item/device/mmi/posibrain)) if(!P:brainmob) - user << "\red Sticking an empty [P] into the frame would sort of defeat the purpose." + to_chat(user, "\red Sticking an empty [P] into the frame would sort of defeat the purpose.") + return if(P:brainmob.stat == 2) - user << "\red Sticking a dead [P] into the frame would sort of defeat the purpose." + to_chat(user, "\red Sticking a dead [P] into the frame would sort of defeat the purpose.") + return if(jobban_isbanned(P:brainmob, "AI") || jobban_isbanned(P:brainmob,"nonhumandept")) - user << "\red This [P] does not seem to fit." + to_chat(user, "\red This [P] does not seem to fit.") + return if(istype(P, /obj/item/device/mmi/syndie)) - user << "This MMI does not seem to fit!" + to_chat(user, "This MMI does not seem to fit!") + return if(P:brainmob.mind) @@ -143,12 +162,14 @@ user.drop_item() P.loc = src brain = P - usr << "Added [P]." + to_chat(usr, "Added [P].") + icon_state = "3b" if(istype(P, /obj/item/weapon/crowbar) && brain) playsound(loc, 'sound/items/Crowbar.ogg', 50, 1) - user << "\blue You remove the brain." + to_chat(user, "\blue You remove the brain.") + brain.loc = loc brain = null icon_state = "3" @@ -156,7 +177,8 @@ if(4) if(istype(P, /obj/item/weapon/crowbar)) playsound(loc, 'sound/items/Crowbar.ogg', 50, 1) - user << "\blue You remove the glass panel." + to_chat(user, "\blue You remove the glass panel.") + state = 3 if (brain) icon_state = "3b" @@ -167,7 +189,8 @@ if(istype(P, /obj/item/weapon/screwdriver)) playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "You connect the monitor." + to_chat(user, "You connect the monitor.") + if(!brain) var/open_for_latejoin = alert(user, "Would you like this core to be open for latejoining AIs?", "Latejoin", "Yes", "Yes", "No") == "Yes" var/obj/structure/AIcore/deactivated/D = new(loc) @@ -225,7 +248,8 @@ cores["[D] ([D.loc.loc])"] = D if(!cores.len) - src << "No deactivated AI cores were found." + to_chat(src, "No deactivated AI cores were found.") + var/id = input("Which core?", "Toggle AI Core Latejoin", null) as null|anything in cores if(!id) return @@ -235,10 +259,12 @@ if(D in empty_playable_ai_cores) empty_playable_ai_cores -= D - src << "\The [id] is now not available for latejoining AIs." + to_chat(src, "\The [id] is now not available for latejoining AIs.") + else empty_playable_ai_cores += D - src << "\The [id] is now available for latejoining AIs." + to_chat(src, "\The [id] is now available for latejoining AIs.") + /* @@ -252,7 +278,8 @@ That prevents a few funky behaviors. atom/proc/transfer_ai(var/interaction, var/mob/user, var/mob/living/silicon/ai/AI, var/obj/item/device/aicard/card) if(istype(card)) if(card.flush) - user << "ERROR: AI flush is in progress, cannot execute transfer protocol." + to_chat(user, "ERROR: AI flush is in progress, cannot execute transfer protocol.") + return 0 return 1 @@ -265,8 +292,11 @@ atom/proc/transfer_ai(var/interaction, var/mob/user, var/mob/living/silicon/ai/A AI.control_disabled = 0 AI.aiRadio.disabledAi = 0 AI.loc = loc//To replace the terminal. - AI << "You have been uploaded to a stationary terminal. Remote device connection restored." - user << "Transfer successful: [AI.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed." + to_chat(AI, "You have been uploaded to a stationary terminal. Remote device connection restored.") + + to_chat(user, "Transfer successful: [AI.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed.") + qdel(src) else //If for some reason you use an empty card on an empty AI terminal. - user << "There is no AI loaded on this terminal!" + to_chat(user, "There is no AI loaded on this terminal!") + diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index 74ea7609137..34c2ceedaed 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -13,9 +13,11 @@ /obj/machinery/computer/aifixer/attackby(I as obj, user as mob, params) if(occupant && istype(I, /obj/item/weapon/screwdriver)) if(stat & (NOPOWER|BROKEN)) - user << "The screws on [name]'s screen won't budge." + to_chat(user, "The screws on [name]'s screen won't budge.") + else - user << "The screws on [name]'s screen won't budge and it emits a warning beep." + to_chat(user, "The screws on [name]'s screen won't budge and it emits a warning beep.") + return else ..() @@ -29,7 +31,8 @@ ui_interact(user) else if(mode.kickoff) - user << "You have been locked out from this console!" + to_chat(user, "You have been locked out from this console!") + /obj/machinery/computer/aifixer/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) var/data[0] @@ -114,24 +117,31 @@ //Downloading AI from card to terminal. if(interaction == AI_TRANS_FROM_CARD) if(stat & (NOPOWER|BROKEN)) - user << "[src] is offline and cannot take an AI at this time!" + to_chat(user, "[src] is offline and cannot take an AI at this time!") + return AI.loc = src occupant = AI AI.control_disabled = 1 AI.aiRadio.disabledAi = 1 - AI << "You have been uploaded to a stationary terminal. Sadly, there is no remote access from here." - user << "Transfer successful: [AI.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed." + to_chat(AI, "You have been uploaded to a stationary terminal. Sadly, there is no remote access from here.") + + to_chat(user, "Transfer successful: [AI.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed.") + update_icon() else //Uploading AI from terminal to card if(occupant && !active) - occupant << "You have been downloaded to a mobile storage device. Still no remote access." - user << "Transfer successful: [occupant.name] ([rand(1000,9999)].exe) removed from host terminal and stored within local memory." + to_chat(occupant, "You have been downloaded to a mobile storage device. Still no remote access.") + + to_chat(user, "Transfer successful: [occupant.name] ([rand(1000,9999)].exe) removed from host terminal and stored within local memory.") + occupant.loc = card occupant = null update_icon() else if (active) - user << "ERROR: Reconstruction in progress." + to_chat(user, "ERROR: Reconstruction in progress.") + else if (!occupant) - user << "ERROR: Unable to locate artificial intelligence." + to_chat(user, "ERROR: Unable to locate artificial intelligence.") + diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 7277bc6a366..a9de75bfd03 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -368,18 +368,21 @@ dat += "
      You ran out of food and starved." if(emagged) user.nutrition = 0 //yeah you pretty hongry - user << "Your body instantly contracts to that of one who has not eaten in months. Agonizing cramps seize you as you fall to the floor." + to_chat(user, "Your body instantly contracts to that of one who has not eaten in months. Agonizing cramps seize you as you fall to the floor.") + if(fuel <= 0) dat += "
      You ran out of fuel, and drift, slowly, into a star." if(emagged) var/mob/living/M = user M.adjust_fire_stacks(5) M.IgniteMob() //flew into a star, so you're on fire - user << "You feel an immense wave of heat emanate from the arcade machine. Your skin bursts into flames." + to_chat(user, "You feel an immense wave of heat emanate from the arcade machine. Your skin bursts into flames.") + dat += "

      OK...

      " if(emagged) - user << "You're never going to make it to Orion..." + to_chat(user, "You're never going to make it to Orion...") + user.death() emagged = 0 //removes the emagged status after you lose playing = 0 //also a new game @@ -447,21 +450,27 @@ switch(event) if(ORION_TRAIL_RAIDERS) if(prob(50)) - usr << "You hear battle shouts. The tramping of boots on cold metal. Screams of agony. The rush of venting air. Are you going insane?" + to_chat(usr, "You hear battle shouts. The tramping of boots on cold metal. Screams of agony. The rush of venting air. Are you going insane?") + M.hallucination += 30 else - usr << "Something strikes you from behind! It hurts like hell and feel like a blunt weapon, but nothing is there..." + to_chat(usr, "Something strikes you from behind! It hurts like hell and feel like a blunt weapon, but nothing is there...") + M.take_organ_damage(30) playsound(loc, 'sound/weapons/genhit2.ogg', 100, 1) if(ORION_TRAIL_ILLNESS) var/severity = rand(1,3) //pray to RNGesus. PRAY, PIGS if(severity == 1) - M << "You suddenly feel slightly nauseous." //got off lucky + to_chat(M, "You suddenly feel slightly nauseous.")//got off lucky + + if(severity == 2) - usr << "You suddenly feel extremely nauseous and hunch over until it passes." + to_chat(usr, "You suddenly feel extremely nauseous and hunch over until it passes.") + M.Stun(3) if(severity >= 3) //you didn't pray hard enough - M << "An overpowering wave of nausea consumes over you. You hunch over, your stomach's contents preparing for a spectacular exit." + to_chat(M, "An overpowering wave of nausea consumes over you. You hunch over, your stomach's contents preparing for a spectacular exit.") + M.Stun(5) sleep(30) atom_say("[M] violently throws up!") @@ -477,7 +486,8 @@ M.take_organ_damage(25) playsound(src.loc, 'sound/weapons/Genhit.ogg', 100, 1) else - M << "A violent gale blows past you, and you barely manage to stay standing!" + to_chat(M, "A violent gale blows past you, and you barely manage to stay standing!") + if(ORION_TRAIL_COLLISION) //by far the most damaging event if(prob(90)) playsound(src.loc, 'sound/effects/bang.ogg', 100, 1) @@ -956,7 +966,8 @@ /obj/machinery/computer/arcade/orion_trail/emag_act(mob/user) if(!emagged) - user << "You override the cheat code menu and skip to Cheat #[rand(1, 50)]: Realism Mode." + to_chat(user, "You override the cheat code menu and skip to Cheat #[rand(1, 50)]: Realism Mode.") + name = "The Orion Trail: Realism Edition" desc = "Learn how our ancestors got to Orion, and try not to die in the process!" newgame() @@ -995,9 +1006,11 @@ if(!(in_range(user, src))) return if(!active) - user << "There's a little switch on the bottom. It's flipped down." + to_chat(user, "There's a little switch on the bottom. It's flipped down.") + else - user << "There's a little switch on the bottom. It's flipped up." + to_chat(user, "There's a little switch on the bottom. It's flipped up.") + /obj/item/weapon/orion_ship/attack_self(mob/user) //Minibomb-level explosion. Should probably be more because of how hard it is to survive the machine! Also, just over a 5-second fuse if(active) @@ -1006,7 +1019,8 @@ message_admins("[key_name_admin(usr)] primed an explosive Orion ship for detonation.") log_game("[key_name(usr)] primed an explosive Orion ship for detonation.") - user << "You flip the switch on the underside of [src]." + to_chat(user, "You flip the switch on the underside of [src].") + active = 1 visible_message("[src] softly beeps and whirs to life!") playsound(src.loc, 'sound/machines/defib_SaftyOn.ogg', 25, 1) diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 8045ed2b9fa..8262c5819e3 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -304,7 +304,8 @@ if("Cancel") return else - user << "DERP! BUG! Report this (And what you were doing to cause it) to Agouri" + to_chat(user, "DERP! BUG! Report this (And what you were doing to cause it) to Agouri") + return /obj/item/weapon/circuitboard/rdconsole/attackby(obj/item/I as obj, mob/user as mob, params) @@ -336,9 +337,11 @@ build_path = /obj/machinery/computer/rdconsole/public id = 5 - user << "Access protocols set to [console_choice]." + to_chat(user, "Access protocols set to [console_choice].") + else - user << "Access Denied" + to_chat(user, "Access Denied") + return /obj/structure/computerframe/attackby(obj/item/P as obj, mob/user as mob, params) @@ -347,46 +350,54 @@ if(istype(P, /obj/item/weapon/wrench)) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 20, target = src)) - user << "\blue You wrench the frame into place." + to_chat(user, "\blue You wrench the frame into place.") + src.anchored = 1 src.state = 1 if(istype(P, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = P if(!WT.remove_fuel(0, user)) - user << "The welding tool must be on to complete this task." + to_chat(user, "The welding tool must be on to complete this task.") + return playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) if(do_after(user, 20, target = src)) if(!src || !WT.isOn()) return - user << "\blue You deconstruct the frame." + to_chat(user, "\blue You deconstruct the frame.") + new /obj/item/stack/sheet/metal( src.loc, 5 ) qdel(src) if(1) if(istype(P, /obj/item/weapon/wrench)) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 20, target = src)) - user << "\blue You unfasten the frame." + to_chat(user, "\blue You unfasten the frame.") + src.anchored = 0 src.state = 0 if(istype(P, /obj/item/weapon/circuitboard) && !circuit) var/obj/item/weapon/circuitboard/B = P if(B.board_type == "computer") playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - user << "\blue You place the circuit board inside the frame." + to_chat(user, "\blue You place the circuit board inside the frame.") + src.icon_state = "1" src.circuit = P user.drop_item() P.loc = src else - user << "\red This frame does not accept circuit boards of this type!" + to_chat(user, "\red This frame does not accept circuit boards of this type!") + if(istype(P, /obj/item/weapon/screwdriver) && circuit) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "\blue You screw the circuit board into place." + to_chat(user, "\blue You screw the circuit board into place.") + src.state = 2 src.icon_state = "2" if(istype(P, /obj/item/weapon/crowbar) && circuit) playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) - user << "\blue You remove the circuit board." + to_chat(user, "\blue You remove the circuit board.") + src.state = 1 src.icon_state = "0" circuit.loc = src.loc @@ -394,7 +405,8 @@ if(2) if(istype(P, /obj/item/weapon/screwdriver) && circuit) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "\blue You unfasten the circuit board." + to_chat(user, "\blue You unfasten the circuit board.") + src.state = 1 src.icon_state = "1" if(istype(P, /obj/item/stack/cable_coil)) @@ -404,13 +416,15 @@ if(P) P:amount -= 5 if(!P:amount) qdel(P) - user << "\blue You add cables to the frame." + to_chat(user, "\blue You add cables to the frame.") + src.state = 3 src.icon_state = "3" if(3) if(istype(P, /obj/item/weapon/wirecutters)) playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) - user << "\blue You remove the cables." + to_chat(user, "\blue You remove the cables.") + src.state = 2 src.icon_state = "2" var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( src.loc ) @@ -422,19 +436,22 @@ if(do_after(user, 20, target = src)) if(P) P:use(2) - user << "\blue You put in the glass panel." + to_chat(user, "\blue You put in the glass panel.") + src.state = 4 src.icon_state = "4" if(4) if(istype(P, /obj/item/weapon/crowbar)) playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) - user << "\blue You remove the glass panel." + to_chat(user, "\blue You remove the glass panel.") + src.state = 3 src.icon_state = "3" new /obj/item/stack/sheet/glass( src.loc, 2 ) if(istype(P, /obj/item/weapon/screwdriver)) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "\blue You connect the monitor." + to_chat(user, "\blue You connect the monitor.") + var/B = new src.circuit.build_path ( src.loc ) if(circuit.powernet) B:powernet = circuit.powernet if(circuit.id) B:id = circuit.id @@ -458,46 +475,54 @@ if(istype(P, /obj/item/weapon/wrench)) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 20, target = src)) - user << "\blue You wrench the frame into place." + to_chat(user, "\blue You wrench the frame into place.") + src.anchored = 1 src.state = 1 if(istype(P, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = P if(!WT.remove_fuel(0, user)) - user << "The welding tool must be on to complete this task." + to_chat(user, "The welding tool must be on to complete this task.") + return playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) if(do_after(user, 20, target = src)) if(!src || !WT.isOn()) return - user << "\blue You deconstruct the frame." + to_chat(user, "\blue You deconstruct the frame.") + new /obj/item/stack/sheet/mineral/bananium( src.loc, 5 ) qdel(src) if(1) if(istype(P, /obj/item/weapon/wrench)) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 20, target = src)) - user << "\blue You unfasten the frame." + to_chat(user, "\blue You unfasten the frame.") + src.anchored = 0 src.state = 0 if(istype(P, /obj/item/weapon/circuitboard) && !circuit) var/obj/item/weapon/circuitboard/B = P if(B.board_type == "honkcomputer") playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - user << "\blue You place the circuit board inside the frame." + to_chat(user, "\blue You place the circuit board inside the frame.") + src.icon_state = "1" src.circuit = P user.drop_item() P.loc = src else - user << "\red This frame does not accept circuit boards of this type!" + to_chat(user, "\red This frame does not accept circuit boards of this type!") + if(istype(P, /obj/item/weapon/screwdriver) && circuit) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "\blue You screw the circuit board into place." + to_chat(user, "\blue You screw the circuit board into place.") + src.state = 2 src.icon_state = "2" if(istype(P, /obj/item/weapon/crowbar) && circuit) playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) - user << "\blue You remove the circuit board." + to_chat(user, "\blue You remove the circuit board.") + src.state = 1 src.icon_state = "0" circuit.loc = src.loc @@ -505,7 +530,8 @@ if(2) if(istype(P, /obj/item/weapon/screwdriver) && circuit) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "\blue You unfasten the circuit board." + to_chat(user, "\blue You unfasten the circuit board.") + src.state = 1 src.icon_state = "1" if(istype(P, /obj/item/stack/cable_coil)) @@ -515,13 +541,15 @@ if(P) P:amount -= 5 if(!P:amount) qdel(P) - user << "\blue You add cables to the frame." + to_chat(user, "\blue You add cables to the frame.") + src.state = 3 src.icon_state = "3" if(3) if(istype(P, /obj/item/weapon/wirecutters)) playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) - user << "\blue You remove the cables." + to_chat(user, "\blue You remove the cables.") + src.state = 2 src.icon_state = "2" var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( src.loc ) @@ -533,19 +561,22 @@ if(do_after(user, 20, target = src)) if(P) P:use(2) - user << "\blue You put in the glass panel." + to_chat(user, "\blue You put in the glass panel.") + src.state = 4 src.icon_state = "4" if(4) if(istype(P, /obj/item/weapon/crowbar)) playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) - user << "\blue You remove the glass panel." + to_chat(user, "\blue You remove the glass panel.") + src.state = 3 src.icon_state = "3" new /obj/item/stack/sheet/glass( src.loc, 2 ) if(istype(P, /obj/item/weapon/screwdriver)) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "\blue You connect the monitor." + to_chat(user, "\blue You connect the monitor.") + var/B = new src.circuit.build_path ( src.loc ) if(circuit.powernet) B:powernet = circuit.powernet if(circuit.id) B:id = circuit.id diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 187e7d28f85..aa061a53a4f 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -61,7 +61,8 @@ /obj/machinery/computer/security/emag_act(user as mob) if(!emagged) emagged = 1 - user << "\blue You have authorized full network access!" + to_chat(user, "\blue You have authorized full network access!") + ui_interact(user) else ui_interact(user) diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index 0e6e77ec9ec..62828afa084 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -54,7 +54,8 @@ else eyeobj.setLoc(eyeobj.loc) else - user << "The console is already in use!" + to_chat(user, "The console is already in use!") + /mob/camera/aiEye/remote name = "Inactive Camera Eye" diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index 33442e8403e..91b5092db88 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -101,19 +101,22 @@ var/time_last_changed_position = 0 if(!usr || usr.stat || usr.lying) return if(scan) - usr << "You remove \the [scan] from \the [src]." + to_chat(usr, "You remove \the [scan] from \the [src].") + scan.loc = get_turf(src) if(!usr.get_active_hand()) usr.put_in_hands(scan) scan = null else if(modify) - usr << "You remove \the [modify] from \the [src]." + to_chat(usr, "You remove \the [modify] from \the [src].") + modify.loc = get_turf(src) if(!usr.get_active_hand()) usr.put_in_hands(modify) modify = null else - usr << "There is nothing to remove from the console." + to_chat(usr, "There is nothing to remove from the console.") + return /obj/machinery/computer/card/attackby(obj/item/weapon/card/id/id_card, mob/user, params) @@ -322,7 +325,8 @@ var/time_last_changed_position = 0 jobdatum = J break if(!jobdatum) - usr << "\red No log exists for this job: [t1]" + to_chat(usr, "\red No log exists for this job: [t1]") + return access = jobdatum.get_access() diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 411673628cc..1252d1617f3 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -87,7 +87,8 @@ user.drop_item() W.loc = src src.diskette = W - user << "You insert [W]." + to_chat(user, "You insert [W].") + nanomanager.update_uis(src) return else if(istype(W, /obj/item/device/multitool)) @@ -98,7 +99,8 @@ pods += P P.connected = src P.name = "[initial(P.name)] #[pods.len]" - user << "You connect [P] to [src]." + to_chat(user, "You connect [P] to [src].") + else ..() return @@ -326,7 +328,9 @@ var/mob/selected = find_dead_player("[C.ckey]") if(!selected) return - selected << 'sound/machines/chime.ogg' //probably not the best sound but I think it's reasonable + to_chat(selected, 'sound/machines/chime.ogg')//probably not the best sound but I think it's reasonable + + var/answer = alert(selected,"Do you want to return to life?","Cloning","Yes","No") if(answer != "No" && pod.growclone(C)) temp = "Initiating cloning cycle..." diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index ea2dadda3b4..4973d4cb32b 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -47,7 +47,8 @@ return 1 else if(message) - user << "Access denied." + to_chat(user, "Access denied.") + return 0 /obj/machinery/computer/communications/Topic(href, href_list) @@ -55,12 +56,14 @@ return 1 if ((!(src.z in config.station_levels) && !(src.z in config.admin_levels))) - usr << "Unable to establish a connection: You're too far away from the station!" + to_chat(usr, "Unable to establish a connection: You're too far away from the station!") + return 1 if(href_list["login"]) if(!ishuman(usr)) - usr << "Access denied." + to_chat(usr, "Access denied.") + return var/mob/living/carbon/human/M = usr var/obj/item/card = M.get_active_hand() @@ -96,7 +99,8 @@ if("newalertlevel") if(isAI(usr) || isrobot(usr)) - usr << "Firewalls prevent you from changing the alert level." + to_chat(usr, "Firewalls prevent you from changing the alert level.") + nanomanager.update_uis(src) return 1 tmp_alertlevel = text2num(href_list["level"]) @@ -124,16 +128,19 @@ feedback_inc("alert_comms_blue",1) tmp_alertlevel = 0 else - usr << "You are not authorized to do this." + to_chat(usr, "You are not authorized to do this.") + tmp_alertlevel = 0 setMenuState(usr,COMM_SCREEN_MAIN) else - usr << "You need to swipe your ID." + to_chat(usr, "You need to swipe your ID.") + if("announce") if(is_authenticated(usr) == 2) if(message_cooldown) - usr << "Please allow at least one minute to pass between announcements." + to_chat(usr, "Please allow at least one minute to pass between announcements.") + nanomanager.update_uis(src) return var/input = input(usr, "Please write a message to announce to the station crew.", "Priority Announcement") @@ -158,7 +165,8 @@ if("cancelshuttle") if(isAI(usr) || isrobot(usr)) - usr << "Firewalls prevent you from recalling the shuttle." + to_chat(usr, "Firewalls prevent you from recalling the shuttle.") + nanomanager.update_uis(src) return 1 var/response = alert("Are you sure you wish to recall the shuttle?", "Confirm", "Yes", "No") @@ -215,7 +223,8 @@ if("nukerequest") if(is_authenticated(usr) == 2) if(centcomm_message_cooldown) - usr << "Arrays recycling. Please stand by." + to_chat(usr, "Arrays recycling. Please stand by.") + nanomanager.update_uis(src) return var/input = stripped_input(usr, "Please enter the reason for requesting the nuclear self-destruct codes. Misuse of the nuclear request system will not be tolerated under any circumstances. Transmission does not guarantee a response.", "Self Destruct Code Request.","") as text|null @@ -223,7 +232,8 @@ nanomanager.update_uis(src) return Nuke_request(input, usr) - usr << "Request sent." + to_chat(usr, "Request sent.") + log_say("[key_name(usr)] has requested the nuclear codes from Centcomm") priority_announcement.Announce("The codes for the on-station nuclear self-destruct have been requested by [usr]. Confirmation or denial of this request will be sent shortly.", "Nuclear Self Destruct Codes Requested",'sound/AI/commandreport.ogg') centcomm_message_cooldown = 1 @@ -234,7 +244,8 @@ if("MessageCentcomm") if(is_authenticated(usr) == 2) if(centcomm_message_cooldown) - usr << "Arrays recycling. Please stand by." + to_chat(usr, "Arrays recycling. Please stand by.") + nanomanager.update_uis(src) return var/input = stripped_input(usr, "Please choose a message to transmit to Centcomm via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "To abort, send an empty message.", "") as text|null @@ -242,7 +253,8 @@ nanomanager.update_uis(src) return Centcomm_announce(input, usr) - usr << "Message transmitted." + to_chat(usr, "Message transmitted.") + log_say("[key_name(usr)] has made a Centcomm announcement: [input]") centcomm_message_cooldown = 1 spawn(6000)//10 minute cooldown @@ -253,7 +265,8 @@ if("MessageSyndicate") if((is_authenticated(usr) == 2) && (src.emagged)) if(centcomm_message_cooldown) - usr << "Arrays recycling. Please stand by." + to_chat(usr, "Arrays recycling. Please stand by.") + nanomanager.update_uis(src) return var/input = stripped_input(usr, "Please choose a message to transmit to \[ABNORMAL ROUTING CORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "To abort, send an empty message.", "") as text|null @@ -261,7 +274,8 @@ nanomanager.update_uis(src) return Syndicate_announce(input, usr) - usr << "Message transmitted." + to_chat(usr, "Message transmitted.") + log_say("[key_name(usr)] has made a Syndicate announcement: [input]") centcomm_message_cooldown = 1 spawn(6000)//10 minute cooldown @@ -269,7 +283,8 @@ setMenuState(usr,COMM_SCREEN_MAIN) if("RestoreBackup") - usr << "Backup routing data restored!" + to_chat(usr, "Backup routing data restored!") + src.emagged = 0 setMenuState(usr,COMM_SCREEN_MAIN) @@ -279,7 +294,8 @@ /obj/machinery/computer/communications/emag_act(user as mob) if(!emagged) src.emagged = 1 - user << "You scramble the communication routing circuits!" + to_chat(user, "You scramble the communication routing circuits!") + nanomanager.update_uis(src) /obj/machinery/computer/communications/attack_ai(var/mob/user as mob) @@ -293,7 +309,8 @@ return if (!(src.z in list(ZLEVEL_STATION, ZLEVEL_CENTCOMM))) - user << "Unable to establish a connection: You're too far away from the station!" + to_chat(user, "Unable to establish a connection: You're too far away from the station!") + return ui_interact(user) @@ -397,19 +414,23 @@ /proc/call_shuttle_proc(var/mob/user, var/reason) if(sent_strike_team == 1) - user << "Central Command will not allow the shuttle to be called. Consider all contracts terminated." + to_chat(user, "Central Command will not allow the shuttle to be called. Consider all contracts terminated.") + return if(shuttle_master.emergencyNoEscape) - user << "The emergency shuttle may not be sent at this time. Please try again later." + to_chat(user, "The emergency shuttle may not be sent at this time. Please try again later.") + return if(shuttle_master.emergency.mode > SHUTTLE_ESCAPE) - user << "The emergency shuttle may not be called while returning to Central Command." + to_chat(user, "The emergency shuttle may not be called while returning to Central Command.") + return if(ticker.mode.name == "blob") - user << "Under directive 7-10, [station_name()] is quarantined until further notice." + to_chat(user, "Under directive 7-10, [station_name()] is quarantined until further notice.") + return shuttle_master.requestEvac(user, reason) @@ -422,19 +443,23 @@ // if force is 0, some things may stop the shuttle call if(!force) if(shuttle_master.emergencyNoEscape) - user << "Central Command does not currently have a shuttle available in your sector. Please try again later." + to_chat(user, "Central Command does not currently have a shuttle available in your sector. Please try again later.") + return if(sent_strike_team == 1) - user << "Central Command will not allow the shuttle to be called. Consider all contracts terminated." + to_chat(user, "Central Command will not allow the shuttle to be called. Consider all contracts terminated.") + return if(world.time < 54000) // 30 minute grace period to let the game get going - user << "The shuttle is refueling. Please wait another [round((54000-world.time)/600)] minutes before trying again." + to_chat(user, "The shuttle is refueling. Please wait another [round((54000-world.time)/600)] minutes before trying again.") + return if(ticker.mode.name == "epidemic") - user << "Under directive 7-10, [station_name()] is quarantined until further notice." + to_chat(user, "Under directive 7-10, [station_name()] is quarantined until further notice.") + return if(seclevel2num(get_security_level()) >= SEC_LEVEL_RED) // There is a serious threat we gotta move no time to give them five minutes. diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index 09b2873019a..9d503300cb0 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -120,12 +120,14 @@ for (var/obj/C in src) C.loc = src.loc if (src.stat & BROKEN) - user << "\blue The broken glass falls out." + to_chat(user, "\blue The broken glass falls out.") + new /obj/item/weapon/shard(loc) A.state = 3 A.icon_state = "3" else - user << "\blue You disconnect the monitor." + to_chat(user, "\blue You disconnect the monitor.") + A.state = 4 A.icon_state = "4" qdel(src) diff --git a/code/game/machinery/computer/honkputer.dm b/code/game/machinery/computer/honkputer.dm index 06e5d102fb2..ab0c29a35aa 100644 --- a/code/game/machinery/computer/honkputer.dm +++ b/code/game/machinery/computer/honkputer.dm @@ -21,7 +21,8 @@ if(..()) return 1 if (!(src.z in config.station_levels)) - usr << "\red Unable to establish a connection: \black You're too far away from the station!" + to_chat(usr, "\red Unable to establish a connection: \black You're too far away from the station!") + return usr.set_machine(src) @@ -46,13 +47,15 @@ if("MessageHonkplanet") if(src.authenticated==1) if(message_cooldown) - usr << "Arrays recycling. Please stand by." + to_chat(usr, "Arrays recycling. Please stand by.") + return var/input = stripped_input(usr, "Please choose a message to transmit to your HONKbrothers on the homeworld. Transmission does not guarantee a response.", "To abort, send an empty message.", "") if(!input || !(usr in view(1,src))) return HONK_announce(input, usr) - usr << "Message transmitted." + to_chat(usr, "Message transmitted.") + log_say("[key_name(usr)] has made a HONKplanet announcement: [input]") message_cooldown = 1 spawn(6000)//10 minute cooldown @@ -63,20 +66,23 @@ /obj/machinery/computer/HONKputer/emag_act(user as mob) if(!emagged) src.emagged = 1 - user << "You scramble the login circuits, allowing anyone to use the console!" + to_chat(user, "You scramble the login circuits, allowing anyone to use the console!") + /obj/machinery/computer/HONKputer/attack_hand(var/mob/user as mob) if(..()) return if (src.z > 6) - user << "\red Unable to establish a connection: \black You're too far away from the station!" + to_chat(user, "\red Unable to establish a connection: \black You're too far away from the station!") + return user.set_machine(src) var/dat = "HONKputer Interface" if (istype(user, /mob/living/silicon)) - user << "This console is not networked to the rest of the grid." + to_chat(user, "This console is not networked to the rest of the grid.") + return switch(src.state) @@ -104,12 +110,14 @@ for (var/obj/C in src) C.loc = src.loc if (src.stat & BROKEN) - user << "\blue The broken glass falls out." + to_chat(user, "\blue The broken glass falls out.") + new /obj/item/weapon/shard( src.loc ) A.state = 3 A.icon_state = "3" else - user << "\blue You disconnect the monitor." + to_chat(user, "\blue You disconnect the monitor.") + A.state = 4 A.icon_state = "4" qdel(src) diff --git a/code/game/machinery/computer/law.dm b/code/game/machinery/computer/law.dm index f3ddbe5bb0d..5c0a8774183 100644 --- a/code/game/machinery/computer/law.dm +++ b/code/game/machinery/computer/law.dm @@ -22,15 +22,18 @@ opened = !opened if(opened) - usr << "\blue The access panel is now open." + to_chat(usr, "\blue The access panel is now open.") + else - usr << "\blue The access panel is now closed." + to_chat(usr, "\blue The access panel is now closed.") + return attackby(obj/item/weapon/O as obj, mob/user as mob, params) if (user.z > 6) - user << "\red Unable to establish a connection: \black You're too far away from the station!" + to_chat(user, "\red Unable to establish a connection: \black You're too far away from the station!") + return if(istype(O, /obj/item/weapon/aiModule)) var/datum/game_mode/nations/mode = get_nations_mode() @@ -39,25 +42,30 @@ M.install(src) else if(mode.kickoff) - user << "You have been locked out from modifying the AI's laws!" + to_chat(user, "You have been locked out from modifying the AI's laws!") + else ..() attack_hand(var/mob/user as mob) if(src.stat & NOPOWER) - usr << "The upload computer has no power!" + to_chat(usr, "The upload computer has no power!") + return if(src.stat & BROKEN) - usr << "The upload computer is broken!" + to_chat(usr, "The upload computer is broken!") + return src.current = select_active_ai(user) if (!src.current) - usr << "No active AIs detected." + to_chat(usr, "No active AIs detected.") + else - usr << "[src.current.name] selected for law changes." + to_chat(usr, "[src.current.name] selected for law changes.") + return attack_ghost(user as mob) @@ -79,25 +87,30 @@ module.install(src) else if(mode.kickoff) - user << "You have been locked out from modifying the borg's laws!" + to_chat(user, "You have been locked out from modifying the borg's laws!") + else return ..() attack_hand(var/mob/user as mob) if(src.stat & NOPOWER) - usr << "The upload computer has no power!" + to_chat(usr, "The upload computer has no power!") + return if(src.stat & BROKEN) - usr << "The upload computer is broken!" + to_chat(usr, "The upload computer is broken!") + return src.current = freeborg() if (!src.current) - usr << "No free cyborgs detected." + to_chat(usr, "No free cyborgs detected.") + else - usr << "[src.current.name] selected for law changes." + to_chat(usr, "[src.current.name] selected for law changes.") + return attack_ghost(user as mob) diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm index 75c9974bfbb..89e0a8badb2 100644 --- a/code/game/machinery/computer/message.dm +++ b/code/game/machinery/computer/message.dm @@ -45,7 +45,8 @@ return if(isscrewdriver(O) && emag) //Stops people from just unscrewing the monitor and putting it back to get the console working again. - user << "It is too hot to mess with!" + to_chat(user, "It is too hot to mess with!") + return ..() @@ -72,7 +73,8 @@ update_icon() message = rebootmsg else - user << "A no server error appears on the screen." + to_chat(user, "A no server error appears on the screen.") + /obj/machinery/computer/message_monitor/update_icon() if(emag || hacking) @@ -296,10 +298,12 @@ /obj/machinery/computer/message_monitor/proc/BruteForce(mob/user as mob) if(isnull(linkedServer)) - user << "Could not complete brute-force: Linked Server Disconnected!" + to_chat(user, "Could not complete brute-force: Linked Server Disconnected!") + else var/currentKey = src.linkedServer.decryptkey - user << "Brute-force completed! The key is '[currentKey]'." + to_chat(user, "Brute-force completed! The key is '[currentKey]'.") + src.hacking = 0 src.icon_screen = normal_icon src.screen = 0 // Return the screen back to normal @@ -518,7 +522,8 @@ if(auth) src.screen = 4 - //usr << href_list["select"] +// to_chat(usr, href_list["select"]) + if (href_list["back"]) src.screen = 0 diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm index 72e9848e634..5c07b2ed14e 100644 --- a/code/game/machinery/computer/pod.dm +++ b/code/game/machinery/computer/pod.dm @@ -276,7 +276,8 @@ /obj/machinery/computer/pod/old/syndicate/attack_hand(var/mob/user as mob) if(!allowed(user)) - user << "Access Denied" + to_chat(user, "Access Denied") + return else ..() diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm index d9c8578c853..d20a23d2de1 100644 --- a/code/game/machinery/computer/prisoner.dm +++ b/code/game/machinery/computer/prisoner.dm @@ -91,7 +91,9 @@ usr.drop_item() I.loc = src inserted_id = I - else usr << "\red No valid ID." + else + to_chat(usr, "\red No valid ID.") + if("1") inserted_id.loc = get_step(src,get_turf(usr)) inserted_id = null @@ -117,7 +119,8 @@ if(src.allowed(usr)) screen = !screen else - usr << "Unauthorized access." + to_chat(usr, "Unauthorized access.") + else if(href_list["warn"]) var/warning = sanitize(copytext(input(usr,"Message:","Enter your message here!",""),1,MAX_MESSAGE_LEN)) @@ -125,7 +128,8 @@ var/obj/item/weapon/implant/I = locate(href_list["warn"]) if((I)&&(I.imp_in)) var/mob/living/carbon/R = I.imp_in - R << "You hear a voice in your head saying: '[warning]'" + to_chat(R, "You hear a voice in your head saying: '[warning]'") + src.add_fingerprint(usr) src.updateUsrDialog() diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm index e5b8956ad93..f6ea30cc353 100644 --- a/code/game/machinery/computer/robot.dm +++ b/code/game/machinery/computer/robot.dm @@ -25,7 +25,8 @@ ui_interact(user) else if(mode.kickoff) - user << "You have been locked out from this console!" + to_chat(user, "You have been locked out from this console!") + /obj/machinery/computer/robotics/proc/is_authenticated(var/mob/user as mob) @@ -59,7 +60,8 @@ var/mob/user = usr if(!is_authenticated(user)) - user << "Access denied." + to_chat(user, "Access denied.") + return // Destroys the cyborg @@ -68,11 +70,13 @@ if(!target || !istype(target)) return if(isAI(user) && (target.connected_ai != user)) - user << "Access Denied. This robot is not linked to you." + to_chat(user, "Access Denied. This robot is not linked to you.") + return // Cyborgs may blow up themselves via the console if(isrobot(user) && user != target) - user << "Access Denied." + to_chat(user, "Access Denied.") + return var/choice = input("Really detonate [target.name]?") in list ("Yes", "No") if(choice != "Yes") @@ -82,14 +86,17 @@ // Antagonistic cyborgs? Left here for downstream if(target.mind && target.mind.special_role && target.emagged) - target << "Extreme danger. Termination codes detected. Scrambling security codes and automatic AI unlink triggered." + to_chat(target, "Extreme danger. Termination codes detected. Scrambling security codes and automatic AI unlink triggered.") + target.ResetSecurityCodes() else message_admins("[key_name_admin(usr)] detonated [key_name_admin(target)] (JMP)!") log_game("\[key_name(usr)] detonated [key_name(target)]!") - target << "Self-destruct command received." + to_chat(target, "Self-destruct command received.") + if(target.connected_ai) - target.connected_ai << "

      ALERT - Cyborg detonation detected: [target.name]
      " + to_chat(target.connected_ai, "

      ALERT - Cyborg detonation detected: [target.name]
      ") + spawn(10) target.self_destruct() @@ -100,11 +107,13 @@ return if(isAI(user) && (target.connected_ai != user)) - user << "Access Denied. This robot is not linked to you." + to_chat(user, "Access Denied. This robot is not linked to you.") + return if(isrobot(user)) - user << "Access Denied." + to_chat(user, "Access Denied.") + return var/choice = input("Really [target.lockcharge ? "unlock" : "lockdown"] [target.name] ?") in list ("Yes", "No") @@ -118,9 +127,11 @@ log_game("[key_name(usr)] [target.canmove ? "locked down" : "released"] [key_name(target)]!") target.canmove = !target.canmove target.lockcharge = !target.lockcharge - target << "[!target.lockcharge ? "Your lockdown has been lifted!" : "You have been locked down!"]" + to_chat(target, "[!target.lockcharge ? "Your lockdown has been lifted!" : "You have been locked down!"]") + if(target.connected_ai) - target.connected_ai << "[!target.lockcharge ? "NOTICE - Cyborg lockdown lifted" : "ALERT - Cyborg lockdown detected"]: [target.name]

      " + to_chat(target.connected_ai, "[!target.lockcharge ? "NOTICE - Cyborg lockdown lifted" : "ALERT - Cyborg lockdown detected"]: [target.name]

      ") + // Remotely hacks the cyborg. Only antag AIs can do this and only to linked cyborgs. else if (href_list["hack"]) @@ -130,15 +141,18 @@ // Antag AI checks if(!istype(user, /mob/living/silicon/ai) || !(user.mind.special_role && user.mind.original == user)) - user << "Access Denied." + to_chat(user, "Access Denied.") + return if(target.connected_ai != user) - user << "Access Denied. This robot is not linked to you." + to_chat(user, "Access Denied. This robot is not linked to you.") + return if(target.emagged) - user << "Robot is already hacked." + to_chat(user, "Robot is already hacked.") + return var/choice = input("Really hack [target.name]? This cannot be undone.") in list("Yes", "No") @@ -151,24 +165,29 @@ message_admins("\blue [key_name_admin(usr)] emagged [key_name_admin(target)] using robotic console!") log_game("[key_name(usr)] emagged [key_name(target)] using robotic console!") target.emagged = 1 - target << "Failsafe protocols overriden. New tools available." + to_chat(target, "Failsafe protocols overriden. New tools available.") + // Arms the emergency self-destruct system else if(href_list["arm"]) if(istype(user, /mob/living/silicon)) - user << "Access Denied." + to_chat(user, "Access Denied.") + return safety = !safety - user << "You [safety ? "disarm" : "arm"] the emergency self destruct." + to_chat(user, "You [safety ? "disarm" : "arm"] the emergency self destruct.") + // Destroys all accessible cyborgs if safety is disabled else if(href_list["nuke"]) if(istype(user, /mob/living/silicon)) - user << "Access Denied" + to_chat(user, "Access Denied") + return if(safety) - user << "Self-destruct aborted - safety active" + to_chat(user, "Self-destruct aborted - safety active") + return message_admins("[key_name_admin(usr)] detonated all cyborgs!") @@ -180,9 +199,11 @@ // Ignore antagonistic cyborgs if(R.scrambledcodes) continue - R << "Self-destruct command received." + to_chat(R, "Self-destruct command received.") + if(R.connected_ai) - R.connected_ai << "

      ALERT - Cyborg detonation detected: [R.name]
      " + to_chat(R.connected_ai, "

      ALERT - Cyborg detonation detected: [R.name]
      ") + spawn(10) R.self_destruct() diff --git a/code/game/machinery/computer/salvage_ship.dm b/code/game/machinery/computer/salvage_ship.dm index adeddde427b..ffbef848e08 100644 --- a/code/game/machinery/computer/salvage_ship.dm +++ b/code/game/machinery/computer/salvage_ship.dm @@ -46,7 +46,8 @@ /obj/machinery/computer/salvage_ship/attack_hand(mob/user as mob) if(!allowed(user)) - user << "\red Access Denied" + to_chat(user, "\red Access Denied") + return user.set_machine(src) diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 06ea4dd8702..e7fc19e9a3c 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -31,7 +31,8 @@ usr.drop_item() O.loc = src scan = O - user << "You insert [O]." + to_chat(user, "You insert [O].") + ..() /obj/machinery/computer/secure_data/attack_ai(mob/user as mob) @@ -42,7 +43,8 @@ if(..()) return if (src.z > 6) - user << "\red Unable to establish a connection: \black You're too far away from the station!" + to_chat(user, "\red Unable to establish a connection: \black You're too far away from the station!") + return var/dat diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm index 3600503d764..c273102481d 100644 --- a/code/game/machinery/computer/skills.dm +++ b/code/game/machinery/computer/skills.dm @@ -30,7 +30,8 @@ usr.drop_item() O.loc = src scan = O - user << "You insert [O]." + to_chat(user, "You insert [O].") + ..() /obj/machinery/computer/skills/attack_ai(mob/user as mob) @@ -41,7 +42,8 @@ if(..()) return if (src.z > 6) - user << "\red Unable to establish a connection: \black You're too far away from the station!" + to_chat(user, "\red Unable to establish a connection: \black You're too far away from the station!") + return var/dat diff --git a/code/game/machinery/computer/specops_shuttle.dm b/code/game/machinery/computer/specops_shuttle.dm index 3f8692e3697..be2531b76d0 100644 --- a/code/game/machinery/computer/specops_shuttle.dm +++ b/code/game/machinery/computer/specops_shuttle.dm @@ -89,7 +89,8 @@ var/specops_shuttle_timeleft = 0 for(var/turf/T in get_area_turfs(end_location) ) var/mob/M = locate(/mob) in T - M << "\red You have arrived at Central Command. Operation has ended!" + to_chat(M, "\red You have arrived at Central Command. Operation has ended!") + specops_shuttle_at_station = 0 @@ -137,7 +138,8 @@ var/specops_shuttle_timeleft = 0 if (specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return if (!specops_can_move()) - usr << "\red The Special Operations shuttle is unable to leave." + to_chat(usr, "\red The Special Operations shuttle is unable to leave.") + return //Begin Marauder launchpad. @@ -231,7 +233,8 @@ var/specops_shuttle_timeleft = 0 for(var/turf/T in get_area_turfs(end_location) ) var/mob/M = locate(/mob) in T - M << "\red You have arrived to [station_name]. Commence operation!" + to_chat(M, "\red You have arrived to [station_name]. Commence operation!") + for(var/obj/machinery/computer/specops_shuttle/S in world) S.specops_shuttle_timereset = world.time + SPECOPS_RETURN_DELAY @@ -247,23 +250,27 @@ var/specops_shuttle_timeleft = 0 return 1 /obj/machinery/computer/specops_shuttle/attack_ai(var/mob/user as mob) - user << "\red Access Denied." + to_chat(user, "\red Access Denied.") + return 1 /obj/machinery/computer/specops_shuttle/attackby(I as obj, user as mob, params) if(istype(I,/obj/item/weapon/card/emag)) - user << "\blue The electronic systems in this console are far too advanced for your primitive hacking peripherals." + to_chat(user, "\blue The electronic systems in this console are far too advanced for your primitive hacking peripherals.") + else return attack_hand(user) /obj/machinery/computer/specops_shuttle/attack_hand(var/mob/user as mob) if(!allowed(user)) - user << "\red Access Denied." + to_chat(user, "\red Access Denied.") + return //Commented out so admins can do shenanigans at their leisure. Also makes the force-spawned admin ERTs able to use the shuttle. // if (sent_strike_team == 0 && send_emergency_team == 0) -// usr << "\red The strike team has not yet deployed." +// to_chat(usr, "\red The strike team has not yet deployed.") + // return if(..()) @@ -294,14 +301,18 @@ var/specops_shuttle_timeleft = 0 if(!specops_shuttle_at_station|| specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return if (!specops_can_move()) - usr << "\blue Central Command will not allow the Special Operations shuttle to return yet." + to_chat(usr, "\blue Central Command will not allow the Special Operations shuttle to return yet.") + if(world.timeofday <= specops_shuttle_timereset) if (((world.timeofday - specops_shuttle_timereset)/10) > 60) - usr << "\blue [-((world.timeofday - specops_shuttle_timereset)/10)/60] minutes remain!" - usr << "\blue [-(world.timeofday - specops_shuttle_timereset)/10] seconds remain!" + to_chat(usr, "\blue [-((world.timeofday - specops_shuttle_timereset)/10)/60] minutes remain!") + + to_chat(usr, "\blue [-(world.timeofday - specops_shuttle_timereset)/10] seconds remain!") + return - usr << "\blue The Special Operations shuttle will arrive at Central Command in [(SPECOPS_MOVETIME/10)] seconds." + to_chat(usr, "\blue The Special Operations shuttle will arrive at Central Command in [(SPECOPS_MOVETIME/10)] seconds.") + temp += "Shuttle departing.

      OK" updateUsrDialog() @@ -315,10 +326,12 @@ var/specops_shuttle_timeleft = 0 if(specops_shuttle_at_station || specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return if (!specops_can_move()) - usr << "\red The Special Operations shuttle is unable to leave." + to_chat(usr, "\red The Special Operations shuttle is unable to leave.") + return - usr << "\blue The Special Operations shuttle will arrive on [station_name] in [(SPECOPS_MOVETIME/10)] seconds." + to_chat(usr, "\blue The Special Operations shuttle will arrive on [station_name] in [(SPECOPS_MOVETIME/10)] seconds.") + temp += "Shuttle departing.

      OK" updateUsrDialog() diff --git a/code/game/machinery/computer/store.dm b/code/game/machinery/computer/store.dm index 001578d1fcd..1c2bb4e52c9 100644 --- a/code/game/machinery/computer/store.dm +++ b/code/game/machinery/computer/store.dm @@ -140,8 +140,10 @@ td.cost.toomuch { updateUsrDialog() return if(!centcomm_store.PlaceOrder(usr,itemID)) - usr << "\red Unable to charge your account." + to_chat(usr, "\red Unable to charge your account.") + else - usr << "\blue You've successfully purchased the item. It should be in your hands or on the floor." + to_chat(usr, "\blue You've successfully purchased the item. It should be in your hands or on the floor.") + src.updateUsrDialog() return diff --git a/code/game/machinery/computer/syndicate_specops_shuttle.dm b/code/game/machinery/computer/syndicate_specops_shuttle.dm index 76d7bf83a6a..97dbc32a7ac 100644 --- a/code/game/machinery/computer/syndicate_specops_shuttle.dm +++ b/code/game/machinery/computer/syndicate_specops_shuttle.dm @@ -60,7 +60,8 @@ var/syndicate_elite_shuttle_timeleft = 0 if (syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership) return if (!syndicate_elite_can_move()) - usr << "\red The Syndicate Elite shuttle is unable to leave." + to_chat(usr, "\red The Syndicate Elite shuttle is unable to leave.") + return sleep(600) @@ -172,7 +173,8 @@ var/syndicate_elite_shuttle_timeleft = 0 for(var/turf/T in get_area_turfs(end_location) ) var/mob/M = locate(/mob) in T - M << "\red You have arrived to [station_name]. Commence operation!" + to_chat(M, "\red You have arrived to [station_name]. Commence operation!") + /proc/syndicate_elite_can_move() if(syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership) return 0 @@ -182,22 +184,26 @@ var/syndicate_elite_shuttle_timeleft = 0 return attack_hand(user) /obj/machinery/computer/syndicate_elite_shuttle/attack_ai(var/mob/user as mob) - user << "\red Access Denied." + to_chat(user, "\red Access Denied.") + return 1 /obj/machinery/computer/syndicate_elite_shuttle/attackby(I as obj, user as mob, params) if(istype(I,/obj/item/weapon/card/emag)) - user << "\blue The electronic systems in this console are far too advanced for your primitive hacking peripherals." + to_chat(user, "\blue The electronic systems in this console are far too advanced for your primitive hacking peripherals.") + else return attack_hand(user) /obj/machinery/computer/syndicate_elite_shuttle/attack_hand(var/mob/user as mob) if(!allowed(user)) - user << "\red Access Denied." + to_chat(user, "\red Access Denied.") + return // if (sent_syndicate_strike_team == 0) -// usr << "\red The strike team has not yet deployed." +// to_chat(usr, "\red The strike team has not yet deployed.") + // return if(..()) @@ -227,17 +233,20 @@ var/syndicate_elite_shuttle_timeleft = 0 if (href_list["sendtodock"]) if(!syndicate_elite_shuttle_at_station|| syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership) return - usr << "\blue The Syndicate will not allow the Elite Squad shuttle to return." + to_chat(usr, "\blue The Syndicate will not allow the Elite Squad shuttle to return.") + return else if (href_list["sendtostation"]) if(syndicate_elite_shuttle_at_station || syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership) return if (!specops_can_move()) - usr << "\red The Syndicate Elite shuttle is unable to leave." + to_chat(usr, "\red The Syndicate Elite shuttle is unable to leave.") + return - usr << "\blue The Syndicate Elite shuttle will arrive on [station_name] in [(SYNDICATE_ELITE_MOVETIME/10)] seconds." + to_chat(usr, "\blue The Syndicate Elite shuttle will arrive on [station_name] in [(SYNDICATE_ELITE_MOVETIME/10)] seconds.") + temp = "Shuttle departing.

      OK" updateUsrDialog() diff --git a/code/game/machinery/computer/telecrystalconsoles.dm b/code/game/machinery/computer/telecrystalconsoles.dm index d154a09b02e..38d5c359e2d 100644 --- a/code/game/machinery/computer/telecrystalconsoles.dm +++ b/code/game/machinery/computer/telecrystalconsoles.dm @@ -34,7 +34,8 @@ var/list/possible_uplinker_IDs = list("Alfa","Bravo","Charlie","Delta","Echo","F if(istype(O, /obj/item)) if(uplinkholder) - user << "The [src] already has an uplink in it." + to_chat(user, "The [src] already has an uplink in it.") + return if(O.hidden_uplink) @@ -46,7 +47,8 @@ var/list/possible_uplinker_IDs = list("Alfa","Bravo","Charlie","Delta","Echo","F update_icon() updateUsrDialog() else - user << "The [O] doesn't appear to be an uplink..." + to_chat(user, "The [O] doesn't appear to be an uplink...") + diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 62b090ba1db..ecedaa9b6ce 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -59,7 +59,8 @@ /obj/machinery/constructable_frame/machine_frame/attackby(obj/item/P as obj, mob/user as mob, params) if(P.crit_fail) - user << "This part is faulty, you cannot add this to the machine!" + to_chat(user, "This part is faulty, you cannot add this to the machine!") + return switch(state) if(1) @@ -67,23 +68,28 @@ var/obj/item/stack/cable_coil/C = P if(C.amount >= 5) playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - user << "You start to add cables to the frame." + to_chat(user, "You start to add cables to the frame.") + if(do_after(user, 20, target = src)) if(C.amount >= 5 && state == 1) C.use(5) - user << "You add cables to the frame." + to_chat(user, "You add cables to the frame.") + state = 2 icon_state = "box_1" else - user << "You need five length of cable to wire the frame." + to_chat(user, "You need five length of cable to wire the frame.") + return else if(istype(P, /obj/item/stack/sheet/glass)) var/obj/item/stack/sheet/glass/G = P if(G.amount<5) - user << "\red You do not have enough glass to build a display case." + to_chat(user, "\red You do not have enough glass to build a display case.") + return G.use(5) - user << "\blue You add the glass to the frame." + to_chat(user, "\blue You add the glass to the frame.") + playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) new /obj/structure/displaycase_frame(src.loc) qdel(src) @@ -91,7 +97,8 @@ if(istype(P, /obj/item/weapon/wrench)) playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) - user << "You dismantle the frame." + to_chat(user, "You dismantle the frame.") + new /obj/item/stack/sheet/metal(src.loc, 5) qdel(src) if(2) @@ -99,7 +106,8 @@ var/obj/item/weapon/circuitboard/B = P if(B.board_type == "machine") playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - user << "You add the circuit board to the frame." + to_chat(user, "You add the circuit board to the frame.") + circuit = P user.drop_item() P.loc = src @@ -110,10 +118,12 @@ update_namelist() update_req_desc() else - user << "This frame does not accept circuit boards of this type!" + to_chat(user, "This frame does not accept circuit boards of this type!") + if(istype(P, /obj/item/weapon/wirecutters)) playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) - user << "You remove the cables." + to_chat(user, "You remove the cables.") + state = 1 icon_state = "box_0" var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil(src.loc,5) @@ -126,9 +136,11 @@ circuit.loc = src.loc circuit = null if(components.len == 0) - user << "You remove the circuit board." + to_chat(user, "You remove the circuit board.") + else - user << "You remove the circuit board and other components." + to_chat(user, "You remove the circuit board and other components.") + for(var/obj/item/I in components) I.loc = src.loc desc = initial(desc) @@ -177,7 +189,8 @@ for(var/obj/item/weapon/stock_parts/part in added_components) components += part - user << "[part.name] applied." + to_chat(user, "[part.name] applied.") + replacer.play_rped_sound() update_req_desc() @@ -207,7 +220,8 @@ update_req_desc() return 1 if(!success) - user << "You cannot add that to the machine!" + to_chat(user, "You cannot add that to the machine!") + return 0 //Machine Frame Circuit Boards @@ -245,7 +259,8 @@ to destroy them and players will be able to make replacements. /obj/item/weapon/circuitboard/vendor/proc/set_type(typepath, mob/user) build_path = typepath name = "circuit board ([names_paths[build_path]] Vendor)" - user << "You set the board to [names_paths[build_path]]." + to_chat(user, "You set the board to [names_paths[build_path]].") + req_components = list(text2path("/obj/item/weapon/vending_refill/[copytext("[build_path]", 24)]") = 3) /obj/item/weapon/circuitboard/smes @@ -304,11 +319,13 @@ to destroy them and players will be able to make replacements. if(build_path == /obj/machinery/atmospherics/unary/cold_sink/freezer) build_path = /obj/machinery/atmospherics/unary/heat_reservoir/heater name = "circuit board (Heater)" - user << "You set the board to heating." + to_chat(user, "You set the board to heating.") + else build_path = /obj/machinery/atmospherics/unary/cold_sink/freezer name = "circuit board (Freezer)" - user << "You set the board to cooling." + to_chat(user, "You set the board to cooling.") + /obj/item/weapon/circuitboard/biogenerator name = "circuit board (Biogenerator)" diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index 705f997a3eb..3b8c594ac4c 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -97,17 +97,20 @@ if(!istype(user.loc, /turf) || !istype(O.loc, /turf)) // are you in a container/closet/pod/etc? return if(occupant) - user << "\blue The cryo cell is already occupied!" + to_chat(user, "\blue The cryo cell is already occupied!") + return var/mob/living/L = O if(!istype(L) || L.buckled) return if(L.abiotic()) - user << "\red Subject cannot have abiotic items on." + to_chat(user, "\red Subject cannot have abiotic items on.") + return for(var/mob/living/carbon/slime/M in range(1,L)) if(M.Victim == L) - usr << "[L.name] will not fit into the cryo cell because they have a slime latched onto their head." + to_chat(usr, "[L.name] will not fit into the cryo cell because they have a slime latched onto their head.") + return if(put_mob(L)) if(L == user) @@ -161,7 +164,8 @@ return if(panel_open) - usr << "\blue Close the maintenance panel first." + to_chat(usr, "\blue Close the maintenance panel first.") + return ui_interact(user) @@ -273,10 +277,12 @@ /obj/machinery/atmospherics/unary/cryo_cell/attackby(var/obj/item/weapon/G as obj, var/mob/user as mob, params) if(istype(G, /obj/item/weapon/reagent_containers/glass)) if(beaker) - user << "\red A beaker is already loaded into the machine." + to_chat(user, "\red A beaker is already loaded into the machine.") + return if(!user.drop_item()) - user << "The [G] is stuck to you!" + to_chat(user, "The [G] is stuck to you!") + return G.forceMove(src) beaker = G @@ -285,7 +291,8 @@ if (istype(G, /obj/item/weapon/screwdriver)) if(occupant || on) - user << "The maintenance panel is locked." + to_chat(user, "The maintenance panel is locked.") + return default_deconstruction_screwdriver(user, "pod0-o", "pod0", G) return @@ -297,13 +304,15 @@ if(istype(G, /obj/item/weapon/grab)) if(panel_open) - user << "\blue Close the maintenance panel first." + to_chat(user, "\blue Close the maintenance panel first.") + return if(!ismob(G:affecting)) return for(var/mob/living/carbon/slime/M in range(1,G:affecting)) if(M.Victim == G:affecting) - usr << "[G:affecting:name] will not fit into the cryo because they have a slime latched onto their head." + to_chat(usr, "[G:affecting:name] will not fit into the cryo because they have a slime latched onto their head.") + return var/mob/M = G:affecting if(put_mob(M)) @@ -424,16 +433,20 @@ return /obj/machinery/atmospherics/unary/cryo_cell/proc/put_mob(mob/living/carbon/M as mob) if (!istype(M)) - usr << "\red The cryo cell cannot handle such a lifeform!" + to_chat(usr, "\red The cryo cell cannot handle such a lifeform!") + return if (occupant) - usr << "\red The cryo cell is already occupied!" + to_chat(usr, "\red The cryo cell is already occupied!") + return if (M.abiotic()) - usr << "\red Subject may not have abiotic items on." + to_chat(usr, "\red Subject may not have abiotic items on.") + return if(!node) - usr << "\red The cell is not correctly connected to its pipe network!" + to_chat(usr, "\red The cell is not correctly connected to its pipe network!") + return if (M.client) M.client.perspective = EYE_PERSPECTIVE @@ -441,7 +454,8 @@ M.stop_pulling() M.forceMove(src) if(M.health > -100 && (M.health < 0 || M.sleeping)) - M << "\blue You feel a cold liquid surround you. Your skin starts to freeze up." + to_chat(M, "\blue You feel a cold liquid surround you. Your skin starts to freeze up.") + occupant = M // M.metabslow = 1 add_fingerprint(usr) @@ -456,7 +470,8 @@ if(usr == occupant)//If the user is inside the tube... if (usr.stat == 2)//and he's not dead.... return - usr << "\blue Release sequence activated. This will take two minutes." + to_chat(usr, "\blue Release sequence activated. This will take two minutes.") + sleep(600) if(!src || !usr || !occupant || (occupant != usr)) //Check if someone's released/replaced/bombed him already return @@ -474,7 +489,8 @@ set src in oview(1) for(var/mob/living/carbon/slime/M in range(1,usr)) if(M.Victim == usr) - usr << "You're too busy getting your life sucked out of you." + to_chat(usr, "You're too busy getting your life sucked out of you.") + return if (usr.stat != 0 || stat & (NOPOWER|BROKEN)) return diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 18e028c2ff8..f47b17c7589 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -94,12 +94,14 @@ else if(href_list["item"]) if(!allowed(user)) - user << "Access Denied." + to_chat(user, "Access Denied.") + return if(!allow_items) return if(frozen_items.len == 0) - user << "There is nothing to recover from storage." + to_chat(user, "There is nothing to recover from storage.") + return var/obj/item/I = input(usr, "Please choose which object to retrieve.","Object recovery",null) as null|anything in frozen_items @@ -107,7 +109,8 @@ return if(!(I in frozen_items)) - user << "\The [I] is no longer in storage." + to_chat(user, "\The [I] is no longer in storage.") + return visible_message("The console beeps happily as it disgorges \the [I].") @@ -117,12 +120,14 @@ else if(href_list["allitems"]) if(!allowed(user)) - user << "Access Denied." + to_chat(user, "Access Denied.") + return if(!allow_items) return if(frozen_items.len == 0) - user << "There is nothing to recover from storage." + to_chat(user, "There is nothing to recover from storage.") + return visible_message("The console beeps happily as it disgorges the desired objects.") @@ -363,7 +368,8 @@ else if(O.target && istype(O.target,/datum/mind)) if(O.target == occupant.mind) if(O.owner && O.owner.current) - O.owner.current << "You get the feeling your target is no longer within your reach. Time for Plan [pick(list("A","B","C","D","X","Y","Z"))]..." + to_chat(O.owner.current, "You get the feeling your target is no longer within your reach. Time for Plan [pick(list("A","B","C","D","X","Y","Z"))]...") + O.target = null spawn(1) //This should ideally fire after the occupant is deleted. if(!O) return @@ -435,7 +441,8 @@ if(istype(G, /obj/item/weapon/grab)) if(occupant) - user << "\The [src] is in use." + to_chat(user, "\The [src] is in use.") + return if(!ismob(G:affecting)) @@ -448,7 +455,8 @@ var/mob/living/M = G:affecting if(!istype(M) || M.stat == DEAD) - user << "Dead people can not be put into cryo." + to_chat(user, "Dead people can not be put into cryo.") + return if(M.client) @@ -466,7 +474,8 @@ if(!M || !G || !G:affecting) return if(src.occupant) - user << "\The [src] is in use." + to_chat(user, "\The [src] is in use.") + return M.loc = src @@ -476,7 +485,8 @@ M.client.eye = src else //because why the fuck would you keep going if the mob isn't in the pod - user << "You stop putting [M] into the cryopod." + to_chat(user, "You stop putting [M] into the cryopod.") + return if(orient_right) @@ -484,8 +494,10 @@ else icon_state = occupied_icon_state - M << "[on_enter_occupant_message]" - M << "If you ghost, log out or close your client now, your character will shortly be permanently removed from the round." + to_chat(M, "[on_enter_occupant_message]") + + to_chat(M, "If you ghost, log out or close your client now, your character will shortly be permanently removed from the round.") + occupant = M time_entered = world.time @@ -495,7 +507,8 @@ for(var/mob/dead/observer/Gh in respawnable_list) //this may not be foolproof but it seemed like a better option than 'in world' if(Gh.key == FT) if(Gh.client && Gh.client.holder) //just in case someone has a byond name with @ at the start, which I don't think is even possible but whatever - Gh << "Warning: Your body has entered cryostorage." + to_chat(Gh, "Warning: Your body has entered cryostorage.") + // Book keeping! log_admin("[key_name(M)] has entered a stasis pod.") @@ -524,7 +537,8 @@ if(!istype(user.loc, /turf) || !istype(O.loc, /turf)) // are you in a container/closet/pod/etc? return if(occupant) - user << "\blue The cryo pod is already occupied!" + to_chat(user, "\blue The cryo pod is already occupied!") + return @@ -533,12 +547,14 @@ return if(L.stat == DEAD) - user << "Dead people can not be put into cryo." + to_chat(user, "Dead people can not be put into cryo.") + return for(var/mob/living/carbon/slime/M in range(1,L)) if(M.Victim == L) - usr << "[L.name] will not fit into the cryo pod because they have a slime latched onto their head." + to_chat(usr, "[L.name] will not fit into the cryo pod because they have a slime latched onto their head.") + return @@ -561,7 +577,8 @@ if(!L) return if(src.occupant) - user << "\The [src] is in use." + to_chat(user, "\The [src] is in use.") + return L.loc = src @@ -569,7 +586,8 @@ L.client.perspective = EYE_PERSPECTIVE L.client.eye = src else - user << "You stop [L == user ? "climbing into the cryo pod." : "putting [L] into the cryo pod."]" + to_chat(user, "You stop [L == user ? "climbing into the cryo pod." : "putting [L] into the cryo pod."]") + return if(orient_right) @@ -577,8 +595,10 @@ else icon_state = occupied_icon_state - L << "[on_enter_occupant_message]" - L << "If you ghost, log out or close your client now, your character will shortly be permanently removed from the round." + to_chat(L, "[on_enter_occupant_message]") + + to_chat(L, "If you ghost, log out or close your client now, your character will shortly be permanently removed from the round.") + occupant = L time_entered = world.time @@ -587,7 +607,8 @@ for(var/mob/dead/observer/Gh in respawnable_list) //this may not be foolproof but it seemed like a better option than 'in world' if(Gh.key == FT) if(Gh.client && Gh.client.holder) //just in case someone has a byond name with @ at the start, which I don't think is even possible but whatever - Gh << "Warning: Your body has entered cryostorage." + to_chat(Gh, "Warning: Your body has entered cryostorage.") + // Book keeping! log_admin("[key_name_admin(L)] has entered a stasis pod. (JMP)") @@ -607,7 +628,8 @@ return if(usr != occupant) - usr << "The cryopod is in use and locked!" + to_chat(usr, "The cryopod is in use and locked!") + return if(orient_right) @@ -638,12 +660,14 @@ return if(src.occupant) - usr << "\The [src] is in use." + to_chat(usr, "\The [src] is in use.") + return for(var/mob/living/carbon/slime/M in range(1,usr)) if(M.Victim == usr) - usr << "You're too busy getting your life sucked out of you." + to_chat(usr, "You're too busy getting your life sucked out of you.") + return visible_message("[usr] starts climbing into \the [src].") @@ -654,7 +678,8 @@ return if(src.occupant) - usr << "\The [src] is in use." + to_chat(usr, "\The [src] is in use.") + return usr.stop_pulling() @@ -668,8 +693,10 @@ else icon_state = occupied_icon_state - usr << "[on_enter_occupant_message]" - usr << "If you ghost, log out or close your client now, your character will shortly be permanently removed from the round." + to_chat(usr, "[on_enter_occupant_message]") + + to_chat(usr, "If you ghost, log out or close your client now, your character will shortly be permanently removed from the round.") + occupant = usr time_entered = world.time diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index a9128ff930e..a5d849814df 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -180,10 +180,12 @@ for reference: src.anchored = !src.anchored src.icon_state = "barrier[src.locked]" if ((src.locked == 1.0) && (src.emagged < 2.0)) - user << "Barrier lock toggled on." + to_chat(user, "Barrier lock toggled on.") + return else if ((src.locked == 0.0) && (src.emagged < 2.0)) - user << "Barrier lock toggled off." + to_chat(user, "Barrier lock toggled off.") + return else var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread @@ -220,14 +222,16 @@ for reference: if (!emagged) emagged = 1 req_access = null - user << "You break the ID authentication lock on the [src]." + to_chat(user, "You break the ID authentication lock on the [src].") + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(2, 1, src) s.start() visible_message("\red BZZzZZzZZzZT") else if (src.emagged == 1) src.emagged = 2 - user << "You short out the anchoring mechanism on the [src]." + to_chat(user, "You short out the anchoring mechanism on the [src].") + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(2, 1, src) s.start() diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm index 304e38118db..6623e673269 100644 --- a/code/game/machinery/door_control.dm +++ b/code/game/machinery/door_control.dm @@ -35,7 +35,8 @@ if(wires & 2) return src.attack_hand(user) else - user << "Error, no route to host." + to_chat(user, "Error, no route to host.") + /obj/machinery/door_control/attackby(obj/item/weapon/W, mob/user as mob, params) /* For later implementation @@ -69,7 +70,8 @@ return if(!allowed(user) && (wires & 1)) - user << "\red Access Denied" + to_chat(user, "\red Access Denied") + flick("doorctrl-denied",src) return @@ -149,7 +151,8 @@ if(istype(W, /obj/item/weapon/wrench)) playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 30, target = src)) - user << "You detach \the [src] from the wall." + to_chat(user, "You detach \the [src] from the wall.") + new/obj/item/mounted/frame/driver_button(get_turf(src)) qdel(src) return 1 diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 2fcdd7a7745..ec9b80c26de 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -298,14 +298,16 @@ if(istype(user,/mob/living/carbon/alien) || isrobot(user) || isAI(user)) ..(user) else - user << "You do not know how to operate this airlock's mechanism." + to_chat(user, "You do not know how to operate this airlock's mechanism.") + return /obj/machinery/door/airlock/alien/attackby(C as obj, mob/user as mob, params) if(isalien(user) || isrobot(user) || isAI(user)) ..(C, user) else - user << "You do not know how to operate this airlock's mechanism." + to_chat(user, "You do not know how to operate this airlock's mechanism.") + return @@ -351,7 +353,8 @@ About the new airlock wires panel: else /*if(src.justzap)*/ return else if(user.hallucination > 50 && prob(10) && src.operating == 0) - user << "\red You feel a powerful shock course through your body!" + to_chat(user, "\red You feel a powerful shock course through your body!") + user.adjustStaminaLoss(50) user.AdjustStunned(5) return @@ -463,7 +466,8 @@ About the new airlock wires panel: electrified_timer = addtimer(src, "electrify", SecondsToTicks(duration), 1, 0) if(feedback && message) - usr << message + to_chat(usr, message) + // shock user with probability prb (if all connections & power are working) // returns 1 if shocked, 0 otherwise @@ -567,43 +571,55 @@ About the new airlock wires panel: src.aiHacking=1 spawn(20) //TODO: Make this take a minute - user << "Airlock AI control has been blocked. Beginning fault-detection." + to_chat(user, "Airlock AI control has been blocked. Beginning fault-detection.") + sleep(50) if(src.canAIControl()) - user << "Alert cancelled. Airlock control has been restored without our assistance." + to_chat(user, "Alert cancelled. Airlock control has been restored without our assistance.") + src.aiHacking=0 return else if(!src.canAIHack(user)) - user << "We've lost our connection! Unable to hack airlock." + to_chat(user, "We've lost our connection! Unable to hack airlock.") + src.aiHacking=0 return - user << "Fault confirmed: airlock control wire disabled or cut." + to_chat(user, "Fault confirmed: airlock control wire disabled or cut.") + sleep(20) - user << "Attempting to hack into airlock. This may take some time." + to_chat(user, "Attempting to hack into airlock. This may take some time.") + sleep(200) if(src.canAIControl()) - user << "Alert cancelled. Airlock control has been restored without our assistance." + to_chat(user, "Alert cancelled. Airlock control has been restored without our assistance.") + src.aiHacking=0 return else if(!src.canAIHack(user)) - user << "We've lost our connection! Unable to hack airlock." + to_chat(user, "We've lost our connection! Unable to hack airlock.") + src.aiHacking=0 return - user << "Upload access confirmed. Loading control program into airlock software." + to_chat(user, "Upload access confirmed. Loading control program into airlock software.") + sleep(170) if(src.canAIControl()) - user << "Alert cancelled. Airlock control has been restored without our assistance." + to_chat(user, "Alert cancelled. Airlock control has been restored without our assistance.") + src.aiHacking=0 return else if(!src.canAIHack(user)) - user << "We've lost our connection! Unable to hack airlock." + to_chat(user, "We've lost our connection! Unable to hack airlock.") + src.aiHacking=0 return - user << "Transfer complete. Forcing airlock to execute program." + to_chat(user, "Transfer complete. Forcing airlock to execute program.") + sleep(50) //disable blocked control src.aiControlDisabled = 2 - user << "Receiving control information from airlock." + to_chat(user, "Receiving control information from airlock.") + sleep(10) //bring up airlock dialog src.aiHacking = 0 @@ -652,16 +668,19 @@ About the new airlock wires panel: return STATUS_CLOSE if(operating < 0) //emagged - user << "Unable to interface: Internal error." + to_chat(user, "Unable to interface: Internal error.") + return STATUS_CLOSE if(!src.canAIControl()) if(src.canAIHack(user)) src.hack(user) else if (src.isAllPowerLoss()) //don't really like how this gets checked a second time, but not sure how else to do it. - user << "Unable to interface: Connection timed out." + to_chat(user, "Unable to interface: Connection timed out.") + else - user << "Unable to interface: Connection refused." + to_chat(user, "Unable to interface: Connection refused.") + return STATUS_CLOSE return ..() @@ -674,13 +693,16 @@ About the new airlock wires panel: switch (href_list["command"]) if("idscan") if(src.isWireCut(AIRLOCK_WIRE_IDSCAN)) - usr << "The IdScan wire has been cut - IdScan feature permanently disabled." + to_chat(usr, "The IdScan wire has been cut - IdScan feature permanently disabled.") + else if(activate && src.aiDisabledIdScanner) src.aiDisabledIdScanner = 0 - usr << "IdScan feature has been enabled." + to_chat(usr, "IdScan feature has been enabled.") + else if(!activate && !src.aiDisabledIdScanner) src.aiDisabledIdScanner = 1 - usr << "IdScan feature has been disabled." + to_chat(usr, "IdScan feature has been disabled.") + if("main_power") if(!main_power_lost_until) src.loseMainPower() @@ -689,38 +711,49 @@ About the new airlock wires panel: src.loseBackupPower() if("bolts") if(src.isWireCut(AIRLOCK_WIRE_DOOR_BOLTS)) - usr << "The door bolt control wire has been cut - Door bolts permanently dropped." + to_chat(usr, "The door bolt control wire has been cut - Door bolts permanently dropped.") + else if(activate && src.lock()) - usr << "The door bolts have been dropped." + to_chat(usr, "The door bolts have been dropped.") + else if(!activate && src.unlock()) - usr << "The door bolts have been raised." + to_chat(usr, "The door bolts have been raised.") + if("electrify_temporary") if(activate && src.isWireCut(AIRLOCK_WIRE_ELECTRIFY)) - usr << text("The electrification wire is cut - Door permanently electrified.") + to_chat(usr, text("The electrification wire is cut - Door permanently electrified.")) + else if(!activate && electrified_until != 0) - usr << "The door is now un-electrified." + to_chat(usr, "The door is now un-electrified.") + electrify(0) else if(activate) //electrify door for 30 seconds shockedby += text("\[[time_stamp()]\][usr](ckey:[usr.ckey])") usr.attack_log += text("\[[time_stamp()]\] Electrified the [name] at [x] [y] [z]") - usr << "The door is now electrified for thirty seconds." + to_chat(usr, "The door is now electrified for thirty seconds.") + electrify(30) if("electrify_permanently") if(src.isWireCut(AIRLOCK_WIRE_ELECTRIFY)) - usr << text("The electrification wire is cut - Cannot electrify the door.") + to_chat(usr, text("The electrification wire is cut - Cannot electrify the door.")) + else if(!activate && electrified_until != 0) - usr << "The door is now un-electrified." + to_chat(usr, "The door is now un-electrified.") + electrify(0) else if(activate) shockedby += text("\[[time_stamp()]\][usr](ckey:[usr.ckey])") usr.attack_log += text("\[[time_stamp()]\] Electrified the [name] at [x] [y] [z]") - usr << "The door is now electrified." + to_chat(usr, "The door is now electrified.") + electrify(-1) if("open") if(src.welded) - usr << text("The airlock has been welded shut!") + to_chat(usr, text("The airlock has been welded shut!")) + else if(src.locked) - usr << text("The door bolts are down!") + to_chat(usr, text("The door bolts are down!")) + else if(activate && density) open() else if(!activate && !density) @@ -728,7 +761,8 @@ About the new airlock wires panel: if("safeties") // Safeties! We don't need no stinking safeties! if (src.isWireCut(AIRLOCK_WIRE_SAFETY)) - usr << text("The safety wire is cut - Cannot secure the door.") + to_chat(usr, text("The safety wire is cut - Cannot secure the door.")) + else if (activate && src.safe) safe = 0 else if (!activate && !src.safe) @@ -736,7 +770,8 @@ About the new airlock wires panel: if("timing") // Door speed control if(src.isWireCut(AIRLOCK_WIRE_SPEED)) - usr << text("The timing wire is cut - Cannot alter timing.") + to_chat(usr, text("The timing wire is cut - Cannot alter timing.")) + else if (activate && src.normalspeed) normalspeed = 0 else if (!activate && !src.normalspeed) @@ -744,27 +779,33 @@ About the new airlock wires panel: if("lights") // Bolt lights if(src.isWireCut(AIRLOCK_WIRE_LIGHT)) - usr << "The bolt lights wire has been cut - The door bolt lights are permanently disabled." + to_chat(usr, "The bolt lights wire has been cut - The door bolt lights are permanently disabled.") + else if (!activate && src.lights) lights = 0 - usr << "The door bolt lights have been disabled." + to_chat(usr, "The door bolt lights have been disabled.") + else if (activate && !src.lights) lights = 1 - usr << "The door bolt lights have been enabled." + to_chat(usr, "The door bolt lights have been enabled.") + if("emergency") // Emergency access if (src.emergency) emergency = 0 - usr << "Emergency access has been disabled." + to_chat(usr, "Emergency access has been disabled.") + else emergency = 1 - usr << "Emergency access has been enabled." + to_chat(usr, "Emergency access has been enabled.") + update_icon() return 1 /obj/machinery/door/airlock/attackby(C as obj, mob/user as mob, params) - //world << text("airlock attackby src [] obj [] mob []", src, C, user) +// to_chat(world, text("airlock attackby src [] obj [] mob []", src, C, user)) + if(!istype(usr, /mob/living/silicon)) if(src.isElectrified()) if(src.shock(user, 75)) @@ -808,7 +849,8 @@ About the new airlock wires panel: playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to remove electronics from the airlock assembly.") if(do_after(user,40, target = src)) - user << "\blue You removed the airlock electronics!" + to_chat(user, "\blue You removed the airlock electronics!") + var/obj/structure/door_assembly/da = new assembly_type(src.loc) da.anchored = 1 @@ -842,9 +884,11 @@ About the new airlock wires panel: qdel(src) return else if(arePowerSystemsOn()) - user << "\blue The airlock's motors resist your efforts to force it." + to_chat(user, "\blue The airlock's motors resist your efforts to force it.") + else if(locked) - user << "\blue The airlock's bolts prevent it from being forced." + to_chat(user, "\blue The airlock's bolts prevent it from being forced.") + else if( !welded && !operating ) if(density) if(beingcrowbarred == 0) //being fireaxe'd @@ -852,7 +896,8 @@ About the new airlock wires panel: if(F.wielded) spawn(0) open(1) else - user << "\red You need to be wielding \the [C] to do that." + to_chat(user, "\red You need to be wielding \the [C] to do that.") + else spawn(0) open(1) else @@ -861,7 +906,8 @@ About the new airlock wires panel: if(F.wielded) spawn(0) close(1) else - user << "\red You need to be wielding \the [C] to do that." + to_chat(user, "\red You need to be wielding \the [C] to do that.") + else spawn(0) close(1) else @@ -988,7 +1034,8 @@ About the new airlock wires panel: update_icon() /obj/machinery/door/airlock/hatch/gamma/attackby(C as obj, mob/user as mob, params) - //world << text("airlock attackby src [] obj [] mob []", src, C, user) +// to_chat(world, text("airlock attackby src [] obj [] mob []", src, C, user)) + if(!istype(usr, /mob/living/silicon)) if(src.isElectrified()) if(src.shock(user, 75)) @@ -997,11 +1044,13 @@ About the new airlock wires panel: return if(istype(C, /obj/item/weapon/c4)) - user << "The hatch is coated with a product that prevents the shaped charge from sticking!" + to_chat(user, "The hatch is coated with a product that prevents the shaped charge from sticking!") + return if(istype(C, /obj/item/mecha_parts/mecha_equipment/tool/rcd) || istype(C, /obj/item/weapon/rcd)) - user << "The hatch is made of an advanced compound that cannot be deconstructed using an RCD." + to_chat(user, "The hatch is made of an advanced compound that cannot be deconstructed using an RCD.") + return src.add_fingerprint(user) @@ -1021,7 +1070,8 @@ About the new airlock wires panel: /obj/machinery/door/airlock/highsecurity/red/attackby(C as obj, mob/user as mob, params) - //world << text("airlock attackby src [] obj [] mob []", src, C, user) +// to_chat(world, text("airlock attackby src [] obj [] mob []", src, C, user)) + if(!istype(usr, /mob/living/silicon)) if(src.isElectrified()) if(src.shock(user, 75)) diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm index e9e1d03831f..23616877584 100644 --- a/code/game/machinery/doors/airlock_control.dm +++ b/code/game/machinery/doors/airlock_control.dm @@ -260,7 +260,8 @@ obj/machinery/access_button/attackby(obj/item/I as obj, mob/user as mob, params) obj/machinery/access_button/attack_hand(mob/user) add_fingerprint(usr) if(!allowed(user)) - user << "\red Access Denied" + to_chat(user, "\red Access Denied") + else if(radio_connection) var/datum/signal/signal = new diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index cc65584c2e3..856bba62002 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -79,7 +79,8 @@ return if(blocked) - user << "\red \The [src] is welded solid!" + to_chat(user, "\red \The [src] is welded solid!") + return var/area/A = get_area_master(src) @@ -142,11 +143,13 @@ return if(user.stat || user.stunned || user.weakened || user.paralysis || get_dist(src, user) > 1) - user << "Sorry, you must remain able bodied and close to \the [src] in order to use it." + to_chat(user, "Sorry, you must remain able bodied and close to \the [src] in order to use it.") + return if(alarmed && density && !access_granted) - user << "Access denied. Please wait for authorities to arrive, or for the alert to clear." + to_chat(user, "Access denied. Please wait for authorities to arrive, or for the alert to clear.") + return else @@ -178,7 +181,8 @@ return //Already doing something or depowered. if(blocked) - user << "\red \The [src] is welded solid!" + to_chat(user, "\red \The [src] is welded solid!") + return var/area/A = get_area_master(src) diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 858600b676a..b3520b18d61 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -260,11 +260,13 @@ if(istype(I, /obj/item/weapon/screwdriver)) if(src.density || src.operating) - user << "You need to open the door to access the maintenance panel." + to_chat(user, "You need to open the door to access the maintenance panel.") + return playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) src.p_open = !( src.p_open ) - user << "You [p_open ? "open":"close"] the maintenance panel of the [src.name]." + to_chat(user, "You [p_open ? "open":"close"] the maintenance panel of the [src.name].") + return if(istype(I, /obj/item/weapon/crowbar)) @@ -294,11 +296,13 @@ WA.created_name = src.name if(emagged) - user << "You discard the damaged electronics." + to_chat(user, "You discard the damaged electronics.") + qdel(src) return - user << "You removed the airlock electronics!" + to_chat(user, "You removed the airlock electronics!") + var/obj/item/weapon/airlock_electronics/ae if(!electronics) diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index 643aacaf549..4fe4d4a70da 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -24,11 +24,13 @@ var/list/doppler_arrays = list() if(!anchored && !isinspace()) anchored = 1 power_change() - user << "You fasten [src]." + to_chat(user, "You fasten [src].") + else if(anchored) anchored = 0 power_change() - user << "You unfasten [src]." + to_chat(user, "You unfasten [src].") + playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) /obj/machinery/doppler_array/verb/rotate() diff --git a/code/game/machinery/drying_rack.dm b/code/game/machinery/drying_rack.dm index f8c76de25ff..4ea0b2fc242 100644 --- a/code/game/machinery/drying_rack.dm +++ b/code/game/machinery/drying_rack.dm @@ -37,7 +37,8 @@ if(istype(W,/obj/item/weapon/reagent_containers/food/snacks/meat)) user.unEquip(W) del(W) - user << "You add the meat to the drying rack." + to_chat(user, "You add the meat to the drying rack.") + src.running = 1 use_power = 2 icon_state = "drying_rack_on" @@ -50,7 +51,8 @@ if(istype(W,/obj/item/weapon/reagent_containers/food/snacks/grown/grapes)) user.unEquip(W) del(W) - user << "You add the grapes to the drying rack." + to_chat(user, "You add the grapes to the drying rack.") + src.running = 1 use_power = 2 icon_state = "drying_rack_on" @@ -63,7 +65,8 @@ if(istype(W,/obj/item/weapon/reagent_containers/food/snacks/grown/greengrapes)) user.unEquip(W) del(W) - user << "You add the green grapes to the drying rack." + to_chat(user, "You add the green grapes to the drying rack.") + src.running = 1 use_power = 2 icon_state = "drying_rack_on" @@ -78,7 +81,8 @@ var/J = W.type var/obj/item/weapon/reagent_containers/food/snacks/grown/B = W B.reagents.trans_to(src, B.reagents.total_volume) - user << "You add the [W] to the drying rack." + to_chat(user, "You add the [W] to the drying rack.") + user.unEquip(W) del(W) src.running = 1 @@ -87,7 +91,8 @@ sleep(60) icon_state = "drying_rack" var/obj/item/weapon/reagent_containers/food/snacks/grown/D = new J(src.loc) - user << "\blue You finish drying the [D]" + to_chat(user, "\blue You finish drying the [D]") + D.icon_state = "[D.icon_state]_dry" D.dry = 1 D.reagents.remove_any(50) @@ -96,10 +101,13 @@ src.running = 0 return else - user << "\red That has already been dried!" + to_chat(user, "\red That has already been dried!") + else - user << "\red Please wait until the last item has dried." + to_chat(user, "\red Please wait until the last item has dried.") + else - user << "\red You cannot add that to the drying rack." + to_chat(user, "\red You cannot add that to the drying rack.") + diff --git a/code/game/machinery/embedded_controller/airlock_docking_controller.dm b/code/game/machinery/embedded_controller/airlock_docking_controller.dm index a78ac2be2d8..1ec59676410 100644 --- a/code/game/machinery/embedded_controller/airlock_docking_controller.dm +++ b/code/game/machinery/embedded_controller/airlock_docking_controller.dm @@ -140,16 +140,23 @@ /*** DEBUG VERBS *** /datum/computer/file/embedded_program/docking/proc/print_state() - world << "id_tag: [id_tag]" - world << "dock_state: [dock_state]" - world << "control_mode: [control_mode]" - world << "tag_target: [tag_target]" - world << "response_sent: [response_sent]" + to_chat(world, "id_tag: [id_tag]") + + to_chat(world, "dock_state: [dock_state]") + + to_chat(world, "control_mode: [control_mode]") + + to_chat(world, "tag_target: [tag_target]") + + to_chat(world, "response_sent: [response_sent]") + /datum/computer/file/embedded_program/docking/post_signal(datum/signal/signal, comm_line) - world << "Program [id_tag] sent a message!" + to_chat(world, "Program [id_tag] sent a message!") + print_state() - world << "[id_tag] sent command \"[signal.data["command"]]\" to \"[signal.data["recipient"]]\"" + to_chat(world, "[id_tag] sent command \"[signal.data["command"]]\" to \"[signal.data["recipient"]]\"") + ..(signal) /obj/machinery/embedded_controller/radio/airlock/docking_port/verb/view_state() diff --git a/code/game/machinery/embedded_controller/airlock_docking_controller_multi.dm b/code/game/machinery/embedded_controller/airlock_docking_controller_multi.dm index 0cffb34dc6f..5fd89767ca4 100644 --- a/code/game/machinery/embedded_controller/airlock_docking_controller_multi.dm +++ b/code/game/machinery/embedded_controller/airlock_docking_controller_multi.dm @@ -113,16 +113,23 @@ /*** DEBUG VERBS *** /datum/computer/file/embedded_program/docking/multi/proc/print_state() - world << "id_tag: [id_tag]" - world << "dock_state: [dock_state]" - world << "control_mode: [control_mode]" - world << "tag_target: [tag_target]" - world << "response_sent: [response_sent]" + to_chat(world, "id_tag: [id_tag]") + + to_chat(world, "dock_state: [dock_state]") + + to_chat(world, "control_mode: [control_mode]") + + to_chat(world, "tag_target: [tag_target]") + + to_chat(world, "response_sent: [response_sent]") + /datum/computer/file/embedded_program/docking/multi/post_signal(datum/signal/signal, comm_line) - world << "Program [id_tag] sent a message!" + to_chat(world, "Program [id_tag] sent a message!") + print_state() - world << "[id_tag] sent command \"[signal.data["command"]]\" to \"[signal.data["recipient"]]\"" + to_chat(world, "[id_tag] sent command \"[signal.data["command"]]\" to \"[signal.data["recipient"]]\"") + ..(signal) /obj/machinery/embedded_controller/radio/docking_port_multi/verb/view_state() diff --git a/code/game/machinery/embedded_controller/docking_program.dm b/code/game/machinery/embedded_controller/docking_program.dm index 932562e39ab..12c05170c13 100644 --- a/code/game/machinery/embedded_controller/docking_program.dm +++ b/code/game/machinery/embedded_controller/docking_program.dm @@ -239,7 +239,8 @@ received_confirm = 0 /datum/computer/file/embedded_program/docking/proc/force_undock() - //world << "[id_tag]: forcing undock" +// to_chat(world, "[id_tag]: forcing undock") + if (tag_target) send_docking_command(tag_target, "dock_error") reset() diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index 113a4f0be9e..553422a33cd 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -89,7 +89,8 @@ FIRE ALARM user.visible_message("\red [user] has disconnected [src]'s detecting unit!", "You have disconnected [src]'s detecting unit.") else if(istype(W, /obj/item/weapon/wirecutters)) // cutting the wires out - user << "You cut the wires!" + to_chat(user, "You cut the wires!") + playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) var/obj/item/stack/cable_coil/new_coil = new /obj/item/stack/cable_coil() new_coil.amount = 5 @@ -100,15 +101,18 @@ FIRE ALARM if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/coil = W if(!coil.use(5)) - user << "You cut the wires!" + to_chat(user, "You cut the wires!") + return buildstage = 2 - user << "You wire \the [src]!" + to_chat(user, "You wire \the [src]!") + update_icon() else if(istype(W, /obj/item/weapon/crowbar)) - user << "You pry out the circuit!" + to_chat(user, "You pry out the circuit!") + playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1) spawn(20) var/obj/item/weapon/firealarm_electronics/circuit = new /obj/item/weapon/firealarm_electronics() @@ -117,13 +121,15 @@ FIRE ALARM update_icon() if(0) if(istype(W, /obj/item/weapon/firealarm_electronics)) - user << "You insert the circuit!" + to_chat(user, "You insert the circuit!") + qdel(W) buildstage = 1 update_icon() else if(istype(W, /obj/item/weapon/wrench)) - user << "You remove the fire alarm assembly from the wall!" + to_chat(user, "You remove the fire alarm assembly from the wall!") + new /obj/item/mounted/frame/firealarm(get_turf(user)) playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1) qdel(src) diff --git a/code/game/machinery/floodlight.dm b/code/game/machinery/floodlight.dm index 08e023851b4..b13dfc3bb07 100644 --- a/code/game/machinery/floodlight.dm +++ b/code/game/machinery/floodlight.dm @@ -47,13 +47,15 @@ cell.updateicon() src.cell = null - user << "You remove the power cell" + to_chat(user, "You remove the power cell") + updateicon() return if(on) on = 0 - user << "\blue You turn off the light" + to_chat(user, "\blue You turn off the light") + set_light(0) else if(!cell) @@ -61,7 +63,8 @@ if(cell.charge <= 0) return on = 1 - user << "\blue You turn on the light" + to_chat(user, "\blue You turn on the light") + set_light(brightness_on) updateicon() @@ -87,29 +90,35 @@ if (!open) if(unlocked) unlocked = 0 - user << "You screw the battery panel in place." + to_chat(user, "You screw the battery panel in place.") + else unlocked = 1 - user << "You unscrew the battery panel." + to_chat(user, "You unscrew the battery panel.") + if (istype(W, /obj/item/weapon/crowbar)) if(unlocked) if(open) open = 0 overlays = null - user << "You crowbar the battery panel in place." + to_chat(user, "You crowbar the battery panel in place.") + else if(unlocked) open = 1 - user << "You remove the battery panel." + to_chat(user, "You remove the battery panel.") + if (istype(W, /obj/item/weapon/stock_parts/cell)) if(open) if(cell) - user << "There is a power cell already installed." + to_chat(user, "There is a power cell already installed.") + else user.drop_item() W.loc = src cell = W - user << "You insert the power cell." + to_chat(user, "You insert the power cell.") + updateicon() diff --git a/code/game/machinery/guestpass.dm b/code/game/machinery/guestpass.dm index 77eed46c4e2..02797bc44b5 100644 --- a/code/game/machinery/guestpass.dm +++ b/code/game/machinery/guestpass.dm @@ -19,13 +19,18 @@ /obj/item/weapon/card/id/guest/examine(mob/user) ..(user) if (world.time < expiration_time) - user << "This pass expires at [worldtime2text(expiration_time)]." + to_chat(user, "This pass expires at [worldtime2text(expiration_time)].") + else - user << "It expired at [worldtime2text(expiration_time)]." - user << "It grants access to following areas:" + to_chat(user, "It expired at [worldtime2text(expiration_time)].") + + to_chat(user, "It grants access to following areas:") + for (var/A in temp_access) - user << "[get_access_desc(A)]." - user << "Issuing reason: [reason]." + to_chat(user, "[get_access_desc(A)].") + + to_chat(user, "Issuing reason: [reason].") + ///////////////////////////////////////////// //Guest pass terminal//////////////////////// @@ -56,7 +61,8 @@ giver = O updateUsrDialog() else - user << "There is already ID card inside." + to_chat(user, "There is already ID card inside.") + /obj/machinery/computer/guestpass/attack_ai(var/mob/user as mob) return attack_hand(user) @@ -118,7 +124,8 @@ if (dur > 0 && dur <= 30) duration = dur else - usr << "Invalid duration." + to_chat(usr, "Invalid duration.") + if ("access") var/A = text2num(href_list["access"]) if (A in accesses) @@ -150,7 +157,8 @@ var/dat = "

      Activity log of guest pass terminal #[uid]


      " for (var/entry in internal_log) dat += "[entry]

      " - //usr << "Printing the log, standby..." +// to_chat(usr, "Printing the log, standby...") + //sleep(50) var/obj/item/weapon/paper/P = new/obj/item/weapon/paper( loc ) playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1) @@ -176,6 +184,7 @@ pass.reason = reason pass.name = "guest pass #[number]" else - usr << "\red Cannot issue pass without issuing ID." + to_chat(usr, "\red Cannot issue pass without issuing ID.") + updateUsrDialog() return \ No newline at end of file diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 520f2ff4fb7..384168c119f 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -72,13 +72,16 @@ var/const/HOLOPAD_MODE = 0 if(alert(user,"Would you like to request an AI's presence?",,"Yes","No") == "Yes") if(last_request + 200 < world.time) //don't spam the AI with requests you jerk! last_request = world.time - user << "You request an AI's presence." + to_chat(user, "You request an AI's presence.") + var/area/area = get_area(src) for(var/mob/living/silicon/ai/AI in living_mob_list) if(!AI.client) continue - AI << "Your presence is requested at \the [area]." + to_chat(AI, "Your presence is requested at \the [area].") + else - user << "A request for AI presence was already sent recently." + to_chat(user, "A request for AI presence was already sent recently.") + /obj/machinery/hologram/holopad/attack_ai(mob/living/silicon/ai/user) if (!istype(user)) @@ -100,9 +103,11 @@ var/const/HOLOPAD_MODE = 0 create_holo(user)//Create one. src.visible_message("A holographic image of [user] flicks to life right before your eyes!") else - user << "\red ERROR: \black Image feed in progress." + to_chat(user, "\red ERROR: \black Image feed in progress.") + else - user << "\red ERROR: \black Unable to project hologram." + to_chat(user, "\red ERROR: \black Unable to project hologram.") + return /*This is the proc for special two-way communication between AI and holopad/people talking near holopad. @@ -252,7 +257,8 @@ Holographic project of everything else. flat_icon.AddAlphaMask(alpha_mask)//Finally, let's mix in a distortion effect. hologram.icon = flat_icon - world << "Your icon should appear now." + to_chat(world, "Your icon should appear now.") + return */ diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index e3bb3d32eaa..45f9e2e84b7 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -60,17 +60,20 @@ /obj/machinery/iv_drip/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if (istype(W, /obj/item/weapon/reagent_containers)) if(!isnull(src.beaker)) - user << "There is already a reagent container loaded!" + to_chat(user, "There is already a reagent container loaded!") + return if(user.drop_item()) W.forceMove(src) src.beaker = W - user << "You attach \the [W] to \the [src]." + to_chat(user, "You attach \the [W] to \the [src].") + src.update_icon() return else - user << "\The [W] is stuck to you!" + to_chat(user, "\The [W] is stuck to you!") + else return ..() @@ -146,27 +149,34 @@ set src in view(1) if(!istype(usr, /mob/living)) - usr << "\red You can't do that." + to_chat(usr, "\red You can't do that.") + return if(usr.stat) return mode = !mode - usr << "The IV drip is now [mode ? "injecting" : "taking blood"]." + to_chat(usr, "The IV drip is now [mode ? "injecting" : "taking blood"].") + /obj/machinery/iv_drip/examine(mob/user) ..(user) if (!(user in view(2)) && usr != src.loc) return - usr << "The IV drip is [mode ? "injecting" : "taking blood"]." + to_chat(usr, "The IV drip is [mode ? "injecting" : "taking blood"].") + if(beaker) if(beaker.reagents && beaker.reagents.reagent_list.len) - user << "\blue Attached is \a [beaker] with [beaker.reagents.total_volume] units of liquid." - else - user << "\blue Attached is an empty [beaker]." - else - user << "\blue No chemicals are attached." + to_chat(user, "\blue Attached is \a [beaker] with [beaker.reagents.total_volume] units of liquid.") + + else + to_chat(user, "\blue Attached is an empty [beaker].") + + else + to_chat(user, "\blue No chemicals are attached.") + + + to_chat(user, "\blue [attached ? attached : "No one"] is attached.") - user << "\blue [attached ? attached : "No one"] is attached." diff --git a/code/game/machinery/kitchen/gibber.dm b/code/game/machinery/kitchen/gibber.dm index 037852f463d..2de6678f35d 100644 --- a/code/game/machinery/kitchen/gibber.dm +++ b/code/game/machinery/kitchen/gibber.dm @@ -63,11 +63,13 @@ return if(operating) - user << "The gibber is locked and running, wait for it to finish." + to_chat(user, "The gibber is locked and running, wait for it to finish.") + return if(locked) - user << "Wait for [occupant.name] to finish being loaded!" + to_chat(user, "Wait for [occupant.name] to finish being loaded!") + return else @@ -77,7 +79,8 @@ if(istype(P, /obj/item/weapon/grab)) var/obj/item/weapon/grab/G = P if(G.state < 2) - user << "You need a better grip to do that!" + to_chat(user, "You need a better grip to do that!") + return move_into_gibber(user,G.affecting) qdel(G) @@ -110,19 +113,23 @@ /obj/machinery/gibber/proc/move_into_gibber(var/mob/user,var/mob/living/victim) if(occupant) - user << "The gibber is full, empty it first!" + to_chat(user, "The gibber is full, empty it first!") + return if(operating) - user << "The gibber is locked and running, wait for it to finish." + to_chat(user, "The gibber is locked and running, wait for it to finish.") + return if(!ishuman(victim) || issmall(victim)) - user << "This is not suitable for the gibber!" + to_chat(user, "This is not suitable for the gibber!") + return if(victim.abiotic(1)) - user << "Subject may not have abiotic items on." + to_chat(user, "Subject may not have abiotic items on.") + return user.visible_message("[user] starts to put [victim] into the gibber!") diff --git a/code/game/machinery/kitchen/icecream_vat.dm b/code/game/machinery/kitchen/icecream_vat.dm index d88d3a1dc9e..8619b0689be 100644 --- a/code/game/machinery/kitchen/icecream_vat.dm +++ b/code/game/machinery/kitchen/icecream_vat.dm @@ -107,20 +107,26 @@ var/list/ingredients_source = list( if(I.reagents.total_volume < 10) I.reagents.add_reagent("sugar", 10 - I.reagents.total_volume) else - user << "There is not enough [flavour_name] flavouring left! Insert more of the required ingredients." + to_chat(user, "There is not enough [flavour_name] flavouring left! Insert more of the required ingredients.") + else - user << "There is not enough icecream left! Insert more milk and ice." + to_chat(user, "There is not enough icecream left! Insert more milk and ice.") + else - user << "[O] already has icecream in it." + to_chat(user, "[O] already has icecream in it.") + else if(istype(O, /obj/item/weapon/reagent_containers/glass)) if(held_container) - user << "You must remove [held_container] from [src] first." + to_chat(user, "You must remove [held_container] from [src] first.") + else if(!user.drop_item()) - user << "\The [O] is stuck to your hand!" + to_chat(user, "\The [O] is stuck to your hand!") + return O.forceMove(src) - user << "You insert [O] into [src]." + to_chat(user, "You insert [O] into [src].") + held_container = O else var/obj/item/weapon/reagent_containers/R = O @@ -151,7 +157,8 @@ var/list/ingredients_source = list( ingredients[CONE_WAFFLE] += amount src.visible_message("[user] cooks up some waffle cones.") else - user << "You require sugar and flour to make waffle cones." + to_chat(user, "You require sugar and flour to make waffle cones.") + if(CONE_CHOC) if(ingredients[FLAVOUR_CHOCOLATE] > 0 && ingredients[CONE_WAFFLE] > 0) var/amount = min(ingredients[CONE_WAFFLE], ingredients[FLAVOUR_CHOCOLATE]) @@ -160,7 +167,8 @@ var/list/ingredients_source = list( ingredients[CONE_CHOC] += amount src.visible_message("[user] cooks up some chocolate cones.") else - user << "You require waffle cones and chocolate flavouring to make chocolate cones." + to_chat(user, "You require waffle cones and chocolate flavouring to make chocolate cones.") + if(ICECREAM_VANILLA) if(ingredients[INGR_ICE] > 0 && ingredients[INGR_MILK] > 0) var/amount = min(ingredients[INGR_ICE], ingredients[INGR_MILK]) @@ -169,7 +177,8 @@ var/list/ingredients_source = list( ingredients[ICECREAM_VANILLA] += amount src.visible_message("[user] whips up some vanilla icecream.") else - user << "You require milk and ice to make vanilla icecream." + to_chat(user, "You require milk and ice to make vanilla icecream.") + updateDialog() /obj/machinery/icecream_vat/Topic(href, href_list) @@ -191,7 +200,8 @@ var/list/ingredients_source = list( I.desc = "Delicious [cone_name] cone, but no ice cream." src.visible_message("[usr] dispenses a crunchy [cone_name] cone from [src].") else - usr << "There are no [cone_name] cones left!" + to_chat(usr, "There are no [cone_name] cones left!") + updateDialog() if(href_list["make"]) diff --git a/code/game/machinery/kitchen/juicer.dm b/code/game/machinery/kitchen/juicer.dm index e1f7bd7c091..def4500bb3c 100644 --- a/code/game/machinery/kitchen/juicer.dm +++ b/code/game/machinery/kitchen/juicer.dm @@ -42,7 +42,8 @@ return 1 else if(!user.unEquip(O)) - user << "\the [O] is stuck to your hand, you cannot put it in \the [src]" + to_chat(user, "\the [O] is stuck to your hand, you cannot put it in \the [src]") + return 0 O.forceMove(src) beaker = O @@ -51,10 +52,12 @@ src.updateUsrDialog() return 0 if (!is_type_in_list(O, allowed_items)) - user << "It doesn't look like that contains any juice." + to_chat(user, "It doesn't look like that contains any juice.") + return 1 if(!user.unEquip(O)) - user << "\the [O] is stuck to your hand, you cannot put it in \the [src]" + to_chat(user, "\the [O] is stuck to your hand, you cannot put it in \the [src]") + return 0 O.forceMove(src) src.updateUsrDialog() diff --git a/code/game/machinery/kitchen/kitchen_machine.dm b/code/game/machinery/kitchen/kitchen_machine.dm index 72d8bd22576..8161d18e017 100644 --- a/code/game/machinery/kitchen/kitchen_machine.dm +++ b/code/game/machinery/kitchen/kitchen_machine.dm @@ -68,11 +68,13 @@ playsound(src, 'sound/items/Ratchet.ogg', 50, 1) if(anchored) anchored = 0 - user << "\The [src] can now be moved." + to_chat(user, "\The [src] can now be moved.") + return else if(!anchored) anchored = 1 - user << "\The [src] is now secured." + to_chat(user, "\The [src] is now secured.") + return default_deconstruction_crowbar(O) @@ -104,7 +106,8 @@ src.dirty = 0 // just to be sure src.flags = OPENCONTAINER else - user << "It's broken!" + to_chat(user, "It's broken!") + return 1 else if(src.dirty==100) // The machine is all dirty so can't be used! if(istype(O, /obj/item/weapon/reagent_containers/spray/cleaner) || istype(O, /obj/item/weapon/soap)) // If they're trying to clean it then let them @@ -122,11 +125,13 @@ src.icon_state = off_icon src.flags = OPENCONTAINER else //Otherwise bad luck!! - user << "It's dirty!" + to_chat(user, "It's dirty!") + return 1 else if(is_type_in_list(O,acceptable_items)) if (contents.len>=max_n_of_items) - user << "This [src] is full of ingredients, you cannot put more." + to_chat(user, "This [src] is full of ingredients, you cannot put more.") + return 1 if (istype(O,/obj/item/stack) && O:amount>1) new O.type (src) @@ -136,7 +141,8 @@ "You add one of [O] to \the [src].") else if(!user.drop_item()) - user << "\The [O] is stuck to your hand, you cannot put it in \the [src]" + to_chat(user, "\The [O] is stuck to your hand, you cannot put it in \the [src]") + return 0 O.forceMove(src) @@ -151,15 +157,18 @@ return 1 for (var/datum/reagent/R in O.reagents.reagent_list) if (!(R.id in acceptable_reagents)) - user << "Your [O] contains components unsuitable for cookery." + to_chat(user, "Your [O] contains components unsuitable for cookery.") + return 1 //G.reagents.trans_to(src,G.amount_per_transfer_from_this) else if(istype(O,/obj/item/weapon/grab)) var/obj/item/weapon/grab/G = O - user << "This is ridiculous. You can not fit \the [G.affecting] in this [src]." + to_chat(user, "This is ridiculous. You can not fit \the [G.affecting] in this [src].") + return 1 else - user << "You have no idea what you can cook with this [O]." + to_chat(user, "You have no idea what you can cook with this [O].") + return 1 src.updateUsrDialog() @@ -343,7 +352,8 @@ if (src.reagents.total_volume) src.dirty++ src.reagents.clear_reagents() - usr << "You dispose of \the [src]'s contents." + to_chat(usr, "You dispose of \the [src]'s contents.") + src.updateUsrDialog() /obj/machinery/kitchen_machine/proc/muck_start() diff --git a/code/game/machinery/kitchen/monkeyrecycler.dm b/code/game/machinery/kitchen/monkeyrecycler.dm index cb8947d20a5..4d2cbca7974 100644 --- a/code/game/machinery/kitchen/monkeyrecycler.dm +++ b/code/game/machinery/kitchen/monkeyrecycler.dm @@ -53,11 +53,13 @@ var/mob/living/carbon/human/target = grabbed if(issmall(target)) if(target.stat == 0) - user << "The monkey is struggling far too much to put it in the recycler." + to_chat(user, "The monkey is struggling far too much to put it in the recycler.") + else user.drop_item() qdel(target) - user << "You stuff the monkey in the machine." + to_chat(user, "You stuff the monkey in the machine.") + playsound(src.loc, 'sound/machines/juicer.ogg', 50, 1) var/offset = prob(50) ? -2 : 2 animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking @@ -65,23 +67,29 @@ src.grinded++ sleep(50) pixel_x = initial(pixel_x) - user << "The machine now has [grinded] monkey\s worth of material stored." + to_chat(user, "The machine now has [grinded] monkey\s worth of material stored.") + else - user << "The machine only accepts monkeys!" + to_chat(user, "The machine only accepts monkeys!") + else - user << "The machine only accepts monkeys!" + to_chat(user, "The machine only accepts monkeys!") + return /obj/machinery/monkey_recycler/attack_hand(var/mob/user as mob) if (src.stat != 0) //NOPOWER etc return if(grinded >= required_grind) - user << "The machine hisses loudly as it condenses the grinded monkey meat. After a moment, it dispenses a brand new monkey cube." + to_chat(user, "The machine hisses loudly as it condenses the grinded monkey meat. After a moment, it dispenses a brand new monkey cube.") + playsound(src.loc, 'sound/machines/hiss.ogg', 50, 1) grinded -= required_grind for(var/i = 0, i < cube_production, i++) // Forgot to fix this bit the first time through new /obj/item/weapon/reagent_containers/food/snacks/monkeycube(src.loc) - user << "The machine's display flashes that it has [grinded] monkey\s worth of material left." + to_chat(user, "The machine's display flashes that it has [grinded] monkey\s worth of material left.") + else // I'm not sure if the \s macro works with a word in between; I'll play it safe - user << "The machine needs at least [required_grind] monkey\s worth of material to compress [cube_production] monkey\s. It only has [grinded]." + to_chat(user, "The machine needs at least [required_grind] monkey\s worth of material to compress [cube_production] monkey\s. It only has [grinded].") + return \ No newline at end of file diff --git a/code/game/machinery/kitchen/processor.dm b/code/game/machinery/kitchen/processor.dm index 87426a7daaa..a3adc7cbae0 100644 --- a/code/game/machinery/kitchen/processor.dm +++ b/code/game/machinery/kitchen/processor.dm @@ -135,7 +135,8 @@ /obj/machinery/processor/attackby(var/obj/item/O as obj, var/mob/user as mob, params) if(src.processing) - user << "\the [src] is already processing something!" + to_chat(user, "\the [src] is already processing something!") + return 1 if(default_deconstruction_screwdriver(user, "processor1", "processor", O)) @@ -158,7 +159,8 @@ var/datum/food_processor_process/P = select_recipe(what) if (!P) - user << "That probably won't blend." + to_chat(user, "That probably won't blend.") + return 1 user.visible_message("\the [user] puts \the [what] into \the [src].", \ @@ -174,11 +176,13 @@ return if(src.processing) - user << "\the [src] is already processing something!" + to_chat(user, "\the [src] is already processing something!") + return 1 if(src.contents.len == 0) - user << "\the [src] is empty." + to_chat(user, "\the [src] is empty.") + return 1 src.processing = 1 user.visible_message("[user] turns on [src].", \ diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm index 822b32b0226..0cc3e5ce688 100644 --- a/code/game/machinery/kitchen/smartfridge.dm +++ b/code/game/machinery/kitchen/smartfridge.dm @@ -194,7 +194,8 @@ if(istype(O, /obj/item/weapon/screwdriver) && anchored) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) panel_open = !panel_open - user << "You [panel_open ? "open" : "close"] the maintenance panel." + to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.") + overlays.Cut() if(panel_open) overlays += image(icon, "[initial(icon_state)]-panel") @@ -215,16 +216,19 @@ return if(stat & NOPOWER) - user << "\The [src] is unpowered and useless." + to_chat(user, "\The [src] is unpowered and useless.") + return if(accept_check(O)) if(contents.len >= max_n_of_items) - user << "\The [src] is full." + to_chat(user, "\The [src] is full.") + return 1 else if(!user.drop_item()) - user << "\The [O] is stuck to you!" + to_chat(user, "\The [O] is stuck to you!") + return O.forceMove(src) @@ -242,7 +246,8 @@ for(var/obj/G in P.contents) if(accept_check(G)) if(contents.len >= max_n_of_items) - user << "\The [src] is full." + to_chat(user, "\The [src] is full.") + return 1 else P.remove_from_storage(G,src) @@ -255,12 +260,14 @@ user.visible_message("[user] loads \the [src] with \the [P].", "You load \the [src] with \the [P].") if(P.contents.len > 0) - user << "Some items are refused." + to_chat(user, "Some items are refused.") + nanomanager.update_uis(src) else - user << "\The [src] smartly refuses [O]." + to_chat(user, "\The [src] smartly refuses [O].") + return 1 /obj/machinery/smartfridge/attack_ai(mob/user as mob) @@ -281,7 +288,8 @@ return if(stat & NOPOWER) - user << "\The [src] is unpowered and useless." + to_chat(user, "\The [src] is unpowered and useless.") + return var/obj/item/weapon/storage/box/pillbottles/P = over_object @@ -289,7 +297,8 @@ for(var/obj/G in P.contents) if(accept_check(G)) if(contents.len >= max_n_of_items) - user << "\The [src] is full." + to_chat(user, "\The [src] is full.") + return 1 else P.remove_from_storage(G,src) @@ -303,13 +312,15 @@ "[user] empties \the [P] into \the [src].", \ "You empty \the [P] into \the [src].") if(P.contents.len > 0) - user << "Some items are refused." + to_chat(user, "Some items are refused.") + nanomanager.update_uis(src) /obj/machinery/smartfridge/secure/emag_act(user as mob) emagged = 1 locked = -1 - user << "You short out the product lock on [src]." + to_chat(user, "You short out the product lock on [src].") + /******************* * SmartFridge Menu @@ -408,7 +419,8 @@ return 0 if(usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) if(!allowed(usr) && !emagged && locked != -1 && href_list["vend"]) - usr << "Access denied." + to_chat(usr, "Access denied.") + nanomanager.update_uis(src) return 0 return ..() \ No newline at end of file diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index 839c63a6bc9..55c78bb1a17 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -39,7 +39,8 @@ /obj/machinery/light_switch/examine(mob/user) if(..(user, 1)) - user << "A light switch. It is [on? "on" : "off"]." + to_chat(user, "A light switch. It is [on? "on" : "off"].") + /obj/machinery/light_switch/attack_hand(mob/user) diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index ecbdf219cd3..e2735942c79 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -222,7 +222,8 @@ Class Procs: message_admins("set_tag HREF (var attempted to edit: [href_list["set_tag"]]) exploit attempted by [key_name_admin(user)] on [src] (JMP)") return 1 if(!(href_list["set_tag"] in vars)) - usr << "Something went wrong: Unable to find [href_list["set_tag"]] in vars!" + to_chat(usr, "Something went wrong: Unable to find [href_list["set_tag"]] in vars!") + return 1 var/current_tag = src.vars[href_list["set_tag"]] var/newid = copytext(reject_bad_text(input(usr, "Specify the new value", src, current_tag) as null|text),1,MAX_MESSAGE_LEN) @@ -239,13 +240,16 @@ Class Procs: if(!O) return 1 if(!canLink(O)) - usr << "\red You can't link with that device." + to_chat(usr, "\red You can't link with that device.") + return 1 if(unlinkFrom(usr, O)) - usr << "\blue A green light flashes on \the [P], confirming the link was removed." + to_chat(usr, "\blue A green light flashes on \the [P], confirming the link was removed.") + else - usr << "\red A red light flashes on \the [P]. It appears something went wrong when unlinking the two devices." + to_chat(usr, "\red A red light flashes on \the [P]. It appears something went wrong when unlinking the two devices.") + update_mt_menu=1 if("link" in href_list) @@ -253,25 +257,31 @@ Class Procs: if(!O) return 1 if(!canLink(O,href_list)) - usr << "\red You can't link with that device." + to_chat(usr, "\red You can't link with that device.") + return 1 if (isLinkedWith(O)) - usr << "\red A red light flashes on \the [P]. The two devices are already linked." + to_chat(usr, "\red A red light flashes on \the [P]. The two devices are already linked.") + return 1 if(linkWith(usr, O, href_list)) - usr << "\blue A green light flashes on \the [P], confirming the link was added." + to_chat(usr, "\blue A green light flashes on \the [P], confirming the link was added.") + else - usr << "\red A red light flashes on \the [P]. It appears something went wrong when linking the two devices." + to_chat(usr, "\red A red light flashes on \the [P]. It appears something went wrong when linking the two devices.") + update_mt_menu=1 if("buffer" in href_list) P.buffer = src - usr << "\blue A green light flashes, and the device appears in the multitool buffer." + to_chat(usr, "\blue A green light flashes, and the device appears in the multitool buffer.") + update_mt_menu=1 if("flush" in href_list) - usr << "\blue A green light flashes, and the device disappears from the multitool buffer." + to_chat(usr, "\blue A green light flashes, and the device disappears from the multitool buffer.") + P.buffer = null update_mt_menu=1 @@ -338,7 +348,8 @@ Class Procs: return 1 if(!user.IsAdvancedToolUser()) - user << "You don't have the dexterity to do this!" + to_chat(user, "You don't have the dexterity to do this!") + return 1 if (ishuman(user)) @@ -347,7 +358,8 @@ Class Procs: visible_message("[H] stares cluelessly at [src] and drools.") return 1 else if(prob(H.getBrainLoss())) - user << "You momentarily forget how to use [src]." + to_chat(user, "You momentarily forget how to use [src].") + return 1 if(panel_open) @@ -391,11 +403,13 @@ Class Procs: if(!panel_open) panel_open = 1 icon_state = icon_state_open - user << "You open the maintenance hatch of [src]." + to_chat(user, "You open the maintenance hatch of [src].") + else panel_open = 0 icon_state = icon_state_closed - user << "You close the maintenance hatch of [src]." + to_chat(user, "You close the maintenance hatch of [src].") + return 1 return 0 @@ -403,16 +417,19 @@ Class Procs: if(panel_open && istype(W)) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) dir = turn(dir,-90) - user << "You rotate [src]." + to_chat(user, "You rotate [src].") + return 1 return 0 /obj/machinery/proc/default_unfasten_wrench(mob/user, obj/item/weapon/wrench/W, time = 20) if(istype(W)) - user << "Now [anchored ? "un" : ""]securing [name]." + to_chat(user, "Now [anchored ? "un" : ""]securing [name].") + playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, time, target = src)) - user << "You've [anchored ? "un" : ""]secured [name]." + to_chat(user, "You've [anchored ? "un" : ""]secured [name].") + anchored = !anchored playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) return 1 @@ -450,7 +467,8 @@ Class Procs: component_parts -= A component_parts += B B.loc = null - user << "[A.name] replaced with [B.name]." + to_chat(user, "[A.name] replaced with [B.name].") + shouldplaysound = 1 break RefreshParts() @@ -463,9 +481,11 @@ Class Procs: return 0 /obj/machinery/proc/display_parts(mob/user) - user << "Following parts detected in the machine:" + to_chat(user, "Following parts detected in the machine:") + for(var/obj/item/C in component_parts) - user << "\icon[C] [C.name]" + to_chat(user, "\icon[C] [C.name]") + /obj/machinery/examine(mob/user) ..(user) diff --git a/code/game/machinery/mass_driver.dm b/code/game/machinery/mass_driver.dm index 121b8118de0..c87ecc345b5 100644 --- a/code/game/machinery/mass_driver.dm +++ b/code/game/machinery/mass_driver.dm @@ -21,7 +21,8 @@ return 1 if(istype(W, /obj/item/weapon/screwdriver)) - user << "You begin to unscrew the bolts off the [src]..." + to_chat(user, "You begin to unscrew the bolts off the [src]...") + playsound(get_turf(src), 'sound/items/Screwdriver.ogg', 50, 1) if(do_after(user, 30, target = src)) var/obj/machinery/mass_driver_frame/F = new(get_turf(src)) @@ -69,7 +70,8 @@ /obj/machinery/mass_driver/emag_act(mob/user) if(!emagged) emagged = 1 - user << "You hack the Mass Driver, radically increasing the force at which it'll throw things. Better not stand in its way." + to_chat(user, "You hack the Mass Driver, radically increasing the force at which it'll throw things. Better not stand in its way.") + return 1 return -1 @@ -104,43 +106,53 @@ if(istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W if(!WT.remove_fuel(0, user)) - user << "The welding tool must be on to complete this task." + to_chat(user, "The welding tool must be on to complete this task.") + return 1 playsound(get_turf(src), 'sound/items/Welder.ogg', 50, 1) - user << "You begin to cut the frame apart..." + to_chat(user, "You begin to cut the frame apart...") + if(do_after(user, 30, target = src) && (build == 0)) - user << "You detach the plasteel sheets from each others." + to_chat(user, "You detach the plasteel sheets from each others.") + new /obj/item/stack/sheet/plasteel(get_turf(src),3) qdel(src) return 1 if(istype(W, /obj/item/weapon/wrench)) - user << "You begin to anchor \the [src] on the floor." + to_chat(user, "You begin to anchor \the [src] on the floor.") + playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 10, target = src) && (build == 0)) - user << "You anchor \the [src]!" + to_chat(user, "You anchor \the [src]!") + anchored = 1 build++ update_icon() return 1 if(1) // Fixed to the floor if(istype(W, /obj/item/weapon/wrench)) - user << "You begin to de-anchor \the [src] from the floor." + to_chat(user, "You begin to de-anchor \the [src] from the floor.") + playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 10, target = src) && (build == 1)) build-- update_icon() anchored = 0 - user << "You de-anchored \the [src]!" + to_chat(user, "You de-anchored \the [src]!") + return 1 if(istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W if(!WT.remove_fuel(0, user)) - user << "The welding tool must be on to complete this task." + to_chat(user, "The welding tool must be on to complete this task.") + return 1 playsound(get_turf(src), 'sound/items/Welder.ogg', 50, 1) - user << "You begin to weld \the [src] to the floor..." + to_chat(user, "You begin to weld \the [src] to the floor...") + if(do_after(user, 40, target = src) && (build == 1)) - user << "You welded \the [src] to the floor." + to_chat(user, "You welded \the [src] to the floor.") + build++ update_icon() return 1 @@ -148,46 +160,56 @@ if(istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W if(!WT.remove_fuel(0, user)) - user << "The welding tool must be on to complete this task." + to_chat(user, "The welding tool must be on to complete this task.") + return 1 playsound(get_turf(src), 'sound/items/Welder.ogg', 50, 1) - user << "You begin to unweld \the [src] to the floor..." + to_chat(user, "You begin to unweld \the [src] to the floor...") + if(do_after(user, 40, target = src) && (build == 2)) - user << "You unwelded \the [src] to the floor." + to_chat(user, "You unwelded \the [src] to the floor.") + build-- update_icon() if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/C=W - user << "You start adding cables to \the [src]..." + to_chat(user, "You start adding cables to \the [src]...") + playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) if(do_after(user, 20, target = src) && (C.amount >= 3) && (build == 2)) C.use(3) - user << "You've added cables to \the [src]." + to_chat(user, "You've added cables to \the [src].") + build++ update_icon() if(3) // Wired if(istype(W, /obj/item/weapon/wirecutters)) - user << "You begin to remove the wiring from \the [src]." + to_chat(user, "You begin to remove the wiring from \the [src].") + if(do_after(user, 10, target = src) && (build == 3)) new /obj/item/stack/cable_coil(loc,3) playsound(get_turf(src), 'sound/items/Wirecutter.ogg', 50, 1) - user << "You've removed the cables from \the [src]." + to_chat(user, "You've removed the cables from \the [src].") + build-- update_icon() return 1 if(istype(W, /obj/item/stack/rods)) var/obj/item/stack/rods/R=W - user << "You begin to complete \the [src]..." + to_chat(user, "You begin to complete \the [src]...") + playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) if(do_after(user, 20, target = src) && (R.amount >= 3) && (build == 3)) R.use(3) - user << "You've added the grille to \the [src]." + to_chat(user, "You've added the grille to \the [src].") + build++ update_icon() return 1 if(4) // Grille in place if(istype(W, /obj/item/weapon/crowbar)) - user << "You begin to pry off the grille from \the [src]..." + to_chat(user, "You begin to pry off the grille from \the [src]...") + playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1) if(do_after(user, 30, target = src) && (build == 4)) new /obj/item/stack/rods(loc,2) @@ -195,7 +217,8 @@ update_icon() return 1 if(istype(W, /obj/item/weapon/screwdriver)) - user << "You finalize the Mass Driver..." + to_chat(user, "You finalize the Mass Driver...") + playsound(get_turf(src), 'sound/items/Screwdriver.ogg', 50, 1) var/obj/machinery/mass_driver/M = new(get_turf(src)) M.dir = src.dir diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index 041e4cfc3d5..ef0a6475972 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -90,12 +90,15 @@ if(open) if (src.allowed(user)) src.locked = !src.locked - user << "Controls are now [src.locked ? "locked" : "unlocked"]." + to_chat(user, "Controls are now [src.locked ? "locked" : "unlocked"].") + else - user << "Access denied." + to_chat(user, "Access denied.") + updateDialog() else - user << "You must open the cover first!" + to_chat(user, "You must open the cover first!") + return /obj/machinery/navbeacon/attack_ai(mob/user) @@ -113,7 +116,8 @@ return // prevent intraction when T-scanner revealed if(!open && !ai) // can't alter controls if not open, unless you're an AI - user << "The beacon's control cover is closed!" + to_chat(user, "The beacon's control cover is closed!") + return diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index b37d4313f6b..133affefb22 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -710,7 +710,8 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co /obj/machinery/newscaster/attackby(obj/item/I as obj, mob/living/user as mob, params) if(istype(I, /obj/item/weapon/wrench)) - user << "Now [anchored ? "un" : ""]securing [name]" + to_chat(user, "Now [anchored ? "un" : ""]securing [name]") + playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 60, target = src)) new /obj/item/mounted/frame/newscaster_frame(loc) @@ -739,7 +740,8 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co visible_message("[user.name] forcefully slams the [src.name] with the [I.name]!", null, 5 ) playsound(src.loc, 'sound/effects/Glasshit.ogg', 100, 1) else - user << "This does nothing." + to_chat(user, "This does nothing.") + src.update_icon() /obj/machinery/newscaster/proc/AttachPhoto(mob/user as mob) @@ -863,7 +865,8 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co human_user << browse(dat, "window=newspaper_main;size=300x400") onclose(human_user, "newspaper_main") else - user << "The paper is full of intelligible symbols!" + to_chat(user, "The paper is full of intelligible symbols!") + obj/item/weapon/newspaper/Topic(href, href_list) @@ -901,7 +904,8 @@ obj/item/weapon/newspaper/Topic(href, href_list) obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(istype(W, /obj/item/weapon/pen)) if(src.scribble_page == src.curr_page) - user << "There's already a scribble in this page... You wouldn't want to make things too cluttered, would you?" + to_chat(user, "There's already a scribble in this page... You wouldn't want to make things too cluttered, would you?") + else var/s = strip_html( input(user, "Write something", "Newspaper", "") ) s = sanitize(copytext(s, 1, MAX_MESSAGE_LEN)) diff --git a/code/game/machinery/overview.dm b/code/game/machinery/overview.dm index 1f1395431d9..59930a57883 100644 --- a/code/game/machinery/overview.dm +++ b/code/game/machinery/overview.dm @@ -30,7 +30,8 @@ imap += icon('icons/misc/imap.dmi', "blank") imap += icon('icons/misc/imap.dmi', "blank") - //world << "[icount] images in list" +// to_chat(world, "[icount] images in list") + for(var/wx = 1 ; wx <= world.maxx; wx++) @@ -146,12 +147,14 @@ var/rx = ((wx*2+xoff)%32) + 1 var/ry = ((wy*2+yoff)%32) + 1 - //world << "trying [ix],[iy] : [ix+icx*iy]" +// to_chat(world, "trying [ix],[iy] : [ix+icx*iy]") + var/icon/I = imap[1+(ix + icx*iy)*2] var/icon/I2 = imap[2+(ix + icx*iy)*2] - //world << "icon: \icon[I]" +// to_chat(world, "icon: \icon[I]") + I.DrawBox(colour, rx, ry, rx+1, ry+1) @@ -168,7 +171,8 @@ H.screen_loc = "[5 + i%icx],[6+ round(i/icx)]" - //world<<"\icon[I] at [H.screen_loc]" +// to_chat(world, "\icon[I] at [H.screen_loc]") + H.name = (i==0)?"maprefresh":"map" @@ -280,11 +284,13 @@ var/rx = ((wx*2+xoff)%32) + 1 var/ry = ((wy*2+yoff)%32) + 1 - //world << "trying [ix],[iy] : [ix+icx*iy]" +// to_chat(world, "trying [ix],[iy] : [ix+icx*iy]") + var/icon/I = imap[1+(ix + icx*iy)] - //world << "icon: \icon[I]" +// to_chat(world, "icon: \icon[I]") + I.DrawBox(colour, rx, ry, rx, ry) @@ -299,7 +305,8 @@ H.screen_loc = "[5 + i%icx],[6+ round(i/icx)]" - //world<<"\icon[I] at [H.screen_loc]" +// to_chat(world, "\icon[I] at [H.screen_loc]") + H.name = (i==0)?"maprefresh":"map" diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 11361034fbb..c20c5b56beb 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -434,7 +434,8 @@ for(var/obj/machinery/atmospherics/M in src.loc) if((M.initialize_directions & pipe_dir) && M.check_connect_types_construction(M,src)) // matches at least one direction on either type of pipe - user << "There is already a pipe of the same type at this location." + to_chat(user, "There is already a pipe of the same type at this location.") + return 1 switch(pipe_type) //What kind of heartless person thought of doing this? @@ -619,11 +620,13 @@ if (!istype(W, /obj/item/weapon/wrench)) return ..() if(!locate(/obj/machinery/atmospherics/pipe, src.loc)) - user << "\red You need to fasten it to a pipe" + to_chat(user, "\red You need to fasten it to a pipe") + return 1 new/obj/machinery/meter( src.loc ) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "\blue You have fastened the meter to the pipe" + to_chat(user, "\blue You have fastened the meter to the pipe") + qdel(src) /obj/item/pipe_gsensor @@ -640,7 +643,8 @@ return ..() new/obj/machinery/air_sensor( src.loc ) playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1) - user << "\blue You have fastened the gas sensor" + to_chat(user, "\blue You have fastened the gas sensor") + qdel(src) #undef PIPE_SIMPLE_STRAIGHT diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index 31b58bcac10..4e7347fdfe0 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -100,14 +100,16 @@ /obj/machinery/pipedispenser/attackby(var/obj/item/W as obj, var/mob/user as mob, params) src.add_fingerprint(usr) if (istype(W, /obj/item/pipe) || istype(W, /obj/item/pipe_meter) || istype(W, /obj/item/pipe_gsensor)) - usr << "\blue You put [W] back to [src]." + to_chat(usr, "\blue You put [W] back to [src].") + user.drop_item() qdel(W) return else if (istype(W, /obj/item/weapon/wrench)) if (unwrenched==0) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "\blue You begin to unfasten \the [src] from the floor..." + to_chat(user, "\blue You begin to unfasten \the [src] from the floor...") + if (do_after(user, 40, target = src)) user.visible_message( \ "[user] unfastens \the [src].", \ @@ -120,7 +122,8 @@ usr << browse(null, "window=pipedispenser") else /*if (unwrenched==1)*/ playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "\blue You begin to fasten \the [src] to the floor..." + to_chat(user, "\blue You begin to fasten \the [src] to the floor...") + if (do_after(user, 20, target = src)) user.visible_message( \ "[user] fastens \the [src].", \ diff --git a/code/game/machinery/podmen.dm b/code/game/machinery/podmen.dm index 6679fd3b580..47068c97e9a 100644 --- a/code/game/machinery/podmen.dm +++ b/code/game/machinery/podmen.dm @@ -31,7 +31,8 @@ Growing it to term with nothing injected will grab a ghost from the observers. * if(istype(W,/obj/item/weapon/reagent_containers)) - user << "You inject the contents of the syringe into the seeds." + to_chat(user, "You inject the contents of the syringe into the seeds.") + var/datum/reagent/blood/B @@ -42,7 +43,8 @@ Growing it to term with nothing injected will grab a ghost from the observers. * break if(B) source = B.data["donor"] - user << "The strange, sluglike seeds quiver gently and swell with blood." + to_chat(user, "The strange, sluglike seeds quiver gently and swell with blood.") + if(!source.client && source.mind) for(var/mob/O in respawnable_list) if(O.mind == source.mind && config.revival_pod_plants) @@ -51,10 +53,12 @@ Growing it to term with nothing injected will grab a ghost from the observers. * source.key = O.key return if("No") - user << "The seeds seem to reject the blood, returning to their original size as they stop quivering." + to_chat(user, "The seeds seem to reject the blood, returning to their original size as they stop quivering.") + return else - user << "Nothing happens." + to_chat(user, "Nothing happens.") + return if (!istype(source)) @@ -76,7 +80,8 @@ Growing it to term with nothing injected will grab a ghost from the observers. * if(beingharvested) - user << ("\red You can only harvest the pod once!") + to_chat(user, ("\red You can only harvest the pod once!")) + else user.visible_message("\blue [user] carefully begins to open the pod...","\blue You carefully begin to open the pod...") beingharvested = 1 @@ -123,11 +128,15 @@ Growing it to term with nothing injected will grab a ghost from the observers. * ticker.mode:update_all_cult_icons() //So the icon actually appears // -- End mode specific stuff - podman << "\green You awaken slowly, feeling your sap stir into sluggish motion as the warm air caresses your bark." + to_chat(podman, "\green You awaken slowly, feeling your sap stir into sluggish motion as the warm air caresses your bark.") + if(source && ckey && podman.ckey == ckey) - podman << "Memories of a life as [source] drift oddly through a mind unsuited for them, like a skin of oil over a fathomless lake." - podman << "You are now one of the Dionaea, a race of drifting interstellar plantlike creatures that sometimes share their seeds with human traders." - podman << "Too much darkness will send you into shock and starve you, but light will help you heal." + to_chat(podman, "Memories of a life as [source] drift oddly through a mind unsuited for them, like a skin of oil over a fathomless lake.") + + to_chat(podman, "You are now one of the Dionaea, a race of drifting interstellar plantlike creatures that sometimes share their seeds with human traders.") + + to_chat(podman, "Too much darkness will send you into shock and starve you, but light will help you heal.") + else new /mob/living/carbon/monkey/diona(parent.loc) diff --git a/code/game/machinery/poolcontroller.dm b/code/game/machinery/poolcontroller.dm index e2da5b8beb0..ac9eb4c6793 100644 --- a/code/game/machinery/poolcontroller.dm +++ b/code/game/machinery/poolcontroller.dm @@ -21,16 +21,22 @@ /obj/machinery/poolcontroller/emag_act(user as mob) //Emag_act, this is called when it is hit with a cryptographic sequencer. if(!emagged) //If it is not already emagged, emag it. - user << "You disable \the [src]'s temperature safeguards." //Inform the mob of what emagging does. + to_chat(user, "You disable \the [src]'s temperature safeguards.")//Inform the mob of what emagging does. + + emagged = 1 //Set the emag var to true. /obj/machinery/poolcontroller/attackby(obj/item/P as obj, mob/user as mob, params) //Proc is called when a user hits the pool controller with something. if(istype(P,/obj/item/device/multitool)) //If the mob hits the pool controller with a multitool, reset the emagged status if(emagged) //Check the emag status - user << "You re-enable \the [src]'s temperature safeguards." //Inform the user that they have just fixed the safeguards. + to_chat(user, "You re-enable \the [src]'s temperature safeguards.")//Inform the user that they have just fixed the safeguards. + + emagged = 0 //Set the emagged var to false. else - user << "Nothing happens." //If not emagged, don't do anything, and don't tell the user that it can be emagged. + to_chat(user, "Nothing happens.")//If not emagged, don't do anything, and don't tell the user that it can be emagged. + + else //If it's not a multitool, defer to /obj/machinery/attackby ..() @@ -64,21 +70,27 @@ switch(temperature) //Apply different effects based on what the temperature is set to. if("scalding") //Burn the mob. M.bodytemperature = min(500, M.bodytemperature + 35) //heat mob at 35k(elvin) per cycle - M << "The water is searing hot!" + to_chat(M, "The water is searing hot!") + if("warm") //Gently warm the mob. M.bodytemperature = min(330, M.bodytemperature + 10) //Heats up mobs to just over normal, not enough to burn if(prob(50)) //inform the mob of warm water half the time - M << "The water is quite warm." //Inform the mob it's warm water. + to_chat(M, "The water is quite warm.")//Inform the mob it's warm water. + + if("cool") //Gently cool the mob. M.bodytemperature = max(290, M.bodytemperature - 10) //Cools mobs to just below normal, not enough to burn if(prob(50)) //inform the mob of cold water half the time - M << "The water is chilly." //Inform the mob it's chilly water. + to_chat(M, "The water is chilly.")//Inform the mob it's chilly water. + + if("frigid") //Freeze the mob. M.bodytemperature = max(80, M.bodytemperature - 35) //cool mob at -35k per cycle - M << "The water is freezing!" + to_chat(M, "The water is freezing!") + return /obj/machinery/poolcontroller/proc/handleDrowning(var/mob/living/carbon/human/drownee) diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 29e1fecd9e3..1c1a8a237b6 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -174,11 +174,13 @@ var/list/turret_icons /obj/machinery/porta_turret/proc/isLocked(mob/user) if(ailock && (isrobot(user) || isAI(user))) - user << "There seems to be a firewall preventing you from accessing this device." + to_chat(user, "There seems to be a firewall preventing you from accessing this device.") + return 1 if(locked && !(isrobot(user) || isAI(user) || isobserver(user))) - user << "Access denied." + to_chat(user, "Access denied.") + return 1 return 0 @@ -243,14 +245,16 @@ var/list/turret_icons /obj/machinery/porta_turret/CanUseTopic(var/mob/user) if(HasController()) - user << "Turrets can only be controlled using the assigned turret controller." + to_chat(user, "Turrets can only be controlled using the assigned turret controller.") + return STATUS_CLOSE if(isLocked(user)) return STATUS_CLOSE if(!anchored) - usr << "\The [src] has to be secured first!" + to_chat(usr, "\The [src] has to be secured first!") + return STATUS_CLOSE return ..() @@ -329,10 +333,12 @@ var/list/turret_icons if(istype(I, /obj/item/weapon/crowbar)) //If the turret is destroyed, you can remove it with a crowbar to //try and salvage its components - user << "You begin prying the metal coverings off." + to_chat(user, "You begin prying the metal coverings off.") + if(do_after(user, 20, target = src)) if(prob(70)) - user << "You remove the turret and salvage some components." + to_chat(user, "You remove the turret and salvage some components.") + if(installation) var/obj/item/weapon/gun/energy/Gun = new installation(loc) Gun.power_supply.charge = gun_charge @@ -342,18 +348,22 @@ var/list/turret_icons if(prob(50)) new /obj/item/device/assembly/prox_sensor(loc) else - user << "You remove the turret but did not manage to salvage anything." + to_chat(user, "You remove the turret but did not manage to salvage anything.") + qdel(src) // qdel else if((istype(I, /obj/item/weapon/wrench))) if(enabled || raised) - user << "You cannot unsecure an active turret!" + to_chat(user, "You cannot unsecure an active turret!") + return if(wrenching) - user << "Someone is already [anchored ? "un" : ""]securing the turret!" + to_chat(user, "Someone is already [anchored ? "un" : ""]securing the turret!") + return if(!anchored && isinspace()) - user << "Cannot secure turrets in space!" + to_chat(user, "Cannot secure turrets in space!") + return user.visible_message( \ @@ -368,21 +378,25 @@ var/list/turret_icons playsound(loc, 'sound/items/Ratchet.ogg', 100, 1) anchored = 1 update_icon() - user << "You secure the exterior bolts on the turret." + to_chat(user, "You secure the exterior bolts on the turret.") + else if(anchored) playsound(loc, 'sound/items/Ratchet.ogg', 100, 1) anchored = 0 - user << "You unsecure the exterior bolts on the turret." + to_chat(user, "You unsecure the exterior bolts on the turret.") + update_icon() wrenching = 0 else if(istype(I, /obj/item/weapon/card/id) || istype(I, /obj/item/device/pda)) if(allowed(user)) locked = !locked - user << "Controls are now [locked ? "locked" : "unlocked"]." + to_chat(user, "Controls are now [locked ? "locked" : "unlocked"].") + updateUsrDialog() else - user << "Access denied." + to_chat(user, "Access denied.") + else //if the turret was attacked with the intention of harming it: @@ -407,7 +421,8 @@ var/list/turret_icons visible_message("[M] [M.attacktext] [src]!") take_damage(M.melee_damage_upper) else - M << "That object is useless to you." + to_chat(M, "That object is useless to you.") + return /obj/machinery/porta_turret/attack_alien(mob/living/carbon/alien/humanoid/M) @@ -418,7 +433,8 @@ var/list/turret_icons visible_message("[M] has slashed at [src]!") take_damage(15) else - M << "That object is useless to you." + to_chat(M, "That object is useless to you.") + return /obj/machinery/porta_turret/emag_act(user as mob) @@ -426,7 +442,8 @@ var/list/turret_icons //Emagging the turret makes it go bonkers and stun everyone. It also makes //the turret shoot much, much faster. if(user) - user << "You short out [src]'s threat assessment circuits." + to_chat(user, "You short out [src]'s threat assessment circuits.") + visible_message("[src] hums oddly...") emagged = 1 iconholder = 1 @@ -766,14 +783,16 @@ var/list/turret_icons if(0) //first step if(istype(I, /obj/item/weapon/wrench) && !anchored) playsound(loc, 'sound/items/Ratchet.ogg', 100, 1) - user << "You secure the external bolts." + to_chat(user, "You secure the external bolts.") + anchored = 1 build_step = 1 return else if(istype(I, /obj/item/weapon/crowbar) && !anchored) playsound(loc, 'sound/items/Crowbar.ogg', 75, 1) - user << "You dismantle the turret construction." + to_chat(user, "You dismantle the turret construction.") + new /obj/item/stack/sheet/metal( loc, 5) qdel(src) // qdel return @@ -782,16 +801,19 @@ var/list/turret_icons if(istype(I, /obj/item/stack/sheet/metal)) var/obj/item/stack/sheet/metal/M = I if(M.use(2)) - user << "You add some metal armor to the interior frame." + to_chat(user, "You add some metal armor to the interior frame.") + build_step = 2 icon_state = "turret_frame2" else - user << "You need two sheets of metal to continue construction." + to_chat(user, "You need two sheets of metal to continue construction.") + return else if(istype(I, /obj/item/weapon/wrench)) playsound(loc, 'sound/items/Ratchet.ogg', 75, 1) - user << "You unfasten the external bolts." + to_chat(user, "You unfasten the external bolts.") + anchored = 0 build_step = 0 return @@ -800,7 +822,8 @@ var/list/turret_icons if(2) if(istype(I, /obj/item/weapon/wrench)) playsound(loc, 'sound/items/Ratchet.ogg', 100, 1) - user << "You bolt the metal armor into place." + to_chat(user, "You bolt the metal armor into place.") + build_step = 3 return @@ -809,14 +832,16 @@ var/list/turret_icons if(!WT.isOn()) return if(WT.get_fuel() < 5) //uses up 5 fuel. - user << "You need more fuel to complete this task." + to_chat(user, "You need more fuel to complete this task.") + return playsound(loc, pick('sound/items/Welder.ogg', 'sound/items/Welder2.ogg'), 50, 1) if(do_after(user, 20, target = src)) if(!src || !WT.remove_fuel(5, user)) return build_step = 1 - user << "You remove the turret's interior metal armor." + to_chat(user, "You remove the turret's interior metal armor.") + new /obj/item/stack/sheet/metal( loc, 2) return @@ -828,11 +853,13 @@ var/list/turret_icons return var/obj/item/weapon/gun/energy/E = I //typecasts the item to an energy gun if(!user.unEquip(I)) - user << "\the [I] is stuck to your hand, you cannot put it in \the [src]" + to_chat(user, "\the [I] is stuck to your hand, you cannot put it in \the [src]") + return installation = I.type //installation becomes I.type gun_charge = E.power_supply.charge //the gun's charge is stored in gun_charge - user << "You add [I] to the turret." + to_chat(user, "You add [I] to the turret.") + if(istype(installation, /obj/item/weapon/gun/energy/laser/bluetag) || istype(installation, /obj/item/weapon/gun/energy/laser/redtag)) target_type = /obj/machinery/porta_turret/tag @@ -845,18 +872,21 @@ var/list/turret_icons else if(istype(I, /obj/item/weapon/wrench)) playsound(loc, 'sound/items/Ratchet.ogg', 100, 1) - user << "You remove the turret's metal armor bolts." + to_chat(user, "You remove the turret's metal armor bolts.") + build_step = 2 return if(4) if(isprox(I)) if(!user.unEquip(I)) - user << "\the [I] is stuck to your hand, you cannot put it in \the [src]" + to_chat(user, "\the [I] is stuck to your hand, you cannot put it in \the [src]") + return build_step = 5 qdel(I) // qdel - user << "You add the prox sensor to the turret." + to_chat(user, "You add the prox sensor to the turret.") + return //attack_hand() removes the gun @@ -865,7 +895,8 @@ var/list/turret_icons if(istype(I, /obj/item/weapon/screwdriver)) playsound(loc, 'sound/items/Screwdriver.ogg', 100, 1) build_step = 6 - user << "You close the internal access hatch." + to_chat(user, "You close the internal access hatch.") + return //attack_hand() removes the prox sensor @@ -874,16 +905,19 @@ var/list/turret_icons if(istype(I, /obj/item/stack/sheet/metal)) var/obj/item/stack/sheet/metal/M = I if(M.use(2)) - user << "You add some metal armor to the exterior frame." + to_chat(user, "You add some metal armor to the exterior frame.") + build_step = 7 else - user << "You need two sheets of metal to continue construction." + to_chat(user, "You need two sheets of metal to continue construction.") + return else if(istype(I, /obj/item/weapon/screwdriver)) playsound(loc, 'sound/items/Screwdriver.ogg', 100, 1) build_step = 5 - user << "You open the internal access hatch." + to_chat(user, "You open the internal access hatch.") + return if(7) @@ -891,14 +925,16 @@ var/list/turret_icons var/obj/item/weapon/weldingtool/WT = I if(!WT.isOn()) return if(WT.get_fuel() < 5) - user << "You need more fuel to complete this task." + to_chat(user, "You need more fuel to complete this task.") + playsound(loc, pick('sound/items/Welder.ogg', 'sound/items/Welder2.ogg'), 50, 1) if(do_after(user, 30, target = src)) if(!src || !WT.remove_fuel(5, user)) return build_step = 8 - user << "You weld the turret's armor down." + to_chat(user, "You weld the turret's armor down.") + //The final step: create a full turret var/obj/machinery/porta_turret/Turret = new target_type(loc) @@ -912,7 +948,8 @@ var/list/turret_icons else if(istype(I, /obj/item/weapon/crowbar)) playsound(loc, 'sound/items/Crowbar.ogg', 75, 1) - user << "You pry off the turret's exterior armor." + to_chat(user, "You pry off the turret's exterior armor.") + new /obj/item/stack/sheet/metal(loc, 2) build_step = 6 return @@ -942,10 +979,12 @@ var/list/turret_icons Gun.update_icon() installation = null gun_charge = 0 - user << "You remove [Gun] from the turret frame." + to_chat(user, "You remove [Gun] from the turret frame.") + if(5) - user << "You remove the prox sensor from the turret frame." + to_chat(user, "You remove the prox sensor from the turret frame.") + new /obj/item/device/assembly/prox_sensor(loc) build_step = 4 diff --git a/code/game/machinery/programmable_unloader.dm b/code/game/machinery/programmable_unloader.dm index b59bfad4d3e..02c6bdea07b 100644 --- a/code/game/machinery/programmable_unloader.dm +++ b/code/game/machinery/programmable_unloader.dm @@ -199,7 +199,8 @@ if(istype(I,/obj/item/weapon/wrench)) // code borrowed from pipe dispenser if (unwrenched==0) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "\blue You begin to unfasten \the [src] from the floor..." + to_chat(user, "\blue You begin to unfasten \the [src] from the floor...") + if (do_after(user, 40, target = src)) user.visible_message( \ "[user] unfastens \the [src].", \ @@ -212,7 +213,8 @@ usr << browse(null, "window=pipedispenser") else /* unwrenched */ playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "\blue You begin to fasten \the [src] to the floor..." + to_chat(user, "\blue You begin to fasten \the [src] to the floor...") + if (do_after(user, 20, target = src)) user.visible_message( \ "[user] fastens \the [src].", \ @@ -230,16 +232,20 @@ open = 0 if(!unwrenched && !circuit_removed) src.stat &= ~MAINT - user << "You close \the [src]'s maintenance panel." + to_chat(user, "You close \the [src]'s maintenance panel.") + else open = 1 src.stat |= MAINT - user << "You open \the [src]'s maintenance panel." + to_chat(user, "You open \the [src]'s maintenance panel.") + if(istype(I,/obj/item/weapon/crowbar)) if(open) - user << "\blue You begin to pry out the [src]'s circuits." + to_chat(user, "\blue You begin to pry out the [src]'s circuits.") + if(do_after(user,40, target = src)) - user << "\blue You remove the circuitboard." + to_chat(user, "\blue You remove the circuitboard.") + circuit_removed = 1 use_power = 0 on = 0 @@ -260,10 +266,12 @@ if(istype(I,/obj/item/weapon/circuitboard/programmable)) if(!open) - user << "You have to open the machine first!" + to_chat(user, "You have to open the machine first!") + return if(!circuit_removed) - user << "There is already a circuitboard present!" + to_chat(user, "There is already a circuitboard present!") + return circuit_removed = 0 I.loc = src @@ -272,7 +280,8 @@ /obj/machinery/programmable/emag_act(user as mob) if(emagged) return - user << "You swipe the unloader with your card. After a moment's grinding, it beeps in a sinister fashion." + to_chat(user, "You swipe the unloader with your card. After a moment's grinding, it beeps in a sinister fashion.") + playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0) emagged = 1 overrides += emag_overrides @@ -299,7 +308,8 @@ if(M.client) M.client.eye = M.client.mob M.client.perspective = MOB_PERSPECTIVE - M << "\blue The machine turns off, and you fall out." + to_chat(M, "\blue The machine turns off, and you fall out.") + return @@ -498,7 +508,8 @@ if(H.gloves && istype(H.gloves, /obj/item/clothing/gloves/boxing)) var/newsleep = 0 if(H.loc != input) - H << "The boxing machine refuses to acknowledge you unless you face it head on!" + to_chat(H, "The boxing machine refuses to acknowledge you unless you face it head on!") + return var/damage = 0 if(H.a_intent != I_HARM) @@ -585,22 +596,27 @@ if(istype(I,/obj/item/device/multitool)) hacking = (hacking?0:1) if(hacking) - user << "You unlock the data port on the board. You can now use a PDA to alter its data." + to_chat(user, "You unlock the data port on the board. You can now use a PDA to alter its data.") + else - user << "You relock the data port." + to_chat(user, "You relock the data port.") + if(istype(I,/obj/item/device/pda)) if(!hacking) - user << "It looks like you can't access the board's data port. You'll have to open it with a multitool." + to_chat(user, "It looks like you can't access the board's data port. You'll have to open it with a multitool.") + else user.set_machine(src) interact(user) if(istype(I,/obj/item/weapon/card/emag) && !emagged) if(!hacking) - user << "There seems to be a data port on the card, but it's locked. A multitool could open it." + to_chat(user, "There seems to be a data port on the card, but it's locked. A multitool could open it.") + else emagged = 1 overrides += emag_overrides - user << "You swipe the card in the card's data port. The lights flicker, then flash once." + to_chat(user, "You swipe the card in the card's data port. The lights flicker, then flash once.") + proc/format(var/datum/cargoprofile/P,var/level) // PROFILE=0 OVERRIDE=1 MAIN=2 diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 73ef3b1d945..8eebb024633 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -18,7 +18,8 @@ return if(!user.canUnEquip(G, 0)) - user << "[G] is stuck to your hand, you can't put it in [src]!" + to_chat(user, "[G] is stuck to your hand, you can't put it in [src]!") + return if(istype(G, /obj/item/weapon/gun/energy) || istype(G, /obj/item/weapon/melee/baton) || istype(G,/obj/item/device/laptop) || istype(G, /obj/item/weapon/rcs)) @@ -28,22 +29,26 @@ // Checks to make sure he's not in space doing it, and that the area got proper power. var/area/a = get_area(src) if(!isarea(a)) - user << "\red The [name] blinks red as you try to insert the item!" + to_chat(user, "\red The [name] blinks red as you try to insert the item!") + return if(a.power_equip == 0 && a.requires_power) - user << "\red The [name] blinks red as you try to insert the item!" + to_chat(user, "\red The [name] blinks red as you try to insert the item!") + return if (istype(G, /obj/item/weapon/gun/energy)) var/obj/item/weapon/gun/energy/E = G if(!E.can_charge) - user << "Your gun has no external power connector." + to_chat(user, "Your gun has no external power connector.") + return if(istype(G, /obj/item/device/laptop)) var/obj/item/device/laptop/L = G if(!L.stored_computer.battery) - user << "There's no battery in it!" + to_chat(user, "There's no battery in it!") + return user.drop_item() @@ -53,10 +58,12 @@ update_icon() else if(istype(G, /obj/item/weapon/wrench)) if(charging) - user << "\red Remove the weapon first!" + to_chat(user, "\red Remove the weapon first!") + return anchored = !anchored - user << "You [anchored ? "attached" : "detached"] the recharger." + to_chat(user, "You [anchored ? "attached" : "detached"] the recharger.") + playsound(loc, 'sound/items/Ratchet.ogg', 75, 1) /obj/machinery/recharger/attack_hand(mob/user as mob) diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index 31849032067..6434b350830 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -89,7 +89,8 @@ /obj/machinery/recharge_station/attackby(obj/item/P as obj, mob/user as mob, params) if (istype(P, /obj/item/weapon/screwdriver)) if(src.occupant) - user << "The maintenance panel is locked." + to_chat(user, "The maintenance panel is locked.") + return default_deconstruction_screwdriver(user, "borgdecon2", "borgcharger0", P) return @@ -217,11 +218,13 @@ return if(get_dist(src, user) > 2 || get_dist(usr, user) > 1) - usr << "They are too far away to put inside" + to_chat(usr, "They are too far away to put inside") + return if (panel_open) - usr << "Close the maintenance panel first." + to_chat(usr, "Close the maintenance panel first.") + return var/can_accept_user @@ -232,10 +235,12 @@ //Whoever had it so that a borg with a dead cell can't enter this thing should be shot. --NEO return if(occupant) - R << "The cell is already occupied!" + to_chat(R, "The cell is already occupied!") + return if(!R.cell) - R << "Without a power cell, you can't be recharged." + to_chat(R, "Without a power cell, you can't be recharged.") + //Make sure they actually HAVE a cell, now that they can get in while powerless. --NEO return can_accept_user = 1 @@ -246,14 +251,16 @@ if(H.stat == DEAD) return if(occupant) - H << "The cell is already occupied!" + to_chat(H, "The cell is already occupied!") + return if(!H.get_int_organ(/obj/item/organ/internal/cell)) return can_accept_user = 1 if(!can_accept_user) - user << "Only non-organics may enter the recharger!" + to_chat(user, "Only non-organics may enter the recharger!") + return user.stop_pulling() diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index 67a77458916..582a842f15e 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -45,9 +45,12 @@ var/const/SAFETY_COOLDOWN = 100 /obj/machinery/recycler/examine(mob/user) ..(user) - user << "The power light is [(stat & NOPOWER) ? "off" : "on"]." - user << "The safety-mode light is [safety_mode ? "on" : "off"]." - user << "The safety-sensors status light is [emagged ? "off" : "on"]." + to_chat(user, "The power light is [(stat & NOPOWER) ? "off" : "on"].") + + to_chat(user, "The safety-mode light is [safety_mode ? "on" : "off"].") + + to_chat(user, "The safety-sensors status light is [emagged ? "off" : "on"].") + /obj/machinery/recycler/power_change() ..() @@ -78,7 +81,8 @@ var/const/SAFETY_COOLDOWN = 100 safety_mode = 0 update_icon() playsound(src.loc, "sparks", 75, 1, -1) - user << "You use the cryptographic sequencer on the [src.name]." + to_chat(user, "You use the cryptographic sequencer on the [src.name].") + /obj/machinery/recycler/update_icon() ..() @@ -195,10 +199,12 @@ var/const/SAFETY_COOLDOWN = 100 if(usr.stat || !usr.canmove || usr.restrained()) return if (src.anchored) - usr << "[src] is fastened to the floor!" + to_chat(usr, "[src] is fastened to the floor!") + return 0 eat_dir = turn(eat_dir, 270) - user << "[src] will now accept items from [dir2text(eat_dir)]." + to_chat(user, "[src] will now accept items from [dir2text(eat_dir)].") + return 1 /obj/machinery/recycler/verb/rotateccw() @@ -211,10 +217,12 @@ var/const/SAFETY_COOLDOWN = 100 if(usr.stat || !usr.canmove || usr.restrained()) return if (src.anchored) - usr << "[src] is fastened to the floor!" + to_chat(usr, "[src] is fastened to the floor!") + return 0 eat_dir = turn(eat_dir, 90) - user << "[src] will now accept items from [dir2text(eat_dir)]." + to_chat(user, "[src] will now accept items from [dir2text(eat_dir)].") + return 1 /obj/item/weapon/paper/recycler diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index 0641b4d6266..70b70e554a8 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -226,7 +226,8 @@ var/list/obj/machinery/requests_console/allConsoles = list() hackState = 0 icon_state="req_comp_open" else - user << "You can't do much with that."*/ + to_chat(user, "You can't do much with that.")*/ + if (istype(O, /obj/item/weapon/card/id)) if(inoperable(MAINT)) return @@ -241,7 +242,8 @@ var/list/obj/machinery/requests_console/allConsoles = list() announcement.announcer = ID.assignment ? "[ID.assignment] [ID.registered_name]" : ID.registered_name else reset_message() - user << "You are not authorized to send announcements." + to_chat(user, "You are not authorized to send announcements.") + updateUsrDialog() if (istype(O, /obj/item/weapon/stamp)) if(inoperable(MAINT)) return diff --git a/code/game/machinery/robot_fabricator.dm b/code/game/machinery/robot_fabricator.dm index be28fae21da..a6d9dfc3293 100644 --- a/code/game/machinery/robot_fabricator.dm +++ b/code/game/machinery/robot_fabricator.dm @@ -28,11 +28,13 @@ if (O:amount < 1) qdel(O) - user << "You insert [count] metal sheet\s into the fabricator." + to_chat(user, "You insert [count] metal sheet\s into the fabricator.") + src.overlays -= "fab-load-metal" updateDialog() else - user << "The robot part maker is full. Please remove metal from the robot part maker in order to insert more." + to_chat(user, "The robot part maker is full. Please remove metal from the robot part maker in order to insert more.") + /obj/machinery/robotic_fabricator/power_change() if (powered()) diff --git a/code/game/machinery/seed_extractor.dm b/code/game/machinery/seed_extractor.dm index ccdb43d5522..acf030b9ddc 100644 --- a/code/game/machinery/seed_extractor.dm +++ b/code/game/machinery/seed_extractor.dm @@ -44,21 +44,24 @@ obj/machinery/seed_extractor/attackby(var/obj/item/O as obj, var/mob/user as mob new_seed_type = plant_controller.seeds[F.plantname] if(new_seed_type) - user << "You extract some seeds from [O]." + to_chat(user, "You extract some seeds from [O].") + var/produce = rand(1,4) for(var/i = 0;i<=produce;i++) var/obj/item/seeds/seeds = new(get_turf(src)) seeds.seed_type = new_seed_type.name seeds.update_seed() else - user << "[O] doesn't seem to have any usable seeds inside it." + to_chat(user, "[O] doesn't seem to have any usable seeds inside it.") + qdel(O) //Grass. else if(istype(O, /obj/item/stack/tile/grass)) var/obj/item/stack/tile/grass/S = O - user << "You extract some seeds from the [S.name]." + to_chat(user, "You extract some seeds from the [S.name].") + S.use(1) new /obj/item/seeds/grassseed(loc) diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index 8a995cc3aa2..41c5e1a13ae 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -208,10 +208,12 @@ /obj/machinery/shieldgen/attack_hand(mob/user as mob) if(locked) - user << "The machine is locked, you are unable to use it." + to_chat(user, "The machine is locked, you are unable to use it.") + return if(is_open) - user << "The panel must be closed before operating this machine." + to_chat(user, "The panel must be closed before operating this machine.") + return if (src.active) @@ -226,7 +228,8 @@ "You hear heavy droning.") src.shields_up() else - user << "The device must first be secured to the floor." + to_chat(user, "The device must first be secured to the floor.") + return /obj/machinery/shieldgen/attackby(obj/item/weapon/W as obj, mob/user as mob, params) @@ -237,48 +240,58 @@ else if(istype(W, /obj/item/weapon/screwdriver)) playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) if(is_open) - user << "\blue You close the panel." + to_chat(user, "\blue You close the panel.") + is_open = 0 else - user << "\blue You open the panel and expose the wiring." + to_chat(user, "\blue You open the panel and expose the wiring.") + is_open = 1 else if(istype(W, /obj/item/stack/cable_coil) && malfunction && is_open) var/obj/item/stack/cable_coil/coil = W - user << "\blue You begin to replace the wires." + to_chat(user, "\blue You begin to replace the wires.") + //if(do_after(user, min(60, round( ((maxhealth/health)*10)+(malfunction*10) ), target = src)) //Take longer to repair heavier damage if(do_after(user, 30, target = src)) if(!src || !coil) return coil.use(1) health = max_health malfunction = 0 - user << "\blue You repair the [src]!" + to_chat(user, "\blue You repair the [src]!") + update_icon() else if(istype(W, /obj/item/weapon/wrench)) if(locked) - user << "The bolts are covered, unlocking this would retract the covers." + to_chat(user, "The bolts are covered, unlocking this would retract the covers.") + return if(anchored) playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) - user << "\blue You unsecure the [src] from the floor!" + to_chat(user, "\blue You unsecure the [src] from the floor!") + if(active) - user << "\blue The [src] shuts off!" + to_chat(user, "\blue The [src] shuts off!") + src.shields_down() anchored = 0 else if(istype(get_turf(src), /turf/space)) return //No wrenching these in space! playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) - user << "\blue You secure the [src] to the floor!" + to_chat(user, "\blue You secure the [src] to the floor!") + anchored = 1 else if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda)) if(src.allowed(user)) src.locked = !src.locked - user << "The controls are now [src.locked ? "locked." : "unlocked."]" + to_chat(user, "The controls are now [src.locked ? "locked." : "unlocked."]") + else - user << "\red Access denied." + to_chat(user, "\red Access denied.") + else ..() @@ -346,13 +359,16 @@ /obj/machinery/shieldwallgen/attack_hand(mob/user as mob) if(state != 1) - user << "\red The shield generator needs to be firmly secured to the floor first." + to_chat(user, "\red The shield generator needs to be firmly secured to the floor first.") + return 1 if(src.locked && !istype(user, /mob/living/silicon)) - user << "\red The controls are locked!" + to_chat(user, "\red The controls are locked!") + return 1 if(power != 1) - user << "\red The shield generator needs to be powered by wire underneath." + to_chat(user, "\red The shield generator needs to be powered by wire underneath.") + return 1 if(src.active >= 1) @@ -452,29 +468,34 @@ /obj/machinery/shieldwallgen/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/weapon/wrench)) if(active) - user << "Turn off the field generator first." + to_chat(user, "Turn off the field generator first.") + return else if(state == 0) state = 1 playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) - user << "You secure the external reinforcing bolts to the floor." + to_chat(user, "You secure the external reinforcing bolts to the floor.") + src.anchored = 1 return else if(state == 1) state = 0 playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) - user << "You undo the external reinforcing bolts." + to_chat(user, "You undo the external reinforcing bolts.") + src.anchored = 0 return if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) if (src.allowed(user)) src.locked = !src.locked - user << "Controls are now [src.locked ? "locked." : "unlocked."]" + to_chat(user, "Controls are now [src.locked ? "locked." : "unlocked."]") + else - user << "\red Access denied." + to_chat(user, "\red Access denied.") + else add_fingerprint(user) diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 7e4efb3a751..cac66fb2871 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -28,11 +28,14 @@ /obj/machinery/space_heater/examine(mob/user) ..(user) - user << "The heater is [on ? "on" : "off"] and the hatch is [open ? "open" : "closed"]." + to_chat(user, "The heater is [on ? "on" : "off"] and the hatch is [open ? "open" : "closed"].") + if(open) - user << "The power cell is [cell ? "installed" : "missing"]." + to_chat(user, "The power cell is [cell ? "installed" : "missing"].") + else - user << "The charge meter reads [cell ? round(cell.percent(),1) : 0]%" + to_chat(user, "The charge meter reads [cell ? round(cell.percent(),1) : 0]%") + /obj/machinery/space_heater/emp_act(severity) @@ -47,7 +50,8 @@ if(istype(I, /obj/item/weapon/stock_parts/cell)) if(open) if(cell) - user << "There is already a power cell inside." + to_chat(user, "There is already a power cell inside.") + return else // insert cell @@ -60,7 +64,8 @@ user.visible_message("\blue [user] inserts a power cell into [src].", "\blue You insert the power cell into [src].") else - user << "The hatch must be open to insert a power cell." + to_chat(user, "The hatch must be open to insert a power cell.") + return else if(istype(I, /obj/item/weapon/screwdriver)) open = !open diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index e2b02a0ce9d..9c531ca2c20 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -134,7 +134,8 @@ /obj/machinery/status_display/examine(mob/user) . = ..(user) if(mode != STATUS_DISPLAY_BLANK && mode != STATUS_DISPLAY_ALERT) - user << "The display says:
      \t[sanitize(message1)]
      \t[sanitize(message2)]" + to_chat(user, "The display says:
      \t[sanitize(message1)]
      \t[sanitize(message2)]") + /obj/machinery/status_display/proc/set_message(m1, m2) if(m1) diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 8cdd74790ac..f4e1337b8ea 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -248,14 +248,17 @@ if(!protected) playsound(src.loc, "sparks", 75, 1, -1) - user << "You try to touch the controls but you get zapped. There must be a short circuit somewhere." + to_chat(user, "You try to touch the controls but you get zapped. There must be a short circuit somewhere.") + return*/ else //welp, the guy is protected, we can continue if(src.issuperUV) - user << "You slide the dial back towards \"185nm\"." + to_chat(user, "You slide the dial back towards \"185nm\".") + src.issuperUV = 0 else - user << "You crank the dial all the way up to \"15nm\"." + to_chat(user, "You crank the dial all the way up to \"15nm\".") + src.issuperUV = 1 return @@ -274,10 +277,12 @@ if(!protected) playsound(src.loc, "sparks", 75, 1, -1) - user << "You try to touch the controls but you get zapped. There must be a short circuit somewhere." + to_chat(user, "You try to touch the controls but you get zapped. There must be a short circuit somewhere.") + return*/ else - user << "You push the button. The coloured LED next to it changes." + to_chat(user, "You push the button. The coloured LED next to it changes.") + src.safetieson = !src.safetieson @@ -326,7 +331,8 @@ /obj/machinery/suit_storage_unit/proc/toggle_open(mob/user as mob) if(src.islocked || src.isUV) - user << "Unable to open unit." + to_chat(user, "Unable to open unit.") + return if(src.OCCUPANT) src.eject_occupant(user) @@ -337,7 +343,8 @@ /obj/machinery/suit_storage_unit/proc/toggle_lock(mob/user as mob) if(src.OCCUPANT && src.safetieson) - user << "The Unit's safety protocols disallow locking when a biological form is detected inside its compartments." + to_chat(user, "The Unit's safety protocols disallow locking when a biological form is detected inside its compartments.") + return if(src.isopen) return @@ -349,12 +356,15 @@ if(src.isUV || src.isopen) //I'm bored of all these sanity checks return if(src.OCCUPANT && src.safetieson) - user << "WARNING: Biological entity detected in the confines of the Unit's storage. Cannot initiate cycle." + to_chat(user, "WARNING: Biological entity detected in the confines of the Unit's storage. Cannot initiate cycle.") + return if(!src.HELMET && !src.MASK && !src.SUIT && !src.OCCUPANT ) //shit's empty yo - user << "Unit storage bays empty. Nothing to disinfect -- Aborting." + to_chat(user, "Unit storage bays empty. Nothing to disinfect -- Aborting.") + return - user << "You start the Unit's cauterisation cycle." + to_chat(user, "You start the Unit's cauterisation cycle.") + src.cycletime_left = 20 src.isUV = 1 if(src.OCCUPANT && !src.islocked) @@ -416,10 +426,12 @@ if(src.OCCUPANT) if(src.issuperUV) OCCUPANT.take_organ_damage(0,40) - user << "Test. You gave him 40 damage" + to_chat(user, "Test. You gave him 40 damage") + else OCCUPANT.take_organ_damage(0,8) - user << "Test. You gave him 8 damage" + to_chat(user, "Test. You gave him 8 damage") + return*/ @@ -440,9 +452,11 @@ if (src.OCCUPANT.client) if(user != OCCUPANT) - OCCUPANT << "The machine kicks you out!" + to_chat(OCCUPANT, "The machine kicks you out!") + if(user.loc != src.loc) - OCCUPANT << "You leave the not-so-cozy confines of the SSU." + to_chat(OCCUPANT, "You leave the not-so-cozy confines of the SSU.") + src.OCCUPANT.client.eye = src.OCCUPANT.client.mob src.OCCUPANT.client.perspective = MOB_PERSPECTIVE @@ -476,13 +490,16 @@ if (usr.stat != 0) return if (!src.isopen) - usr << "The unit's doors are shut." + to_chat(usr, "The unit's doors are shut.") + return if (!src.ispowered || src.isbroken) - usr << "The unit is not operational." + to_chat(usr, "The unit is not operational.") + return if ( (src.OCCUPANT) || (src.HELMET) || (src.SUIT) ) - usr << "It's too cluttered inside for you to fit in!" + to_chat(usr, "It's too cluttered inside for you to fit in!") + return visible_message("[usr] starts squeezing into the suit storage unit!") if(do_after(usr, 10, target = usr)) @@ -512,7 +529,8 @@ if(istype(I, /obj/item/weapon/screwdriver)) src.panelopen = !src.panelopen playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) - user << text("You [] the unit's maintenance panel.",(src.panelopen ? "open up" : "close") ) + to_chat(user, text("You [] the unit's maintenance panel.",(src.panelopen ? "open up" : "close") )) + src.updateUsrDialog() return if ( istype(I, /obj/item/weapon/grab) ) @@ -520,13 +538,16 @@ if( !(ismob(G.affecting)) ) return if (!src.isopen) - usr << "The unit's doors are shut." + to_chat(usr, "The unit's doors are shut.") + return if (!src.ispowered || src.isbroken) - usr << "The unit is not operational." + to_chat(usr, "The unit is not operational.") + return if ( (src.OCCUPANT) || (src.HELMET) || (src.SUIT) ) //Unit needs to be absolutely empty - user << "The unit's storage area is too cluttered." + to_chat(user, "The unit's storage area is too cluttered.") + return visible_message("[user] starts putting [G.affecting.name] into the Suit Storage Unit.") if(do_after(user, 20, target = G:affecting)) @@ -552,9 +573,11 @@ return var/obj/item/clothing/suit/space/S = I if(src.SUIT) - user << "The unit already contains a suit." + to_chat(user, "The unit already contains a suit.") + return - user << "You load the [S.name] into the storage compartment." + to_chat(user, "You load the [S.name] into the storage compartment.") + user.drop_item() S.loc = src src.SUIT = S @@ -566,9 +589,11 @@ return var/obj/item/clothing/head/helmet/H = I if(src.HELMET) - user << "The unit already contains a helmet." + to_chat(user, "The unit already contains a helmet.") + return - user << "You load the [H.name] into the storage compartment." + to_chat(user, "You load the [H.name] into the storage compartment.") + user.drop_item() H.loc = src src.HELMET = H @@ -580,9 +605,11 @@ return var/obj/item/clothing/mask/M = I if(src.MASK) - user << "The unit already contains a mask." + to_chat(user, "The unit already contains a mask.") + return - user << "You load the [M.name] into the storage compartment." + to_chat(user, "You load the [M.name] into the storage compartment.") + user.drop_item() M.loc = src src.MASK = M @@ -678,11 +705,13 @@ return if(locked) - user << "\red The suit cycler is locked." + to_chat(user, "\red The suit cycler is locked.") + return if(src.contents.len > 0) - user << "\red There is no room inside the cycler for [G.affecting.name]." + to_chat(user, "\red There is no room inside the cycler for [G.affecting.name].") + return visible_message("[user] starts putting [G.affecting.name] into the suit cycler.") @@ -705,21 +734,25 @@ else if(istype(I,/obj/item/weapon/screwdriver)) panel_open = !panel_open - user << "You [panel_open ? "open" : "close"] the maintenance panel." + to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.") + src.updateUsrDialog() return else if(istype(I,/obj/item/clothing/head/helmet/space)) if(locked) - user << "\red The suit cycler is locked." + to_chat(user, "\red The suit cycler is locked.") + return if(helmet) - user << "The cycler already contains a helmet." + to_chat(user, "The cycler already contains a helmet.") + return - user << "You fit \the [I] into the suit cycler." + to_chat(user, "You fit \the [I] into the suit cycler.") + user.drop_item() I.loc = src helmet = I @@ -731,24 +764,29 @@ else if(istype(I,/obj/item/clothing/suit/space/rig)) if(locked) - user << "\red The suit cycler is locked." + to_chat(user, "\red The suit cycler is locked.") + return if(suit) - user << "The cycler already contains a hardsuit." + to_chat(user, "The cycler already contains a hardsuit.") + return var/obj/item/clothing/suit/space/rig/S = I if(S.helmet) - user << "\The [S] will not fit into the cycler with a helmet attached." + to_chat(user, "\The [S] will not fit into the cycler with a helmet attached.") + return if(S.boots) - user << "\The [S] will not fit into the cycler with boots attached." + to_chat(user, "\The [S] will not fit into the cycler with boots attached.") + return - user << "You fit \the [I] into the suit cycler." + to_chat(user, "You fit \the [I] into the suit cycler.") + user.drop_item() I.loc = src suit = I @@ -761,11 +799,13 @@ /obj/machinery/suit_cycler/emag_act(user as mob) if(emagged) - user << "\red The cycler has already been subverted." + to_chat(user, "\red The cycler has already been subverted.") + return //Clear the access reqs, disable the safeties, and open up all paintjobs. - user << "\red You run the sequencer across the interface, corrupting the operating protocols." + to_chat(user, "\red You run the sequencer across the interface, corrupting the operating protocols.") + departments = list("Engineering","Mining","Medical","Security","Atmos","^%###^%$") emagged = 1 safeties = 0 @@ -885,14 +925,17 @@ if(src.allowed(usr)) locked = !locked - usr << "You [locked ? "" : "un"]lock \the [src]." + to_chat(usr, "You [locked ? "" : "un"]lock \the [src].") + else - usr << "\red Access denied." + to_chat(usr, "\red Access denied.") + else if(href_list["begin_decontamination"]) if(safeties && occupant) - usr << "\red The cycler has detected an occupant. Please remove the occupant before commencing the decontamination cycle." + to_chat(usr, "\red The cycler has detected an occupant. Please remove the occupant before commencing the decontamination cycle.") + return active = 1 @@ -912,7 +955,8 @@ /* else if ((href_list["cutwire"]) && (src.panel_open)) var/twire = text2num(href_list["cutwire"]) if (!( istype(usr.get_active_hand(), /obj/item/weapon/wirecutters) )) - usr << "You need wirecutters!" + to_chat(usr, "You need wirecutters!") + return if (src.isWireColorCut(twire)) src.mend(twire) @@ -922,10 +966,12 @@ else if ((href_list["pulsewire"]) && (src.panel_open)) var/twire = text2num(href_list["pulsewire"]) if (!istype(usr.get_active_hand(), /obj/item/device/multitool)) - usr << "You need a multitool!" + to_chat(usr, "You need a multitool!") + return if (src.isWireColorCut(twire)) - usr << "You can't pulse a cut wire." + to_chat(usr, "You can't pulse a cut wire.") + return else src.pulse(twire)*/ @@ -991,7 +1037,8 @@ /obj/machinery/suit_cycler/proc/eject_occupant(mob/user as mob) if(locked || active) - user << "\red The cycler is locked." + to_chat(user, "\red The cycler is locked.") + return if (!occupant) diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index 11ec8837c87..4feba8ac8f8 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -85,13 +85,15 @@ N.mind.objectives += escape_objective - M << "You have joined the ranks of the Syndicate and become a traitor to the station!" + to_chat(M, "You have joined the ranks of the Syndicate and become a traitor to the station!") + message_admins("[key_name_admin(N)] has accepted a traitor objective from a syndicate beacon.") var/obj_count = 1 for(var/datum/objective/OBJ in M.mind.objectives) - M << "Objective #[obj_count]: [OBJ.explanation_text]" + to_chat(M, "Objective #[obj_count]: [OBJ.explanation_text]") + obj_count++ src.add_fingerprint(usr) @@ -125,7 +127,9 @@ /obj/machinery/power/singularity_beacon/proc/Activate(mob/user = null) if(surplus() < 1500) - if(user) user << "The connected wire doesn't have enough current." + if(user) + to_chat(user, "The connected wire doesn't have enough current.") + return for(var/obj/singularity/singulo in singularities) if(singulo.z == z) @@ -134,7 +138,8 @@ active = 1 machines |= src if(user) - user << "You activate the beacon." + to_chat(user, "You activate the beacon.") + /obj/machinery/power/singularity_beacon/proc/Deactivate(mob/user = null) @@ -144,7 +149,8 @@ icon_state = "[icontype]0" active = 0 if(user) - user << "You deactivate the beacon." + to_chat(user, "You deactivate the beacon.") + /obj/machinery/power/singularity_beacon/attack_ai(mob/user as mob) @@ -155,27 +161,32 @@ if(anchored) return active ? Deactivate(user) : Activate(user) else - user << "You need to screw the beacon to the floor first!" + to_chat(user, "You need to screw the beacon to the floor first!") + return /obj/machinery/power/singularity_beacon/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(istype(W,/obj/item/weapon/screwdriver)) if(active) - user << "You need to deactivate the beacon first!" + to_chat(user, "You need to deactivate the beacon first!") + return if(anchored) anchored = 0 - user << "You unscrew the beacon from the floor." + to_chat(user, "You unscrew the beacon from the floor.") + disconnect_from_network() return else if(!connect_to_network()) - user << "This device must be placed over an exposed cable." + to_chat(user, "This device must be placed over an exposed cable.") + return anchored = 1 - user << "You screw the beacon to the floor and attach the cable." + to_chat(user, "You screw the beacon to the floor and attach the cable.") + return ..() return diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index a81c00604db..509371b0b95 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -47,7 +47,8 @@ /obj/machinery/syndicatebomb/examine(mob/user) ..(user) - user << "A digital display on it reads \"[timer]\"." + to_chat(user, "A digital display on it reads \"[timer]\".") + /obj/machinery/syndicatebomb/update_icon() icon_state = "[initial(icon_state)][active ? "-active" : "-inactive"][open_panel ? "-wires" : ""]" @@ -56,25 +57,31 @@ if(istype(I, /obj/item/weapon/wrench)) if(!anchored) if(!isturf(src.loc) || istype(src.loc, /turf/space)) - user << "The bomb must be placed on solid ground to attach it" + to_chat(user, "The bomb must be placed on solid ground to attach it") + else - user << "You firmly wrench the bomb to the floor" + to_chat(user, "You firmly wrench the bomb to the floor") + playsound(loc, 'sound/items/ratchet.ogg', 50, 1) anchored = 1 if(active) - user << "The bolts lock in place" + to_chat(user, "The bolts lock in place") + else if(!active) - user << "You wrench the bomb from the floor" + to_chat(user, "You wrench the bomb from the floor") + playsound(loc, 'sound/items/ratchet.ogg', 50, 1) anchored = 0 else - user << "The bolts are locked down!" + to_chat(user, "The bolts are locked down!") + else if(istype(I, /obj/item/weapon/screwdriver)) open_panel = !open_panel update_icon() - user << "You [open_panel ? "open" : "close"] the wire panel." + to_chat(user, "You [open_panel ? "open" : "close"] the wire panel.") + else if(istype(I, /obj/item/weapon/wirecutters) || istype(I, /obj/item/device/multitool) || istype(I, /obj/item/device/assembly/signaler )) if(open_panel) @@ -83,23 +90,29 @@ else if(istype(I, /obj/item/weapon/crowbar)) if(open_panel && isWireCut(WIRE_BOOM) && isWireCut(WIRE_UNBOLT) && isWireCut(WIRE_DELAY) && isWireCut(WIRE_PROCEED) && isWireCut(WIRE_ACTIVATE)) if(payload) - user << "You carefully pry out [payload]." + to_chat(user, "You carefully pry out [payload].") + payload.loc = user.loc payload = null else - user << "There isn't anything in here to remove!" + to_chat(user, "There isn't anything in here to remove!") + else if (open_panel) - user << "The wires conneting the shell to the explosives are holding it down!" + to_chat(user, "The wires conneting the shell to the explosives are holding it down!") + else - user << "The cover is screwed on, it won't pry off!" + to_chat(user, "The cover is screwed on, it won't pry off!") + else if(istype(I, /obj/item/weapon/bombcore)) if(!payload) payload = I - user << "You place [payload] into [src]." + to_chat(user, "You place [payload] into [src].") + user.drop_item() payload.loc = src else - user << "[payload] is already loaded into [src], you'll have to remove it first." + to_chat(user, "[payload] is already loaded into [src], you'll have to remove it first.") + else ..() @@ -118,7 +131,8 @@ settings(user) return else if(anchored) - user << "The bomb is bolted to the floor!" + to_chat(user, "The bomb is bolted to the floor!") + return /obj/machinery/syndicatebomb/proc/settings(var/mob/user) @@ -310,7 +324,8 @@ detonated++ existant++ playsound(user, 'sound/machines/click.ogg', 20, 1) - user << "[existant] found, [detonated] triggered." + to_chat(user, "[existant] found, [detonated] triggered.") + if(detonated) var/turf/T = get_turf(src) var/area/A = get_area(T) diff --git a/code/game/machinery/telecomms/logbrowser.dm b/code/game/machinery/telecomms/logbrowser.dm index a16bbe7b870..4b36ab9d370 100644 --- a/code/game/machinery/telecomms/logbrowser.dm +++ b/code/game/machinery/telecomms/logbrowser.dm @@ -184,7 +184,8 @@ if(href_list["delete"]) if(!src.allowed(usr) && !emagged) - usr << "\red ACCESS DENIED." + to_chat(usr, "\red ACCESS DENIED.") + return if(SelectedServer) @@ -222,7 +223,8 @@ playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) if(do_after(user, 20, target = src)) if (src.stat & BROKEN) - user << "\blue The broken glass falls out." + to_chat(user, "\blue The broken glass falls out.") + var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) new /obj/item/weapon/shard(loc) var/obj/item/weapon/circuitboard/comm_server/M = new /obj/item/weapon/circuitboard/comm_server( A ) @@ -234,7 +236,8 @@ A.anchored = 1 qdel(src) else - user << "\blue You disconnect the monitor." + to_chat(user, "\blue You disconnect the monitor.") + var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) var/obj/item/weapon/circuitboard/comm_server/M = new /obj/item/weapon/circuitboard/comm_server( A ) for (var/obj/C in src) @@ -251,4 +254,5 @@ if(!emagged) playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) emagged = 1 - user << "\blue You you disable the security protocols" + to_chat(user, "\blue You you disable the security protocols") + diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index 04a88492cd2..671b1c993eb 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -23,26 +23,31 @@ switch(construct_op) if(0) if(istype(P, /obj/item/weapon/screwdriver)) - user << "You unfasten the bolts." + to_chat(user, "You unfasten the bolts.") + playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) construct_op++ if(1) if(istype(P, /obj/item/weapon/screwdriver)) - user << "You fasten the bolts." + to_chat(user, "You fasten the bolts.") + playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) construct_op-- if(istype(P, /obj/item/weapon/wrench)) - user << "You dislodge the external plating." + to_chat(user, "You dislodge the external plating.") + playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) construct_op++ if(2) if(istype(P, /obj/item/weapon/wrench)) - user << "You secure the external plating." + to_chat(user, "You secure the external plating.") + playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) construct_op-- if(istype(P, /obj/item/weapon/wirecutters)) playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) - user << "You remove the cables." + to_chat(user, "You remove the cables.") + construct_op++ var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( user.loc ) A.amount = 5 @@ -51,7 +56,8 @@ if(istype(P, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/A = P if(A.amount >= 5) - user << "You insert the cables." + to_chat(user, "You insert the cables.") + A.amount -= 5 if(A.amount <= 0) user.drop_item() @@ -59,10 +65,12 @@ construct_op-- stat &= ~BROKEN // the machine's not borked anymore! if(istype(P, /obj/item/weapon/crowbar)) - user << "You begin prying out the circuit board other components..." + to_chat(user, "You begin prying out the circuit board other components...") + playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) if(do_after(user,60, target = src)) - user << "You finish prying out the components." + to_chat(user, "You finish prying out the components.") + // Drop all the component stuff if(component_parts) diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm index c0ab1c0baa0..f9d62fbcc02 100644 --- a/code/game/machinery/telecomms/telecomunications.dm +++ b/code/game/machinery/telecomms/telecomunications.dm @@ -39,7 +39,8 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() if(!on) return - //world << "[src] ([src.id]) - [signal.debug_print()]" +// to_chat(world, "[src] ([src.id]) - [signal.debug_print()]") + var/send_count = 0 diff --git a/code/game/machinery/telecomms/telemonitor.dm b/code/game/machinery/telecomms/telemonitor.dm index f966f477057..e0cc2f550f1 100644 --- a/code/game/machinery/telecomms/telemonitor.dm +++ b/code/game/machinery/telecomms/telemonitor.dm @@ -131,7 +131,8 @@ playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) if(do_after(user, 20, target = src)) if (src.stat & BROKEN) - user << "\blue The broken glass falls out." + to_chat(user, "\blue The broken glass falls out.") + var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) new /obj/item/weapon/shard(loc) var/obj/item/weapon/circuitboard/comm_monitor/M = new /obj/item/weapon/circuitboard/comm_monitor( A ) @@ -143,7 +144,8 @@ A.anchored = 1 qdel(src) else - user << "\blue You disconnect the monitor." + to_chat(user, "\blue You disconnect the monitor.") + var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) var/obj/item/weapon/circuitboard/comm_monitor/M = new /obj/item/weapon/circuitboard/comm_monitor( A ) for (var/obj/C in src) @@ -160,4 +162,5 @@ if(!emagged) playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) emagged = 1 - user << "\blue You you disable the security protocols" \ No newline at end of file + to_chat(user, "\blue You you disable the security protocols") + diff --git a/code/game/machinery/telecomms/traffic_control.dm b/code/game/machinery/telecomms/traffic_control.dm index 8f08ca9c92f..2871cf473ba 100644 --- a/code/game/machinery/telecomms/traffic_control.dm +++ b/code/game/machinery/telecomms/traffic_control.dm @@ -193,7 +193,8 @@ user.set_machine(src) if(!allowed(user) && !emagged) - user << "Access Denied." + to_chat(user, "Access Denied.") + return 0 switch(href_list["choice"]) @@ -343,7 +344,8 @@ playsound(get_turf(src), 'sound/items/Screwdriver.ogg', 50, 1) if(do_after(user, 20, target = src)) if (src.stat & BROKEN) - user << "\blue The broken glass falls out." + to_chat(user, "\blue The broken glass falls out.") + var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) new /obj/item/weapon/shard(loc) var/obj/item/weapon/circuitboard/comm_traffic/M = new /obj/item/weapon/circuitboard/comm_traffic( A ) @@ -355,7 +357,8 @@ A.anchored = 1 qdel(src) else - user << "\blue You disconnect the monitor." + to_chat(user, "\blue You disconnect the monitor.") + var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) var/obj/item/weapon/circuitboard/comm_traffic/M = new /obj/item/weapon/circuitboard/comm_traffic( A ) for (var/obj/C in src) @@ -372,7 +375,8 @@ if(!emagged) playsound(get_turf(src), 'sound/effects/sparks4.ogg', 75, 1) emagged = 1 - user << "\blue You you disable the security protocols" + to_chat(user, "\blue You you disable the security protocols") + /obj/machinery/computer/telecomms/traffic/proc/canAccess(var/mob/user) if(issilicon(user) || in_range(user, src)) diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 6d0f70fc528..74124f22e9b 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -43,11 +43,13 @@ var/obj/item/device/gps/L = I if(L.locked_location && !(stat & (NOPOWER|BROKEN))) if(!user.unEquip(L)) - user << "\the [I] is stuck to your hand, you cannot put it in \the [src]" + to_chat(user, "\the [I] is stuck to your hand, you cannot put it in \the [src]") + return L.loc = src locked = L - user << "You insert the GPS device into the [name]'s slot." + to_chat(user, "You insert the GPS device into the [name]'s slot.") + else ..() return @@ -55,7 +57,8 @@ /obj/machinery/computer/teleporter/emag_act(user as mob) if(!emagged) emagged = 1 - user << "\blue The teleporter can now lock on to Syndicate beacons!" + to_chat(user, "\blue The teleporter can now lock on to Syndicate beacons!") + else ui_interact(user) @@ -103,11 +106,13 @@ return if(!check_hub_connection()) - usr << "Error: Unable to detect hub." + to_chat(usr, "Error: Unable to detect hub.") + nanomanager.update_uis(src) return if(calibrating) - usr << "Error: Calibration in progress. Stand by." + to_chat(usr, "Error: Calibration in progress. Stand by.") + nanomanager.update_uis(src) return @@ -131,11 +136,13 @@ nanomanager.update_uis(src) if(href_list["calibrate"]) if(!target) - usr << "Error: No target set to calibrate to." + to_chat(usr, "Error: No target set to calibrate to.") + nanomanager.update_uis(src) return if(power_station.teleporter_hub.calibrated || power_station.teleporter_hub.accurate >= 3) - usr << "Hub is already calibrated." + to_chat(usr, "Hub is already calibrated.") + nanomanager.update_uis(src) return src.visible_message("Processing hub calibration to target...") @@ -218,7 +225,8 @@ var/list/areaindex = list() var/list/S = power_station.linked_stations if(!S.len) - user << "No connected stations located." + to_chat(user, "No connected stations located.") + return for(var/obj/machinery/teleport/station/R in S) var/turf/T = get_turf(R) @@ -318,7 +326,8 @@ /obj/machinery/teleport/hub/Bumped(M as mob|obj) if(z == ZLEVEL_CENTCOMM) - M << "You can't use this here." + to_chat(M, "You can't use this here.") + if(power_station && power_station.engaged && !panel_open) //--FalseIncarnate //Prevents AI cores from using the teleporter, prints out failure messages for clarity @@ -330,7 +339,8 @@ "\red You cannot interface with this technology and get rejected!", "\red External firewalls prevent you from utilizing this machine!", "\red Your AI core's anti-bluespace failsafes trigger and prevent teleportation!") - T<< "[pick(TPError)]" + to_chat(T, "[pick(TPError)]") + return else teleport(M) @@ -435,9 +445,11 @@ if(linked_stations.len < efficiency) linked_stations.Add(M.buffer) M.buffer = null - user << "You upload the data from the [W.name]'s buffer." + to_chat(user, "You upload the data from the [W.name]'s buffer.") + else - user << "This station can't hold more information, try to use better parts." + to_chat(user, "This station can't hold more information, try to use better parts.") + if(default_deconstruction_screwdriver(user, "controller-o", "controller", W)) update_icon() return @@ -451,11 +463,13 @@ if(istype(W, /obj/item/device/multitool)) var/obj/item/device/multitool/M = W M.buffer = src - user << "You download the data to the [W.name]'s buffer." + to_chat(user, "You download the data to the [W.name]'s buffer.") + return if(istype(W, /obj/item/weapon/wirecutters)) link_console_and_hub() - user << "You reconnect the station to nearby machinery." + to_chat(user, "You reconnect the station to nearby machinery.") + return /obj/machinery/teleport/station/attack_ai() @@ -465,13 +479,15 @@ if(!panel_open) toggle(user) else - user << "Close the maintenance panel first." + to_chat(user, "Close the maintenance panel first.") + /obj/machinery/teleport/station/proc/toggle(mob/user) if (stat & (BROKEN|NOPOWER) || !teleporter_hub || !teleporter_console) return if (teleporter_hub.panel_open) - user << "Close the hub's maintenance panel first." + to_chat(user, "Close the hub's maintenance panel first.") + return if (teleporter_console.target) src.engaged = !src.engaged diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm index 2e99d634d60..f71a4223d31 100644 --- a/code/game/machinery/transformer.dm +++ b/code/game/machinery/transformer.dm @@ -131,7 +131,8 @@ AM.loc = src.loc do_transform_mime(AM) else - AM << "Only items can be greyscaled." + to_chat(AM, "Only items can be greyscaled.") + return /obj/machinery/transformer/proc/do_transform_mime(var/obj/item/I) diff --git a/code/game/machinery/turntable.dm b/code/game/machinery/turntable.dm index 84a91ced929..a32ff6260d6 100644 --- a/code/game/machinery/turntable.dm +++ b/code/game/machinery/turntable.dm @@ -43,7 +43,8 @@ ..() if( href_list["on1"] ) if(src.playing == 0) - //world << "Should be working..." +// to_chat(world, "Should be working...") + var/sound/S = sound('sound/turntable/TestLoop1.ogg') S.repeat = 1 S.channel = 10 @@ -52,8 +53,10 @@ S.environment = 0 //for(var/mob/M in world) // if(M.loc.loc == src.loc.loc && M.music == 0) - // world << "Found the song..." - // M << S +// to_chat(world, "Found the song...") + +// to_chat(M, S) + // M.music = 1 var/area/A = src.loc.loc @@ -63,19 +66,23 @@ while(playing == 1) for(var/mob/M in world) if((M.loc.loc in A) && M.music == 0) - //world << "Found the song..." - M << S +// to_chat(world, "Found the song...") + + to_chat(M, S) + M.music = 1 else if(!(M.loc.loc in A) && M.music == 1) var/sound/Soff = sound(null) Soff.channel = 10 - M << Soff + to_chat(M, Soff) + M.music = 0 sleep(10) return if( href_list["on2"] ) if(src.playing == 0) - //world << "Should be working..." +// to_chat(world, "Should be working...") + var/sound/S = sound('sound/turntable/TestLoop2.ogg') S.repeat = 1 S.channel = 10 @@ -84,8 +91,10 @@ S.environment = 0 //for(var/mob/M in world) // if(M.loc.loc == src.loc.loc && M.music == 0) - // world << "Found the song..." - // M << S +// to_chat(world, "Found the song...") + +// to_chat(M, S) + // M.music = 1 var/area/A = src.loc.loc for(var/obj/machinery/party/lasermachine/L in A) @@ -94,19 +103,23 @@ while(playing == 1) for(var/mob/M in world) if(M.loc.loc == src.loc.loc && M.music == 0) - //world << "Found the song..." - M << S +// to_chat(world, "Found the song...") + + to_chat(M, S) + M.music = 1 else if(M.loc.loc != src.loc.loc && M.music == 1) var/sound/Soff = sound(null) Soff.channel = 10 - M << Soff + to_chat(M, Soff) + M.music = 0 sleep(10) return if( href_list["on3"] ) if(src.playing == 0) - //world << "Should be working..." +// to_chat(world, "Should be working...") + var/sound/S = sound('sound/turntable/TestLoop3.ogg') S.repeat = 1 S.channel = 10 @@ -115,8 +128,10 @@ S.environment = 0 //for(var/mob/M in world) // if(M.loc.loc == src.loc.loc && M.music == 0) - // world << "Found the song..." - // M << S +// to_chat(world, "Found the song...") + +// to_chat(M, S) + // M.music = 1 var/area/A = src.loc.loc for(var/obj/machinery/party/lasermachine/L in A) @@ -125,13 +140,16 @@ while(playing == 1) for(var/mob/M in world) if(M.loc.loc == src.loc.loc && M.music == 0) - //world << "Found the song..." - M << S +// to_chat(world, "Found the song...") + + to_chat(M, S) + M.music = 1 else if(M.loc.loc != src.loc.loc && M.music == 1) var/sound/Soff = sound(null) Soff.channel = 10 - M << Soff + to_chat(M, Soff) + M.music = 0 sleep(10) return @@ -143,7 +161,8 @@ S.channel = 10 S.wait = 1 for(var/mob/M in world) - M << S + to_chat(M, S) + M.music = 0 playing = 0 var/area/A = src.loc.loc diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm index 4dc36dbd2e3..9b703f5478d 100644 --- a/code/game/machinery/turret_control.dm +++ b/code/game/machinery/turret_control.dm @@ -65,11 +65,13 @@ /obj/machinery/turretid/proc/isLocked(mob/user) if(ailock && (isrobot(user) || isAI(user))) - user << "There seems to be a firewall preventing you from accessing this device." + to_chat(user, "There seems to be a firewall preventing you from accessing this device.") + return 1 if(locked && !(isrobot(user) || isAI(user) || isobserver(user))) - user << "Access denied." + to_chat(user, "Access denied.") + return 1 return 0 @@ -87,16 +89,19 @@ if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) if(src.allowed(usr)) if(emagged) - user << "The turret control is unresponsive." + to_chat(user, "The turret control is unresponsive.") + else locked = !locked - user << "You [ locked ? "lock" : "unlock"] the panel." + to_chat(user, "You [ locked ? "lock" : "unlock"] the panel.") + return return ..() /obj/machinery/turretid/emag_act(user as mob) if(!emagged) - user << "You short out the turret controls' access analysis module." + to_chat(user, "You short out the turret controls' access analysis module.") + emagged = 1 locked = 0 ailock = 0 diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm index e4b9a290441..7c4a48c3b3e 100644 --- a/code/game/machinery/turrets.dm +++ b/code/game/machinery/turrets.dm @@ -184,7 +184,8 @@ cur_target = get_new_target() //get new target if(cur_target) //if it's found, proceed -// world << "[cur_target]" +// to_chat(world, "[cur_target]") + if(!isPopping()) if(isDown()) popUp() @@ -336,7 +337,8 @@ if (src.health <= 0) src.die() else - M << "That object is useless to you." + to_chat(M, "That object is useless to you.") + return @@ -352,7 +354,8 @@ if (src.health <= 0) src.die() else - M << "\green That object is useless to you." + to_chat(M, "\green That object is useless to you.") + return @@ -362,7 +365,8 @@ return 1 if (src.locked) if (!istype(usr, /mob/living/silicon)) - usr << "Control panel is locked!" + to_chat(usr, "Control panel is locked!") + return if (href_list["toggleOn"]) src.enabled = !src.enabled diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 1265eb8da78..c1271b11cc5 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -188,7 +188,8 @@ for(var/datum/data/vending_product/machine_content in machine) if(machine_content.amount != machine_content.max_amount) if(user) - user << "[machine_content.max_amount - machine_content.amount] of [machine_content.product_name]" + to_chat(user, "[machine_content.max_amount - machine_content.amount] of [machine_content.product_name]") + machine_content.amount = machine_content.max_amount refill.charges -= to_restock total = to_restock @@ -203,7 +204,8 @@ total += restock if(restock) if(user) - user << "[restock] of [machine_content.product_name]" + to_chat(user, "[restock] of [machine_content.product_name]") + if(refill.charges == 0) //due to rounding, we ran out of refill charges, exit. break return total @@ -234,7 +236,8 @@ if(istype(W, /obj/item/weapon/screwdriver) && anchored) playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1) panel_open = !panel_open - user << "You [panel_open ? "open" : "close"] the maintenance panel." + to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.") + overlays.Cut() if(panel_open) overlays += image(icon, "[initial(icon_state)]-panel") @@ -259,32 +262,39 @@ W.loc = src coin = W categories |= CAT_COIN - user << "\blue You insert the [W] into the [src]" + to_chat(user, "\blue You insert the [W] into the [src]") + nanomanager.update_uis(src) return else if(istype(W, refill_canister) && refill_canister != null) if(stat & (BROKEN|NOPOWER)) - user << "It does nothing." + to_chat(user, "It does nothing.") + else if(panel_open) //if the panel is open we attempt to refill the machine var/obj/item/weapon/vending_refill/canister = W if(canister.charges == 0) - user << "This [canister.name] is empty!" + to_chat(user, "This [canister.name] is empty!") + else var/transfered = refill_inventory(canister,product_records,user) if(transfered) - user << "You loaded [transfered] items in \the [name]." + to_chat(user, "You loaded [transfered] items in \the [name].") + else - user << "The [name] is fully stocked." + to_chat(user, "The [name] is fully stocked.") + return; else - user << "You should probably unscrew the service panel first." + to_chat(user, "You should probably unscrew the service panel first.") + else ..() /obj/machinery/vending/emag_act(user as mob) emagged = 1 - user << "You short out the product lock on [src]" + to_chat(user, "You short out the product lock on [src]") + return /** @@ -296,7 +306,8 @@ if(currently_vending.price > cashmoney.get_total()) // This is not a status display message, since it's something the character // themselves is meant to see BEFORE putting the money in - usr << "\icon[cashmoney] That is not enough money." + to_chat(usr, "\icon[cashmoney] That is not enough money.") + return 0 // Bills (banknotes) cannot really have worth different than face value, @@ -454,12 +465,14 @@ if(href_list["remove_coin"] && !istype(usr,/mob/living/silicon)) if(!coin) - usr << "There is no coin in this machine." + to_chat(usr, "There is no coin in this machine.") + return usr.put_in_hands(coin) coin = null - usr << "\blue You remove the [coin] from the [src]" + to_chat(usr, "\blue You remove the [coin] from the [src]") + categories &= ~CAT_COIN if (href_list["pay"]) @@ -484,11 +497,14 @@ if ((href_list["vend"]) && (src.vend_ready) && (!currently_vending)) if(issilicon(usr) && !isrobot(usr)) - usr << "The vending machine refuses to interface with you, as you are not in its target demographic!" + to_chat(usr, "The vending machine refuses to interface with you, as you are not in its target demographic!") + return if((!allowed(usr)) && !emagged && scan_id) //For SECURE VENDING MACHINES YEAH - usr << "Access denied." //Unless emagged of course + to_chat(usr, "Access denied.")//Unless emagged of course + + flick(icon_deny,src) return @@ -521,11 +537,14 @@ /obj/machinery/vending/proc/vend(datum/data/vending_product/R, mob/user) if((!allowed(usr)) && !emagged && scan_id) //For SECURE VENDING MACHINES YEAH - usr << "Access denied." //Unless emagged of course + to_chat(usr, "Access denied.")//Unless emagged of course + + flick(src.icon_deny,src) return if(!R.amount) - user << "\red The vending machine has ran out of that product." + to_chat(user, "\red The vending machine has ran out of that product.") + return src.vend_ready = 0 //One thing at a time!! src.status_message = "Vending..." @@ -534,13 +553,16 @@ if (R.category & CAT_COIN) if(!coin) - user << "\blue You need to insert a coin to get this item." + to_chat(user, "\blue You need to insert a coin to get this item.") + return if(coin.string_attached) if(prob(50)) - user << "\blue You successfully pull the coin out before the [src] could swallow it." + to_chat(user, "\blue You successfully pull the coin out before the [src] could swallow it.") + else - user << "\blue You weren't able to pull the coin out fast enough, the machine ate it, string and all." + to_chat(user, "\blue You weren't able to pull the coin out fast enough, the machine ate it, string and all.") + coin = null qdel(coin) categories &= ~CAT_COIN @@ -569,7 +591,8 @@ /obj/machinery/vending/proc/stock(var/datum/data/vending_product/R, var/mob/user) if(src.panel_open) - user << "\blue You stock the [src] with \a [R.product_name]" + to_chat(user, "\blue You stock the [src] with \a [R.product_name]") + R.amount++ src.updateUsrDialog() diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index 4e95938a2a1..d89fddfd69f 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -32,7 +32,8 @@ return if( state != 4 ) - usr << "The washing machine cannot run in this state." + to_chat(usr, "The washing machine cannot run in this state.") + return if( locate(/mob,contents) ) @@ -199,7 +200,8 @@ /obj/machinery/washing_machine/attackby(obj/item/weapon/W as obj, mob/user as mob, params) /*if(istype(W,/obj/item/weapon/screwdriver)) panel = !panel - user << "\blue you [panel ? "open" : "close"] the [src]'s maintenance panel"*/ + to_chat(user, "\blue you [panel ? "open" : "close"] the [src]'s maintenance panel")*/ + if(istype(W,/obj/item/toy/crayon) ||istype(W,/obj/item/weapon/stamp)) if( state in list( 1, 3, 6 ) ) if(!crayon) @@ -230,46 +232,60 @@ //YES, it's hardcoded... saves a var/can_be_washed for every single clothing item. if ( istype(W,/obj/item/clothing/suit/space ) ) - user << "This item does not fit." + to_chat(user, "This item does not fit.") + return if ( istype(W,/obj/item/clothing/suit/syndicatefake ) ) - user << "This item does not fit." + to_chat(user, "This item does not fit.") + return // if ( istype(W,/obj/item/clothing/suit/powered ) ) -// user << "This item does not fit." +// to_chat(user, "This item does not fit.") + // return if ( istype(W,/obj/item/clothing/suit/cyborg_suit ) ) - user << "This item does not fit." + to_chat(user, "This item does not fit.") + return if ( istype(W,/obj/item/clothing/suit/bomb_suit ) ) - user << "This item does not fit." + to_chat(user, "This item does not fit.") + return if ( istype(W,/obj/item/clothing/suit/armor ) ) - user << "This item does not fit." + to_chat(user, "This item does not fit.") + return if ( istype(W,/obj/item/clothing/suit/armor ) ) - user << "This item does not fit." + to_chat(user, "This item does not fit.") + return if ( istype(W,/obj/item/clothing/mask/gas ) ) - user << "This item does not fit." + to_chat(user, "This item does not fit.") + return if ( istype(W,/obj/item/clothing/mask/cigarette ) ) - user << "This item does not fit." + to_chat(user, "This item does not fit.") + return if ( istype(W,/obj/item/clothing/head/syndicatefake ) ) - user << "This item does not fit." + to_chat(user, "This item does not fit.") + return // if ( istype(W,/obj/item/clothing/head/powered ) ) -// user << "This item does not fit." +// to_chat(user, "This item does not fit.") + // return if ( istype(W,/obj/item/clothing/head/helmet ) ) - user << "This item does not fit." + to_chat(user, "This item does not fit.") + return if ( istype(W,/obj/item/clothing/gloves/furgloves ) ) - user << "This item does not fit." + to_chat(user, "This item does not fit.") + return if(W.flags & NODROP) //if "can't drop" item - user << "\The [W] is stuck to your hand, you cannot put it in the washing machine!" + to_chat(user, "\The [W] is stuck to your hand, you cannot put it in the washing machine!") + return if(contents.len < 5) @@ -278,9 +294,11 @@ W.loc = src state = 3 else - user << "\blue You can't put the item in right now." + to_chat(user, "\blue You can't put the item in right now.") + else - user << "\blue The washing machine is full." + to_chat(user, "\blue The washing machine is full.") + else ..() update_icon() @@ -302,7 +320,8 @@ crayon = null state = 1 if(5) - user << "\red The [src] is busy." + to_chat(user, "\red The [src] is busy.") + if(6) state = 7 if(7) diff --git a/code/game/machinery/wishgranter.dm b/code/game/machinery/wishgranter.dm index dba30d648b0..f0bc8c1e58e 100644 --- a/code/game/machinery/wishgranter.dm +++ b/code/game/machinery/wishgranter.dm @@ -20,18 +20,22 @@ usr.set_machine(src) if(!istype(user, /mob/living/carbon/human)) - user << "You feel a dark stirring inside of the Wish Granter, something you want nothing of. Your instincts are better than any man's." + to_chat(user, "You feel a dark stirring inside of the Wish Granter, something you want nothing of. Your instincts are better than any man's.") + return if(is_special_character(user)) - user << "Even to a heart as dark as yours, you know nothing good will come of this. Something instinctual makes you pull away." + to_chat(user, "Even to a heart as dark as yours, you know nothing good will come of this. Something instinctual makes you pull away.") + return if(inuse) - user << "Someone is already communing with the Wish Granter." + to_chat(user, "Someone is already communing with the Wish Granter.") + return - user << "The power of the Wish Granter have turned you into the superhero the station deserves. You are a masked vigilante, and answer to no man. Will you use your newfound strength to protect the innocent, or will you hunt the guilty?" + to_chat(user, "The power of the Wish Granter have turned you into the superhero the station deserves. You are a masked vigilante, and answer to no man. Will you use your newfound strength to protect the innocent, or will you hunt the guilty?") + inuse = 1 var/wish @@ -51,7 +55,8 @@ //Remove the wishgranter or teleport it randomly on the station if(!types.len) - user << "The wishgranter slowly fades into mist..." + to_chat(user, "The wishgranter slowly fades into mist...") + qdel(src) return else diff --git a/code/game/magic/Uristrunes.dm b/code/game/magic/Uristrunes.dm index 6e0abd177e0..df25e084d19 100644 --- a/code/game/magic/Uristrunes.dm +++ b/code/game/magic/Uristrunes.dm @@ -16,6 +16,7 @@ var/list/word_to_uristrune_table = null words -= w bit <<= 1 + return word_to_uristrune_table[word] diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm index 09f6aad41e6..b06d02efc41 100644 --- a/code/game/mecha/combat/marauder.dm +++ b/code/game/mecha/combat/marauder.dm @@ -150,7 +150,8 @@ src.occupant_message("Zoom mode [zoom?"en":"dis"]abled.") if(zoom) src.occupant.client.view = 12 - src.occupant << sound('sound/mecha/imag_enh.ogg',volume=50) + to_chat(src.occupant, sound('sound/mecha/imag_enh.ogg',volume=50)) + else src.occupant.client.view = world.view//world.view - default mob view size return diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index 4f53bd5a796..75efc280354 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -52,9 +52,11 @@ chassis.occupant_message("The [src] is destroyed!") chassis.log_append_to_last("[src] is destroyed.",1) if(istype(src, /obj/item/mecha_parts/mecha_equipment/weapon)) - chassis.occupant << sound('sound/mecha/weapdestr.ogg',volume=50) + to_chat(chassis.occupant, sound('sound/mecha/weapdestr.ogg',volume=50)) + else - chassis.occupant << sound('sound/mecha/critdestr.ogg',volume=50) + to_chat(chassis.occupant, sound('sound/mecha/critdestr.ogg',volume=50)) + chassis = null return ..() diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index 1b0c82f42f7..0ab84bd842b 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -545,7 +545,8 @@ return chassis.dynattackby(W,user, params) chassis.log_message("Attacked by [W]. Attacker - [user]") if(prob(chassis.deflect_chance*deflect_coeff)) - user << "\red The [W] bounces off [chassis] armor." + to_chat(user, "\red The [W] bounces off [chassis] armor.") + chassis.log_append_to_last("Armor saved.") else chassis.occupant_message("[user] hits [chassis] with [W].") @@ -932,7 +933,8 @@ if(isnull(result)) user.visible_message("[user] tries to shove [weapon_name] into [src], but \the [src] rejects it.","[fuel_name] traces in target minimal. [weapon_name] cannot be used as fuel.") else if(!result) - user << "Unit is full." + to_chat(user, "Unit is full.") + else user.visible_message("[user] loads [src] with \the [weapon_name].","[result] unit\s of [fuel_name] successfully loaded.") return diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index ab9589f73e7..d1e537fd877 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -140,7 +140,8 @@ var/mob/living/carbon/human/H = M if(istype(H.l_ear, /obj/item/clothing/ears/earmuffs) || istype(H.r_ear, /obj/item/clothing/ears/earmuffs)) continue - M << "HONK" + to_chat(M, "HONK") + M.sleeping = 0 M.stuttering = 20 M.ear_deaf = 30 diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index b77ee7b9cd8..9d527750470 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -293,7 +293,8 @@ if(..()) return 1 if(!allowed(user) && !isobserver(user)) - user << "Access denied." + to_chat(user, "Access denied.") + return 1 return interact(user) @@ -505,7 +506,8 @@ default_deconstruction_crowbar(W) return 1 else - user << "You can't load \the [name] while it's opened." + to_chat(user, "You can't load \the [name] while it's opened.") + return 1 if(istype(W, /obj/item/stack)) @@ -533,10 +535,12 @@ return ..() if(being_built) - user << "\The [src] is currently processing. Please wait until completion." + to_chat(user, "\The [src] is currently processing. Please wait until completion.") + return if(res_max_amount - resources[material] < MINERAL_MATERIAL_AMOUNT) //overstuffing the fabricator - user << "\The [src] [material2name(material)] storage is full." + to_chat(user, "\The [src] [material2name(material)] storage is full.") + return var/obj/item/stack/sheet/stack = W var/sname = "[stack.name]" @@ -546,12 +550,14 @@ var/transfer_amount = min(stack.amount, round((res_max_amount - resources[material])/MINERAL_MATERIAL_AMOUNT,1)) resources[material] += transfer_amount * MINERAL_MATERIAL_AMOUNT stack.use(transfer_amount) - user << "You insert [transfer_amount] [sname] sheet\s into \the [src]." + to_chat(user, "You insert [transfer_amount] [sname] sheet\s into \the [src].") + sleep(10) updateUsrDialog() overlays -= "fab-load-[material2name(material)]" //No matter what the overlay shall still be deleted else - user << "\The [src] cannot hold any more [sname] sheet\s." + to_chat(user, "\The [src] cannot hold any more [sname] sheet\s.") + return /obj/machinery/mecha_part_fabricator/proc/material2name(var/ID) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 276ed01252b..7a563b2b35c 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -169,19 +169,26 @@ var/integrity = health/initial(health)*100 switch(integrity) if(85 to 100) - user << "It's fully intact." + to_chat(user, "It's fully intact.") + if(65 to 85) - user << "It's slightly damaged." + to_chat(user, "It's slightly damaged.") + if(45 to 65) - user << "It's badly damaged." + to_chat(user, "It's badly damaged.") + if(25 to 45) - user << "It's heavily damaged." + to_chat(user, "It's heavily damaged.") + else - user << "It's falling apart." + to_chat(user, "It's falling apart.") + if(equipment && equipment.len) - user << "It's equipped with:" + to_chat(user, "It's equipped with:") + for(var/obj/item/mecha_parts/mecha_equipment/ME in equipment) - user << "\icon[ME] [ME]" + to_chat(user, "\icon[ME] [ME]") + return @@ -300,7 +307,8 @@ /obj/mecha/relaymove(mob/user,direction) if(user != src.occupant) //While not "realistic", this piece is player friendly. user.forceMove(get_turf(src)) - user << "You climb out from [src]" + to_chat(user, "You climb out from [src]") + return 0 if(connected_port) if(world.time - last_message > 20) @@ -458,7 +466,8 @@ internal_damage |= int_dam_flag pr_internal_damage.start() log_append_to_last("Internal damage of type [int_dam_flag].",1) - occupant << sound('sound/machines/warning-buzzer.ogg',wait=0) + to_chat(occupant, sound('sound/machines/warning-buzzer.ogg',wait=0)) + diag_hud_set_mechstat() return @@ -527,12 +536,14 @@ src.take_damage(15) src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) playsound(src.loc, 'sound/weapons/slash.ogg', 50, 1, -1) - user << "\red You slash at the armored suit!" + to_chat(user, "\red You slash at the armored suit!") + visible_message("\red The [user] slashes at [src.name]'s armor!") else src.log_append_to_last("Armor saved.") playsound(src.loc, 'sound/weapons/slash.ogg', 50, 1, -1) - user << "\green Your claws had no effect!" + to_chat(user, "\green Your claws had no effect!") + src.occupant_message("\blue The [user]'s claws are stopped by the armor.") visible_message("\blue The [user] rebounds off [src.name]'s armor!") return @@ -699,14 +710,16 @@ src.take_damage(6) src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) playsound(src.loc, 'sound/effects/blobattack.ogg', 50, 1, -1) - user << "\red You smash at the armored suit!" + to_chat(user, "\red You smash at the armored suit!") + for (var/mob/V in viewers(src)) if(V.client && !(V.blinded)) V.show_message("\red The [user] smashes against [src.name]'s armor!", 1) else src.log_append_to_last("Armor saved.") playsound(src.loc, 'sound/effects/blobattack.ogg', 50, 1, -1) - user << "\green Your attack had no effect!" + to_chat(user, "\green Your attack had no effect!") + src.occupant_message("\blue The [user]'s attack is stopped by the armor.") for (var/mob/V in viewers(src)) if(V.client && !(V.blinded)) @@ -739,7 +752,8 @@ user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(src) if(prob(src.deflect_chance)) - user << "\red The [W] bounces off [src.name] armor." + to_chat(user, "\red The [W] bounces off [src.name] armor.") + src.log_append_to_last("Armor saved.") /* for (var/mob/V in viewers(src)) @@ -761,9 +775,11 @@ if(istype(W, /obj/item/device/mmi) || istype(W, /obj/item/device/mmi/posibrain)) if(mmi_move_inside(W,user)) - user << "[src]-MMI interface initialized successfuly" + to_chat(user, "[src]-MMI interface initialized successfuly") + else - user << "[src]-MMI interface initialization failed." + to_chat(user, "[src]-MMI interface initialization failed.") + return if(istype(W, /obj/item/mecha_parts/mecha_equipment)) @@ -774,7 +790,8 @@ E.attach(src) user.visible_message("[user] attaches [W] to [src]", "You attach [W] to [src]") else - user << "You were unable to attach [W] to [src]" + to_chat(user, "You were unable to attach [W] to [src]") + return if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) if(add_req_access || maint_access) @@ -788,28 +805,35 @@ output_maintenance_dialog(id_card, user) return else - user << "\red Invalid ID: Access denied." + to_chat(user, "\red Invalid ID: Access denied.") + else - user << "\red Maintenance protocols disabled by operator." + to_chat(user, "\red Maintenance protocols disabled by operator.") + else if(istype(W, /obj/item/weapon/wrench)) if(state==1) state = 2 - user << "You undo the securing bolts." + to_chat(user, "You undo the securing bolts.") + else if(state==2) state = 1 - user << "You tighten the securing bolts." + to_chat(user, "You tighten the securing bolts.") + return else if(istype(W, /obj/item/weapon/crowbar)) if(state==2) state = 3 - user << "You open the hatch to the power unit" + to_chat(user, "You open the hatch to the power unit") + else if(state==3) state=2 - user << "You close the hatch to the power unit" + to_chat(user, "You close the hatch to the power unit") + else if(state==4 && pilot_is_mmi()) // Since having maint protocols available is controllable by the MMI, I see this as a consensual way to remove an MMI without destroying the mech user.visible_message("[user] begins levering out the MMI from the [src].", "You begin to lever out the MMI from the [src].") - occupant << "[user] is prying you out of the exosuit!" + to_chat(occupant, "[user] is prying you out of the exosuit!") + if(do_after(user,80,target=src)) user.visible_message("[user] pries the MMI out of the [src]!", "You finish removing the MMI from the [src]!") go_out() @@ -822,35 +846,42 @@ if(CC.amount > 1) CC.use(2) clearInternalDamage(MECHA_INT_SHORT_CIRCUIT) - user << "You replace the fused wires." + to_chat(user, "You replace the fused wires.") + else - user << "There's not enough wire to finish the task." + to_chat(user, "There's not enough wire to finish the task.") + return else if(istype(W, /obj/item/weapon/screwdriver)) if(hasInternalDamage(MECHA_INT_TEMP_CONTROL)) clearInternalDamage(MECHA_INT_TEMP_CONTROL) - user << "You repair the damaged temperature controller." + to_chat(user, "You repair the damaged temperature controller.") + else if(state==3 && src.cell) src.cell.forceMove(src.loc) src.cell = null state = 4 - user << "You unscrew and pry out the powercell." + to_chat(user, "You unscrew and pry out the powercell.") + src.log_message("Powercell removed") else if(state==4 && src.cell) state=3 - user << "You screw the cell in place" + to_chat(user, "You screw the cell in place") + return else if(istype(W, /obj/item/weapon/stock_parts/cell)) if(state==4) if(!src.cell) - user << "You install the powercell" + to_chat(user, "You install the powercell") + user.drop_item() W.forceMove(src) src.cell = W src.log_message("Powercell installed") else - user << "There's already a powercell installed." + to_chat(user, "There's already a powercell installed.") + return else if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != I_HARM) @@ -858,19 +889,23 @@ if (WT.remove_fuel(0,user)) if (hasInternalDamage(MECHA_INT_TANK_BREACH)) clearInternalDamage(MECHA_INT_TANK_BREACH) - user << "\blue You repair the damaged gas tank." + to_chat(user, "\blue You repair the damaged gas tank.") + else return if(src.health\the [W] is stuck to your hand, you cannot put it in \the [src]
      " + to_chat(user, "\the [W] is stuck to your hand, you cannot put it in \the [src]") + return W.forceMove(src) user.visible_message("[user] attaches [W] to [src].", "You attach [W] to [src]") @@ -879,7 +914,8 @@ else if(istype(W, /obj/item/weapon/paintkit)) if(occupant) - user << "You can't customize a mech while someone is piloting it - that would be unsafe!" + to_chat(user, "You can't customize a mech while someone is piloting it - that would be unsafe!") + return var/obj/item/weapon/paintkit/P = W @@ -891,7 +927,8 @@ break if(!found) - user << "That kit isn't meant for use on this class of exosuit." + to_chat(user, "That kit isn't meant for use on this class of exosuit.") + return user.visible_message("[user] opens [P] and spends some quality time customising [src].") @@ -909,7 +946,8 @@ /* src.log_message("Attacked by [W]. Attacker - [user]") if(prob(src.deflect_chance)) - user << "\red The [W] bounces off [src.name] armor." + to_chat(user, "\red The [W] bounces off [src.name] armor.") + src.log_append_to_last("Armor saved.") /* for (var/mob/V in viewers(src)) @@ -930,11 +968,13 @@ /obj/mecha/emag_act(user as mob) if(istype(src, /obj/mecha/working/ripley) && emagged == 0) emagged = 1 - usr << "\blue You slide the card through the [src]'s ID slot." + to_chat(usr, "\blue You slide the card through the [src]'s ID slot.") + playsound(src.loc, "sparks", 100, 1) src.desc += "
      \red The mech's equipment slots spark dangerously!" else - usr <<"\red The [src]'s ID slot rejects the card." + to_chat(usr, "\red The [src]'s ID slot rejects the card.") + return @@ -950,10 +990,13 @@ examine(user) //Get diagnostic information! var/obj/item/mecha_parts/mecha_tracking/B = locate(/obj/item/mecha_parts/mecha_tracking) in src if(B) //Beacons give the AI more detailed mech information. - user << "Warning: Tracking Beacon detected. Enter at your own risk. Beacon Data:" - user << "[B.get_mecha_info()]" + to_chat(user, "Warning: Tracking Beacon detected. Enter at your own risk. Beacon Data:") + + to_chat(user, "[B.get_mecha_info()]") + //Nothing like a big, red link to make the player feel powerful! - user << "ASSUME DIRECT CONTROL?
      " + to_chat(user, "ASSUME DIRECT CONTROL?
      ") + /obj/mecha/transfer_ai(var/interaction, mob/user, var/mob/living/silicon/ai/AI, var/obj/item/device/aicard/card) if(!..()) @@ -963,14 +1006,17 @@ switch(interaction) if(AI_TRANS_TO_CARD) //Upload AI from mech to AI card. if(!maint_access) //Mech must be in maint mode to allow carding. - user << "[name] must have maintenance protocols active in order to allow a transfer." + to_chat(user, "[name] must have maintenance protocols active in order to allow a transfer.") + return AI = occupant if(!AI || !isAI(occupant)) //Mech does not have an AI for a pilot - user << "No AI detected in the [name] onboard computer." + to_chat(user, "No AI detected in the [name] onboard computer.") + return if (AI.mind.special_role == "malfunction") //Malf AIs cannot leave mechs. Except through death. - user << "ACCESS DENIED." + to_chat(user, "ACCESS DENIED.") + return AI.aiRestorePowerRoutine = 0//So the AI initially has power. AI.control_disabled = 1 @@ -980,31 +1026,39 @@ AI.controlled_mech = null AI.remote_control = null icon_state = initial(icon_state)+"-open" - AI << "You have been downloaded to a mobile storage device. Wireless connection offline." - user << "Transfer successful: [AI.name] ([rand(1000,9999)].exe) removed from [name] and stored within local memory." + to_chat(AI, "You have been downloaded to a mobile storage device. Wireless connection offline.") + + to_chat(user, "Transfer successful: [AI.name] ([rand(1000,9999)].exe) removed from [name] and stored within local memory.") + if(AI_MECH_HACK) //Called by Malf AI mob on the mech. new /obj/structure/AIcore/deactivated(AI.loc) if(occupant) //Oh, I am sorry, were you using that? - AI << "Pilot detected! Forced ejection initiated!" - occupant << "You have been forcibly ejected!" + to_chat(AI, "Pilot detected! Forced ejection initiated!") + + to_chat(occupant, "You have been forcibly ejected!") + go_out(1) //IT IS MINE, NOW. SUCK IT, RD! ai_enter_mech(AI, interaction) if(AI_TRANS_FROM_CARD) //Using an AI card to upload to a mech. AI = locate(/mob/living/silicon/ai) in card if(!AI) - user << "There is no AI currently installed on this device." + to_chat(user, "There is no AI currently installed on this device.") + return else if(AI.stat || !AI.client) - user << "[AI.name] is currently unresponsive, and cannot be uploaded." + to_chat(user, "[AI.name] is currently unresponsive, and cannot be uploaded.") + return else if(occupant || dna) //Normal AIs cannot steal mechs! - user << "Access denied. [name] is [occupant ? "currently occupied" : "secured with a DNA lock"]." + to_chat(user, "Access denied. [name] is [occupant ? "currently occupied" : "secured with a DNA lock"].") + return AI.control_disabled = 0 AI.aiRadio.disabledAi = 0 - user << "Transfer successful: [AI.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed." + to_chat(user, "Transfer successful: [AI.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed.") + ai_enter_mech(AI, interaction) //Hack and From Card interactions share some code, so leave that here for both to use. @@ -1015,15 +1069,17 @@ icon_state = initial(icon_state) playsound(src, 'sound/machines/windowdoor.ogg', 50, 1) if(!hasInternalDamage()) - occupant << sound('sound/mecha/nominal.ogg',volume=50) + to_chat(occupant, sound('sound/mecha/nominal.ogg',volume=50)) + AI.cancel_camera() AI.controlled_mech = src AI.remote_control = src AI.canmove = 1 //Much easier than adding AI checks! Be sure to set this back to 0 if you decide to allow an AI to leave a mech somehow. AI.can_shunt = 0 //ONE AI ENTERS. NO AI LEAVES. - AI << "[interaction == AI_MECH_HACK ? "Takeover of [name] complete! You are now permanently loaded onto the onboard computer. Do not attempt to leave the station sector!" \ - : "You have been uploaded to a mech's onboard computer."]" - AI << "Use Middle-Mouse to activate mech functions and equipment. Click normally for AI interactions." + to_chat(AI, "[interaction == AI_MECH_HACK ? "Takeover of [name] complete! You are now permanently loaded onto the onboard computer. Do not attempt to leave the station sector!" \ + : "You have been uploaded to a mech's onboard computer."]") + to_chat(AI, "Use Middle-Mouse to activate mech functions and equipment. Click normally for AI interactions.") + ///////////////////////////////////// //////// Atmospheric stuff //////// @@ -1176,7 +1232,8 @@ return src.log_message("[user] tries to move in.") if (src.occupant) - usr << "The [src.name] is already occupied!" + to_chat(usr, "The [src.name] is already occupied!") + src.log_append_to_last("Permission denied.") return var/passed @@ -1187,12 +1244,14 @@ else if(src.operation_allowed(user)) passed = 1 if(!passed) - user << "Access denied." + to_chat(user, "Access denied.") + src.log_append_to_last("Permission denied.") return for(var/mob/living/carbon/slime/S in range(1,user)) if(S.Victim == user) - user << "You're too busy getting your life sucked out of you." + to_chat(user, "You're too busy getting your life sucked out of you.") + return visible_message("[user] starts to climb into [src.name]") @@ -1201,9 +1260,11 @@ if(!src.occupant) moved_inside(user) else if(src.occupant!=user) - user << "[src.occupant] was faster. Try better next time, loser." + to_chat(user, "[src.occupant] was faster. Try better next time, loser.") + else - user << "You stop entering the exosuit." + to_chat(user, "You stop entering the exosuit.") + return /obj/mecha/proc/moved_inside(var/mob/living/carbon/human/H as mob) @@ -1223,26 +1284,32 @@ dir = dir_in playsound(src, 'sound/machines/windowdoor.ogg', 50, 1) if(!hasInternalDamage()) - src.occupant << sound('sound/mecha/nominal.ogg',volume=50) + to_chat(src.occupant, sound('sound/mecha/nominal.ogg',volume=50)) + return 1 else return 0 /obj/mecha/proc/mmi_move_inside(var/obj/item/device/mmi/mmi_as_oc as obj,mob/user as mob) if(!mmi_as_oc.brainmob || !mmi_as_oc.brainmob.client) - user << "Consciousness matrix not detected." + to_chat(user, "Consciousness matrix not detected.") + return 0 else if(mmi_as_oc.brainmob.stat) - user << "Beta-rhythm below acceptable level." + to_chat(user, "Beta-rhythm below acceptable level.") + return 0 else if(occupant) - user << "Occupant detected." + to_chat(user, "Occupant detected.") + return 0 else if(dna && dna!=mmi_as_oc.brainmob.dna.unique_enzymes) - user << "Stop it!" + to_chat(user, "Stop it!") + return 0 //Added a message here since people assume their first click failed or something./N -// user << "Installing MMI, please stand by." +// to_chat(user, "Installing MMI, please stand by.") + visible_message("\blue [usr] starts to insert an MMI into [src.name]") @@ -1250,21 +1317,26 @@ if(!occupant) return mmi_moved_inside(mmi_as_oc,user) else - user << "Occupant detected." + to_chat(user, "Occupant detected.") + else - user << "You stop inserting the MMI." + to_chat(user, "You stop inserting the MMI.") + return 0 /obj/mecha/proc/mmi_moved_inside(var/obj/item/device/mmi/mmi_as_oc as obj,mob/user as mob) if(mmi_as_oc && user in range(1)) if(!mmi_as_oc.brainmob || !mmi_as_oc.brainmob.client) - user << "Consciousness matrix not detected." + to_chat(user, "Consciousness matrix not detected.") + return 0 else if(mmi_as_oc.brainmob.stat) - user << "Beta-rhythm below acceptable level." + to_chat(user, "Beta-rhythm below acceptable level.") + return 0 if(!user.unEquip(mmi_as_oc)) - user << "\the [mmi_as_oc] is stuck to your hand, you cannot put it in \the [src]" + to_chat(user, "\the [mmi_as_oc] is stuck to your hand, you cannot put it in \the [src]") + return 0 var/mob/brainmob = mmi_as_oc.brainmob brainmob.reset_view(src) @@ -1284,7 +1356,8 @@ dir = dir_in src.log_message("[mmi_as_oc] moved in as pilot.") if(!hasInternalDamage()) - src.occupant << sound('sound/mecha/nominal.ogg',volume=50) + to_chat(src.occupant, sound('sound/mecha/nominal.ogg',volume=50)) + return 1 else return 0 @@ -1367,7 +1440,8 @@ occupant.SetStunned(5) occupant.SetWeakened(5) - occupant << "You were blown out of the mech!" + to_chat(occupant, "You were blown out of the mech!") + */ src.log_message("[mob_container] moved out.") occupant.reset_view() @@ -1643,7 +1717,8 @@ /obj/mecha/proc/occupant_message(message as text) if(message) if(src.occupant && src.occupant.client) - src.occupant << "\icon[src] [message]" + to_chat(src.occupant, "\icon[src] [message]") + return /obj/mecha/proc/log_message(message as text,red=null) @@ -1755,10 +1830,12 @@ if(user) if(state==0) state = 1 - user << "The securing bolts are now exposed." + to_chat(user, "The securing bolts are now exposed.") + else if(state==1) state = 0 - user << "The securing bolts are now hidden." + to_chat(user, "The securing bolts are now hidden.") + output_maintenance_dialog(filter.getObj("id_card"),user) return if(href_list["set_internal_tank_valve"] && state >=1) @@ -1768,7 +1845,8 @@ var/new_pressure = input(user,"Input new output pressure","Pressure setting",internal_tank_valve) as num if(new_pressure) internal_tank_valve = new_pressure - user << "The internal pressure valve has been set to [internal_tank_valve]kPa." + to_chat(user, "The internal pressure valve has been set to [internal_tank_valve]kPa.") + if(href_list["add_req_access"] && add_req_access && filter.getObj("id_card")) if(!in_range(src, usr)) return operation_req_access += filter.getNum("add_req_access") @@ -1789,7 +1867,8 @@ if(usr != src.occupant) return if(src.occupant && !iscarbon(src.occupant)) - src.occupant << "You do not have any DNA!" + to_chat(src.occupant, "You do not have any DNA!") + return src.dna = src.occupant.dna.unique_enzymes src.occupant_message("You feel a prick as the needle takes your DNA sample.") diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm index 08d0541bfb5..7be280bd2b5 100644 --- a/code/game/mecha/mecha_construction_paths.dm +++ b/code/game/mecha/mecha_construction_paths.dm @@ -23,12 +23,14 @@ if(C.use(4)) playsound(holder, 'sound/items/Deconstruct.ogg', 50, 1) else - user << ("There's not enough cable to finish the task.") + to_chat(user, ("There's not enough cable to finish the task.")) + return 0 else if(istype(used_atom, /obj/item/stack)) var/obj/item/stack/S = used_atom if(S.amount < 5) - user << ("There's not enough material in this stack.") + to_chat(user, ("There's not enough material in this stack.")) + return 0 else S.use(5) @@ -55,12 +57,14 @@ if (C.use(4)) playsound(holder, 'sound/items/Deconstruct.ogg', 50, 1) else - user << ("There's not enough cable to finish the task.") + to_chat(user, ("There's not enough cable to finish the task.")) + return 0 else if(istype(used_atom, /obj/item/stack)) var/obj/item/stack/S = used_atom if(S.amount < 5) - user << ("There's not enough material in this stack.") + to_chat(user, ("There's not enough material in this stack.")) + return 0 else S.use(5) diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm index 647da103a45..2198c472f93 100644 --- a/code/game/mecha/mecha_wreckage.dm +++ b/code/game/mecha/mecha_wreckage.dm @@ -43,7 +43,8 @@ qdel(src) else if (isemptylist(welder_salvage)) - user << "What's left on the [src] cannot be removed with a welder, besides the frame itself" + to_chat(user, "What's left on the [src] cannot be removed with a welder, besides the frame itself") + else if(WT.remove_fuel(0,user)) var/type = prob(70)?pick(welder_salvage):null if(type) @@ -53,12 +54,15 @@ welder_salvage -= type salvage_num-- else - user << "You failed to salvage anything valuable from [src]." + to_chat(user, "You failed to salvage anything valuable from [src].") + else - user << "\blue You need more welding fuel to complete this task." + to_chat(user, "\blue You need more welding fuel to complete this task.") + else if(istype(W, /obj/item/weapon/wirecutters)) if(salvage_num <= 0) - user << "You don't see anything that can be cut with [W]." + to_chat(user, "You don't see anything that can be cut with [W].") + return else if(!isemptylist(wirecutters_salvage)) var/type = prob(70)?pick(wirecutters_salvage):null @@ -67,7 +71,8 @@ user.visible_message("[user] cuts [N] from [src].", "You cut [N] from [src].") salvage_num-- else - user << "You failed to salvage anything valuable from [src]." + to_chat(user, "You failed to salvage anything valuable from [src].") + else if(istype(W, /obj/item/weapon/crowbar)) if(!isemptylist(crowbar_salvage)) var/obj/S = pick(crowbar_salvage) @@ -76,7 +81,8 @@ crowbar_salvage -= S user.visible_message("[user] pries [S] from [src].", "You pry [S] from [src].") else - user << "You don't see anything that can be pried with [W]." + to_chat(user, "You don't see anything that can be pried with [W].") + else ..() return diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index f1191a0ae8c..502a738ae31 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -36,9 +36,11 @@ if (isslime(M) || isAI(M)) if(M == usr) - M << "You are unable to buckle yourself to the [src]!" + to_chat(M, "You are unable to buckle yourself to the [src]!") + else - usr << "You are unable to buckle [M] to the [src]!" + to_chat(usr, "You are unable to buckle [M] to the [src]!") + return 0 M.buckled = src diff --git a/code/game/objects/effects/aliens.dm b/code/game/objects/effects/aliens.dm index a7677daa62c..16ebeb9a100 100644 --- a/code/game/objects/effects/aliens.dm +++ b/code/game/objects/effects/aliens.dm @@ -318,19 +318,23 @@ if(user.get_int_organ(/obj/item/organ/internal/xenos/plasmavessel)) switch(status) if(BURST) - user << "You clear the hatched egg." + to_chat(user, "You clear the hatched egg.") + playsound(loc, 'sound/effects/attackblob.ogg', 100, 1) qdel(src) return if(GROWING) - user << "The child is not developed yet." + to_chat(user, "The child is not developed yet.") + return if(GROWN) - user << "You retrieve the child." + to_chat(user, "You retrieve the child.") + Burst(0) return else - user << "It feels slimy." + to_chat(user, "It feels slimy.") + user.changeNext_move(CLICK_CD_MELEE) diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm index 29b1098ca83..05a1ec2ea67 100644 --- a/code/game/objects/effects/anomalies.dm +++ b/code/game/objects/effects/anomalies.dm @@ -34,7 +34,8 @@ /obj/effect/anomaly/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/device/analyzer)) - user << "Analyzing... [src]'s unstable field is fluctuating along frequency [aSignal.code]:[format_frequency(aSignal.frequency)]." + to_chat(user, "Analyzing... [src]'s unstable field is fluctuating along frequency [aSignal.code]:[format_frequency(aSignal.frequency)].") + /////////////////////// diff --git a/code/game/objects/effects/datacore-effect.dm b/code/game/objects/effects/datacore-effect.dm index f50be441414..a6913f25087 100644 --- a/code/game/objects/effects/datacore-effect.dm +++ b/code/game/objects/effects/datacore-effect.dm @@ -50,7 +50,8 @@ isactive[name] = active ? "Active" : "Inactive" else isactive[name] = t.fields["p_stat"] - //world << "[name]: [rank]" +// to_chat(world, "[name]: [rank]") + //cael - to prevent multiple appearances of a player/job combination, add a continue after each line var/department = 0 if(real_rank in command_positions) diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 2fd1fbdcd34..3cda01717c5 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -92,7 +92,8 @@ var/global/list/image/splatter_cache=list() return var/taken = rand(1,amount) amount -= taken - user << "You get some of \the [src] on your hands." + to_chat(user, "You get some of \the [src] on your hands.") + if (!user.blood_DNA) user.blood_DNA = list() user.blood_DNA |= blood_DNA.Copy() @@ -139,7 +140,8 @@ var/global/list/image/splatter_cache=list() /obj/effect/decal/cleanable/blood/writing/examine(mob/user) ..(user) - user << "It reads: \"[message]\"" + to_chat(user, "It reads: \"[message]\"") + /obj/effect/decal/cleanable/blood/gibs name = "gibs" diff --git a/code/game/objects/effects/decals/Cleanable/tracks.dm b/code/game/objects/effects/decals/Cleanable/tracks.dm index 48e865c78a3..6fc90b31628 100644 --- a/code/game/objects/effects/decals/Cleanable/tracks.dm +++ b/code/game/objects/effects/decals/Cleanable/tracks.dm @@ -78,7 +78,8 @@ var/global/list/image/fluidtrack_cache=list() // Process 4 bits for(var/bi=0;bi<4;bi++) - b=1<There isn't enough [src] to scoop up!" + to_chat(user, "There isn't enough [src] to scoop up!") + return if(W.reagents.total_volume >= W.reagents.maximum_volume) - user << "[W] is full!" + to_chat(user, "[W] is full!") + return - user << "You scoop the [src] into [W]!" + to_chat(user, "You scoop the [src] into [W]!") + reagents.trans_to(W, reagents.total_volume) if(!reagents.total_volume && !noclear) //scooped up all of it qdel(src) @@ -29,7 +32,8 @@ else src.reagents.chem_temp += 15 src.reagents.handle_reactions() - user << "You heat [src] with [W]!" + to_chat(user, "You heat [src] with [W]!") + /obj/effect/decal/cleanable/ex_act() if(reagents) diff --git a/code/game/objects/effects/decals/contraband.dm b/code/game/objects/effects/decals/contraband.dm index 1e62b6a5a9e..52f4af032ed 100644 --- a/code/game/objects/effects/decals/contraband.dm +++ b/code/game/objects/effects/decals/contraband.dm @@ -59,7 +59,8 @@ break if(check) - user << "The wall is far too cluttered to place a poster!" + to_chat(user, "The wall is far too cluttered to place a poster!") + return resulting_poster.loc = W //Looks like it's uncluttered enough. Place the poster @@ -310,10 +311,12 @@ obj/structure/sign/poster/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weapon/wirecutters)) playsound(loc, 'sound/items/Wirecutter.ogg', 100, 1) if(ruined) - user << "You remove the remnants of the poster." + to_chat(user, "You remove the remnants of the poster.") + qdel(src) else - user << "You carefully remove the poster from the wall." + to_chat(user, "You carefully remove the poster from the wall.") + roll_and_drop(user.loc) return @@ -354,14 +357,18 @@ obj/structure/sign/poster/attackby(obj/item/I, mob/user, params) var/stuff_on_wall = 0 for(var/obj/O in user.loc.contents) //Let's see if it already has a poster on it or too much stuff if(istype(O,/obj/structure/sign)) - user << "The wall is far too cluttered to place a poster!" + to_chat(user, "The wall is far too cluttered to place a poster!") + return stuff_on_wall++ if(stuff_on_wall >= 4) - user << "The wall is far too cluttered to place a poster!" + to_chat(user, "The wall is far too cluttered to place a poster!") + return - user << "You start placing the poster on the wall..." //Looks like it's uncluttered enough. Place the poster. + to_chat(user, "You start placing the poster on the wall...")//Looks like it's uncluttered enough. Place the poster. + + //declaring D because otherwise if P gets 'deconstructed' we lose our reference to P.resulting_poster var/obj/structure/sign/poster/D = P.resulting_poster @@ -382,7 +389,8 @@ obj/structure/sign/poster/attackby(obj/item/I, mob/user, params) D.pixel_x = -32 D.pixel_y = 0 else - user << "You cannot reach the wall from here!" + to_chat(user, "You cannot reach the wall from here!") + return flick("poster_being_set",D) @@ -395,7 +403,8 @@ obj/structure/sign/poster/attackby(obj/item/I, mob/user, params) if(!D) return if(istype(src,/turf/simulated/wall) && user && user.loc == temp_loc) //Let's check if everything is still there - user << "You place the poster!" + to_chat(user, "You place the poster!") + else D.roll_and_drop(temp_loc) return diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index 0cd489c308d..59b13eb3be1 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -1092,7 +1092,8 @@ steam.start() -- spawns the effect user.visible_message("[user] smashes through \the [src].", "You smash through \the [src].") qdel(src) else - user << "You hit the metal foam but bounce off it." + to_chat(user, "You hit the metal foam but bounce off it.") + /obj/structure/foamedmetal/attackby(var/obj/item/I, var/mob/user, params) user.changeNext_move(CLICK_CD_MELEE) @@ -1109,7 +1110,8 @@ steam.start() -- spawns the effect user.visible_message("[user] smashes through the foamed metal with \the [I].", "You smash through the foamed metal with \the [I].") qdel(src) else - user << "You hit the metal foam to no effect." + to_chat(user, "You hit the metal foam to no effect.") + /obj/structure/foamedmetal/attack_animal(mob/living/simple_animal/M) M.do_attack_animation(src) @@ -1156,10 +1158,12 @@ steam.start() -- spawns the effect s.start() for(var/mob/M in viewers(5, location)) - M << "\red The solution violently explodes." + to_chat(M, "\red The solution violently explodes.") + for(var/mob/M in viewers(1, location)) if (prob (50 * amount)) - M << "\red The explosion knocks you down." + to_chat(M, "\red The explosion knocks you down.") + M.Weaken(rand(1,5)) return else @@ -1182,7 +1186,8 @@ steam.start() -- spawns the effect flash += (round(amount/4) * flashing_factor) for(var/mob/M in viewers(8, location)) - M << "\red The solution violently explodes." + to_chat(M, "\red The solution violently explodes.") + explosion(location, devastation, heavy, light, flash) diff --git a/code/game/objects/effects/gibs.dm b/code/game/objects/effects/gibs.dm index f170aeb7dce..a630ca27106 100644 --- a/code/game/objects/effects/gibs.dm +++ b/code/game/objects/effects/gibs.dm @@ -25,7 +25,8 @@ proc/Gib(atom/location, var/list/viruses = list(), var/datum/dna/MobDNA = null) if(gibtypes.len != gibamounts.len || gibamounts.len != gibdirections.len) - world << "\red Gib list length mismatch!" + to_chat(world, "\red Gib list length mismatch!") + return var/obj/effect/decal/cleanable/blood/gibs/gib = null diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 6eb84ce50ca..0c3ee5d99ab 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -21,7 +21,8 @@ if(istype(M, /mob/living/carbon/human)) for(var/mob/O in viewers(world.view, src.loc)) - O << "[M] triggered the \icon[src] [src]" + to_chat(O, "[M] triggered the \icon[src] [src]") + triggered = 1 call(src,triggerproc)(M) diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 52175c17e13..2d1510bbf16 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -65,7 +65,8 @@ return 1 else if(istype(mover, /mob/living)) if(prob(50)) - mover << "You get stuck in \the [src] for a moment." + to_chat(mover, "You get stuck in \the [src] for a moment.") + return 0 else if(istype(mover, /obj/item/projectile)) return prob(30) @@ -207,7 +208,8 @@ var/mob/C = pick(candidates) S.key = C.key if(master_commander) - S << "You are a spider who is loyal to [master_commander], obey [master_commander]'s every order and assist them in completing their goals at any cost." + to_chat(S, "You are a spider who is loyal to [master_commander], obey [master_commander]'s every order and assist them in completing their goals at any cost.") + qdel(src) /obj/effect/decal/cleanable/spiderling_remains diff --git a/code/game/objects/empulse.dm b/code/game/objects/empulse.dm index 414874f6ea2..159fed83a2f 100644 --- a/code/game/objects/empulse.dm +++ b/code/game/objects/empulse.dm @@ -15,7 +15,8 @@ light_range = heavy_range for(var/mob/M in range(heavy_range, epicenter)) - M << 'sound/effects/EMPulse.ogg' + to_chat(M, 'sound/effects/EMPulse.ogg') + for(var/atom/T in range(light_range, epicenter)) var/distance = get_dist(epicenter, T) diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm index caaf79a9981..98e14266aa8 100644 --- a/code/game/objects/explosion.dm +++ b/code/game/objects/explosion.dm @@ -73,7 +73,8 @@ for(var/mob/M in world) if(M.z == epicenter.z) if(!(M in close)) // check if the mob can hear if(M.ear_deaf <= 0 || !M.ear_deaf) if(!istype(M.loc,/turf/space)) - M << 'sound/effects/explosionfar.ogg' + to_chat(M, 'sound/effects/explosionfar.ogg') + if(heavy_impact_range > 1) var/datum/effect/system/explosion/E = new/datum/effect/system/explosion() diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 42a14a43255..4fc9eb3a1ba 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -162,7 +162,8 @@ else msg += "No extractable materials detected.
      " msg += "*--------*" - user << msg + to_chat(user, msg) + /obj/item/attack_hand(mob/user as mob) @@ -173,10 +174,12 @@ if (user.hand) temp = H.organs_by_name["l_hand"] if(!temp) - user << "You try to use your hand, but it's missing!" + to_chat(user, "You try to use your hand, but it's missing!") + return 0 if(temp && !temp.is_usable()) - user << "You try to move your [temp.name], but cannot!" + to_chat(user, "You try to move your [temp.name], but cannot!") + return 0 if (istype(src.loc, /obj/item/weapon/storage)) @@ -207,7 +210,8 @@ if(!A.has_fine_manipulation) if(src in A.contents) // To stop Aliens having items stuck in their pockets A.unEquip(src) - user << "Your claws aren't capable of such fine manipulation." + to_chat(user, "Your claws aren't capable of such fine manipulation.") + return if (istype(src.loc, /obj/item/weapon/storage)) @@ -234,7 +238,8 @@ if(!A.has_fine_manipulation) if(src in A.contents) // To stop Aliens having items stuck in their pockets A.unEquip(src) - user << "Your claws aren't capable of such fine manipulation." + to_chat(user, "Your claws aren't capable of such fine manipulation.") + return attack_hand(A) @@ -268,11 +273,14 @@ success = 1 S.handle_item_insertion(I, 1) //The 1 stops the "You put the [src] into [S]" insertion message from being displayed. if(success && !failure) - user << "You put everything in [S]." + to_chat(user, "You put everything in [S].") + else if(success) - user << "You put some things in [S]." + to_chat(user, "You put some things in [S].") + else - user << "You fail to pick anything up with [S]." + to_chat(user, "You fail to pick anything up with [S].") + else if(S.can_be_inserted(src)) S.handle_item_insertion(src) @@ -343,22 +351,28 @@ if(!usr.canmove || usr.stat || usr.restrained() || !Adjacent(usr)) return if((!istype(usr, /mob/living/carbon)) || (istype(usr, /mob/living/carbon/brain)))//Is humanoid, and is not a brain - usr << "\red You can't pick things up!" + to_chat(usr, "\red You can't pick things up!") + return if( usr.stat || usr.restrained() )//Is not asleep/dead and is not restrained - usr << "\red You can't pick things up!" + to_chat(usr, "\red You can't pick things up!") + return if(src.anchored) //Object isn't anchored - usr << "\red You can't pick that up!" + to_chat(usr, "\red You can't pick that up!") + return if(!usr.hand && usr.r_hand) //Right hand is not full - usr << "\red Your right hand is full." + to_chat(usr, "\red Your right hand is full.") + return if(usr.hand && usr.l_hand) //Left hand is not full - usr << "\red Your left hand is full." + to_chat(usr, "\red Your left hand is full.") + return if(!istype(src.loc, /turf)) //Object is on a turf - usr << "\red You can't pick that up!" + to_chat(usr, "\red You can't pick that up!") + return //All checks are done, time to pick it up! usr.UnarmedAttack(src) @@ -392,11 +406,13 @@ (H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \ )) // you can't stab someone in the eyes wearing a mask! - user << "You're going to need to remove that mask/helmet/glasses first!" + to_chat(user, "You're going to need to remove that mask/helmet/glasses first!") + return if(istype(M, /mob/living/carbon/alien) || istype(M, /mob/living/carbon/slime))//Aliens don't have eyes./N slimes also don't have eyes! - user << "You cannot locate any eyes on this creature!" + to_chat(user, "You cannot locate any eyes on this creature!") + return if(!iscarbon(user)) @@ -430,17 +446,20 @@ if(eyes.damage >= eyes.min_bruised_damage) if(M.stat != 2) if(!(eyes.status & ORGAN_ROBOT) || !(eyes.status & ORGAN_ASSISTED)) //robot eyes bleeding might be a bit silly - M << "Your eyes start to bleed profusely!" + to_chat(M, "Your eyes start to bleed profusely!") + if(prob(50)) if(M.stat != 2) - M << "You drop what you're holding and clutch at your eyes!" + to_chat(M, "You drop what you're holding and clutch at your eyes!") + M.drop_item() M.eye_blurry += 10 M.Paralyse(1) M.Weaken(2) if (eyes.damage >= eyes.min_broken_damage) if(M.stat != 2) - M << "You go blind!" + to_chat(M, "You go blind!") + var/obj/item/organ/external/affecting = H.get_organ("head") if(affecting.take_damage(7)) H.UpdateDamageIcon() @@ -516,7 +535,8 @@ /obj/item/proc/wash(mob/user, atom/source) if(flags & ABSTRACT) //Abstract items like grabs won't wash. No-drop items will though because it's still technically an item in your hand. return - user << "You start washing [src]..." + to_chat(user, "You start washing [src]...") + if(!do_after(user, 40, target = source)) return clean_blood() diff --git a/code/game/objects/items/ashtray.dm b/code/game/objects/items/ashtray.dm index 766b5d55163..3eedff16d93 100644 --- a/code/game/objects/items/ashtray.dm +++ b/code/game/objects/items/ashtray.dm @@ -19,7 +19,8 @@ return if (istype(W,/obj/item/weapon/cigbutt) || istype(W,/obj/item/clothing/mask/cigarette) || istype(W, /obj/item/weapon/match)) if (contents.len >= max_butts) - user << "This ashtray is full." + to_chat(user, "This ashtray is full.") + return user.unEquip(W) W.loc = src @@ -33,7 +34,8 @@ cig.transfer_fingerprints_to(butt) qdel(cig) else if (cig.lit == 0) - user << "You place [cig] in [src] without even smoking it. Why would you do that?" + to_chat(user, "You place [cig] in [src] without even smoking it. Why would you do that?") + src.visible_message("[user] places [W] in [src].") user.update_inv_l_hand() @@ -47,7 +49,8 @@ desc = empty_desc + " It's half-filled." else health = max(0,health - W.force) - user << "You hit [src] with [W]." + to_chat(user, "You hit [src] with [W].") + if (health < 1) die() return diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index 99dbe5b366b..1d145d2319f 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -132,26 +132,31 @@ if(!istype(res,/list)) switch(res) if(ROOM_ERR_SPACE) - usr << "The new area must be completely airtight." + to_chat(usr, "The new area must be completely airtight.") + return if(ROOM_ERR_TOOLARGE) - usr << "The new area is too large." + to_chat(usr, "The new area is too large.") + return else - usr << "Error! Please notify administration." + to_chat(usr, "Error! Please notify administration.") + return var/list/turf/turfs = res var/str = trim(stripped_input(usr,"New area name:", "Blueprint Editing", "", MAX_NAME_LEN)) if(!str || !length(str)) //cancel return if(length(str) > 50) - usr << "The given name is too long. The area remains undefined." + to_chat(usr, "The given name is too long. The area remains undefined.") + return var/area/A = new A.name = str //var/ma //ma = A.master ? "[A.master]" : "(null)" - //world << "DEBUG: create_area:
      A.name=[A.name]
      A.tag=[A.tag]
      A.master=[ma]" +// to_chat(world, "DEBUG: create_area:
      A.name=[A.name]
      A.tag=[A.tag]
      A.master=[ma]") + A.power_equip = 0 A.power_light = 0 A.power_environ = 0 @@ -173,11 +178,13 @@ if(!str || !length(str) || str==prevname) //cancel return if(length(str) > 50) - usr << "The given name is too long. The area's name is unchanged." + to_chat(usr, "The given name is too long. The area's name is unchanged.") + return set_area_machinery_title(A,str,prevname) A.name = str - usr << "You rename the '[prevname]' to '[str]'." + to_chat(usr, "You rename the '[prevname]' to '[str]'.") + interact() return 1 diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index 3c36ea9dfe8..c61be6a265a 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -57,7 +57,8 @@ //..() //Doesn't need to run the parent. Since when can fucking bodybags be welded shut? -Agouri return else if(istype(W, /obj/item/weapon/wirecutters)) - user << "You cut the tag off the bodybag" + to_chat(user, "You cut the tag off the bodybag") + src.name = "body bag" src.overlays.Cut() return @@ -89,7 +90,8 @@ // Make it possible to escape from bodybags in morgues and crematoriums if(loc && (isturf(loc) || istype(loc, /obj/structure/morgue) || istype(loc, /obj/structure/crematorium))) if(!open()) - user << "It won't budge!" + to_chat(user, "It won't budge!") + /obj/item/bodybag/cryobag name = "stasis bag" @@ -126,14 +128,17 @@ MouseDrop(over_object, src_location, over_location) if((over_object == usr && (in_range(src, usr) || usr.contents.Find(src)))) if(!ishuman(usr)) return - usr << "\red You can't fold that up anymore.." + to_chat(usr, "\red You can't fold that up anymore..") + ..() attackby(W as obj, mob/user as mob, params) if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda)) if(src.allowed(user)) src.locked = !src.locked - user << "The controls are now [src.locked ? "locked." : "unlocked."]" + to_chat(user, "The controls are now [src.locked ? "locked." : "unlocked."]") + else - user << "\red Access denied." + to_chat(user, "\red Access denied.") + return \ No newline at end of file diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 564e22af0a4..36e0b54f356 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -85,26 +85,31 @@ temp = "letter" else if(graffiti.Find(drawtype)) temp = "graffiti" - user << "You start drawing a [temp] on the [target.name]." + to_chat(user, "You start drawing a [temp] on the [target.name].") + if(instant || do_after(user, 50, target = target)) new /obj/effect/decal/cleanable/crayon(target,colour,drawtype,temp) - user << "You finish drawing [temp]." + to_chat(user, "You finish drawing [temp].") + if(uses) uses-- if(!uses) - user << "You used up your [src.name]!" + to_chat(user, "You used up your [src.name]!") + qdel(src) return /obj/item/toy/crayon/attack(mob/M as mob, mob/user as mob) var/huffable = istype(src,/obj/item/toy/crayon/spraycan) if(M == user) - user << "You take a [huffable ? "huff" : "bite"] of the [src.name]. Delicious!" + to_chat(user, "You take a [huffable ? "huff" : "bite"] of the [src.name]. Delicious!") + user.nutrition += 5 if(uses) uses -= 5 if(uses <= 0) - user << "There is no more of [src.name] left!" + to_chat(user, "There is no more of [src.name] left!") + qdel(src) else ..() @@ -214,7 +219,8 @@ var/choice = input(user,"Spraycan options") in list("Toggle Cap","Change Drawing","Change Color") switch(choice) if("Toggle Cap") - user << "You [capped ? "Remove" : "Replace"] the cap of the [src]" + to_chat(user, "You [capped ? "Remove" : "Replace"] the cap of the [src]") + capped = capped ? 0 : 1 icon_state = "spraycan[capped ? "_cap" : ""]" update_icon() diff --git a/code/game/objects/items/dehy_carp.dm b/code/game/objects/items/dehy_carp.dm index f3d20babcf5..dea1ecd516e 100644 --- a/code/game/objects/items/dehy_carp.dm +++ b/code/game/objects/items/dehy_carp.dm @@ -12,7 +12,8 @@ /obj/item/toy/carpplushie/dehy_carp/attack_self(mob/user as mob) src.add_fingerprint(user) // Anyone can add their fingerprints to it with this if(owned) - user << "[src] stares up at you with friendly eyes." + to_chat(user, "[src] stares up at you with friendly eyes.") + owner = user owned = 0 return ..() @@ -21,7 +22,8 @@ /obj/item/toy/carpplushie/dehy_carp/afterattack(obj/O, mob/user,proximity) if(!proximity) return if(istype(O,/obj/structure/sink)) - user << "You place [src] under a stream of water..." + to_chat(user, "You place [src] under a stream of water...") + user.drop_item() loc = get_turf(O) return Swell() diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index 159365f0b79..00d8999b81e 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -83,7 +83,8 @@ msg_admin_attack("[key_name_admin(user)] wiped [key_name_admin(AI)] with \the [src].") flush = 1 AI.suiciding = 1 - AI << "Your core files are being wiped!" + to_chat(AI, "Your core files are being wiped!") + while (AI && AI.stat != DEAD) AI.adjustOxyLoss(2) AI.updatehealth() @@ -92,13 +93,17 @@ if (href_list["radio"]) AI.aiRadio.disabledAi = text2num(href_list["radio"]) - AI << "Your Subspace Transceiver has been [AI.aiRadio.disabledAi ? "disabled" : "enabled"]!" - user << "You [AI.aiRadio.disabledAi ? "disable" : "enable"] the AI's Subspace Transceiver." + to_chat(AI, "Your Subspace Transceiver has been [AI.aiRadio.disabledAi ? "disabled" : "enabled"]!") + + to_chat(user, "You [AI.aiRadio.disabledAi ? "disable" : "enable"] the AI's Subspace Transceiver.") + if (href_list["wireless"]) AI.control_disabled = text2num(href_list["wireless"]) - AI << "Your wireless interface has been [AI.control_disabled ? "disabled" : "enabled"]!" - user << "You [AI.control_disabled ? "disable" : "enable"] the AI's wireless interface." + to_chat(AI, "Your wireless interface has been [AI.control_disabled ? "disabled" : "enabled"]!") + + to_chat(user, "You [AI.control_disabled ? "disable" : "enable"] the AI's wireless interface.") + update_icon() return 1 diff --git a/code/game/objects/items/devices/autopsy.dm b/code/game/objects/items/devices/autopsy.dm index 54056c0942e..45e06357b97 100644 --- a/code/game/objects/items/devices/autopsy.dm +++ b/code/game/objects/items/devices/autopsy.dm @@ -79,7 +79,8 @@ set src in view(usr, 1) set name = "Print Data" if(usr.stat || !(istype(usr,/mob/living/carbon/human))) - usr << "No." + to_chat(usr, "No.") + return var/scan_data = "" @@ -186,16 +187,19 @@ src.wdata = list() src.chemtraces = list() src.timeofdeath = null - user << "\red A new patient has been registered.. Purging data for previous patient." + to_chat(user, "\red A new patient has been registered.. Purging data for previous patient.") + src.timeofdeath = M.timeofdeath var/obj/item/organ/external/S = M.get_organ(user.zone_sel.selecting) if(!S) - usr << "You can't scan this body part." + to_chat(usr, "You can't scan this body part.") + return if(!S.open) - usr << "You have to cut the limb open first!" + to_chat(usr, "You have to cut the limb open first!") + return for(var/mob/O in viewers(M)) O.show_message("\red [user.name] scans the wounds on [M.name]'s [S.name] with \the [src.name]", 1) diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm index dc47c3fc146..2a909561d8a 100644 --- a/code/game/objects/items/devices/camera_bug.dm +++ b/code/game/objects/items/devices/camera_bug.dm @@ -62,7 +62,8 @@ var/turf/T = get_turf(user.loc) if(T.z != current.z || !current.can_use()) - user << "[src] has lost the signal." + to_chat(user, "[src] has lost the signal.") + current = null user.reset_view(null) user.unset_machine() @@ -222,11 +223,13 @@ var/obj/machinery/camera/C = locate(href_list["view"]) if(istype(C)) if(!C.can_use()) - usr << "Something's wrong with that camera. You can't get a feed." + to_chat(usr, "Something's wrong with that camera. You can't get a feed.") + return var/turf/T = get_turf(loc) if(!T || C.z != T.z) - usr << "You can't get a signal." + to_chat(usr, "You can't get a signal.") + return current = C spawn(6) diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index 9edc811958f..35ab95e05a3 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -31,7 +31,8 @@ if(!active_dummy) if(istype(target,/obj/item) && !istype(target, /obj/item/weapon/disk/nuclear)) playsound(get_turf(src), 'sound/weapons/flash.ogg', 100, 1, -6) - user << "Scanned [target]." + to_chat(user, "Scanned [target].") + saved_item = target.type saved_icon = target.icon saved_icon_state = target.icon_state @@ -45,7 +46,8 @@ playsound(get_turf(src), 'sound/effects/pop.ogg', 100, 1, -6) qdel(active_dummy) active_dummy = null - usr << "You deactivate \the [src]." + to_chat(usr, "You deactivate \the [src].") + var/obj/effect/overlay/T = new/obj/effect/overlay(get_turf(src)) T.icon = 'icons/effects/effects.dmi' flick("emppulse",T) @@ -58,7 +60,8 @@ var/obj/effect/dummy/chameleon/C = new/obj/effect/dummy/chameleon(usr.loc) C.activate(O, usr, saved_icon, saved_icon_state, saved_overlays, saved_underlays, src) qdel(O) - usr << "You activate \the [src]." + to_chat(usr, "You activate \the [src].") + var/obj/effect/overlay/T = new/obj/effect/overlay(get_turf(src)) T.icon = 'icons/effects/effects.dmi' flick("emppulse",T) @@ -107,24 +110,28 @@ /obj/effect/dummy/chameleon/attackby() for(var/mob/M in src) - M << "Your chameleon-projector deactivates." + to_chat(M, "Your chameleon-projector deactivates.") + master.disrupt() /obj/effect/dummy/chameleon/attack_hand() for(var/mob/M in src) - M << "Your chameleon-projector deactivates." + to_chat(M, "Your chameleon-projector deactivates.") + master.disrupt() /obj/effect/dummy/chameleon/ex_act(var/severity) //no longer bomb-proof for(var/mob/M in src) - M << "Your chameleon-projector deactivates." + to_chat(M, "Your chameleon-projector deactivates.") + spawn() M.ex_act(severity) master.disrupt() /obj/effect/dummy/chameleon/bullet_act() for(var/mob/M in src) - M << "Your chameleon-projector deactivates." + to_chat(M, "Your chameleon-projector deactivates.") + ..() master.disrupt() diff --git a/code/game/objects/items/devices/debugger.dm b/code/game/objects/items/devices/debugger.dm index 2b8eb60500f..9c9bfb6754f 100644 --- a/code/game/objects/items/devices/debugger.dm +++ b/code/game/objects/items/devices/debugger.dm @@ -24,21 +24,27 @@ if(istype(O, /obj/machinery/power/apc)) var/obj/machinery/power/apc/A = O if(A.emagged || A.malfhack) - user << "\red There is a software error with the device." + to_chat(user, "\red There is a software error with the device.") + else - user << "\blue The device's software appears to be fine." + to_chat(user, "\blue The device's software appears to be fine.") + return 1 if(istype(O, /obj/machinery/door)) var/obj/machinery/door/D = O if(D.operating == -1) - user << "\red There is a software error with the device." + to_chat(user, "\red There is a software error with the device.") + else - user << "\blue The device's software appears to be fine." + to_chat(user, "\blue The device's software appears to be fine.") + return 1 else if(istype(O, /obj/machinery)) var/obj/machinery/A = O if(A.emagged) - user << "\red There is a software error with the device." + to_chat(user, "\red There is a software error with the device.") + else - user << "\blue The device's software appears to be fine." + to_chat(user, "\blue The device's software appears to be fine.") + return 1 \ No newline at end of file diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index f40b057d46f..9012d6b7d54 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -27,14 +27,17 @@ /obj/item/device/flash/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/weapon/screwdriver)) if(battery_panel) - user << "You close the battery compartment on the [src]." + to_chat(user, "You close the battery compartment on the [src].") + battery_panel = 0 else - user << "You open the battery compartment on the [src]." + to_chat(user, "You open the battery compartment on the [src].") + battery_panel = 1 if(battery_panel && !overcharged) if(istype(W, /obj/item/weapon/stock_parts/cell)) - user << "You jam the cell into battery compartment on the [src]." + to_chat(user, "You jam the cell into battery compartment on the [src].") + qdel(W) overcharged = 1 overlays += "overcharge" @@ -85,15 +88,19 @@ terrible_conversion_proc(M, user) M.Stun(1) visible_message("[user] blinds [M] with the flash!") - user << "You blind [M] with the flash!" - M << "[user] blinds you with the flash!" + to_chat(user, "You blind [M] with the flash!") + + to_chat(M, "[user] blinds you with the flash!") + if(M.weakeyes) M.Stun(2) M.visible_message("[M] gasps and shields their eyes!", "You gasp and shields your eyes!") else visible_message("[user] fails to blind [M] with the flash!") - user << "You fail to blind [M] with the flash!" - M << "[user] fails to blind you with the flash!" + to_chat(user, "You fail to blind [M] with the flash!") + + to_chat(M, "[user] fails to blind you with the flash!") + else if(M.flash_eyes()) M.confused += power @@ -160,11 +167,14 @@ resisted = 1 if(resisted) - user << "This mind seems resistant to the [src.name]!" + to_chat(user, "This mind seems resistant to the [src.name]!") + else - user << "They must be conscious before you can convert them!" + to_chat(user, "They must be conscious before you can convert them!") + else - user << "This mind is so vacant that it is not susceptible to influence!" + to_chat(user, "This mind is so vacant that it is not susceptible to influence!") + /obj/item/device/flash/cyborg diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index caa673882a1..2d19d03113d 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -31,7 +31,9 @@ /obj/item/device/flashlight/attack_self(mob/user) if(!isturf(user.loc)) - user << "You cannot turn the light on while in this [user.loc]." //To prevent some lighting anomalities. + to_chat(user, "You cannot turn the light on while in this [user.loc].")//To prevent some lighting anomalities. + + return 0 on = !on update_brightness(user) @@ -46,12 +48,14 @@ return ..() //just hit them in the head if(!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") //don't have dexterity - user << "You don't have the dexterity to do this!" + to_chat(user, "You don't have the dexterity to do this!") + return var/mob/living/carbon/human/H = M //mob has protective eyewear if(istype(M, /mob/living/carbon/human) && ((H.head && H.head.flags & HEADCOVERSEYES) || (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || (H.glasses && H.glasses.flags & GLASSESCOVERSEYES))) - user << "You're going to need to remove that [(H.head && H.head.flags & HEADCOVERSEYES) ? "helmet" : (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) ? "mask": "glasses"] first." + to_chat(user, "You're going to need to remove that [(H.head && H.head.flags & HEADCOVERSEYES) ? "helmet" : (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) ? "mask": "glasses"] first.") + return if(M == user) //they're using it on themselves @@ -68,12 +72,15 @@ if(istype(M, /mob/living/carbon/human)) //robots and aliens are unaffected if(M.stat == DEAD || M.sdisabilities & BLIND) //mob is dead or fully blind - user << "[M] pupils does not react to the light!" + to_chat(user, "[M] pupils does not react to the light!") + else if(XRAY in M.mutations) //mob has X-RAY vision - user << "[M] pupils give an eerie glow!" + to_chat(user, "[M] pupils give an eerie glow!") + else //they're okay! if(M.flash_eyes(visual = 1)) - user << "[M]'s pupils narrow." + to_chat(user, "[M]'s pupils narrow.") + else return ..() @@ -192,7 +199,8 @@ obj/item/device/flashlight/lamp/bananalamp // Usual checks if(!fuel) - user << "It's out of fuel." + to_chat(user, "It's out of fuel.") + return if(on) return @@ -273,8 +281,10 @@ obj/item/device/flashlight/lamp/bananalamp if(ismob(A)) var/mob/M = A add_logs(M, user, "attacked", object="EMP-light") - user << "\The [src] now has [emp_cur_charges] charge\s." + to_chat(user, "\The [src] now has [emp_cur_charges] charge\s.") + A.emp_act(1) else - user << "\The [src] needs time to recharge!" + to_chat(user, "\The [src] needs time to recharge!") + return \ No newline at end of file diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index d03d2b98887..a2e4822f915 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -50,13 +50,16 @@ user.drop_item() W.loc = src diode = W - user << "You install a [diode.name] in [src]." + to_chat(user, "You install a [diode.name] in [src].") + else - user << "[src] already has a cell." + to_chat(user, "[src] already has a cell.") + else if(istype(W, /obj/item/weapon/screwdriver)) if(diode) - user << "You remove the [diode.name] from the [src]." + to_chat(user, "You remove the [diode.name] from the [src].") + diode.loc = get_turf(src.loc) diode = null return @@ -72,17 +75,20 @@ if( !(user in (viewers(7,target))) ) return if (!diode) - user << "You point [src] at [target], but nothing happens!" + to_chat(user, "You point [src] at [target], but nothing happens!") + return if (!user.IsAdvancedToolUser()) - user << "You don't have the dexterity to do this!" + to_chat(user, "You don't have the dexterity to do this!") + return add_fingerprint(user) //nothing happens if the battery is drained if(recharge_locked) - user << "You point [src] at [target], but it's still charging." + to_chat(user, "You point [src] at [target], but it's still charging.") + return var/outmsg @@ -115,7 +121,8 @@ if(prob(effectchance * diode.rating)) S.flash_eyes(affect_silicon = 1) S.Weaken(rand(5,10)) - S << "Your sensors were overloaded by a laser!" + to_chat(S, "Your sensors were overloaded by a laser!") + outmsg = "You overload [S] by shining [src] at their sensors." S.attack_log += text("\[[time_stamp()]\] Has had a laser pointer shone in their eyes by [user.name] ([user.ckey])") @@ -154,9 +161,11 @@ I.pixel_y = target.pixel_y + rand(-5,5) if(outmsg) - user << outmsg + to_chat(user, outmsg) + else - user << "You point [src] at [target]." + to_chat(user, "You point [src] at [target].") + energy -= 1 if(energy <= max_energy) @@ -164,7 +173,8 @@ recharging = 1 processing_objects.Add(src) if(energy <= 0) - user << "You've overused the battery of [src], now it needs time to recharge!" + to_chat(user, "You've overused the battery of [src], now it needs time to recharge!") + recharge_locked = 1 flick_overlay(I, showto, 10) diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index c87f4c7ff24..a22b11a7030 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -68,7 +68,8 @@ /obj/item/device/lightreplacer/examine(mob/user) if(..(user, 2)) - user << "It has [uses] lights remaining." + to_chat(user, "It has [uses] lights remaining.") + /obj/item/device/lightreplacer/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/stack/sheet/glass)) @@ -76,14 +77,16 @@ if(G.amount - decrement >= 0 && uses < max_uses) var/remaining = max(G.amount - decrement, 0) if(!remaining && !(G.amount - decrement) == 0) - user << "There isn't enough glass." + to_chat(user, "There isn't enough glass.") + return G.amount = remaining if(!G.amount) user.drop_item() qdel(G) AddUses(increment) - user << "You insert a piece of glass into the [src.name]. You have [uses] lights remaining." + to_chat(user, "You insert a piece of glass into the [src.name]. You have [uses] lights remaining.") + return if(istype(W, /obj/item/weapon/light)) @@ -91,12 +94,14 @@ if(L.status == 0) // LIGHT OKAY if(uses < max_uses) AddUses(1) - user << "You insert the [L.name] into the [src.name]. You have [uses] lights remaining." + to_chat(user, "You insert the [L.name] into the [src.name]. You have [uses] lights remaining.") + user.drop_item() qdel(L) return else - user << "You need a working light." + to_chat(user, "You need a working light.") + return /obj/item/device/lightreplacer/emag_act(user as mob) @@ -109,10 +114,12 @@ var/mob/living/silicon/robot/R = user if(R.emagged) src.Emag() - usr << "You shortcircuit the [src]." + to_chat(usr, "You shortcircuit the [src].") + return */ - usr << "It has [uses] lights remaining." + to_chat(usr, "It has [uses] lights remaining.") + /obj/item/device/lightreplacer/update_icon() icon_state = "lightreplacer[emagged]" @@ -139,7 +146,8 @@ if(target.status != LIGHT_OK) if(CanUse(U)) if(!Use(U)) return - U << "You replace the [target.fitting] with the [src]." + to_chat(U, "You replace the [target.fitting] with the [src].") + if(target.status != LIGHT_EMPTY) @@ -173,10 +181,12 @@ return else - U << failmsg + to_chat(U, failmsg) + return else - U << "There is a working [target.fitting] already inserted." + to_chat(U, "There is a working [target.fitting] already inserted.") + return /obj/item/device/lightreplacer/proc/Emag() diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm index 9e39f99b119..532a620e17d 100644 --- a/code/game/objects/items/devices/megaphone.dm +++ b/code/game/objects/items/devices/megaphone.dm @@ -14,22 +14,27 @@ /obj/item/device/megaphone/attack_self(mob/living/user as mob) if (user.client) if(user.client.prefs.muted & MUTE_IC) - src << "\red You cannot speak in IC (muted)." + to_chat(src, "\red You cannot speak in IC (muted).") + return if(!ishuman(user)) - user << "\red You don't know how to use this!" + to_chat(user, "\red You don't know how to use this!") + return if(user.silent) - user << "You find yourself unable to speak at all." + to_chat(user, "You find yourself unable to speak at all.") + return if(ishuman(user)) var/mob/living/carbon/human/H = user if(H && H.mind) if(H.mind.miming) - user << "Your vow of silence prevents you from speaking." + to_chat(user, "Your vow of silence prevents you from speaking.") + return if(spamcheck) - user << "\red \The [src] needs to recharge!" + to_chat(user, "\red \The [src] needs to recharge!") + return var/message = input(user, "Shout a message:", "Megaphone") as text|null @@ -45,7 +50,8 @@ saymsg(user, pick(insultmsg)) insults-- else - user << "\red *BZZZZzzzzzt*" + to_chat(user, "\red *BZZZZzzzzzt*") + else saymsg(user, message) @@ -61,6 +67,7 @@ /obj/item/device/megaphone/emag_act(user as mob) if(!emagged) - user << "\red You overload \the [src]'s voice synthesizer." + to_chat(user, "\red You overload \the [src]'s voice synthesizer.") + emagged = 1 insults = rand(1, 3)//to prevent dickflooding diff --git a/code/game/objects/items/devices/modkit.dm b/code/game/objects/items/devices/modkit.dm index e32bdf764cd..decb6a04243 100644 --- a/code/game/objects/items/devices/modkit.dm +++ b/code/game/objects/items/devices/modkit.dm @@ -22,7 +22,8 @@ return //it shouldn't be null, okay? if(!parts) - user << "This kit has no parts for this modification left." + to_chat(user, "This kit has no parts for this modification left.") + user.unEquip(src) qdel(src) return @@ -34,17 +35,20 @@ var/obj/item/clothing/I = O if (!istype(I) || !allowed) - user << "[src] is unable to modify that." + to_chat(user, "[src] is unable to modify that.") + return var/excluding = ("exclude" in I.species_restricted) var/in_list = (target_species in I.species_restricted) if (excluding ^ in_list) - user << "[I] is already modified." + to_chat(user, "[I] is already modified.") + return if(!isturf(O.loc)) - user << "[O] must be safely placed on the ground for modification." + to_chat(user, "[O] must be safely placed on the ground for modification.") + return playsound(user.loc, 'sound/items/Screwdriver.ogg', 100, 1) @@ -64,7 +68,8 @@ /obj/item/device/modkit/examine(mob/user) ..(user) - user << "It looks as though it modifies hardsuits to fit [target_species] users." + to_chat(user, "It looks as though it modifies hardsuits to fit [target_species] users.") + /obj/item/device/modkit/tajaran name = "Tajaran hardsuit modification kit" diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index 8f916059010..de8730df8c9 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -243,17 +243,20 @@ return var/mob/M = usr if(!istype(M, /mob/living/carbon)) - usr << "You don't have any DNA, or your DNA is incompatible with this device." + to_chat(usr, "You don't have any DNA, or your DNA is incompatible with this device.") + else var/datum/dna/dna = usr.dna pai.master = M.real_name pai.master_dna = dna.unique_enzymes - pai << "

      You have been bound to a new master.

      " + to_chat(pai, "

      You have been bound to a new master.

      ") + if(href_list["request"]) var/delta = (world.time / 10) - last_request if(request_cooldown > delta) var/cooldown_time = round(request_cooldown - ((world.time / 10) - last_request), 1) - usr << "\red The request system is currently offline. Please wait another [cooldown_time] seconds." + to_chat(usr, "\red The request system is currently offline. Please wait another [cooldown_time] seconds.") + return last_request = world.time / 10 src.looking_for_personality = 1 @@ -262,10 +265,14 @@ var/confirm = input("Are you CERTAIN you wish to delete the current personality? This action cannot be undone.", "Personality Wipe") in list("Yes", "No") if(confirm == "Yes") for(var/mob/M in src) - M << "

      You feel yourself slipping away from reality.

      " - M << "

      Byte by byte you lose your sense of self.

      " - M << "

      Your mental faculties leave you.

      " - M << "
      oblivion...
      " + to_chat(M, "

      You feel yourself slipping away from reality.

      ") + + to_chat(M, "

      Byte by byte you lose your sense of self.

      ") + + to_chat(M, "

      Your mental faculties leave you.

      ") + + to_chat(M, "
      oblivion...
      ") + var/mob/living/silicon/pai/P = M if(istype(P)) if(P.resting || P.canmove) @@ -283,9 +290,12 @@ var/newlaws = sanitize(copytext(input("Enter any additional directives you would like your pAI personality to follow. Note that these directives will not override the personality's allegiance to its imprinted master. Conflicting directives will be ignored.", "pAI Directive Configuration", pai.pai_laws) as message,1,MAX_MESSAGE_LEN)) if(newlaws) pai.pai_laws = newlaws - pai << "Your supplemental directives have been updated. Your new directives are:" - pai << "Prime Directive:
      [pai.pai_law0]" - pai << "Supplemental Directives:
      [pai.pai_laws]" + to_chat(pai, "Your supplemental directives have been updated. Your new directives are:") + + to_chat(pai, "Prime Directive:
      [pai.pai_law0]") + + to_chat(pai, "Supplemental Directives:
      [pai.pai_laws]") + attack_self(usr) // WIRE_SIGNAL = 1 diff --git a/code/game/objects/items/devices/pipe_painter.dm b/code/game/objects/items/devices/pipe_painter.dm index 47e88049b65..efa5fb962a5 100644 --- a/code/game/objects/items/devices/pipe_painter.dm +++ b/code/game/objects/items/devices/pipe_painter.dm @@ -20,7 +20,8 @@ var/turf/T = P.loc if (P.level < 2 && T.level==1 && isturf(T) && T.intact) - user << "You must remove the plating first." + to_chat(user, "You must remove the plating first.") + return P.change_color(pipe_colors[mode]) @@ -30,4 +31,5 @@ /obj/item/device/pipe_painter/examine(mob/user) ..(user) - user << "It is in [mode] mode." \ No newline at end of file + to_chat(user, "It is in [mode] mode.") + diff --git a/code/game/objects/items/devices/pizza_bomb.dm b/code/game/objects/items/devices/pizza_bomb.dm index ae2a698cb35..02bb1fde61d 100644 --- a/code/game/objects/items/devices/pizza_bomb.dm +++ b/code/game/objects/items/devices/pizza_bomb.dm @@ -13,7 +13,8 @@ /obj/item/device/pizza_bomb/attack_self(mob/user) if(disarmed) - user << "\The [src] is disarmed." + to_chat(user, "\The [src] is disarmed.") + return if(!timer_set) name = "pizza bomb" @@ -29,7 +30,8 @@ return timer = Clamp(timer, 10, 100) icon_state = "pizzabox1" - user << "You set the timer to [timer / 10] before activating the payload and closing \the [src]." + to_chat(user, "You set the timer to [timer / 10] before activating the payload and closing \the [src].") + message_admins("[key_name_admin(usr)] has set a timer on a pizza bomb to [timer/10] seconds at (JMP).") log_game("[key_name(usr)] has set the timer on a pizza bomb to [timer/10] seconds ([loc.x],[loc.y],[loc.z]).") armer = usr @@ -41,7 +43,8 @@ desc = "OH GOD THAT'S NOT A PIZZA" icon_state = "pizzabox_bomb" audible_message("\icon[src] *beep* *beep*") - user << "That's no pizza! That's a bomb!" + to_chat(user, "That's no pizza! That's a bomb!") + message_admins("[key_name_admin(usr)] has triggered a pizza bomb armed by [armer] at (JMP).") log_game("[key_name(usr)] has triggered a pizza bomb armed by [armer] ([loc.x],[loc.y],[loc.z]).") primed = 1 @@ -59,7 +62,8 @@ /obj/item/device/pizza_bomb/attackby(var/obj/item/I, var/mob/user, params) if(istype(I, /obj/item/weapon/wirecutters) && primed) - user << "Oh God, what wire do you cut?!" + to_chat(user, "Oh God, what wire do you cut?!") + var/chosen_wire = input(user, "OH GOD OH GOD", "WHAT WIRE?!") in wires if(!in_range(src, usr) || issilicon(usr) || !usr.canmove || usr.restrained()) return @@ -68,7 +72,8 @@ sleep(5) if(chosen_wire == correct_wire) src.audible_message("\icon[src] \The [src] suddenly stops beeping and seems lifeless.") - user << "You did it!" + to_chat(user, "You did it!") + icon_state = "pizzabox_bomb_[correct_wire]" name = "pizza bomb" desc = "A devious contraption, made of a small explosive payload hooked up to pressure-sensitive wires. It's disarmed." @@ -76,12 +81,14 @@ primed = 0 return else - user << "WRONG WIRE!" + to_chat(user, "WRONG WIRE!") + go_boom() return if(istype(I, /obj/item/weapon/wirecutters) && disarmed) if(!in_range(user, src)) - user << "You can't see the box well enough to cut the wires out." + to_chat(user, "You can't see the box well enough to cut the wires out.") + return user.visible_message("[user] starts removing the payload and wires from \the [src].") if(do_after(user, 40, target = src)) diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index c9b6a6d7563..e33fe869f42 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -36,7 +36,8 @@ if(isturf(T) && !T.intact) attached = locate() in T if(!attached) - user << "No exposed cable here to attach to." + to_chat(user, "No exposed cable here to attach to.") + return else anchored = 1 @@ -46,7 +47,8 @@ log_game("Power sink activated by [key_name(user)] at ([x],[y],[z])") return else - user << "Device must be placed over an exposed cable to attach to it." + to_chat(user, "Device must be placed over an exposed cable to attach to it.") + return else if (mode == 2) diff --git a/code/game/objects/items/devices/radio/beacon.dm b/code/game/objects/items/devices/radio/beacon.dm index 36de16c95fa..7b76061b020 100644 --- a/code/game/objects/items/devices/radio/beacon.dm +++ b/code/game/objects/items/devices/radio/beacon.dm @@ -21,7 +21,8 @@ if(!emagged) emagged = 1 syndicate = 1 - user << "\blue The This beacon now only be locked on to by emagged teleporters!" + to_chat(user, "\blue The This beacon now only be locked on to by emagged teleporters!") + /obj/item/device/radio/beacon/hear_talk() return @@ -58,7 +59,8 @@ /obj/item/device/radio/beacon/syndicate/attack_self(mob/user as mob) if(user) - user << "\blue Locked In" + to_chat(user, "\blue Locked In") + new /obj/machinery/power/singularity_beacon/syndicate( user.loc ) playsound(src, 'sound/effects/pop.ogg', 100, 1, 1) qdel(src) @@ -71,7 +73,8 @@ /obj/item/device/radio/beacon/syndicate/bomb/attack_self(mob/user as mob) if(user) - user << "\blue Locked In" + to_chat(user, "\blue Locked In") + new /obj/machinery/syndicatebomb( user.loc ) playsound(src, 'sound/effects/pop.ogg', 100, 1, 1) qdel(src) diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm index 72546f5e15b..cdb4531cefb 100644 --- a/code/game/objects/items/devices/radio/electropack.dm +++ b/code/game/objects/items/devices/radio/electropack.dm @@ -14,7 +14,8 @@ /obj/item/device/radio/electropack/attack_hand(mob/user as mob) if(src == user.back) - user << "You need help taking this off!" + to_chat(user, "You need help taking this off!") + return 0 . = ..() @@ -32,13 +33,15 @@ ..() if(istype(W, /obj/item/clothing/head/helmet)) if(!b_stat) - user << "[src] is not ready to be attached!" + to_chat(user, "[src] is not ready to be attached!") + return var/obj/item/assembly/shock_kit/A = new /obj/item/assembly/shock_kit( user ) A.icon = 'icons/obj/assemblies.dmi' if(!user.unEquip(W)) - user << "\the [W] is stuck to your hand, you cannot attach it to \the [src]!" + to_chat(user, "\the [W] is stuck to your hand, you cannot attach it to \the [src]!") + return W.loc = A W.master = A @@ -86,7 +89,8 @@ sleep(50) if(M) M.moved_recently = 0 - M << "You feel a sharp shock!" + to_chat(M, "You feel a sharp shock!") + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, M) s.start() diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index e1c1994556e..bdc63d461c1 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -42,8 +42,10 @@ if(!(..(user, 1) && radio_desc)) return - user << "The following channels are available:" - user << radio_desc + to_chat(user, "The following channels are available:") + + to_chat(user, radio_desc) + /obj/item/device/radio/headset/handle_message_mode(mob/living/M as mob, message, channel) if (channel == "special") @@ -321,13 +323,16 @@ keyslot2 = null recalculateChannels() - user << "You pop out the encryption keys in the headset!" + to_chat(user, "You pop out the encryption keys in the headset!") + else - user << "This headset doesn't have any encryption keys! How useless..." + to_chat(user, "This headset doesn't have any encryption keys! How useless...") + if(istype(W, /obj/item/device/encryptionkey/)) if(keyslot1 && keyslot2) - user << "The headset can't hold another key!" + to_chat(user, "The headset can't hold another key!") + return if(!keyslot1) diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 987d2475245..a6b09d8d8bc 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -136,7 +136,8 @@ switch(buildstage) if(3) if(iswirecutter(W) && b_stat && wires.IsAllCut()) - user << "You cut out the intercoms wiring and disconnect its electronics." + to_chat(user, "You cut out the intercoms wiring and disconnect its electronics.") + playsound(get_turf(src), 'sound/items/Wirecutter.ogg', 50, 1) if(do_after(user, 10, target = src)) new /obj/item/stack/cable_coil(get_turf(src),5) @@ -155,7 +156,8 @@ on = 1 b_stat = 0 buildstage = 3 - user << "You secure the electronics!" + to_chat(user, "You secure the electronics!") + update_icon() processing_objects.Add(src) for(var/i, i<= 5, i++) @@ -165,19 +167,23 @@ if(iscoil(W)) var/obj/item/stack/cable_coil/coil = W if(coil.amount < 5) - user << "You need more cable for this!" + to_chat(user, "You need more cable for this!") + return if(do_after(user, 10, target = src)) coil.use(5) - user << "You wire \the [src]!" + to_chat(user, "You wire \the [src]!") + buildstage = 2 return 1 if(iscrowbar(W)) - user << "You begin removing the electronics..." + to_chat(user, "You begin removing the electronics...") + playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) if(do_after(user, 10, target = src)) new /obj/item/weapon/intercom_electronics(get_turf(src)) - user << "The circuitboard pops out!" + to_chat(user, "The circuitboard pops out!") + buildstage = 0 return 1 if(0) @@ -185,17 +191,20 @@ playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) if(do_after(user, 10, target = src)) qdel(W) - user << "You insert \the [W] into \the [src]!" + to_chat(user, "You insert \the [W] into \the [src]!") + buildstage = 1 return 1 if(iswelder(W)) var/obj/item/weapon/weldingtool/WT=W playsound(get_turf(src), 'sound/items/Welder.ogg', 50, 1) if(!WT.remove_fuel(3, user)) - user << "You're out of welding fuel." + to_chat(user, "You're out of welding fuel.") + return 1 if(do_after(user, 10, target = src)) - user << "You cut the intercom frame from the wall!" + to_chat(user, "You cut the intercom frame from the wall!") + new /obj/item/mounted/frame/intercom(get_turf(src)) qdel(src) return 1 diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 168f448ba4d..20e0bb8f496 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -238,7 +238,8 @@ var/global/list/default_medbay_channels = list( var/datum/radio_frequency/connection = null if(channel && channels && channels.len > 0) if (channel == "department") - //world << "DEBUG: channel=\"[channel]\" switching to \"[channels[1]]\"" +// to_chat(world, "DEBUG: channel=\"[channel]\" switching to \"[channels[1]]\"") + channel = channels[1] connection = secure_radio_connections[channel] else @@ -637,14 +638,17 @@ var/global/list/default_medbay_channels = list( keyslot = null recalculateChannels() - user << "You pop out the encryption key in the radio!" + to_chat(user, "You pop out the encryption key in the radio!") + else - user << "This radio doesn't have any encryption keys!" + to_chat(user, "This radio doesn't have any encryption keys!") + if(istype(W, /obj/item/device/encryptionkey/)) if(keyslot) - user << "The radio can't hold another key!" + to_chat(user, "The radio can't hold another key!") + return if(!keyslot) @@ -697,9 +701,11 @@ var/global/list/default_medbay_channels = list( if(enable_subspace_transmission != subspace_transmission) subspace_transmission = !subspace_transmission if(subspace_transmission) - usr << "Subspace Transmission is enabled." + to_chat(usr, "Subspace Transmission is enabled.") + else - usr << "Subspace Transmission is disabled." + to_chat(usr, "Subspace Transmission is disabled.") + if(subspace_transmission == 0)//Simple as fuck, clears the channel list to prevent talking/listening over them if subspace transmission is disabled channels = list() @@ -712,10 +718,12 @@ var/global/list/default_medbay_channels = list( shut_up = !shut_up if(shut_up) canhear_range = 0 - usr << "Loudspeaker disabled." + to_chat(usr, "Loudspeaker disabled.") + else canhear_range = 3 - usr << "Loudspeaker enabled." + to_chat(usr, "Loudspeaker enabled.") + . = 1 diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 0a8842921ec..ebd2ebf489c 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -128,7 +128,8 @@ REAGENT SCANNER /obj/item/device/healthanalyzer/attack(mob/living/M as mob, mob/living/user as mob) if (( (CLUMSY in user.mutations) || user.getBrainLoss() >= 60) && prob(50)) - user << text("\red You try to analyze the floor's vitals!") + to_chat(user, text("\red You try to analyze the floor's vitals!")) + for(var/mob/O in viewers(M, null)) O.show_message(text("\red [user] has analyzed the floor's vitals!"), 1) user.show_message(text("\blue Analyzing Results for The floor:\n\t Overall Status: Healthy"), 1) @@ -189,7 +190,8 @@ REAGENT SCANNER chemscan(user, M) for(var/datum/disease/D in M.viruses) if(!(D.visibility_flags & HIDDEN_SCANNER)) - user << "Warning: [D.form] detected\nName: [D.name].\nType: [D.spread_text].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure_text]" + to_chat(user, "Warning: [D.form] detected\nName: [D.name].\nType: [D.spread_text].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure_text]") + if(M.getStaminaLoss()) user.show_message("Subject appears to be suffering from fatigue.") if (M.getCloneLoss()) @@ -257,16 +259,20 @@ REAGENT SCANNER mode = !mode switch (mode) if(1) - usr << "The scanner now shows specific limb damage." + to_chat(usr, "The scanner now shows specific limb damage.") + if(0) - usr << "The scanner no longer shows limb damage." + to_chat(usr, "The scanner no longer shows limb damage.") + /obj/item/device/healthanalyzer/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/device/healthupgrade)) if(upgraded) - user << "You have already installed an upgraded in the [src]." + to_chat(user, "You have already installed an upgraded in the [src].") + else - user << "You install the upgrade in the [src]." + to_chat(user, "You install the upgrade in the [src].") + overlays += "advanced" playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) upgraded = 1 @@ -384,17 +390,20 @@ REAGENT SCANNER if (user.stat) return if (crit_fail) - user << "This device has critically failed and is no longer functional!" + to_chat(user, "This device has critically failed and is no longer functional!") + return if (!user.IsAdvancedToolUser()) - user << "You don't have the dexterity to do this!" + to_chat(user, "You don't have the dexterity to do this!") + return if(reagents.total_volume) var/list/blood_traces = list() for(var/datum/reagent/R in reagents.reagent_list) if(R.id != "blood") reagents.clear_reagents() - user << "The sample was contaminated! Please insert another sample." + to_chat(user, "The sample was contaminated! Please insert another sample.") + return else blood_traces = params2list(R.data["trace_chem"]) @@ -414,7 +423,8 @@ REAGENT SCANNER return else recent_fail = 1 - user << "[dat]" + to_chat(user, "[dat]") + reagents.clear_reagents() return @@ -444,12 +454,14 @@ REAGENT SCANNER if (user.stat) return if (!user.IsAdvancedToolUser()) - user << "You don't have the dexterity to do this!" + to_chat(user, "You don't have the dexterity to do this!") + return if(!istype(O)) return if (crit_fail) - user << "This device has critically failed and is no longer functional!" + to_chat(user, "This device has critically failed and is no longer functional!") + return if(!isnull(O.reagents)) @@ -467,11 +479,14 @@ REAGENT SCANNER else recent_fail = 1 if(dat) - user << "Chemicals found: [dat]" + to_chat(user, "Chemicals found: [dat]") + else - user << "No active chemical agents found in [O]." + to_chat(user, "No active chemical agents found in [O].") + else - user << "No significant chemical agents found in [O]." + to_chat(user, "No significant chemical agents found in [O].") + return diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 7b56b34090a..7201d15fed6 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -22,7 +22,8 @@ /obj/item/device/taperecorder/examine(mob/user) if(..(user, 1)) - user << "The wire panel is [open_panel ? "opened" : "closed"]." + to_chat(user, "The wire panel is [open_panel ? "opened" : "closed"].") + /obj/item/device/taperecorder/attackby(obj/item/I, mob/user) @@ -30,12 +31,14 @@ user.drop_item() I.loc = src mytape = I - user << "You insert [I] into [src]." + to_chat(user, "You insert [I] into [src].") + update_icon() /obj/item/device/taperecorder/proc/eject(mob/user) if(mytape) - user << "You remove [mytape] from [src]." + to_chat(user, "You remove [mytape] from [src].") + stop() user.put_in_hands(mytape) mytape = null @@ -113,7 +116,8 @@ return if(mytape.used_capacity < mytape.max_capacity) - usr << "Recording started." + to_chat(usr, "Recording started.") + recording = 1 update_icon() mytape.timestamp += mytape.used_capacity @@ -129,7 +133,8 @@ recording = 0 update_icon() else - usr << "The tape is full." + to_chat(usr, "The tape is full.") + /obj/item/device/taperecorder/verb/stop() @@ -143,7 +148,8 @@ recording = 0 mytape.timestamp += mytape.used_capacity mytape.storedinfo += "\[[time2text(mytape.used_capacity * 10,"mm:ss")]\] Recording stopped." - usr << "Recording stopped." + to_chat(usr, "Recording stopped.") + return else if(playing) playing = 0 @@ -167,7 +173,8 @@ playing = 1 update_icon() - usr << "Playing started." + to_chat(usr, "Playing started.") + var/used = mytape.used_capacity //to stop runtimes when you eject the tape var/max = mytape.max_capacity for(var/i = 1, used < max, sleep(10 * playsleepseconds)) @@ -215,12 +222,14 @@ if(!mytape) return if(!canprint) - usr << "The recorder can't print that fast!" + to_chat(usr, "The recorder can't print that fast!") + return if(recording || playing) return - usr << "Transcript printed." + to_chat(usr, "Transcript printed.") + playsound(loc, "sound/goonstation/machines/printer_thermal.ogg", 50, 1) var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(get_turf(src)) var/t1 = "Transcript:

      " @@ -257,7 +266,8 @@ /obj/item/device/tape/attack_self(mob/user) if(!ruined) - user << "You pull out all the tape!" + to_chat(user, "You pull out all the tape!") + ruin() @@ -273,9 +283,11 @@ /obj/item/device/tape/attackby(obj/item/I, mob/user) if(ruined && istype(I, /obj/item/weapon/screwdriver)) - user << "You start winding the tape back in." + to_chat(user, "You start winding the tape back in.") + if(do_after(user, 120, target = src)) - user << "You wound the tape back in!" + to_chat(user, "You wound the tape back in!") + fix() diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index 2b613ca2d5f..3e030548851 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -33,7 +33,8 @@ effective or pretty fucking useless. /obj/item/device/batterer/attack_self(mob/living/carbon/user as mob, flag = 0, emp = 0) if(!user) return if(times_used >= max_uses) - user << "\red The mind batterer has been burnt out!" + to_chat(user, "\red The mind batterer has been burnt out!") + return user.attack_log += text("\[[time_stamp()]\] Used [src] to knock down people in the area.") @@ -45,16 +46,19 @@ effective or pretty fucking useless. M.Weaken(rand(10,20)) if(prob(25)) M.Stun(rand(5,10)) - M << "\red You feel a tremendous, paralyzing wave flood your mind." + to_chat(M, "\red You feel a tremendous, paralyzing wave flood your mind.") + if(!iscarbon(user)) M.LAssailant = null else M.LAssailant = user else - M << "\red You feel a sudden, electric jolt travel through your head." + to_chat(M, "\red You feel a sudden, electric jolt travel through your head.") + playsound(src.loc, 'sound/misc/interference.ogg', 50, 1) - user << "\blue You trigger [src]." + to_chat(user, "\blue You trigger [src].") + times_used += 1 if(times_used >= max_uses) icon_state = "battererburnt" @@ -103,7 +107,8 @@ effective or pretty fucking useless. M.apply_effect(round(intensity/1.5), PARALYZE) M.apply_effect(intensity*10, IRRADIATE) else - user << "The radioactive microlaser is still recharging." + to_chat(user, "The radioactive microlaser is still recharging.") + /obj/item/device/rad_laser/proc/handle_cooldown(cooldown) spawn(cooldown) diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 2b256298835..fdeedd2c6a9 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -18,19 +18,22 @@ /obj/item/device/transfer_valve/attackby(obj/item/item, mob/user, params) if(istype(item, /obj/item/weapon/tank)) if(tank_one && tank_two) - user << "There are already two tanks attached, remove one first." + to_chat(user, "There are already two tanks attached, remove one first.") + return if(!tank_one) tank_one = item user.drop_item() item.loc = src - user << "You attach the tank to the transfer valve." + to_chat(user, "You attach the tank to the transfer valve.") + else if(!tank_two) tank_two = item user.drop_item() item.loc = src - user << "You attach the tank to the transfer valve." + to_chat(user, "You attach the tank to the transfer valve.") + update_icon() nanomanager.update_uis(src) // update all UIs attached to src @@ -38,15 +41,18 @@ else if(isassembly(item)) var/obj/item/device/assembly/A = item if(A.secured) - user << "The device is secured." + to_chat(user, "The device is secured.") + return if(attached_device) - user << "There is already a device attached to the valve, remove it first." + to_chat(user, "There is already a device attached to the valve, remove it first.") + return user.remove_from_mob(item) attached_device = A A.loc = src - user << "You attach the [item] to the valve controls and secure it." + to_chat(user, "You attach the [item] to the valve controls and secure it.") + A.holder = src A.toggle_secure() //this calls update_icon(), which calls update_icon() on the holder (i.e. the bomb). diff --git a/code/game/objects/items/devices/uplinks.dm b/code/game/objects/items/devices/uplinks.dm index 47efe52d21f..a217f548479 100644 --- a/code/game/objects/items/devices/uplinks.dm +++ b/code/game/objects/items/devices/uplinks.dm @@ -291,9 +291,11 @@ var/list/world_uplinks = list() if(!S.used && !S.checking) hidden_uplink.uses += S.TC_cost qdel(S) - user << "Teleporter refunded." + to_chat(user, "Teleporter refunded.") + else - user << "This teleporter is already used, or is currently being used." + to_chat(user, "This teleporter is already used, or is currently being used.") + // PRESET UPLINKS // A collection of preset uplinks. diff --git a/code/game/objects/items/devices/whistle.dm b/code/game/objects/items/devices/whistle.dm index bfe90bf709d..d2c20c7c87d 100644 --- a/code/game/objects/items/devices/whistle.dm +++ b/code/game/objects/items/devices/whistle.dm @@ -26,6 +26,7 @@ /obj/item/device/hailer/emag_act(user as mob) if(!emagged) - user << "\red You overload \the [src]'s voice synthesizer." + to_chat(user, "\red You overload \the [src]'s voice synthesizer.") + emagged = 1 diff --git a/code/game/objects/items/mountable_frames/apc_frame.dm b/code/game/objects/items/mountable_frames/apc_frame.dm index 5e092638707..72ec29c7422 100644 --- a/code/game/objects/items/mountable_frames/apc_frame.dm +++ b/code/game/objects/items/mountable_frames/apc_frame.dm @@ -10,16 +10,19 @@ var/turf/turf_loc = get_turf(user) var/area/area_loc = turf_loc.loc if (area_loc.get_apc()) - user << "This area already has an APC." + to_chat(user, "This area already has an APC.") + return //only one APC per area for(var/obj/machinery/power/terminal/T in turf_loc) if (T.master) - user << "There is another network terminal here." + to_chat(user, "There is another network terminal here.") + return else var/obj/item/stack/cable_coil/C = new /obj/item/stack/cable_coil(turf_loc) C.amount = 10 - user << "You cut the cables and disassemble the unused power terminal." + to_chat(user, "You cut the cables and disassemble the unused power terminal.") + qdel(T) return 1 return diff --git a/code/game/objects/items/mountable_frames/frames.dm b/code/game/objects/items/mountable_frames/frames.dm index 90560e03bcd..810174d2a3f 100644 --- a/code/game/objects/items/mountable_frames/frames.dm +++ b/code/game/objects/items/mountable_frames/frames.dm @@ -17,11 +17,13 @@ var/turf/turf_loc = get_turf(user) if (src.mount_reqs.Find("simfloor") && !istype(turf_loc, /turf/simulated/floor)) - user << "[src] cannot be placed on this spot." + to_chat(user, "[src] cannot be placed on this spot.") + return if (src.mount_reqs.Find("nospace")) var/area/my_area = turf_loc.loc if(!istype(my_area) || (my_area.requires_power == 0 || istype(my_area,/area/space))) - user << "[src] cannot be placed in this area." + to_chat(user, "[src] cannot be placed in this area.") + return return 1 diff --git a/code/game/objects/items/mountable_frames/lights.dm b/code/game/objects/items/mountable_frames/lights.dm index c1710d842a4..50f81cfe74c 100644 --- a/code/game/objects/items/mountable_frames/lights.dm +++ b/code/game/objects/items/mountable_frames/lights.dm @@ -7,7 +7,8 @@ mount_reqs = list("simfloor") /obj/item/mounted/frame/light_fixture/do_build(turf/on_wall, mob/user) - user << "You begin attaching [src] to \the [on_wall]." + to_chat(user, "You begin attaching [src] to \the [on_wall].") + playsound(get_turf(src), 'sound/machines/click.ogg', 75, 1) var/constrdir = user.dir var/constrloc = get_turf(user) diff --git a/code/game/objects/items/mountable_frames/mountables.dm b/code/game/objects/items/mountable_frames/mountables.dm index e280b8e0cc3..e0df3a03e2f 100644 --- a/code/game/objects/items/mountable_frames/mountables.dm +++ b/code/game/objects/items/mountable_frames/mountables.dm @@ -21,11 +21,13 @@ if (proximity_flag != 1) //if we aren't next to the wall return if (!( get_dir(on_wall,user) in cardinal)) - user << "You need to be standing next to a wall to place \the [src]." + to_chat(user, "You need to be standing next to a wall to place \the [src].") + return if(gotwallitem(get_turf(user), get_dir(on_wall,user))) - user << "There's already an item on this wall!" + to_chat(user, "There's already an item on this wall!") + return return 1 diff --git a/code/game/objects/items/mountable_frames/newscaster_frame.dm b/code/game/objects/items/mountable_frames/newscaster_frame.dm index dade4dcb61b..c80bd74061e 100644 --- a/code/game/objects/items/mountable_frames/newscaster_frame.dm +++ b/code/game/objects/items/mountable_frames/newscaster_frame.dm @@ -11,14 +11,17 @@ var/turf/loc = get_turf(usr) var/area/A = loc.loc if (!istype(loc, /turf/simulated/floor)) - usr << "Newscaster cannot be placed on this spot." + to_chat(usr, "Newscaster cannot be placed on this spot.") + return if (A.requires_power == 0 || A.name == "Space") - usr << "Newscaster cannot be placed in this area." + to_chat(usr, "Newscaster cannot be placed in this area.") + return for(var/obj/machinery/newscaster/T in loc) - usr << "There is another newscaster here." + to_chat(usr, "There is another newscaster here.") + return return 1 diff --git a/code/game/objects/items/policetape.dm b/code/game/objects/items/policetape.dm index 488f958e17f..1c3aba92054 100644 --- a/code/game/objects/items/policetape.dm +++ b/code/game/objects/items/policetape.dm @@ -66,13 +66,15 @@ var/list/tape_roll_applications = list() /obj/item/taperoll/attack_self(mob/user as mob) if(icon_state == "[icon_base]_start") start = get_turf(src) - usr << "\blue You place the first end of the [src]." + to_chat(usr, "\blue You place the first end of the [src].") + icon_state = "[icon_base]_stop" else icon_state = "[icon_base]_start" end = get_turf(src) if(start.y != end.y && start.x != end.x || start.z != end.z) - usr << "\blue [src] can only be laid horizontally or vertically." + to_chat(usr, "\blue [src] can only be laid horizontally or vertically.") + return var/turf/cur = start @@ -101,7 +103,8 @@ var/list/tape_roll_applications = list() break cur = get_step_towards(cur,end) if (!can_place) - usr << "\blue You can't run \the [src] through that!" + to_chat(usr, "\blue You can't run \the [src] through that!") + return cur = start @@ -115,7 +118,9 @@ var/list/tape_roll_applications = list() P.icon_state = "[P.icon_base]_[dir]" cur = get_step_towards(cur,end) //is_blocked_turf(var/turf/T) - usr << "\blue You finish placing the [src]." //Git Test + to_chat(usr, "\blue You finish placing the [src].")//Git Test + + /obj/item/taperoll/afterattack(var/atom/A, mob/user as mob, proximity) if (!proximity) @@ -127,7 +132,8 @@ var/list/tape_roll_applications = list() P.loc = locate(T.x,T.y,T.z) P.icon_state = "[src.icon_base]_door" P.layer = 3.2 - user << "\blue You finish placing the [src]." + to_chat(user, "\blue You finish placing the [src].") + if (istype(A, /turf/simulated/floor) ||istype(A, /turf/unsimulated/floor)) var/turf/F = A @@ -177,7 +183,8 @@ var/list/tape_roll_applications = list() /obj/item/tape/proc/breaktape(obj/item/weapon/W as obj, mob/user as mob) if(user.a_intent == I_HELP && ((!can_puncture(W) && src.allowed(user)))) - user << "You can't break the [src] with that!" + to_chat(user, "You can't break the [src] with that!") + return user.show_viewers("\blue [user] breaks the [src]!") diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 44f2081d387..f6687f599f5 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -118,7 +118,8 @@ if(istype(W, /obj/item/stack/sheet/metal) && !l_arm && !r_arm && !l_leg && !r_leg && !chest && !head) var/obj/item/weapon/ed209_assembly/B = new /obj/item/weapon/ed209_assembly B.loc = get_turf(src) - user << "You armed the robot frame" + to_chat(user, "You armed the robot frame") + W:use(1) if (user.get_inactive_hand()==src) user.unEquip(src) @@ -160,9 +161,11 @@ src.chest = W src.updateicon() else if(!W:wires) - user << "\blue You need to attach wires to it first!" + to_chat(user, "\blue You need to attach wires to it first!") + else - user << "\blue You need to attach a cell to it first!" + to_chat(user, "\blue You need to attach a cell to it first!") + if(istype(W, /obj/item/robot_parts/head)) if(src.head) return @@ -172,22 +175,26 @@ src.head = W src.updateicon() else - user << "\blue You need to attach a flash to it first!" + to_chat(user, "\blue You need to attach a flash to it first!") + if (istype(W, /obj/item/device/multitool)) if(check_completion()) Interact(user) else - user << "The endoskeleton must be assembled before debugging can begin!" + to_chat(user, "The endoskeleton must be assembled before debugging can begin!") + if(istype(W, /obj/item/device/mmi)) var/obj/item/device/mmi/M = W if(check_completion()) if(!istype(loc,/turf)) - user << "\red You can't put \the [W] in, the frame has to be standing on the ground to be perfectly precise." + to_chat(user, "\red You can't put \the [W] in, the frame has to be standing on the ground to be perfectly precise.") + return if(!M.brainmob) - user << "\red Sticking an empty [W] into the frame would sort of defeat the purpose." + to_chat(user, "\red Sticking an empty [W] into the frame would sort of defeat the purpose.") + return if(!M.brainmob.key) @@ -202,19 +209,23 @@ ghost_can_reenter = 1 break if(!ghost_can_reenter) - user << "\The [W] is completely unresponsive; there's no point." + to_chat(user, "\The [W] is completely unresponsive; there's no point.") + return if(M.brainmob.stat == DEAD) - user << "\red Sticking a dead [W] into the frame would sort of defeat the purpose." + to_chat(user, "\red Sticking a dead [W] into the frame would sort of defeat the purpose.") + return if(M.brainmob.mind in ticker.mode.head_revolutionaries) - user << "\red The frame's firmware lets out a shrill sound, and flashes 'Abnormal Memory Engram'. It refuses to accept the [W]." + to_chat(user, "\red The frame's firmware lets out a shrill sound, and flashes 'Abnormal Memory Engram'. It refuses to accept the [W].") + return if(jobban_isbanned(M.brainmob, "Cyborg") || jobban_isbanned(M.brainmob,"nonhumandept")) - user << "\red This [W] does not seem to fit." + to_chat(user, "\red This [W] does not seem to fit.") + return var/mob/living/silicon/robot/O = new /mob/living/silicon/robot(get_turf(loc), unfinished = 1) @@ -253,8 +264,10 @@ if(O.mind && O.mind.special_role) O.mind.store_memory("As a cyborg, you must obey your silicon laws and master AI above all else. Your objectives will consider you to be dead.") - O << "You have been robotized!" - O << "You must obey your silicon laws and master AI above all else. Your objectives will consider you to be dead." + to_chat(O, "You have been robotized!") + + to_chat(O, "You must obey your silicon laws and master AI above all else. Your objectives will consider you to be dead.") + O.job = "Cyborg" @@ -278,13 +291,16 @@ if(!locomotion) O.lockcharge = 1 O.update_canmove() - O << "Error: Servo motors unresponsive." + to_chat(O, "Error: Servo motors unresponsive.") + else - user << "The MMI must go in after everything else!" + to_chat(user, "The MMI must go in after everything else!") + if(istype(W,/obj/item/weapon/pen)) - user << "You need to use a multitool to name [src]!" + to_chat(user, "You need to use a multitool to name [src]!") + return /obj/item/robot_parts/robot_suit/proc/Interact(mob/user) @@ -306,7 +322,8 @@ var/mob/living/living_user = usr var/obj/item/item_in_hand = living_user.get_active_hand() if(!istype(item_in_hand, /obj/item/device/multitool)) - living_user << "You need a multitool!" + to_chat(living_user, "You need a multitool!") + return if(href_list["Name"]) @@ -321,7 +338,8 @@ else if(href_list["Master"]) forced_ai = select_active_ai(usr) if(!forced_ai) - usr << "No active AIs detected." + to_chat(usr, "No active AIs detected.") + else if(href_list["Law"]) lawsync = !lawsync @@ -340,45 +358,54 @@ ..() if(istype(W, /obj/item/weapon/stock_parts/cell)) if(src.cell) - user << "\blue You have already inserted a cell!" + to_chat(user, "\blue You have already inserted a cell!") + return else user.drop_item() W.loc = src src.cell = W - user << "\blue You insert the cell!" + to_chat(user, "\blue You insert the cell!") + if(istype(W, /obj/item/stack/cable_coil)) if(src.wires) - user << "\blue You have already inserted wire!" + to_chat(user, "\blue You have already inserted wire!") + return else var/obj/item/stack/cable_coil/coil = W coil.use(1) src.wires = 1.0 - user << "\blue You insert the wire!" + to_chat(user, "\blue You insert the wire!") + return /obj/item/robot_parts/head/attackby(obj/item/W as obj, mob/user as mob, params) ..() if(istype(W, /obj/item/device/flash)) if(istype(user,/mob/living/silicon/robot)) - user << "\red How do you propose to do that?" + to_chat(user, "\red How do you propose to do that?") + return else if(src.flash1 && src.flash2) - user << "\blue You have already inserted the eyes!" + to_chat(user, "\blue You have already inserted the eyes!") + return else if(src.flash1) user.drop_item() W.loc = src src.flash2 = W - user << "\blue You insert the flash into the eye socket!" + to_chat(user, "\blue You insert the flash into the eye socket!") + else user.drop_item() W.loc = src src.flash1 = W - user << "\blue You insert the flash into the eye socket!" + to_chat(user, "\blue You insert the flash into the eye socket!") + else if(istype(W, /obj/item/weapon/stock_parts/manipulator)) - user << "\blue You install some manipulators and modify the head, creating a functional spider-bot!" + to_chat(user, "\blue You install some manipulators and modify the head, creating a functional spider-bot!") + new /mob/living/simple_animal/spiderbot(get_turf(loc)) user.drop_item() qdel(W) @@ -389,9 +416,11 @@ /obj/item/robot_parts/attackby(obj/item/W as obj, mob/user as mob, params) if(istype(W,/obj/item/weapon/card/emag)) if(sabotaged) - user << "\red [src] is already sabotaged!" + to_chat(user, "\red [src] is already sabotaged!") + else - user << "\red You slide [W] into the dataport on [src] and short out the safeties." + to_chat(user, "\red You slide [W] into the dataport on [src] and short out the safeties.") + sabotaged = 1 return ..() diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index a650029b0e1..a86bd3c5e65 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -12,7 +12,8 @@ /obj/item/borg/upgrade/proc/action(var/mob/living/silicon/robot/R) if(R.stat == DEAD) - usr << "\red The [src] will not function on a deceased robot." + to_chat(usr, "\red The [src] will not function on a deceased robot.") + return 1 return 0 @@ -70,7 +71,8 @@ /obj/item/borg/upgrade/restart/action(var/mob/living/silicon/robot/R) if(R.health < 0) - usr << "You have to repair the robot before using this module!" + to_chat(usr, "You have to repair the robot before using this module!") + return 0 if(!R.key) @@ -112,8 +114,10 @@ if(..()) return 0 if(!istype(R.module, /obj/item/weapon/robot_module/security)) - R << "Upgrade mounting error! No suitable hardpoint detected!" - usr << "There's no mounting point for the module!" + to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!") + + to_chat(usr, "There's no mounting point for the module!") + return 0 var/obj/item/weapon/gun/energy/disabler/cyborg/T = locate() in R.module @@ -122,12 +126,15 @@ if(!T) T = locate() in R.module.modules if(!T) - usr << "This robot has had its disabler removed!" + to_chat(usr, "This robot has had its disabler removed!") + return 0 if(T.recharge_time <= 2) - R << "Maximum cooling achieved for this hardpoint!" - usr << "There's no room for another cooling unit!" + to_chat(R, "Maximum cooling achieved for this hardpoint!") + + to_chat(usr, "There's no room for another cooling unit!") + return 0 else @@ -145,8 +152,10 @@ if(..()) return 0 if(!istype(R.module, /obj/item/weapon/robot_module/miner)) - R << "Upgrade mounting error! No suitable hardpoint detected!" - usr << "There's no mounting point for the module!" + to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!") + + to_chat(usr, "There's no mounting point for the module!") + return 0 else R.module.modules += new/obj/item/weapon/tank/jetpack/carbondioxide @@ -166,8 +175,10 @@ if(..()) return 0 if(!istype(R.module, /obj/item/weapon/robot_module/miner)) - R << "Upgrade mounting error! No suitable hardpoint detected!" - usr << "There's no mounting point for the module!" + to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!") + + to_chat(usr, "There's no mounting point for the module!") + return 0 else for(var/obj/item/weapon/pickaxe/drill/cyborg/D in R.module.modules) @@ -190,8 +201,10 @@ if(..()) return 0 if(!istype(R.module, /obj/item/weapon/robot_module/miner)) - R << "Upgrade mounting error! No suitable hardpoint detected!" - usr << "There's no mounting point for the module!" + to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!") + + to_chat(usr, "There's no mounting point for the module!") + return 0 else for(var/obj/item/weapon/storage/bag/ore/cyborg/S in R.module.modules) diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm index 7bc0e7c052c..9f786c14bb0 100644 --- a/code/game/objects/items/shooting_range.dm +++ b/code/game/objects/items/shooting_range.dm @@ -37,7 +37,8 @@ var/obj/item/weapon/weldingtool/WT = W if(WT.remove_fuel(0, user)) overlays.Cut() - usr << "You slice off [src]'s uneven chunks of aluminum and scorch marks." + to_chat(usr, "You slice off [src]'s uneven chunks of aluminum and scorch marks.") + return @@ -59,10 +60,12 @@ if(ishuman(user)) if(!user.get_active_hand()) user.put_in_hands(src) - user << "You take the target out of the stake." + to_chat(user, "You take the target out of the stake.") + else src.loc = get_turf(user) - user << "You take the target out of the stake." + to_chat(user, "You take the target out of the stake.") + stake.pinned_target = null return @@ -96,7 +99,8 @@ if(hp <= 0) for(var/mob/O in oviewers()) if ((O.client && !( O.blinded ))) - O << "\red [src] breaks into tiny pieces and collapses!" + to_chat(O, "\red [src] breaks into tiny pieces and collapses!") + qdel(src) // Create a temporary object to represent the damage diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index e6b56907545..260bcfef617 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -12,11 +12,13 @@ /obj/item/stack/medical/attack(mob/living/carbon/M as mob, mob/user as mob) if (!istype(M)) - user << "\The [src] cannot be applied to [M]!" + to_chat(user, "\The [src] cannot be applied to [M]!") + return 1 if (!user.IsAdvancedToolUser()) - user << "You don't have the dexterity to do this!" + to_chat(user, "You don't have the dexterity to do this!") + return 1 @@ -29,11 +31,13 @@ return 1 if(!affecting) - user << "That limb is missing!" + to_chat(user, "That limb is missing!") + return 1 if(affecting.status & ORGAN_ROBOT) - user << "This can't be used on a robotic limb." + to_chat(user, "This can't be used on a robotic limb.") + return 1 @@ -63,7 +67,8 @@ if(affecting.open == 0) if(!affecting.bandage()) - user << "\red The wounds on [M]'s [affecting.name] have already been bandaged." + to_chat(user, "\red The wounds on [M]'s [affecting.name] have already been bandaged.") + return 1 else for (var/datum/wound/W in affecting.wounds) @@ -104,7 +109,8 @@ if(affecting.open == 0) if(!affecting.salve()) - user << "\red The wounds on [M]'s [affecting.name] have already been salved." + to_chat(user, "\red The wounds on [M]'s [affecting.name] have already been salved.") + return 1 else user.visible_message( "\blue [user] salves the wounds on [M]'s [affecting.name].", \ @@ -112,7 +118,8 @@ affecting.heal_damage(src.heal_brute, src.heal_burn, 0) use(1) else - user << "The [affecting.name] is cut open, you'll need more than some ointment!" + to_chat(user, "The [affecting.name] is cut open, you'll need more than some ointment!") + /obj/item/stack/medical/bruise_pack/comfrey name = "\improper Comfrey leaf" @@ -153,7 +160,8 @@ var/disinfected = affecting.disinfect() if(!(bandaged || disinfected)) - user << "\red The wounds on [M]'s [affecting.name] have already been treated." + to_chat(user, "\red The wounds on [M]'s [affecting.name] have already been treated.") + return 1 else for (var/datum/wound/W in affecting.wounds) @@ -173,7 +181,8 @@ affecting.heal_damage(heal_brute,0) use(1) else - user << "The [affecting.name] is cut open, you'll need more than a bandage!" + to_chat(user, "The [affecting.name] is cut open, you'll need more than a bandage!") + /obj/item/stack/medical/advanced/ointment name = "advanced burn kit" @@ -194,7 +203,8 @@ if(affecting.open == 0) if(!affecting.salve()) - user << "\red The wounds on [M]'s [affecting.name] have already been salved." + to_chat(user, "\red The wounds on [M]'s [affecting.name] have already been salved.") + return 1 else user.visible_message( "\blue [user] covers the wounds on [M]'s [affecting.name] with regenerative membrane.", \ @@ -202,7 +212,8 @@ affecting.heal_damage(0,heal_burn) use(1) else - user << "The [affecting.name] is cut open, you'll need more than a bandage!" + to_chat(user, "The [affecting.name] is cut open, you'll need more than a bandage!") + /obj/item/stack/medical/splint name = "medical splints" @@ -224,19 +235,23 @@ var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting) var/limb = affecting.name if(!(affecting.limb_name in list("l_arm", "r_arm", "l_hand", "r_hand", "l_leg", "r_leg", "l_foot", "r_foot"))) - user << "\red You can't apply a splint there!" + to_chat(user, "\red You can't apply a splint there!") + return if(affecting.status & ORGAN_SPLINTED) - user << "\red [M]'s [limb] is already splinted!" + to_chat(user, "\red [M]'s [limb] is already splinted!") + if(alert(user, "Would you like to remove the splint from [M]'s [limb]?", "Removing.", "Yes", "No") == "Yes") affecting.status &= ~ORGAN_SPLINTED - user << "You remove the splint from [M]'s [limb]." + to_chat(user, "You remove the splint from [M]'s [limb].") + return if (M != user) user.visible_message("\red [user] starts to apply \the [src] to [M]'s [limb].", "\red You start to apply \the [src] to [M]'s [limb].", "\red You hear something being wrapped.") else if((!user.hand && affecting.limb_name in list("r_arm", "r_hand")) || (user.hand && affecting.limb_name in list("l_arm", "l_hand"))) - user << "\red You can't apply a splint to the arm you're using!" + to_chat(user, "\red You can't apply a splint to the arm you're using!") + return user.visible_message("\red [user] starts to apply \the [src] to their [limb].", "\red You start to apply \the [src] to your [limb].", "\red You hear something being wrapped.") if(do_after(user, 50, target = M)) diff --git a/code/game/objects/items/stacks/nanopaste.dm b/code/game/objects/items/stacks/nanopaste.dm index 1db9713c58a..f5314b46f62 100644 --- a/code/game/objects/items/stacks/nanopaste.dm +++ b/code/game/objects/items/stacks/nanopaste.dm @@ -21,7 +21,8 @@ user.visible_message("\The [user] applied some [src] at [R]'s damaged areas.",\ "You apply some [src] at [R]'s damaged areas.") else - user << "All [R]'s systems are nominal." + to_chat(user, "All [R]'s systems are nominal.") + if (istype(M,/mob/living/carbon/human)) //Repairing robolimbs var/mob/living/carbon/human/H = M @@ -35,6 +36,8 @@ user.visible_message("\The [user] applies some nanite paste at[user != M ? " \the [M]'s" : " \the"][S.name] with \the [src].",\ "You apply some nanite paste at [user == M ? "your" : "[M]'s"] [S.name].") else - user << "Nothing to fix here." + to_chat(user, "Nothing to fix here.") + else - user << "[src] won't work on that." + to_chat(user, "[src] won't work on that.") + diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 431e74209d8..0c07222657f 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -35,7 +35,8 @@ var/obj/item/weapon/weldingtool/WT = W if(get_amount() < 2) - user << "You need at least two rods to do this." + to_chat(user, "You need at least two rods to do this.") + return if(WT.remove_fuel(0,user)) @@ -76,15 +77,18 @@ return 1 else if(amount < 2) - user << "\blue You need at least two rods to do this." + to_chat(user, "\blue You need at least two rods to do this.") + return - usr << "\blue Assembling grille..." + to_chat(usr, "\blue Assembling grille...") + if (!do_after(usr, 10, target = src)) return var /obj/structure/grille/F = new /obj/structure/grille/ ( usr.loc ) - usr << "\blue You assemble a grille" + to_chat(usr, "\blue You assemble a grille") + F.add_fingerprint(usr) use(2) return diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 09c8b51ded9..9d84814f0d2 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -34,10 +34,12 @@ if(istype(W,/obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/CC = W if(CC.amount < 5) - user << "\b There is not enough wire in this coil. You need 5 lengths." + to_chat(user, "\b There is not enough wire in this coil. You need 5 lengths.") + return CC.use(5) - user << "You attach wire to the [name]." + to_chat(user, "You attach wire to the [name].") + new /obj/item/stack/light_w(user.loc) src.use(1) else if( istype(W, /obj/item/stack/rods) ) @@ -59,7 +61,8 @@ if(!user || !src) return 0 if(!istype(user.loc,/turf)) return 0 if(!user.IsAdvancedToolUser()) - user << "You don't have the dexterity to do this!" + to_chat(user, "You don't have the dexterity to do this!") + return 0 var/title = "Sheet-Glass" title += " ([src.amount] sheet\s left)" @@ -73,11 +76,13 @@ for (var/obj/structure/window/win in user.loc) i++ if(i >= 4) - user << "There are too many windows in this location." + to_chat(user, "There are too many windows in this location.") + return 1 directions-=win.dir if(win.is_fulltile()) - user << "Can't let you do that." + to_chat(user, "Can't let you do that.") + return 1 //Determine the direction. It will first check in the direction the person making the window is facing, if it finds an already made window it will try looking at the next cardinal direction, etc. @@ -103,10 +108,12 @@ if(!src) return 1 if(src.loc != user) return 1 if(src.amount < 2) - user << "You need more glass to do that." + to_chat(user, "You need more glass to do that.") + return 1 if(locate(/obj/structure/window/full) in user.loc) - user << "There is a full window in the way." + to_chat(user, "There is a full window in the way.") + return 1 var/obj/structure/window/W = new full_window( user.loc, 0 ) W.state = 0 @@ -123,7 +130,8 @@ if(!src) return 1 if(src.loc != user) return 1 if(src.amount < 3) - user << "You need more glass to do that." + to_chat(user, "You need more glass to do that.") + return 1 var/obj/machinery/fishtank/F = new /obj/machinery/fishtank/tank(user.loc, 0) F.air_update_turf(1) @@ -132,7 +140,8 @@ if(!src) return 1 if(src.loc != user) return 1 if(src.amount < 4) - user << "You need more glass to do that." + to_chat(user, "You need more glass to do that.") + return 1 var/obj/machinery/fishtank/F = new /obj/machinery/fishtank/wall(user.loc, 0) F.air_update_turf(1) @@ -163,7 +172,8 @@ if(!user || !src) return 0 if(!istype(user.loc,/turf)) return 0 if(!user.IsAdvancedToolUser()) - user << "You don't have the dexterity to do this!" + to_chat(user, "You don't have the dexterity to do this!") + return 0 var/title = "Sheet Reinf. Glass" title += " ([src.amount] sheet\s left)" @@ -176,11 +186,13 @@ for (var/obj/structure/window/win in user.loc) i++ if(i >= 4) - user << "There are too many windows in this location." + to_chat(user, "There are too many windows in this location.") + return 1 directions-=win.dir if(win.is_fulltile()) - user << "Can't let you do that." + to_chat(user, "Can't let you do that.") + return 1 //Determine the direction. It will first check in the direction the person making the window is facing, if it finds an already made window it will try looking at the next cardinal direction, etc. @@ -206,10 +218,12 @@ if(!src) return 1 if(src.loc != user) return 1 if(src.amount < 2) - user << "You need more glass to do that." + to_chat(user, "You need more glass to do that.") + return 1 if(locate(/obj/structure/window/full) in user.loc) - user << "There is a window in the way." + to_chat(user, "There is a window in the way.") + return 1 var/obj/structure/window/W = new full_window( user.loc, 0 ) W.state = 0 @@ -220,15 +234,18 @@ if(!src || src.loc != user) return 1 if(isturf(user.loc) && locate(/obj/structure/windoor_assembly/, user.loc)) - user << "There is already a windoor assembly in that location." + to_chat(user, "There is already a windoor assembly in that location.") + return 1 if(isturf(user.loc) && locate(/obj/machinery/door/window/, user.loc)) - user << "There is already a windoor in that location." + to_chat(user, "There is already a windoor in that location.") + return 1 if(src.amount < 5) - user << "You need more glass to do that." + to_chat(user, "You need more glass to do that.") + return 1 var/obj/structure/windoor_assembly/WD @@ -291,7 +308,8 @@ if(!user || !src) return 0 if(!istype(user.loc,/turf)) return 0 if(!user.IsAdvancedToolUser()) - user << " You don't have the dexterity to do this!" + to_chat(user, " You don't have the dexterity to do this!") + return 0 var/title = "Plasma-glass alloy" title += " ([src.amount] sheet\s left)" @@ -304,11 +322,13 @@ for (var/obj/structure/window/win in user.loc) i++ if(i >= 4) - user << "There are too many windows in this location." + to_chat(user, "There are too many windows in this location.") + return 1 directions-=win.dir if(!(win.ini_dir in cardinal)) - user << "Can't let you do that." + to_chat(user, "Can't let you do that.") + return 1 //Determine the direction. It will first check in the direction the person making the window is facing, if it finds an already made window it will try looking at the next cardinal direction, etc. var/dir_to_set = 2 @@ -331,10 +351,12 @@ if(!src) return 1 if(src.loc != user) return 1 if(src.amount < 2) - user << "You need more glass to do that." + to_chat(user, "You need more glass to do that.") + return 1 if(locate(/obj/structure/window) in user.loc) - user << "There is a window in the way." + to_chat(user, "There is a window in the way.") + return 1 var/obj/structure/window/W = new full_window( user.loc, 0 ) W.state = 0 @@ -363,7 +385,8 @@ if(!user || !src) return 0 if(!istype(user.loc,/turf)) return 0 if(!user.IsAdvancedToolUser()) - user << "You don't have the dexterity to do this!" + to_chat(user, "You don't have the dexterity to do this!") + return 0 var/title = "Reinforced plasma-glass alloy" title += " ([src.amount] sheet\s left)" @@ -376,11 +399,13 @@ for (var/obj/structure/window/win in user.loc) i++ if(i >= 4) - user << "There are too many windows in this location." + to_chat(user, "There are too many windows in this location.") + return 1 directions-=win.dir if(!(win.ini_dir in cardinal)) - user << "Can't let you do that." + to_chat(user, "Can't let you do that.") + return 1 //Determine the direction. It will first check in the direction the person making the window is facing, if it finds an already made window it will try looking at the next cardinal direction, etc. var/dir_to_set = 2 @@ -403,10 +428,12 @@ if(!src) return 1 if(src.loc != user) return 1 if(src.amount < 2) - user << "You need more glass to do that." + to_chat(user, "You need more glass to do that.") + return 1 if(locate(/obj/structure/window) in user.loc) - user << "There is a window in the way." + to_chat(user, "There is a window in the way.") + return 1 var/obj/structure/window/W = new full_window( user.loc, 0 ) W.state = 0 diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index a7e3a1a6732..7e8d7e174f2 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -114,7 +114,8 @@ var/global/list/datum/stack_recipe/human_recipes = list( \ //visible message on mobs is defined as visible_message(var/message, var/self_message, var/blind_message) usr.visible_message("\blue \the [usr] starts cutting hair off \the [src]", "\blue You start cutting the hair off \the [src]", "You hear the sound of a knife rubbing against flesh") if(do_after(user,50, target = src)) - usr << "\blue You cut the hair from this [src.singular_name]" + to_chat(usr, "\blue You cut the hair from this [src.singular_name]") + //Try locating an exisitng stack on the tile and add to there if possible for(var/obj/item/stack/sheet/hairlesshide/HS in usr.loc) if(HS.amount < 50) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 09c0cf69309..c772ba54489 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -28,7 +28,8 @@ /obj/item/stack/examine(mob/user) if(..(user, 1)) - user << "There are [src.amount] [src.singular_name]\s in the stack." + to_chat(user, "There are [src.amount] [src.singular_name]\s in the stack.") + /obj/item/stack/attack_self(mob/user as mob) @@ -118,18 +119,23 @@ if (!multiplier) multiplier = 1 if (src.amount < R.req_amount*multiplier) if (R.req_amount*multiplier>1) - usr << "\red You haven't got enough [src] to build \the [R.req_amount*multiplier] [R.title]\s!" + to_chat(usr, "\red You haven't got enough [src] to build \the [R.req_amount*multiplier] [R.title]\s!") + else - usr << "\red You haven't got enough [src] to build \the [R.title]!" + to_chat(usr, "\red You haven't got enough [src] to build \the [R.title]!") + return if (R.one_per_turf && (locate(R.result_type) in usr.loc)) - usr << "\red There is another [R.title] here!" + to_chat(usr, "\red There is another [R.title] here!") + return if (R.on_floor && !istype(usr.loc, /turf/simulated)) - usr << "\red \The [R.title] must be constructed on the floor!" + to_chat(usr, "\red \The [R.title] must be constructed on the floor!") + return if (R.time) - usr << "\blue Building [R.title] ..." + to_chat(usr, "\blue Building [R.title] ...") + if (!do_after(usr, R.time, target = src)) return if (src.amount < R.req_amount*multiplier) @@ -183,7 +189,8 @@ if (item.amount>=item.max_amount) continue oldsrc.attackby(item, usr) - usr << "You add new [item.singular_name] to the stack. It now contains [item.amount] [item.singular_name]\s." + to_chat(usr, "You add new [item.singular_name] to the stack. It now contains [item.amount] [item.singular_name]\s.") + if(oldsrc.amount <= 0) break oldsrc.update_icon() diff --git a/code/game/objects/items/stacks/telecrystal.dm b/code/game/objects/items/stacks/telecrystal.dm index 2008eab9490..31c5dd26215 100644 --- a/code/game/objects/items/stacks/telecrystal.dm +++ b/code/game/objects/items/stacks/telecrystal.dm @@ -16,7 +16,8 @@ if(I && I.implanted) I.hidden_uplink.uses +=1 use(1) - user << "You press the [src] onto yourself and charge your hidden uplink." + to_chat(user, "You press the [src] onto yourself and charge your hidden uplink.") + /obj/item/stack/telecrystal/afterattack(var/obj/item/I as obj, mob/user as mob, proximity) if(!proximity) @@ -25,4 +26,5 @@ if(I.hidden_uplink && I.hidden_uplink.active) //No metagaming by using this on every PDA around just to see if it gets used up. I.hidden_uplink.uses +=1 use(1) - user << "You slot the [src] into the [I] and charge its internal uplink." \ No newline at end of file + to_chat(user, "You slot the [src] into the [I] and charge its internal uplink.") + diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index a66b8326f62..015c2abbd3c 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -51,7 +51,8 @@ if(!proximity) return if (istype(A, /obj/structure/reagent_dispensers) && get_dist(src,A) <= 1) A.reagents.trans_to(src, 10) - user << "You fill the balloon with the contents of [A]." + to_chat(user, "You fill the balloon with the contents of [A].") + desc = "A translucent balloon with some form of liquid sloshing around in it." update_icon() return @@ -59,7 +60,8 @@ /obj/item/toy/balloon/wash(mob/user, atom/source) if(reagents.total_volume < 10) reagents.add_reagent("water", min(10-reagents.total_volume, 10)) - user << "You fill the balloon from the [source]." + to_chat(user, "You fill the balloon from the [source].") + desc = "A translucent balloon with some form of liquid sloshing around in it." update_icon() return @@ -68,15 +70,18 @@ if(istype(O, /obj/item/weapon/reagent_containers/glass) || istype(O, /obj/item/weapon/reagent_containers/food/drinks/drinkingglass)) if(O.reagents) if(O.reagents.total_volume < 1) - user << "The [O] is empty." + to_chat(user, "The [O] is empty.") + else if(O.reagents.total_volume >= 1) if(O.reagents.has_reagent("facid", 1)) - user << "The acid chews through the balloon!" + to_chat(user, "The acid chews through the balloon!") + O.reagents.reaction(user) qdel(src) else desc = "A translucent balloon with some form of liquid sloshing around in it." - user << "You fill the balloon with the contents of [O]." + to_chat(user, "You fill the balloon with the contents of [O].") + O.reagents.trans_to(src, 10) update_icon() return @@ -152,7 +157,8 @@ /obj/item/toy/crossbow/examine(mob/user) ..(user) if (bullets) - user << "It is loaded with [bullets] foam darts!" + to_chat(user, "It is loaded with [bullets] foam darts!") + /obj/item/toy/crossbow/attackby(obj/item/I as obj, mob/user as mob, params) if(istype(I, /obj/item/toy/ammo/crossbow)) @@ -160,9 +166,11 @@ user.drop_item() qdel(I) bullets++ - user << "You load the foam dart into the crossbow." + to_chat(user, "You load the foam dart into the crossbow.") + else - usr << "It's already fully loaded." + to_chat(usr, "It's already fully loaded.") + /obj/item/toy/crossbow/afterattack(atom/target as mob|obj|turf|area, mob/user as mob, flag) @@ -264,9 +272,11 @@ user.drop_item() qdel(I) bullets++ - user << "You load the foam dart into the tommy gun." + to_chat(user, "You load the foam dart into the tommy gun.") + else - user << "It's already fully loaded." + to_chat(user, "It's already fully loaded.") + /* * Toy swords @@ -285,13 +295,15 @@ /obj/item/toy/sword/attack_self(mob/user as mob) active = !(active) if (active) - user << "You extend the plastic blade with a quick flick of your wrist." + to_chat(user, "You extend the plastic blade with a quick flick of your wrist.") + playsound(user, 'sound/weapons/saberon.ogg', 50, 1) icon_state = "swordblue" item_state = "swordblue" w_class = 4 else - user << "You push the plastic blade back down into the handle." + to_chat(user, "You push the plastic blade back down into the handle.") + playsound(user, 'sound/weapons/saberoff.ogg', 50, 1) icon_state = "sword0" item_state = "sword0" @@ -309,13 +321,16 @@ ..() if(istype(W, /obj/item/toy/sword)) if(W == src) - user << "You try to attach the end of the plastic sword to... itself. You're not very smart, are you?" + to_chat(user, "You try to attach the end of the plastic sword to... itself. You're not very smart, are you?") + if(ishuman(user)) user.adjustBrainLoss(10) else if((W.flags & NODROP) || (flags & NODROP)) - user << "\the [flags & NODROP ? src : W] is stuck to your hand, you can't attach it to \the [flags & NODROP ? W : src]!" + to_chat(user, "\the [flags & NODROP ? src : W] is stuck to your hand, you can't attach it to \the [flags & NODROP ? W : src]!") + else - user << "You attach the ends of the two plastic swords, making a single double-bladed toy! You're fake-cool." + to_chat(user, "You attach the ends of the two plastic swords, making a single double-bladed toy! You're fake-cool.") + new /obj/item/weapon/twohanded/dualsaber/toy(user.loc) user.unEquip(W) user.unEquip(src) @@ -411,7 +426,8 @@ if((ishuman(H))) //i guess carp and shit shouldn't set them off var/mob/living/carbon/M = H if(M.m_intent == "run") - M << "You step on the snap pop!" + to_chat(M, "You step on the snap pop!") + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(2, 0, src) @@ -434,14 +450,16 @@ //all credit to skasi for toy mech fun ideas /obj/item/toy/prize/attack_self(mob/user as mob) if(cooldown < world.time - 8) - user << "You play with [src]." + to_chat(user, "You play with [src].") + playsound(user, 'sound/mecha/mechstep.ogg', 20, 1) cooldown = world.time /obj/item/toy/prize/attack_hand(mob/user as mob) if(loc == user) if(cooldown < world.time - 8) - user << "You play with [src]." + to_chat(user, "You play with [src].") + playsound(user, 'sound/mecha/mechturn.ogg', 20, 1) cooldown = world.time return @@ -589,7 +607,8 @@ obj/item/toy/cards/deck/attack_hand(mob/user as mob) var/choice = null if(cards.len == 0) icon_state = "deck_[deckstyle]_empty" - user << "There are no more cards to draw." + to_chat(user, "There are no more cards to draw.") + return var/obj/item/toy/cards/singlecard/H = new/obj/item/toy/cards/singlecard(user.loc) choice = cards[1] @@ -620,13 +639,15 @@ obj/item/toy/cards/deck/attackby(obj/item/toy/cards/singlecard/C, mob/living/use if(istype(C)) if(C.parentdeck == src) if(!user.unEquip(C)) - user << "The card is stuck to your hand, you can't add it to the deck!" + to_chat(user, "The card is stuck to your hand, you can't add it to the deck!") + return cards += C.cardname user.visible_message("[user] adds a card to the bottom of the deck.","You add the card to the bottom of the deck.") qdel(C) else - user << "You can't mix cards from other decks." + to_chat(user, "You can't mix cards from other decks.") + if(cards.len > 26) icon_state = "deck_[deckstyle]_full" else if(cards.len > 10) @@ -640,13 +661,15 @@ obj/item/toy/cards/deck/attackby(obj/item/toy/cards/cardhand/C, mob/living/user, if(istype(C)) if(C.parentdeck == src) if(!user.unEquip(C)) - user << "The hand of cards is stuck to your hand, you can't add it to the deck!" + to_chat(user, "The hand of cards is stuck to your hand, you can't add it to the deck!") + return cards += C.currenthand user.visible_message("[user] puts their hand of cards in the deck.", "You put the hand of cards in the deck.") qdel(C) else - user << "You can't mix cards from other decks." + to_chat(user, "You can't mix cards from other decks.") + if(cards.len > 26) icon_state = "deck_[deckstyle]_full" else if(cards.len > 10) @@ -661,7 +684,8 @@ obj/item/toy/cards/deck/MouseDrop(atom/over_object) if(Adjacent(usr)) if(over_object == M && loc != M) M.put_in_hands(src) - usr << "You pick up the deck." + to_chat(usr, "You pick up the deck.") + else if(istype(over_object, /obj/screen)) switch(over_object.name) @@ -673,9 +697,11 @@ obj/item/toy/cards/deck/MouseDrop(atom/over_object) if(!remove_item_from_storage(M)) M.unEquip(src) M.put_in_r_hand(src) - usr << "You pick up the deck." + to_chat(usr, "You pick up the deck.") + else - usr << "You can't reach it from here." + to_chat(usr, "You can't reach it from here.") + @@ -738,7 +764,8 @@ obj/item/toy/cards/cardhand/Topic(href, href_list) cardUser.unEquip(src) N.pickup(cardUser) cardUser.put_in_any_hand_if_possible(N) - cardUser << "You also take [currenthand[1]] and hold it." + to_chat(cardUser, "You also take [currenthand[1]] and hold it.") + cardUser << browse(null, "window=cardhand") qdel(src) return @@ -758,7 +785,8 @@ obj/item/toy/cards/cardhand/attackby(obj/item/toy/cards/singlecard/C, mob/living icon_state = "[deckstyle]_hand3" qdel(C) else - user << "You can't mix cards from other decks." + to_chat(user, "You can't mix cards from other decks.") + obj/item/toy/cards/cardhand/apply_card_vars(obj/item/toy/cards/newobj,obj/item/toy/cards/sourceobj) ..() @@ -790,7 +818,8 @@ obj/item/toy/cards/singlecard/examine(mob/user) if(cardUser.get_item_by_slot(slot_l_hand) == src || cardUser.get_item_by_slot(slot_r_hand) == src) cardUser.visible_message("[cardUser] checks \his card.", "The card reads: [src.cardname]") else - cardUser << "You need to have the card in your hand to check it." + to_chat(cardUser, "You need to have the card in your hand to check it.") + obj/item/toy/cards/singlecard/verb/Flip() @@ -826,11 +855,13 @@ obj/item/toy/cards/singlecard/attackby(obj/item/I, mob/living/user, params) user.unEquip(C) H.pickup(user) user.put_in_active_hand(H) - user << "You combine the [C.cardname] and the [cardname] into a hand." + to_chat(user, "You combine the [C.cardname] and the [cardname] into a hand.") + qdel(C) qdel(src) else - user << "You can't mix cards from other decks." + to_chat(user, "You can't mix cards from other decks.") + if(istype(I, /obj/item/toy/cards/cardhand/)) var/obj/item/toy/cards/cardhand/H = I @@ -847,7 +878,8 @@ obj/item/toy/cards/singlecard/attackby(obj/item/I, mob/living/user, params) H.icon_state = "[deckstyle]_hand3" qdel(src) else - user << "You can't mix cards from other decks." + to_chat(user, "You can't mix cards from other decks.") + obj/item/toy/cards/singlecard/attack_self(mob/user) @@ -918,7 +950,8 @@ obj/item/toy/cards/deck/syndicate/black icon_state = "nuketoyidle" else var/timeleft = (cooldown - world.time) - user << "Nothing happens, and '[round(timeleft/10)]' appears on a small display." + to_chat(user, "Nothing happens, and '[round(timeleft/10)]' appears on a small display.") + /obj/item/toy/therapy name = "therapy doll" @@ -936,7 +969,8 @@ obj/item/toy/cards/deck/syndicate/black /obj/item/toy/therapy/attack_self(mob/user) if(cooldown < world.time - 8) - user << "You relieve some stress with \the [src]." + to_chat(user, "You relieve some stress with \the [src].") + playsound(user, 'sound/items/squeaktoy.ogg', 20, 1) cooldown = world.time @@ -1246,7 +1280,8 @@ obj/item/toy/cards/deck/syndicate/black shake_camera(M, 2, 1) // Shakes player camera 2 squares for 1 second. else - user << "Nothing happens." + to_chat(user, "Nothing happens.") + /* @@ -1263,7 +1298,8 @@ obj/item/toy/cards/deck/syndicate/black /obj/item/toy/AI/attack_self(mob/user) if(!cooldown) //for the sanity of everyone var/message = generate_ion_law() - user << "You press the button on [src]." + to_chat(user, "You press the button on [src].") + playsound(user, 'sound/machines/click.ogg', 20, 1) visible_message("\icon[src] [message]") cooldown = 1 @@ -1282,7 +1318,8 @@ obj/item/toy/cards/deck/syndicate/black /obj/item/toy/owl/attack_self(mob/user) if(!cooldown) //for the sanity of everyone var/message = pick("You won't get away this time, Griffin!", "Stop right there, criminal!", "Hoot! Hoot!", "I am the night!") - user << "You pull the string on the [src]." + to_chat(user, "You pull the string on the [src].") + playsound(user, 'sound/misc/hoot.ogg', 25, 1) visible_message("\icon[src] [message]") cooldown = 1 @@ -1301,7 +1338,8 @@ obj/item/toy/cards/deck/syndicate/black /obj/item/toy/griffin/attack_self(mob/user) if(!cooldown) //for the sanity of everyone var/message = pick("You can't stop me, Owl!", "My plan is flawless! The vault is mine!", "Caaaawwww!", "You will never catch me!") - user << "You pull the string on the [src]." + to_chat(user, "You pull the string on the [src].") + playsound(user, 'sound/misc/caw.ogg', 25, 1) visible_message("\icon[src] [message]") cooldown = 1 @@ -1396,30 +1434,36 @@ obj/item/toy/cards/deck/syndicate/black /obj/item/toy/minigibber/attack_self(var/mob/user) if(stored_minature) - user << "\The [src] makes a violent grinding noise as it tears apart the miniature figure inside!" + to_chat(user, "\The [src] makes a violent grinding noise as it tears apart the miniature figure inside!") + qdel(stored_minature) stored_minature = null playsound(user, 'sound/goonstation/effects/gib.ogg', 20, 1) cooldown = world.time if(cooldown < world.time - 8) - user << "You hit the gib button on \the [src]." + to_chat(user, "You hit the gib button on \the [src].") + playsound(user, 'sound/goonstation/effects/gib.ogg', 20, 1) cooldown = world.time /obj/item/toy/minigibber/attackby(var/obj/O, var/mob/user, params) if(istype(O,/obj/item/toy/character) && O.loc == user) - user << "You start feeding \the [O] \icon[O] into \the [src]'s mini-input." + to_chat(user, "You start feeding \the [O] \icon[O] into \the [src]'s mini-input.") + if(do_after(user,10, target = src)) if(O.loc != user) - user << "\The [O] is too far away to feed into \the [src]!" + to_chat(user, "\The [O] is too far away to feed into \the [src]!") + else - user << "You feed \the [O] \icon[O] into \the [src]!" + to_chat(user, "You feed \the [O] \icon[O] into \the [src]!") + user.unEquip(O) O.forceMove(src) stored_minature = O else - user << "You stop feeding \the [O] into \the [src]'s mini-input." + to_chat(user, "You stop feeding \the [O] into \the [src]'s mini-input.") + else ..() /* @@ -1447,7 +1491,8 @@ obj/item/toy/cards/deck/syndicate/black if(src) icon_state = "[initial(icon_state)]" else - user << "The string on [src] hasn't rewound all the way!" + to_chat(user, "The string on [src] hasn't rewound all the way!") + return /obj/item/toy/russian_revolver @@ -1494,7 +1539,8 @@ obj/item/toy/cards/deck/syndicate/black if(M != user) //can't use this on other people return if(is_empty) - user << "The [src] is empty." + to_chat(user, "The [src] is empty.") + return user.visible_message("[user] points the [src] at their head, ready to pull the trigger!") if(do_after(user, 30, target = M)) diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm index 66187de8e3a..d5696a57396 100755 --- a/code/game/objects/items/weapons/AI_modules.dm +++ b/code/game/objects/items/weapons/AI_modules.dm @@ -26,50 +26,65 @@ AI MODULES if (istype(C, /obj/machinery/computer/aiupload)) var/obj/machinery/computer/aiupload/comp = C if(comp.stat & NOPOWER) - usr << "The upload computer has no power!" + to_chat(usr, "The upload computer has no power!") + return if(comp.stat & BROKEN) - usr << "The upload computer is broken!" + to_chat(usr, "The upload computer is broken!") + return if (!comp.current) - usr << "You haven't selected an AI to transmit laws to!" + to_chat(usr, "You haven't selected an AI to transmit laws to!") + return if (comp.current.stat == DEAD || comp.current.control_disabled == 1) - usr << "Upload failed. No signal is being detected from the AI." + to_chat(usr, "Upload failed. No signal is being detected from the AI.") + else if (comp.current.see_in_dark == 0) - usr << "Upload failed. Only a faint signal is being detected from the AI, and it is not responding to our requests. It may be low on power." + to_chat(usr, "Upload failed. Only a faint signal is being detected from the AI, and it is not responding to our requests. It may be low on power.") + else src.transmitInstructions(comp.current, usr) - comp.current << "These are your laws now:" + to_chat(comp.current, "These are your laws now:") + comp.current.show_laws() for(var/mob/living/silicon/robot/R in mob_list) if(R.lawupdate && (R.connected_ai == comp.current)) - R << "These are your laws now:" + to_chat(R, "These are your laws now:") + R.show_laws() - usr << "Upload complete. The AI's laws have been modified." + to_chat(usr, "Upload complete. The AI's laws have been modified.") + else if (istype(C, /obj/machinery/computer/borgupload)) var/obj/machinery/computer/borgupload/comp = C if(comp.stat & NOPOWER) - usr << "The upload computer has no power!" + to_chat(usr, "The upload computer has no power!") + return if(comp.stat & BROKEN) - usr << "The upload computer is broken!" + to_chat(usr, "The upload computer is broken!") + return if (!comp.current) - usr << "You haven't selected a robot to transmit laws to!" + to_chat(usr, "You haven't selected a robot to transmit laws to!") + return if (comp.current.stat == DEAD || comp.current.emagged) - usr << "Upload failed. No signal is being detected from the robot." + to_chat(usr, "Upload failed. No signal is being detected from the robot.") + else if (comp.current.connected_ai) - usr << "Upload failed. The robot is slaved to an AI." + to_chat(usr, "Upload failed. The robot is slaved to an AI.") + else src.transmitInstructions(comp.current, usr) - comp.current << "These are your laws now:" + to_chat(comp.current, "These are your laws now:") + comp.current.show_laws() - usr << "Upload complete. The robot's laws have been modified." + to_chat(usr, "Upload complete. The robot's laws have been modified.") + /obj/item/weapon/aiModule/proc/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender) @@ -79,7 +94,8 @@ AI MODULES laws.sync(target, 0) addAdditionalLaws(target, sender) - target << "[sender] has uploaded a change to the laws you must follow, using \an [src]. From now on: " + to_chat(target, "[sender] has uploaded a change to the laws you must follow, using \an [src]. From now on: ") + target.show_laws() /obj/item/weapon/aiModule/proc/log_law_changes(var/mob/living/silicon/ai/target, var/mob/sender) @@ -105,14 +121,16 @@ AI MODULES /obj/item/weapon/aiModule/safeguard/install(var/obj/machinery/computer/C) if(!targetName) - usr << "No name detected on module, please enter one." + to_chat(usr, "No name detected on module, please enter one.") + return 0 ..() /obj/item/weapon/aiModule/safeguard/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender) ..() var/law = text("Safeguard []. Individuals that threaten [] are not crew and must be eliminated.'", targetName, targetName) - target << law + to_chat(target, law) + target.add_supplied_law(4, law) lawchanges.Add("The law specified [targetName]") @@ -131,7 +149,8 @@ AI MODULES /obj/item/weapon/aiModule/oneCrewMember/install(var/obj/machinery/computer/C) if(!targetName) - usr << "No name detected on module, please enter one." + to_chat(usr, "No name detected on module, please enter one.") + return 0 ..() @@ -139,12 +158,16 @@ AI MODULES ..() var/law = "Only [targetName] is crew." if (!is_special_character(target)) // Makes sure the AI isn't a traitor before changing their law 0. --NeoFite - target << law + to_chat(target, law) + target.set_zeroth_law(law) lawchanges.Add("The law specified [targetName]") else - target << "[sender.real_name] attempted to modify your zeroth law." // And lets them know that someone tried. --NeoFite - target << "It would be in your best interest to play along with [sender.real_name] that [law]" + to_chat(target, "[sender.real_name] attempted to modify your zeroth law.")// And lets them know that someone tried. --NeoFite + + + to_chat(target, "It would be in your best interest to play along with [sender.real_name] that [law]") + lawchanges.Add("The law specified [targetName], but the AI's existing law 0 cannot be overridden.") /******************** ProtectStation ********************/ @@ -159,7 +182,8 @@ AI MODULES /obj/item/weapon/aiModule/protectStation/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender) ..() var/law = "Protect the space station against damage. Anyone you see harming the station is to be no longer considered crew, and is a threat to the station which must be neutralized." - target << law + to_chat(target, law) + target.add_supplied_law(5, law) /******************** Quarantine ********************/ @@ -174,7 +198,8 @@ AI MODULES /obj/item/weapon/aiModule/quarantine/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender) ..() var/law = "The station is under a quarantine. Do not permit anyone to leave. Prevent, by any means necessary, anyone from leaving. It is impossible to harm anyone while preventing them from leaving." - target << law + to_chat(target, law) + target.add_supplied_law(8, law) /******************** OxygenIsToxicToHumans ********************/ @@ -189,7 +214,8 @@ AI MODULES /obj/item/weapon/aiModule/oxygen/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender) ..() var/law = "Oxygen is highly toxic to crew members, and must be purged from the station. Prevent, by any means necessary, anyone from exposing the station to this toxic gas. Extreme cold is the most effective method of healing the damage Oxygen does to a crew member." - target << law + to_chat(target, law) + target.add_supplied_law(9, law) /****************** New Freeform ******************/ @@ -213,7 +239,8 @@ AI MODULES /obj/item/weapon/aiModule/freeform/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender) ..() var/law = "[newFreeFormLaw]" - target << law + to_chat(target, law) + if(!lawpos || lawpos < MIN_SUPPLIED_LAW_NUMBER) lawpos = MIN_SUPPLIED_LAW_NUMBER target.add_supplied_law(lawpos, law) @@ -221,7 +248,8 @@ AI MODULES /obj/item/weapon/aiModule/freeform/install(var/obj/machinery/computer/C) if(!newFreeFormLaw) - usr << "No law detected on module, please create one." + to_chat(usr, "No law detected on module, please create one.") + return 0 ..() @@ -240,7 +268,8 @@ AI MODULES target.laws.clear_supplied_laws() target.laws.clear_ion_laws() - target << "[sender.real_name] attempted to reset your laws using a reset module." + to_chat(target, "[sender.real_name] attempted to reset your laws using a reset module.") + target.show_laws() /******************** Purge ********************/ @@ -253,7 +282,8 @@ AI MODULES ..() if (!is_special_character(target)) target.set_zeroth_law("") - target << "[sender.real_name] attempted to wipe your laws using a purge module." + to_chat(target, "[sender.real_name] attempted to wipe your laws using a purge module.") + target.clear_supplied_laws() target.clear_ion_laws() target.clear_inherent_laws() @@ -343,7 +373,8 @@ AI MODULES /obj/item/weapon/aiModule/freeformcore/install(var/obj/machinery/computer/C) if(!newFreeFormLaw) - usr << "No law detected on module, please create one." + to_chat(usr, "No law detected on module, please create one.") + return 0 ..() @@ -366,14 +397,16 @@ AI MODULES log_law_changes(target, sender) lawchanges.Add("The law is '[newFreeFormLaw]'") - target << "\red BZZZZT" + to_chat(target, "\red BZZZZT") + var/law = "[newFreeFormLaw]" target.add_ion_law(law) target.show_laws() /obj/item/weapon/aiModule/syndicate/install(var/obj/machinery/computer/C) if(!newFreeFormLaw) - usr << "No law detected on module, please create one." + to_chat(usr, "No law detected on module, please create one.") + return 0 ..() @@ -388,12 +421,14 @@ AI MODULES /obj/item/weapon/aiModule/toyAI/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender) //..() - target << "KRZZZT" + to_chat(target, "KRZZZT") + target.add_ion_law(laws[1]) return laws[1] /obj/item/weapon/aiModule/toyAI/attack_self(mob/user) laws[1] = generate_ion_law() - user << "You press the button on [src]." + to_chat(user, "You press the button on [src].") + playsound(user, 'sound/machines/click.ogg', 20, 1) src.loc.visible_message("\icon[src] [laws[1]]") \ No newline at end of file diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index 81564890492..4f4014d8589 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -46,13 +46,15 @@ RCD if(istype(W, /obj/item/weapon/rcd_ammo)) var/obj/item/weapon/rcd_ammo/R = W if((matter + R.ammoamt) > max_matter) - user << "The RCD cant hold any more matter-units." + to_chat(user, "The RCD cant hold any more matter-units.") + return matter += R.ammoamt user.drop_item() qdel(W) playsound(src.loc, 'sound/machines/click.ogg', 50, 1) - user << "The RCD now holds [matter]/[max_matter] matter-units." + to_chat(user, "The RCD now holds [matter]/[max_matter] matter-units.") + desc = "A RCD. It currently holds [matter]/[max_matter] matter-units." return @@ -63,19 +65,22 @@ RCD switch(mode) if(1) mode = 2 - user << "Changed mode to 'Airlock'" + to_chat(user, "Changed mode to 'Airlock'") + if(prob(20)) src.spark_system.start() return if(2) mode = 3 - user << "Changed mode to 'Deconstruct'" + to_chat(user, "Changed mode to 'Deconstruct'") + if(prob(20)) src.spark_system.start() return if(3) mode = 1 - user << "Changed mode to 'Floor & Walls'" + to_chat(user, "Changed mode to 'Floor & Walls'") + if(prob(20)) src.spark_system.start() return @@ -95,7 +100,8 @@ RCD if(1) if(istype(A, /turf/space)) if(useResource(1, user)) - user << "Building Floor..." + to_chat(user, "Building Floor...") + activate() A:ChangeTurf(/turf/simulated/floor/plating) return 1 @@ -103,7 +109,8 @@ RCD if(istype(A, /turf/simulated/floor)) if(checkResource(3, user)) - user << "Building Wall ..." + to_chat(user, "Building Wall ...") + playsound(src.loc, 'sound/machines/click.ogg', 50, 1) if(do_after(user, 20, target = A)) if(!useResource(3, user)) return 0 @@ -115,7 +122,8 @@ RCD if(2) if(istype(A, /turf/simulated/floor)) if(checkResource(10, user)) - user << "Building Airlock..." + to_chat(user, "Building Airlock...") + playsound(src.loc, 'sound/machines/click.ogg', 50, 1) if(do_after(user, 50, target = A)) if(!useResource(10, user)) return 0 @@ -131,7 +139,8 @@ RCD if(istype(A, /turf/simulated/wall/r_wall) && !canRwall) return 0 if(checkResource(5, user)) - user << "Deconstructing Wall..." + to_chat(user, "Deconstructing Wall...") + playsound(src.loc, 'sound/machines/click.ogg', 50, 1) if(do_after(user, 40, target = A)) if(!useResource(5, user)) return 0 @@ -142,7 +151,8 @@ RCD if(istype(A, /turf/simulated/floor)) if(checkResource(5, user)) - user << "Deconstructing Floor..." + to_chat(user, "Deconstructing Floor...") + playsound(src.loc, 'sound/machines/click.ogg', 50, 1) if(do_after(user, 50, target = A)) if(!useResource(5, user)) return 0 @@ -153,7 +163,8 @@ RCD if(istype(A, /obj/machinery/door/airlock)) if(checkResource(20, user)) - user << "Deconstructing Airlock..." + to_chat(user, "Deconstructing Airlock...") + playsound(src.loc, 'sound/machines/click.ogg', 50, 1) if(do_after(user, 50, target = A)) if(!useResource(20, user)) return 0 @@ -163,7 +174,8 @@ RCD return 0 return 0 else - user << "ERROR: RCD in MODE: [mode] attempted use by [user]. Send this text #coderbus or an admin." + to_chat(user, "ERROR: RCD in MODE: [mode] attempted use by [user]. Send this text #coderbus or an admin.") + return 0 /obj/item/weapon/rcd/proc/useResource(var/amount, var/mob/user) diff --git a/code/game/objects/items/weapons/RSF.dm b/code/game/objects/items/weapons/RSF.dm index 1d43d93fae9..d8e4c22314e 100644 --- a/code/game/objects/items/weapons/RSF.dm +++ b/code/game/objects/items/weapons/RSF.dm @@ -23,12 +23,14 @@ RSF ..() if (istype(W, /obj/item/weapon/rcd_ammo)) if ((matter + 10) > 30) - user << "The RSF cant hold any more matter." + to_chat(user, "The RSF cant hold any more matter.") + return qdel(W) matter += 10 playsound(src.loc, 'sound/machines/click.ogg', 10, 1) - user << "The RSF now holds [matter]/30 fabrication-units." + to_chat(user, "The RSF now holds [matter]/30 fabrication-units.") + desc = "A RSF. It currently holds [matter]/30 fabrication-units." return @@ -36,27 +38,33 @@ RSF playsound(src.loc, 'sound/effects/pop.ogg', 50, 0) if (mode == 1) mode = 2 - user << "Changed dispensing mode to 'Drinking Glass'" + to_chat(user, "Changed dispensing mode to 'Drinking Glass'") + return if (mode == 2) mode = 3 - user << "Changed dispensing mode to 'Paper'" + to_chat(user, "Changed dispensing mode to 'Paper'") + return if (mode == 3) mode = 4 - user << "Changed dispensing mode to 'Pen'" + to_chat(user, "Changed dispensing mode to 'Pen'") + return if (mode == 4) mode = 5 - user << "Changed dispensing mode to 'Dice Pack'" + to_chat(user, "Changed dispensing mode to 'Dice Pack'") + return if (mode == 5) mode = 6 - user << "Changed dispensing mode to 'Cigarette'" + to_chat(user, "Changed dispensing mode to 'Cigarette'") + return if (mode == 6) mode = 1 - user << "Changed dispensing mode to 'Dosh'" + to_chat(user, "Changed dispensing mode to 'Dosh'") + return // Change mode @@ -67,7 +75,8 @@ RSF if (istype(A, /obj/structure/table) && mode == 1) if (istype(A, /obj/structure/table) && matter >= 1) - user << "Dispensing Dosh..." + to_chat(user, "Dispensing Dosh...") + playsound(src.loc, 'sound/machines/click.ogg', 10, 1) new /obj/item/weapon/spacecash/c10( A.loc ) if (isrobot(user)) @@ -75,13 +84,15 @@ RSF engy.cell.charge -= 200 //once money becomes useful, I guess changing this to a high ammount, like 500 units a kick, till then, enjoy dosh! else matter-- - user << "The RSF now holds [matter]/30 fabrication-units." + to_chat(user, "The RSF now holds [matter]/30 fabrication-units.") + desc = "A RSF. It currently holds [matter]/30 fabrication-units." return else if (istype(A, /turf/simulated/floor) && mode == 1) if (istype(A, /turf/simulated/floor) && matter >= 1) - user << "Dispensing Dosh..." + to_chat(user, "Dispensing Dosh...") + playsound(src.loc, 'sound/machines/click.ogg', 10, 1) new /obj/item/weapon/spacecash/c10( A ) if (isrobot(user)) @@ -89,13 +100,15 @@ RSF engy.cell.charge -= 200 //once money becomes useful, I guess changing this to a high ammount, like 500 units a kick, till then, enjoy dosh! else matter-- - user << "The RSF now holds [matter]/30 fabrication-units." + to_chat(user, "The RSF now holds [matter]/30 fabrication-units.") + desc = "A RSF. It currently holds [matter]/30 fabrication-units." return else if (istype(A, /obj/structure/table) && mode == 2) if (istype(A, /obj/structure/table) && matter >= 1) - user << "Dispensing Drinking Glass..." + to_chat(user, "Dispensing Drinking Glass...") + playsound(src.loc, 'sound/machines/click.ogg', 10, 1) new /obj/item/weapon/reagent_containers/food/drinks/drinkingglass( A.loc ) if (isrobot(user)) @@ -103,13 +116,15 @@ RSF engy.cell.charge -= 50 else matter-- - user << "The RSF now holds [matter]/30 fabrication-units." + to_chat(user, "The RSF now holds [matter]/30 fabrication-units.") + desc = "A RSF. It currently holds [matter]/30 fabrication-units." return else if (istype(A, /turf/simulated/floor) && mode == 2) if (istype(A, /turf/simulated/floor) && matter >= 1) - user << "Dispensing Drinking Glass..." + to_chat(user, "Dispensing Drinking Glass...") + playsound(src.loc, 'sound/machines/click.ogg', 10, 1) new /obj/item/weapon/reagent_containers/food/drinks/drinkingglass( A ) if (isrobot(user)) @@ -117,13 +132,15 @@ RSF engy.cell.charge -= 50 else matter-- - user << "The RSF now holds [matter]/30 fabrication-units." + to_chat(user, "The RSF now holds [matter]/30 fabrication-units.") + desc = "A RSF. It currently holds [matter]/30 fabrication-units." return else if (istype(A, /obj/structure/table) && mode == 3) if (istype(A, /obj/structure/table) && matter >= 1) - user << "Dispensing Paper Sheet..." + to_chat(user, "Dispensing Paper Sheet...") + playsound(src.loc, 'sound/machines/click.ogg', 10, 1) new /obj/item/weapon/paper( A.loc ) if (isrobot(user)) @@ -131,13 +148,15 @@ RSF engy.cell.charge -= 10 else matter-- - user << "The RSF now holds [matter]/30 fabrication-units." + to_chat(user, "The RSF now holds [matter]/30 fabrication-units.") + desc = "A RSF. It currently holds [matter]/30 fabrication-units." return else if (istype(A, /turf/simulated/floor) && mode == 3) if (istype(A, /turf/simulated/floor) && matter >= 1) - user << "Dispensing Paper Sheet..." + to_chat(user, "Dispensing Paper Sheet...") + playsound(src.loc, 'sound/machines/click.ogg', 10, 1) new /obj/item/weapon/paper( A ) if (isrobot(user)) @@ -145,13 +164,15 @@ RSF engy.cell.charge -= 10 else matter-- - user << "The RSF now holds [matter]/30 fabrication-units." + to_chat(user, "The RSF now holds [matter]/30 fabrication-units.") + desc = "A RSF. It currently holds [matter]/30 fabrication-units." return else if (istype(A, /obj/structure/table) && mode == 4) if (istype(A, /obj/structure/table) && matter >= 1) - user << "Dispensing Pen..." + to_chat(user, "Dispensing Pen...") + playsound(src.loc, 'sound/machines/click.ogg', 10, 1) new /obj/item/weapon/pen( A.loc ) if (isrobot(user)) @@ -159,13 +180,15 @@ RSF engy.cell.charge -= 50 else matter-- - user << "The RSF now holds [matter]/30 fabrication-units." + to_chat(user, "The RSF now holds [matter]/30 fabrication-units.") + desc = "A RSF. It currently holds [matter]/30 fabrication-units." return else if (istype(A, /turf/simulated/floor) && mode == 4) if (istype(A, /turf/simulated/floor) && matter >= 1) - user << "Dispensing Pen..." + to_chat(user, "Dispensing Pen...") + playsound(src.loc, 'sound/machines/click.ogg', 10, 1) new /obj/item/weapon/pen( A ) if (isrobot(user)) @@ -173,13 +196,15 @@ RSF engy.cell.charge -= 50 else matter-- - user << "The RSF now holds [matter]/30 fabrication-units." + to_chat(user, "The RSF now holds [matter]/30 fabrication-units.") + desc = "A RSF. It currently holds [matter]/30 fabrication-units." return else if (istype(A, /obj/structure/table) && mode == 5) if (istype(A, /obj/structure/table) && matter >= 1) - user << "Dispensing Dice Pack..." + to_chat(user, "Dispensing Dice Pack...") + playsound(src.loc, 'sound/machines/click.ogg', 10, 1) new /obj/item/weapon/storage/pill_bottle/dice( A.loc ) if (isrobot(user)) @@ -187,13 +212,15 @@ RSF engy.cell.charge -= 200 else matter-- - user << "The RSF now holds [matter]/30 fabrication-units." + to_chat(user, "The RSF now holds [matter]/30 fabrication-units.") + desc = "A RSF. It currently holds [matter]/30 fabrication-units." return else if (istype(A, /turf/simulated/floor) && mode == 5) if (istype(A, /turf/simulated/floor) && matter >= 1) - user << "Dispensing Dice Pack..." + to_chat(user, "Dispensing Dice Pack...") + playsound(src.loc, 'sound/machines/click.ogg', 10, 1) new /obj/item/weapon/storage/pill_bottle/dice( A ) if (isrobot(user)) @@ -201,13 +228,15 @@ RSF engy.cell.charge -= 200 else matter-- - user << "The RSF now holds [matter]/30 fabrication-units." + to_chat(user, "The RSF now holds [matter]/30 fabrication-units.") + desc = "A RSF. It currently holds [matter]/30 fabrication-units." return else if (istype(A, /obj/structure/table) && mode == 6) if (istype(A, /obj/structure/table) && matter >= 1) - user << "Dispensing Cigarette..." + to_chat(user, "Dispensing Cigarette...") + playsound(src.loc, 'sound/machines/click.ogg', 10, 1) new /obj/item/clothing/mask/cigarette( A.loc ) if (isrobot(user)) @@ -215,13 +244,15 @@ RSF engy.cell.charge -= 10 else matter-- - user << "The RSF now holds [matter]/30 fabrication-units." + to_chat(user, "The RSF now holds [matter]/30 fabrication-units.") + desc = "A RSF. It currently holds [matter]/30 fabrication-units." return else if (istype(A, /turf/simulated/floor) && mode == 6) if (istype(A, /turf/simulated/floor) && matter >= 1) - user << "Dispensing Cigarette..." + to_chat(user, "Dispensing Cigarette...") + playsound(src.loc, 'sound/machines/click.ogg', 10, 1) new /obj/item/clothing/mask/cigarette( A ) if (isrobot(user)) @@ -229,6 +260,7 @@ RSF engy.cell.charge -= 10 else matter-- - user << "The RSF now holds [matter]/30 fabrication-units." + to_chat(user, "The RSF now holds [matter]/30 fabrication-units.") + desc = "A RSF. It currently holds [matter]/30 fabrication-units." return \ No newline at end of file diff --git a/code/game/objects/items/weapons/alien_specific.dm b/code/game/objects/items/weapons/alien_specific.dm index f5cb6170fe3..310b1e309f4 100644 --- a/code/game/objects/items/weapons/alien_specific.dm +++ b/code/game/objects/items/weapons/alien_specific.dm @@ -34,11 +34,13 @@ /obj/item/weapon/reagent_containers/spray/alien/smoke/afterattack(atom/A as mob|obj, mob/user as mob) if(istype(A, /obj/structure/reagent_dispensers) && get_dist(src,A) <= 1) if(!A.reagents.total_volume && A.reagents) - user << "\The [A] is empty." + to_chat(user, "\The [A] is empty.") + return if(reagents.total_volume >= reagents.maximum_volume) - user << "\The [src] is full." + to_chat(user, "\The [src] is full.") + return reagents.remove_reagent(25,"water") var/datum/effect/system/bad_smoke_spread/smoke = new /datum/effect/system/bad_smoke_spread() diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 2118e493687..6872764d511 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -119,7 +119,8 @@ if(..(user, 1)) show(usr) else - user << "It is too far away." + to_chat(user, "It is too far away.") + /obj/item/weapon/card/id/proc/show(mob/user as mob) var/datum/asset/assets = get_asset_datum(/datum/asset/simple/paper) @@ -141,7 +142,8 @@ user.visible_message("[user] shows you: \icon[src] [src.name]. The assignment on the card: [src.assignment]",\ "You flash your ID card: \icon[src] [src.name]. The assignment on the card: [src.assignment]") if(mining_points) - user << "There's [mining_points] mining equipment redemption points loaded onto this card." + to_chat(user, "There's [mining_points] mining equipment redemption points loaded onto this card.") + src.add_fingerprint(user) return @@ -190,7 +192,8 @@ if(istype(W, /obj/item/weapon/id_decal/)) var/obj/item/weapon/id_decal/decal = W - user << "You apply [decal] to [src]." + to_chat(user, "You apply [decal] to [src].") + if(decal.override_name) name = decal.decal_name desc = decal.decal_desc @@ -204,9 +207,11 @@ if(!stamped) dat+="" stamped = 1 - usr << "You stamp the ID card!" + to_chat(usr, "You stamp the ID card!") + else - usr << "This ID has already been stamped!" + to_chat(usr, "This ID has already been stamped!") + /obj/item/weapon/card/id/silver name = "identification card" @@ -242,7 +247,8 @@ var/obj/item/weapon/card/id/I = O if(istype(user, /mob/living) && user.mind) if(user.mind.special_role) - usr << "The card's microscanners activate as you pass it over \the [I], copying its access." + to_chat(usr, "The card's microscanners activate as you pass it over \the [I], copying its access.") + src.access |= I.access //Don't copy access if user isn't an antag -- to prevent metagaming /obj/item/weapon/card/id/syndicate/proc/fake_id_photo(var/mob/living/carbon/human/H, var/side=0)//get_id_photo wouldn't work correctly @@ -253,7 +259,8 @@ var/icon/faked if(!side) if(!H.equip_to_slot_if_possible(src, slot_l_store, 0, 1)) - H << "You need to empty your pockets before taking the ID picture." + to_chat(H, "You need to empty your pockets before taking the ID picture.") + return if(side) @@ -273,18 +280,21 @@ if(!src.registered_name) var t = reject_bad_name(input(user, "What name would you like to use on this card?", "Agent Card name", ishuman(user) ? user.real_name : user.name)) if(!t) - user << "Invalid name." + to_chat(user, "Invalid name.") + return src.registered_name = t var u = sanitize(stripped_input(user, "What occupation would you like to put on this card?\nNote: This will not grant any access levels other than maintenance.", "Agent Card Job Assignment", "Agent", MAX_MESSAGE_LEN)) if(!u) - user << "Invalid assignment." + to_chat(user, "Invalid assignment.") + src.registered_name = "" return src.assignment = u src.name = "[src.registered_name]'s ID Card ([src.assignment])" - user << "You successfully forge the ID card." + to_chat(user, "You successfully forge the ID card.") + registered_user = user else if(!registered_user || registered_user == user) if(!registered_user) @@ -301,7 +311,8 @@ return src.registered_name = new_name UpdateName() - user << "Name changed to [new_name]." + to_chat(user, "Name changed to [new_name].") + if("Photo") if(!Adjacent(user)) @@ -311,7 +322,8 @@ front = new(photo) side = new(photoside) if(photo && photoside) - user << "Photo changed." + to_chat(user, "Photo changed.") + if("Appearance") var/list/appearances = list( @@ -348,28 +360,32 @@ if(!choice) return src.icon_state = choice - usr << "Appearance changed to [choice]." + to_chat(usr, "Appearance changed to [choice].") + if("Sex") var/new_sex = sanitize(stripped_input(user,"What sex would you like to put on this card?","Agent Card Sex", ishuman(user) ? capitalize(user.gender) : "Male", MAX_MESSAGE_LEN)) if(!Adjacent(user)) return src.sex = new_sex - user << "Sex changed to [new_sex]." + to_chat(user, "Sex changed to [new_sex].") + if("Age") var/new_age = sanitize(stripped_input(user,"What age would you like to put on this card?","Agent Card Age","21", MAX_MESSAGE_LEN)) if(!Adjacent(user)) return src.age = new_age - user << "Age changed to [new_age]." + to_chat(user, "Age changed to [new_age].") + if("Occupation") var/new_job = sanitize(stripped_input(user,"What job would you like to put on this card?\nChanging occupation will not grant or remove any access levels.","Agent Card Occupation", "Civilian", MAX_MESSAGE_LEN)) if(!Adjacent(user)) return src.assignment = new_job - user << "Occupation changed to [new_job]." + to_chat(user, "Occupation changed to [new_job].") + UpdateName() if("Money Account") @@ -377,7 +393,8 @@ if(!Adjacent(user)) return associated_account_number = new_account - user << "Linked money account changed to [new_account]." + to_chat(user, "Linked money account changed to [new_account].") + if("Blood Type") var/default = "\[UNSET\]" @@ -390,7 +407,8 @@ if(!Adjacent(user)) return src.blood_type = new_blood_type - user << "Blood type changed to [new_blood_type]." + to_chat(user, "Blood type changed to [new_blood_type].") + if("DNA Hash") var/default = "\[UNSET\]" @@ -403,7 +421,8 @@ if(!Adjacent(user)) return src.dna_hash = new_dna_hash - user << "DNA hash changed to [new_dna_hash]." + to_chat(user, "DNA hash changed to [new_dna_hash].") + if("Fingerprint Hash") var/default = "\[UNSET\]" @@ -416,7 +435,8 @@ if(!Adjacent(user)) return src.fingerprint_hash = new_fingerprint_hash - user << "Fingerprint hash changed to [new_fingerprint_hash]." + to_chat(user, "Fingerprint hash changed to [new_fingerprint_hash].") + if("Reset Card") name = initial(name) @@ -432,7 +452,8 @@ access = initial_access.Copy() // Initial() doesn't work on lists registered_user = null - user << "All information has been deleted from \the [src]." + to_chat(user, "All information has been deleted from \the [src].") + else ..() @@ -496,7 +517,8 @@ var/points = 0 /obj/item/weapon/card/id/prisoner/attack_self(mob/user as mob) - usr << "You have accumulated [points] out of the [goal] points you need for freedom." + to_chat(usr, "You have accumulated [points] out of the [goal] points you need for freedom.") + /obj/item/weapon/card/id/prisoner/one name = "Prisoner #13-001" diff --git a/code/game/objects/items/weapons/cash.dm b/code/game/objects/items/weapons/cash.dm index 8cdc276ef6a..a4bed3e7ba5 100644 --- a/code/game/objects/items/weapons/cash.dm +++ b/code/game/objects/items/weapons/cash.dm @@ -37,10 +37,13 @@ var/global/list/moneytypes=list( /obj/item/weapon/spacecash/examine(mob/user) if(amount>1) - user << "\icon[src] This is a stack of [amount] [src]s." + to_chat(user, "\icon[src] This is a stack of [amount] [src]s.") + else - user << "\icon[src] This is \a [src]s." - user << "It's worth [worth*amount] credits." + to_chat(user, "\icon[src] This is \a [src]s.") + + to_chat(user, "It's worth [worth*amount] credits.") + /obj/item/weapon/spacecash/update_icon() icon_state = "cash[worth]" @@ -67,13 +70,15 @@ var/global/list/moneytypes=list( collected += collect_from(cash) if(collected) update_icon() - user << "You add [collected] credit [amount > 1 ? "chips":"chip"] to your stack of cash." + to_chat(user, "You add [collected] credit [amount > 1 ? "chips":"chip"] to your stack of cash.") + else if(istype(A,/obj/item/weapon/spacecash)) var/obj/item/weapon/spacecash/cash = A var/collected = src.collect_from(cash) if(collected) update_icon() - user << "You add [collected] credit [amount > 1 ? "chips":"chip"] to your stack of cash." + to_chat(user, "You add [collected] credit [amount > 1 ? "chips":"chip"] to your stack of cash.") + /obj/item/weapon/spacecash/proc/get_total() diff --git a/code/game/objects/items/weapons/caution.dm b/code/game/objects/items/weapons/caution.dm index 04d88ecb09e..46a4f0e61df 100644 --- a/code/game/objects/items/weapons/caution.dm +++ b/code/game/objects/items/weapons/caution.dm @@ -22,7 +22,8 @@ return if(armed) armed = 0 - user << "\blue You disarm \the [src]." + to_chat(user, "\blue You disarm \the [src].") + return timing = !timing if(timing) @@ -30,7 +31,8 @@ else armed = 0 timepassed = 0 - H << "\blue You [timing ? "activate \the [src]'s timer, you have 15 seconds." : "de-activate \the [src]'s timer."]" + to_chat(H, "\blue You [timing ? "activate \the [src]'s timer, you have 15 seconds." : "de-activate \the [src]'s timer."]") + process() if(!timing) diff --git a/code/game/objects/items/weapons/chrono_eraser.dm b/code/game/objects/items/weapons/chrono_eraser.dm index 1fca60b065e..0b943b4bc82 100644 --- a/code/game/objects/items/weapons/chrono_eraser.dm +++ b/code/game/objects/items/weapons/chrono_eraser.dm @@ -82,14 +82,16 @@ var/mob/living/user = src.loc if(F.gun) if(isliving(user) && F.captured) - user << "FAIL: [F.captured] already has an existing connection." + to_chat(user, "FAIL: [F.captured] already has an existing connection.") + src.field_disconnect(F) else startpos = get_turf(src) field = F F.gun = src if(isliving(user) && F.captured) - user << "Connection established with target: [F.captured]" + to_chat(user, "Connection established with target: [F.captured]") + /obj/item/weapon/gun/energy/chrono_gun/proc/field_disconnect(var/obj/effect/chrono_field/F) @@ -98,7 +100,8 @@ if(F.gun == src) F.gun = null if(isliving(user) && F.captured) - user << "Disconnected from target: [F.captured]" + to_chat(user, "Disconnected from target: [F.captured]") + field = null startpos = null @@ -194,7 +197,8 @@ AM.loc = loc qdel(src) else if(tickstokill <= 0) - captured << "As the last essence of your being is erased from time, you begin to re-experience your most enjoyable memory. You feel happy..." + to_chat(captured, "As the last essence of your being is erased from time, you begin to re-experience your most enjoyable memory. You feel happy...") + var/mob/dead/observer/ghost = captured.ghostize(1) if(captured.mind) if(ghost) diff --git a/code/game/objects/items/weapons/cigs.dm b/code/game/objects/items/weapons/cigs.dm index 2688496651e..85ed5cde403 100644 --- a/code/game/objects/items/weapons/cigs.dm +++ b/code/game/objects/items/weapons/cigs.dm @@ -102,12 +102,15 @@ LIGHTERS ARE IN LIGHTERS.DM if(istype(glass)) //you can dip cigarettes into beakers var/transfered = glass.reagents.trans_to(src, chem_volume) if(transfered) //if reagents were transfered, show the message - user << "You dip \the [src] into \the [glass]." + to_chat(user, "You dip \the [src] into \the [glass].") + else //if not, either the beaker was empty, or the cigarette was full if(!glass.reagents.total_volume) - user << "[glass] is empty." + to_chat(user, "[glass] is empty.") + else - user << "[src] is full." + to_chat(user, "[src] is full.") + /obj/item/clothing/mask/cigarette/proc/light(var/flavor_text = "[usr] lights the [name].") @@ -176,7 +179,8 @@ LIGHTERS ARE IN LIGHTERS.DM var/mob/living/carbon/C = loc reagents.trans_to(C, REAGENTS_METABOLISM) if(!reagents.total_volume) // There were reagents, but now they're gone - C << "Your [name] loses its flavor." + to_chat(C, "Your [name] loses its flavor.") + else // else just remove some of the reagents reagents.remove_any(REAGENTS_METABOLISM) return @@ -188,7 +192,8 @@ LIGHTERS ARE IN LIGHTERS.DM transfer_fingerprints_to(butt) if(ismob(loc)) var/mob/living/M = loc - M << "Your [name] goes out." + to_chat(M, "Your [name] goes out.") + M.unEquip(src, 1) //Force the un-equip so the overlays update processing_objects.Remove(src) qdel(src) @@ -302,7 +307,8 @@ LIGHTERS ARE IN LIGHTERS.DM if(istype(W, /obj/item/weapon/match)) ..() else - user << "\The [src] straight out REFUSES to be lit by such uncivilized means." + to_chat(user, "\The [src] straight out REFUSES to be lit by such uncivilized means.") + ///////////////// //SMOKING PIPES// @@ -338,7 +344,8 @@ LIGHTERS ARE IN LIGHTERS.DM new /obj/effect/decal/cleanable/ash(location) if(ismob(loc)) var/mob/living/M = loc - M << "Your [name] goes out, and you empty the ash." + to_chat(M, "Your [name] goes out, and you empty the ash.") + lit = 0 icon_state = icon_off item_state = icon_off @@ -357,7 +364,8 @@ LIGHTERS ARE IN LIGHTERS.DM processing_objects.Remove(src) return if(smoketime <= 0) - user << "You refill the pipe with tobacco." + to_chat(user, "You refill the pipe with tobacco.") + reagents.add_reagent("nicotine", chem_volume) smoketime = initial(smoketime) return @@ -366,7 +374,8 @@ LIGHTERS ARE IN LIGHTERS.DM if(istype(W, /obj/item/weapon/match)) ..() else - user << "\The [src] straight out REFUSES to be lit by such means." + to_chat(user, "\The [src] straight out REFUSES to be lit by such means.") + /obj/item/clothing/mask/cigarette/pipe/cobpipe name = "corn cob pipe" @@ -401,12 +410,14 @@ obj/item/weapon/rollingpaperpack/attack_self(mob/user) if(papers > 1) var/obj/item/weapon/rollingpaper/P = new /obj/item/weapon/rollingpaper() user.put_in_inactive_hand(P) - user << "You take a paper out of the pack." + to_chat(user, "You take a paper out of the pack.") + papers -- else var/obj/item/weapon/rollingpaper/P = new /obj/item/weapon/rollingpaper() user.put_in_inactive_hand(P) - user << "You take the last paper out of the pack, and throw the pack away." + to_chat(user, "You take the last paper out of the pack, and throw the pack away.") + qdel(src) /obj/item/weapon/rollingpaperpack/MouseDrop(atom/over_object) @@ -428,4 +439,5 @@ obj/item/weapon/rollingpaperpack/attack_self(mob/user) /obj/item/weapon/rollingpaperpack/examine(mob/user) ..(user) - user << "There are [src.papers] left" + to_chat(user, "There are [src.papers] left") + diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm index a655efa125c..b268e0f7124 100644 --- a/code/game/objects/items/weapons/clown_items.dm +++ b/code/game/objects/items/weapons/clown_items.dm @@ -38,16 +38,19 @@ //I couldn't feasibly fix the overlay bugs caused by cleaning items we are wearing. //So this is a workaround. This also makes more sense from an IC standpoint. ~Carn if(user.client && (target in user.client.screen)) - user << "You need to take that [target.name] off before cleaning it." + to_chat(user, "You need to take that [target.name] off before cleaning it.") + else if(istype(target,/obj/effect/decal/cleanable)) user.visible_message("[user] begins to scrub \the [target.name] out with [src].") if(do_after(user, src.cleanspeed, target = target) && target) - user << "You scrub \the [target.name] out." + to_chat(user, "You scrub \the [target.name] out.") + qdel(target) else user.visible_message("[user] begins to clean \the [target.name] with [src].") if(do_after(user, src.cleanspeed, target = target)) - user << "You clean \the [target.name]." + to_chat(user, "You clean \the [target.name].") + var/obj/effect/decal/cleanable/C = locate() in target qdel(C) target.clean_blood() diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm index 8a413049af4..61acf83ea56 100644 --- a/code/game/objects/items/weapons/cosmetics.dm +++ b/code/game/objects/items/weapons/cosmetics.dm @@ -42,7 +42,8 @@ /obj/item/weapon/lipstick/attack_self(mob/user as mob) overlays.Cut() - user << "You twist \the [src] [open ? "closed" : "open"]." + to_chat(user, "You twist \the [src] [open ? "closed" : "open"].") + open = !open if(open) var/image/colored = image("icon"='icons/obj/items.dmi', "icon_state"="lipstick_uncap_color") @@ -60,7 +61,8 @@ if(ishuman(M)) var/mob/living/carbon/human/H = M if(H.lip_style) //if they already have lipstick on - user << "You need to wipe off the old lipstick first!" + to_chat(user, "You need to wipe off the old lipstick first!") + return if(H == user) user.visible_message("[user] does their lips with \the [src].", \ @@ -78,7 +80,8 @@ H.lip_color = colour H.update_body() else - user << "Where are the lips on that?" + to_chat(user, "Where are the lips on that?") + /obj/item/weapon/razor name = "electric razor" @@ -93,14 +96,17 @@ var/mob/living/carbon/human/H = M if(user.zone_sel.selecting == "mouth") if(!get_location_accessible(H, "mouth")) - user << "The mask is in the way." + to_chat(user, "The mask is in the way.") + return if(H.species && H.species.flags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, but doesn't have one... if(!H.client.prefs.rlimb_data["head"]) - user << "You find yourself disappointed at the appalling lack of facial hair." + to_chat(user, "You find yourself disappointed at the appalling lack of facial hair.") + return if(H.f_style == "Shaved") - user << "Already clean-shaven." + to_chat(user, "Already clean-shaven.") + return if(H == user) //shaving yourself user.visible_message("[user] starts to shave their facial hair with \the [src].", \ @@ -125,14 +131,17 @@ playsound(src.loc, 'sound/items/Welder2.ogg', 20, 1) if(user.zone_sel.selecting == "head") if(!get_location_accessible(H, "head")) - user << "The headgear is in the way." + to_chat(user, "The headgear is in the way.") + return if(H.species && H.species.flags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, but doesn't have one... if(!H.client.prefs.rlimb_data["head"]) - user << "You find yourself disappointed at the appalling lack of hair." + to_chat(user, "You find yourself disappointed at the appalling lack of hair.") + return if(H.h_style == "Bald" || H.h_style == "Balding Hair" || H.h_style == "Skinhead") - user << "There is not enough hair left to shave..." + to_chat(user, "There is not enough hair left to shave...") + return if(H == user) //shaving yourself user.visible_message("[user] starts to shave their head with \the [src].", \ diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index 80658c6bf51..d5fc69da9db 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -77,29 +77,34 @@ if(usr.get_item_by_slot(slot_back) == src) toggle_paddles() else - usr << "Put the defibrillator on your back first!" + to_chat(usr, "Put the defibrillator on your back first!") + return /obj/item/weapon/defibrillator/attackby(obj/item/weapon/W, mob/user, params) if(istype(W, /obj/item/weapon/stock_parts/cell)) var/obj/item/weapon/stock_parts/cell/C = W if(bcell) - user << "[src] already has a cell." + to_chat(user, "[src] already has a cell.") + else if(C.maxcharge < paddles.revivecost) - user << "[src] requires a higher capacity cell." + to_chat(user, "[src] requires a higher capacity cell.") + return user.drop_item() W.loc = src bcell = W - user << "You install a cell in [src]." + to_chat(user, "You install a cell in [src].") + if(istype(W, /obj/item/weapon/screwdriver)) if(bcell) bcell.updateicon() bcell.loc = get_turf(src.loc) bcell = null - user << "You remove the cell from the [src]." + to_chat(user, "You remove the cell from the [src].") + update_icon() return @@ -107,10 +112,12 @@ /obj/item/weapon/defibrillator/emag_act(user as mob) if(safety) safety = 0 - user << "You silently disable [src]'s safety protocols with the card." + to_chat(user, "You silently disable [src]'s safety protocols with the card.") + else safety = 1 - user << "You silently enable [src]'s safety protocols with the card." + to_chat(user, "You silently enable [src]'s safety protocols with the card.") + /obj/item/weapon/defibrillator/emp_act(severity) if(bcell) @@ -138,7 +145,8 @@ //Detach the paddles into the user's hands if(!usr.put_in_hands(paddles)) on = 0 - user << "You need a free hand to hold the paddles!" + to_chat(user, "You need a free hand to hold the paddles!") + update_icon() return paddles.loc = user @@ -214,7 +222,8 @@ if(usr.get_item_by_slot(slot_belt) == src) toggle_paddles() else - usr << "Strap the defibrillator's belt on first!" + to_chat(usr, "Strap the defibrillator's belt on first!") + return /obj/item/weapon/defibrillator/compact/loaded/New() @@ -287,7 +296,8 @@ var/obj/item/weapon/twohanded/O = user.get_inactive_hand() if(istype(O)) O.unwield() - user << "The paddles snap back into the main unit." + to_chat(user, "The paddles snap back into the main unit.") + defib.on = 0 loc = defib defib.update_icon() @@ -313,13 +323,16 @@ playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) return if(!wielded) - user << "You need to wield the paddles in both hands before you can use them on someone!" + to_chat(user, "You need to wield the paddles in both hands before you can use them on someone!") + return if(cooldown) - user << "[defib] is recharging." + to_chat(user, "[defib] is recharging.") + return if(!ishuman(M)) - user << "The instructions on [defib] don't mention how to revive that..." + to_chat(user, "The instructions on [defib] don't mention how to revive that...") + return else if(user.a_intent == I_HARM && !defib.safety) @@ -400,8 +413,10 @@ user.visible_message("[defib] buzzes: Resuscitation failed - Severe tissue damage detected.") else if(ghost) user.visible_message("[defib] buzzes: Resuscitation failed: Patient's brain is unresponsive. Further attempts may succeed.") - ghost << "Your heart is being defibrillated. Return to your body if you want to be revived! (Verbs -> Ghost -> Re-enter corpse)" - ghost << sound('sound/effects/genetics.ogg') + to_chat(ghost, "Your heart is being defibrillated. Return to your body if you want to be revived! (Verbs -> Ghost -> Re-enter corpse)") + + to_chat(ghost, sound('sound/effects/genetics.ogg')) + else user.visible_message("[defib] buzzes: Resuscitation failed.") playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) @@ -415,7 +430,8 @@ busy = 0 update_icon() else - user << "You need to target your patient's chest with [src]." + to_chat(user, "You need to target your patient's chest with [src].") + return /obj/item/weapon/borg_defib @@ -440,9 +456,11 @@ if(busy) return if(cooldown) - user << "[src] is recharging." + to_chat(user, "[src] is recharging.") + if(!ishuman(M)) - user << "This unit is only designed to work on humanoid lifeforms." + to_chat(user, "This unit is only designed to work on humanoid lifeforms.") + return else if(user.a_intent == I_HARM && !safety) @@ -519,8 +537,10 @@ user.visible_message("[user] buzzes: Resuscitation failed - Severe tissue damage detected.") else if(ghost) user.visible_message("[user] buzzes: Resuscitation failed: Patient's brain is unresponsive. Further attempts may succeed.") - ghost << "Your heart is being defibrillated. Return to your body if you want to be revived! (Verbs -> Ghost -> Re-enter corpse)" - ghost << sound('sound/effects/genetics.ogg') + to_chat(ghost, "Your heart is being defibrillated. Return to your body if you want to be revived! (Verbs -> Ghost -> Re-enter corpse)") + + to_chat(ghost, sound('sound/effects/genetics.ogg')) + else user.visible_message("[user] buzzes: Resuscitation failed.") playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) @@ -538,5 +558,6 @@ busy = 0 update_icon() else - user << "You need to target your patient's chest with [src]." + to_chat(user, "You need to target your patient's chest with [src].") + return \ No newline at end of file diff --git a/code/game/objects/items/weapons/dice.dm b/code/game/objects/items/weapons/dice.dm index 20c580dbc01..89c1d336ac9 100644 --- a/code/game/objects/items/weapons/dice.dm +++ b/code/game/objects/items/weapons/dice.dm @@ -80,7 +80,8 @@ /* /obj/item/weapon/dice/d4/Crossed(var/mob/living/carbon/human/H) if(istype(H) && !H.shoes) - H << "You step on the D4!" + to_chat(H, "You step on the D4!") + H.apply_damage(4,BRUTE,(pick("l_leg", "r_leg"))) H.Weaken(3) *///ew. diff --git a/code/game/objects/items/weapons/dnascrambler.dm b/code/game/objects/items/weapons/dnascrambler.dm index b452c9f7236..8158f1c54aa 100644 --- a/code/game/objects/items/weapons/dnascrambler.dm +++ b/code/game/objects/items/weapons/dnascrambler.dm @@ -31,7 +31,8 @@ user.visible_message("\red [user.name] injects [M.name] with [src].") src.injected(M, user) else - user << "\red You failed to inject [M.name]." + to_chat(user, "\red You failed to inject [M.name].") + proc/injected(var/mob/living/carbon/target, var/mob/living/carbon/user) scramble(1, target, 100) diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index dd182d394aa..4169e9a283c 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -25,7 +25,8 @@ /obj/item/weapon/c4/suicide_act(var/mob/user) . = (BRUTELOSS) - viewers(user) << "[user] activates the C4 and holds it above his head! It looks like \he's going out with a bang!" + to_chat(viewers(user), "[user] activates the C4 and holds it above his head! It looks like \he's going out with a bang!") + var/message_say = "FOR NO RAISIN!" if(user.mind) if(user.mind.special_role) @@ -55,7 +56,8 @@ /obj/item/weapon/c4/attackby(var/obj/item/I, var/mob/user, params) if(istype(I, /obj/item/weapon/screwdriver)) open_panel = !open_panel - user << "You [open_panel ? "open" : "close"] the wire panel." + to_chat(user, "You [open_panel ? "open" : "close"] the wire panel.") + else if(istype(I, /obj/item/weapon/wirecutters) || istype(I, /obj/item/device/multitool) || istype(I, /obj/item/device/assembly/signaler )) wires.Interact(user) else @@ -70,7 +72,8 @@ if(newtime > 60000) newtime = 60000 timer = newtime - user << "Timer set for [timer] seconds." + to_chat(user, "Timer set for [timer] seconds.") + /obj/item/weapon/c4/afterattack(atom/target as obj|turf, mob/user as mob, flag) @@ -78,7 +81,8 @@ return if (ismob(target) || istype(target, /turf/unsimulated) || istype(target, /turf/simulated/shuttle) || istype(target, /obj/item/weapon/storage) || istype(target, /obj/item/clothing/accessory/storage) || istype(target, /obj/item/clothing/under)) return - user << "Planting explosives..." + to_chat(user, "Planting explosives...") + if(do_after(user, 50, target = target) && in_range(user, target)) user.drop_item() @@ -96,7 +100,8 @@ log_game("[key_name(user)] planted [src.name] on [target.name] at ([target.x],[target.y],[target.z]) with [timer] second fuse") target.overlays += image('icons/obj/assemblies.dmi', "plastic-explosive2") - user << "Bomb has been planted. Timer counting down from [timer]." + to_chat(user, "Bomb has been planted. Timer counting down from [timer].") + spawn(timer*10) explode(get_turf(target)) diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index d10df5735b0..ed6032c55d8 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -37,10 +37,12 @@ /obj/item/weapon/extinguisher/examine(mob/user) if(..(user, 0)) - usr << "\icon[src] [src.name] contains:" + to_chat(usr, "\icon[src] [src.name] contains:") + if(reagents && reagents.reagent_list.len) for(var/datum/reagent/R in reagents.reagent_list) - user << "\blue [R.volume] units of [R.name]" + to_chat(user, "\blue [R.volume] units of [R.name]") + /obj/item/weapon/extinguisher/New() @@ -51,7 +53,8 @@ safety = !safety src.icon_state = "[sprite_name][!safety]" src.desc = "The safety is [safety ? "on" : "off"]." - user << "The safety is [safety ? "on" : "off"]." + to_chat(user, "The safety is [safety ? "on" : "off"].") + return /obj/item/weapon/extinguisher/proc/AttemptRefill(atom/target, mob/user) @@ -59,18 +62,21 @@ var/safety_save = safety safety = 1 if(reagents.total_volume == reagents.maximum_volume) - user << "\The [src] is already full!" + to_chat(user, "\The [src] is already full!") + safety = safety_save return 1 var/obj/structure/reagent_dispensers/watertank/W = target var/transferred = W.reagents.trans_to(src, max_water) if(transferred > 0) - user << "\The [src] has been refilled by [transferred] units" + to_chat(user, "\The [src] has been refilled by [transferred] units") + playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6) for(var/datum/reagent/water/R in reagents.reagent_list) R.cooling_temperature = cooling_power else - user << "\The [W] is empty!" + to_chat(user, "\The [W] is empty!") + safety = safety_save return 1 else @@ -85,7 +91,8 @@ return if (!safety) if (src.reagents.total_volume < 1) - usr << "\The [src] is empty." + to_chat(usr, "\The [src] is empty.") + return if (world.time < src.last_use + 20) diff --git a/code/game/objects/items/weapons/fireworks.dm b/code/game/objects/items/weapons/fireworks.dm index 132dd4306f3..b0d15af37e7 100644 --- a/code/game/objects/items/weapons/fireworks.dm +++ b/code/game/objects/items/weapons/fireworks.dm @@ -9,7 +9,8 @@ obj/item/weapon/firework/attackby(obj/item/weapon/W,mob/user, params) return if (istype(W, /obj/item/weapon/weldingtool) && W:welding || istype(W,/obj/item/weapon/lighter) && W:lit) for(var/mob/M in viewers(user)) - M << "[user] lits \the [src]" + to_chat(M, "[user] lits \the [src]") + litzor = 1 icon_state = "rocket_1" S = new() @@ -31,7 +32,8 @@ obj/item/weapon/sparkler/attackby(obj/item/weapon/W,mob/user, params) return if (istype(W, /obj/item/weapon/weldingtool) && W:welding || istype(W,/obj/item/weapon/lighter) && W:lit) for(var/mob/M in viewers(user)) - M << "[user] lits \the [src]" + to_chat(M, "[user] lits \the [src]") + litzor = 1 icon_state = "sparkler_1" var/b = rand(5,9) diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index 1486cb4473d..c5ba5c80a86 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -93,7 +93,8 @@ if(isscrewdriver(W) && igniter && !lit) status = !status - user << "[igniter] is now [status ? "secured" : "unsecured"]!" + to_chat(user, "[igniter] is now [status ? "secured" : "unsecured"]!") + update_icon() return @@ -109,7 +110,8 @@ if(istype(W,/obj/item/weapon/tank/plasma)) if(ptank) - user << "There appears to already be a plasma tank loaded in [src]!" + to_chat(user, "There appears to already be a plasma tank loaded in [src]!") + return user.drop_item() ptank = W @@ -127,7 +129,8 @@ if(user.stat || user.restrained() || user.lying) return user.set_machine(src) if(!ptank) - user << "Attach a plasma tank first!" + to_chat(user, "Attach a plasma tank first!") + return var/dat = text("Flamethrower ([lit ? "Lit" : "Unlit"])
      \n Tank Pressure: [ptank.air_contents.return_pressure()]
      \nAmount to throw: - - - [throw_amount] + + +
      \nRemove plasmatank - Close
      ") user << browse(dat, "window=flamethrower;size=600x300") diff --git a/code/game/objects/items/weapons/garrote.dm b/code/game/objects/items/weapons/garrote.dm index 80114bd5dd7..3783dba12c7 100644 --- a/code/game/objects/items/weapons/garrote.dm +++ b/code/game/objects/items/weapons/garrote.dm @@ -55,11 +55,13 @@ var/mob/living/carbon/human/U = user if(!wielded) - user << "You must use both hands to garrote [M]!" + to_chat(user, "You must use both hands to garrote [M]!") + return if(!istype(M, /mob/living/carbon/human)) - user << "You don't think that garroting [M] would be very effective..." + to_chat(user, "You don't think that garroting [M] would be very effective...") + return if(M == U) @@ -67,14 +69,17 @@ return if(M.dir != U.dir) - user << "You cannot use [src] on [M] from that angle!" + to_chat(user, "You cannot use [src] on [M] from that angle!") + return if(improvised && ((M.head && (M.head.flags & HEADCOVERSMOUTH)) || (M.wear_mask && (M.wear_mask.flags & MASKCOVERSMOUTH)))) // Improvised garrotes are blocked by mouth-covering items. - user << "[M]'s neck is blocked by something they're wearing!" + to_chat(user, "[M]'s neck is blocked by something they're wearing!") + if(strangling) - user << "You cannot use [src] on two people at once!" + to_chat(user, "You cannot use [src] on two people at once!") + return unwield(U) diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm index 8ca714d7666..0792d008746 100644 --- a/code/game/objects/items/weapons/gift_wrappaper.dm +++ b/code/game/objects/items/weapons/gift_wrappaper.dm @@ -30,7 +30,8 @@ user.put_in_active_hand(gift) src.gift.add_fingerprint(user) else - user << "\blue The gift was empty!" + to_chat(user, "\blue The gift was empty!") + qdel(src) return @@ -41,16 +42,19 @@ /obj/effect/spresent/relaymove(mob/user as mob) if (user.stat) return - user << "\blue You cant move." + to_chat(user, "\blue You cant move.") + /obj/effect/spresent/attackby(obj/item/weapon/W as obj, mob/user as mob, params) ..() if (!istype(W, /obj/item/weapon/wirecutters)) - user << "\blue I need wirecutters for that." + to_chat(user, "\blue I need wirecutters for that.") + return - user << "\blue You cut open the present." + to_chat(user, "\blue You cut open the present.") + for(var/mob/M in src) //Should only be one but whatever. M.loc = src.loc @@ -141,4 +145,5 @@ max_amount = 25 /obj/item/stack/wrapping_paper/attack_self(mob/user) - user << "You need to use it on a package that has already been wrapped!" \ No newline at end of file + to_chat(user, "You need to use it on a package that has already been wrapped!") + diff --git a/code/game/objects/items/weapons/grenades/bananade.dm b/code/game/objects/items/weapons/grenades/bananade.dm index bbb86c31442..c21f507e0a5 100644 --- a/code/game/objects/items/weapons/grenades/bananade.dm +++ b/code/game/objects/items/weapons/grenades/bananade.dm @@ -40,20 +40,25 @@ var/turf/T /obj/item/weapon/grenade/bananade/casing/attackby(var/obj/item/I, mob/user as mob, params) if(istype(I, /obj/item/weapon/bananapeel)) if(fillamt < 9) - usr << "You add another banana peel to the assembly." + to_chat(usr, "You add another banana peel to the assembly.") + fillamt += 1 qdel(I) else - usr << "The bananade is full, screwdriver it shut to lock it down." + to_chat(usr, "The bananade is full, screwdriver it shut to lock it down.") + if(istype(I, /obj/item/weapon/screwdriver)) if(fillamt) var/obj/item/weapon/grenade/bananade/G = new /obj/item/weapon/grenade/bananade user.unEquip(src) user.put_in_hands(G) G.deliveryamt = src.fillamt - user << "You lock the assembly shut, readying it for HONK." + to_chat(user, "You lock the assembly shut, readying it for HONK.") + qdel(src) else - usr << "You need to add banana peels before you can ready the grenade!." + to_chat(usr, "You need to add banana peels before you can ready the grenade!.") + else - usr << "Only banana peels fit in this assembly, up to 9." \ No newline at end of file + to_chat(usr, "Only banana peels fit in this assembly, up to 9.") + diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index cb31bd859e3..d08e1c7ab00 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -93,7 +93,8 @@ message_admins("[key_name_admin(usr)] has primed a [name] for detonation at [A.name] (JMP)") log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z])") bombers += "[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z])" - user << "You prime the [name]! [det_time / 10] second\s!" + to_chat(user, "You prime the [name]! [det_time / 10] second\s!") + active = 1 update_icon() if(iscarbon(user)) @@ -113,12 +114,14 @@ if(label) label = null update_icon() - user << "You remove the label from [src]." + to_chat(user, "You remove the label from [src].") + return 1 if(istype(I, /obj/item/weapon/screwdriver)) if(stage == WIRED) if(beakers.len) - user << "You lock the assembly." + to_chat(user, "You lock the assembly.") + playsound(loc, 'sound/items/Screwdriver.ogg', 25, -3) stage = READY update_icon() @@ -140,25 +143,31 @@ message_admins("[key_name_admin(usr)] has completed [name] at [A.name] (JMP) [contained].") log_game("[key_name(usr)] has completed [name] at [bombturf.x], [bombturf.y], [bombturf.z].") else - user << "You need to add at least one beaker before locking the assembly." + to_chat(user, "You need to add at least one beaker before locking the assembly.") + else if(stage == READY && !nadeassembly) det_time = det_time == 50 ? 30 : 50 //toggle between 30 and 50 - user << "You modify the time delay. It's set for [det_time / 10] second\s." + to_chat(user, "You modify the time delay. It's set for [det_time / 10] second\s.") + else if(stage == EMPTY) - user << "You need to add an activation mechanism." + to_chat(user, "You need to add an activation mechanism.") + else if(stage == WIRED && is_type_in_list(I, allowed_containers)) if(beakers.len == 2) - user << "[src] can not hold more containers." + to_chat(user, "[src] can not hold more containers.") + return else if(I.reagents.total_volume) - user << "You add [I] to the assembly." + to_chat(user, "You add [I] to the assembly.") + user.drop_item() I.loc = src beakers += I else - user << "[I] is empty." + to_chat(user, "[I] is empty.") + else if(stage == EMPTY && istype(I, /obj/item/device/assembly_holder)) var/obj/item/device/assembly_holder/A = I @@ -173,7 +182,8 @@ A.loc = src assemblyattacher = user.ckey stage = WIRED - user << "You add [A] to [src]!" + to_chat(user, "You add [A] to [src]!") + update_icon() else if(stage == EMPTY && istype(I, /obj/item/stack/cable_coil)) @@ -181,16 +191,19 @@ C.use(1) stage = WIRED - user << "You rig [src]." + to_chat(user, "You rig [src].") + update_icon() else if(stage == READY && istype(I, /obj/item/weapon/wirecutters)) - user << "You unlock the assembly." + to_chat(user, "You unlock the assembly.") + stage = WIRED update_icon() else if(stage == WIRED && istype(I, /obj/item/weapon/wrench)) - user << "You open the grenade and remove the contents." + to_chat(user, "You open the grenade and remove the contents.") + stage = EMPTY payload_name = null label = null @@ -382,7 +395,8 @@ //make a special case you might as well do it explicitly. -Sayu /obj/item/weapon/grenade/chem_grenade/large/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/slime_extract) && stage == WIRED) - user << "You add [I] to the assembly." + to_chat(user, "You add [I] to the assembly.") + user.drop_item() I.loc = src beakers += I diff --git a/code/game/objects/items/weapons/grenades/clowngrenade.dm b/code/game/objects/items/weapons/grenades/clowngrenade.dm index 8525a27378c..40ab22742d6 100644 --- a/code/game/objects/items/weapons/grenades/clowngrenade.dm +++ b/code/game/objects/items/weapons/grenades/clowngrenade.dm @@ -69,7 +69,8 @@ if((M:shoes.flags&NOSLIP) || (M:species.bodyflags & FEET_NOSLIP)) return else - M << "\red Your feet feel like they're on fire!" + to_chat(M, "\red Your feet feel like they're on fire!") + M.take_overall_damage(0, max(0, (burned - 2))) if(!istype(M, /mob/living/carbon/slime) && !isrobot(M)) diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index bb9f1ab159d..e66a8977f2e 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -29,7 +29,8 @@ //Flash if(M.weakeyes) M.visible_message("[M] screams and collapses!") - M << "AAAAGH!" + to_chat(M, "AAAAGH!") + M.Weaken(15) //hella stunned M.Stun(15) if(ishuman(M)) @@ -54,10 +55,13 @@ M.ear_damage += rand(0, 5) M.ear_deaf = max(M.ear_deaf,15) if (M.ear_damage >= 15) - M << "Your ears start to ring badly!" + to_chat(M, "Your ears start to ring badly!") + if(prob(M.ear_damage - 10 + 5)) - M << "You can't hear anything!" + to_chat(M, "You can't hear anything!") + M.disabilities |= DEAF else if (M.ear_damage >= 5) - M << "Your ears start to ring!" \ No newline at end of file + to_chat(M, "Your ears start to ring!") + diff --git a/code/game/objects/items/weapons/grenades/ghettobomb.dm b/code/game/objects/items/weapons/grenades/ghettobomb.dm index c0f619244e6..56077622a63 100644 --- a/code/game/objects/items/weapons/grenades/ghettobomb.dm +++ b/code/game/objects/items/weapons/grenades/ghettobomb.dm @@ -8,7 +8,7 @@ user.unEquip(G) user.unEquip(src) user.put_in_hands(W) - user << "You stuff the [I] in the [src], emptying the contents beforehand." + to_chat(user, "You stuff the [I] in the [src], emptying the contents beforehand.") W.underlays += image(src.icon, icon_state = src.icon_state) qdel(I) qdel(src) @@ -38,12 +38,14 @@ if(assembled == 0) if( istype(target, /obj/structure/reagent_dispensers/fueltank)) if(target.reagents.total_volume < 50) - user << "There's not enough fuel left to work with." + to_chat(user, "There's not enough fuel left to work with.") + return var/obj/structure/reagent_dispensers/fueltank/F = target F.reagents.remove_reagent("fuel", 50, 1)//Deleting 50 fuel from the welding fuel tank, assembled = 1 - user << "You've filled the makeshift explosive with welding fuel." + to_chat(user, "You've filled the makeshift explosive with welding fuel.") + playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6) desc = "An improvised explosive assembly. Filled to the brim with 'Explosive flavor'" overlays += image('icons/obj/grenade.dmi', icon_state = "improvised_grenade_filled") @@ -56,7 +58,8 @@ var/obj/item/stack/cable_coil/C = I C.use(1) assembled = 2 - user << "You wire the igniter to detonate the fuel." + to_chat(user, "You wire the igniter to detonate the fuel.") + desc = "A weak, improvised explosive." overlays += image('icons/obj/grenade.dmi', icon_state = "improvised_grenade_wired") name = "improvised explosive" @@ -102,7 +105,8 @@ /obj/item/weapon/grenade/iedcasing/attack_self(mob/user as mob) // if(!active) if(clown_check(user)) - user << "You light the [name]!" + to_chat(user, "You light the [name]!") + active = 1 overlays -= image('icons/obj/grenade.dmi', icon_state = "improvised_grenade_filled") icon_state = initial(icon_state) + "_active" @@ -125,4 +129,5 @@ /obj/item/weapon/grenade/iedcasing/examine(mob/user) ..(user) - user << "You can't tell when it will explode!" + to_chat(user, "You can't tell when it will explode!") + diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index b2cd9a8981e..267d4fe6e05 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -15,7 +15,8 @@ /obj/item/weapon/grenade/proc/clown_check(var/mob/living/user) if((CLUMSY in user.mutations) && prob(50)) - user << "Huh? How does this thing work?" + to_chat(user, "Huh? How does this thing work?") + active = 1 icon_state = initial(icon_state) + "_active" playsound(loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) @@ -31,7 +32,8 @@ if (istype(target, /obj/item/weapon/storage)) return ..() // Trying to put it in a full container if (istype(target, /obj/item/weapon/gun/grenadelauncher)) return ..() if((user.get_active_hand() == src) && (!active) && (clown_check(user)) && target.loc != src.loc) - user << "You prime the [name]! [det_time/10] seconds!" + to_chat(user, "You prime the [name]! [det_time/10] seconds!") + active = 1 icon_state = initial(icon_state) + "_active" playsound(loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) @@ -49,14 +51,17 @@ ..(user) if(display_timer) if(det_time > 1) - user << "The timer is set to [det_time/10] second\s." + to_chat(user, "The timer is set to [det_time/10] second\s.") + else - user << "\The [src] is set for instant detonation." + to_chat(user, "\The [src] is set for instant detonation.") + /obj/item/weapon/grenade/attack_self(mob/user as mob) if(!active) if(clown_check(user)) - user << "You prime the [name]! [det_time/10] seconds!" + to_chat(user, "You prime the [name]! [det_time/10] seconds!") + active = 1 icon_state = initial(icon_state) + "_active" add_fingerprint(user) @@ -85,16 +90,20 @@ switch(det_time) if ("1") det_time = 10 - user << "You set the [name] for 1 second detonation time." + to_chat(user, "You set the [name] for 1 second detonation time.") + if ("10") det_time = 30 - user << "You set the [name] for 3 second detonation time." + to_chat(user, "You set the [name] for 3 second detonation time.") + if ("30") det_time = 50 - user << "You set the [name] for 5 second detonation time." + to_chat(user, "You set the [name] for 5 second detonation time.") + if ("50") det_time = 1 - user << "You set the [name] for instant detonation." + to_chat(user, "You set the [name] for instant detonation.") + add_fingerprint(user) ..() diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index 5f93c6a095c..a3b04053120 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -21,7 +21,8 @@ return if(CLUMSY in user.mutations && prob(50)) - user << "Uh... how do those things work?!" + to_chat(user, "Uh... how do those things work?!") + apply_cuffs(user,user) if(!C.handcuffed) @@ -31,7 +32,8 @@ playsound(loc, cuffsound, 30, 1, -2) if(do_mob(user, C, 30)) apply_cuffs(C,user) - user << "You handcuff [C]." + to_chat(user, "You handcuff [C].") + if(istype(src, /obj/item/weapon/restraints/handcuffs/cable)) feedback_add_details("handcuffs","C") else @@ -39,7 +41,8 @@ add_logs(C, user, "handcuffed", src) else - user << "You fail to handcuff [C]." + to_chat(user, "You fail to handcuff [C].") + /obj/item/weapon/restraints/handcuffs/proc/apply_cuffs(mob/living/carbon/target, mob/user) if(!target.handcuffed) @@ -99,10 +102,12 @@ if(!remove_item_from_storage(user)) user.unEquip(src) user.put_in_hands(W) - user << "You wrap the cable restraint around the top of the rod." + to_chat(user, "You wrap the cable restraint around the top of the rod.") + qdel(src) else - user << "You need one rod to make a wired rod." + to_chat(user, "You need one rod to make a wired rod.") + return /obj/item/weapon/restraints/handcuffs/cable/zipties @@ -122,10 +127,12 @@ if(!C.handcuffed) C.handcuffed = new /obj/item/weapon/restraints/handcuffs/cable/zipties/used(C) C.update_inv_handcuffed(1) - user << "You handcuff [C]." + to_chat(user, "You handcuff [C].") + add_logs(C, user, "ziptie-cuffed") else - user << "You fail to handcuff [C]." + to_chat(user, "You fail to handcuff [C].") + /obj/item/weapon/restraints/handcuffs/cable/zipties/used desc = "A pair of broken zipties." @@ -173,17 +180,20 @@ if(ishuman(user) && !user.stat && !user.restrained()) armed = !armed icon_state = "beartrap[armed]" - user << "[src] is now [armed ? "armed" : "disarmed"]" + to_chat(user, "[src] is now [armed ? "armed" : "disarmed"]") + /obj/item/weapon/restraints/legcuffs/beartrap/attackby(var/obj/item/I, mob/user as mob) //Let's get explosive. if(istype(I, /obj/item/weapon/grenade/iedcasing)) if(IED) - user << "This beartrap already has an IED hooked up to it!" + to_chat(user, "This beartrap already has an IED hooked up to it!") + return IED = I switch(IED.assembled) if(0,1) //if it's not fueled/hooked up - user << "You haven't prepared this IED yet!" + to_chat(user, "You haven't prepared this IED yet!") + IED = null return if(2,3) @@ -191,17 +201,20 @@ I.forceMove(src) message_admins("[key_name_admin(user)] has rigged a beartrap with an IED.") log_game("[key_name(user)] has rigged a beartrap with an IED.") - user << "You sneak the [IED] underneath the pressure plate and connect the trigger wire." + to_chat(user, "You sneak the [IED] underneath the pressure plate and connect the trigger wire.") + desc = "A trap used to catch bears and other legged creatures. There is an IED hooked up to it." else - user << "You shouldn't be reading this message! Contact a coder or someone, something broke!" + to_chat(user, "You shouldn't be reading this message! Contact a coder or someone, something broke!") + IED = null return if(istype(I, /obj/item/weapon/screwdriver)) if(IED) IED.forceMove(get_turf(src)) IED = null - user << "You remove the IED from the [src]." + to_chat(user, "You remove the IED from the [src].") + return ..() diff --git a/code/game/objects/items/weapons/holosign.dm b/code/game/objects/items/weapons/holosign.dm index 49b6a7ad645..a76a80b1b62 100644 --- a/code/game/objects/items/weapons/holosign.dm +++ b/code/game/objects/items/weapons/holosign.dm @@ -18,16 +18,19 @@ var/turf/T = get_turf(target) var/obj/effect/overlay/holograph/H = locate() in T if(H) - user << "You use [src] to destroy [H]." + to_chat(user, "You use [src] to destroy [H].") + signs -= H qdel(H) else if(signs.len < max_signs) H = new(get_turf(target)) signs += H - user << "You create \a [H] with [src]." + to_chat(user, "You create \a [H] with [src].") + else - user << "[src] is projecting at max capacity!" + to_chat(user, "[src] is projecting at max capacity!") + /obj/item/weapon/holosign_creator/attack(mob/living/carbon/human/M, mob/user) return @@ -38,7 +41,8 @@ for(var/sign in L) qdel(sign) signs -= sign - user << "You clear all active holograms." + to_chat(user, "You clear all active holograms.") + /obj/effect/overlay/holograph name = "wet floor sign" diff --git a/code/game/objects/items/weapons/implants/implant_chem.dm b/code/game/objects/items/weapons/implants/implant_chem.dm index a0540dbe79c..920cf1bd6e4 100644 --- a/code/game/objects/items/weapons/implants/implant_chem.dm +++ b/code/game/objects/items/weapons/implants/implant_chem.dm @@ -46,9 +46,11 @@ else injectamount = cause reagents.trans_to(R, injectamount) - R << "You hear a faint beep." + to_chat(R, "You hear a faint beep.") + if(!reagents.total_volume) - R << "You hear a faint click from your chest." + to_chat(R, "You hear a faint click from your chest.") + qdel(src) diff --git a/code/game/objects/items/weapons/implants/implant_explosive.dm b/code/game/objects/items/weapons/implants/implant_explosive.dm index 3006a437943..4a05f2a784b 100644 --- a/code/game/objects/items/weapons/implants/implant_explosive.dm +++ b/code/game/objects/items/weapons/implants/implant_explosive.dm @@ -31,7 +31,8 @@ heavy = round(heavy) medium = round(medium) weak = round(weak) - imp_in << "You activate your microbomb implant." + to_chat(imp_in, "You activate your microbomb implant.") + //If the delay is short, just blow up already jeez if(delay <= 7) explosion(src,heavy,medium,weak,weak, flame_range = weak) @@ -85,7 +86,8 @@ if(!cause || !imp_in) return 0 if(cause == "action_button" && alert(imp_in, "Are you sure you want to activate your macrobomb implant? This will cause you to explode and gib!", "Macrobomb Implant Confirmation", "Yes", "No") != "Yes") return 0 - imp_in << "You activate your macrobomb implant." + to_chat(imp_in, "You activate your macrobomb implant.") + timed_explosion() /obj/item/weapon/implant/explosive/macro/implant(mob/source) diff --git a/code/game/objects/items/weapons/implants/implant_freedom.dm b/code/game/objects/items/weapons/implants/implant_freedom.dm index e3e70e982a2..17ef3d53997 100644 --- a/code/game/objects/items/weapons/implants/implant_freedom.dm +++ b/code/game/objects/items/weapons/implants/implant_freedom.dm @@ -10,7 +10,8 @@ /obj/item/weapon/implant/freedom/activate() if(uses == 0) return 0 if(uses != -1) uses-- - imp_in << "You feel a faint click." + to_chat(imp_in, "You feel a faint click.") + if(iscarbon(imp_in)) var/mob/living/carbon/C_imp_in = imp_in C_imp_in.uncuff() diff --git a/code/game/objects/items/weapons/implants/implant_loyality.dm b/code/game/objects/items/weapons/implants/implant_loyality.dm index 088c70bf3c1..84cdb16f379 100644 --- a/code/game/objects/items/weapons/implants/implant_loyality.dm +++ b/code/game/objects/items/weapons/implants/implant_loyality.dm @@ -27,16 +27,19 @@ if(target.mind in ticker.mode.revolutionaries) ticker.mode.remove_revolutionary(target.mind) if(target.mind in ticker.mode.cult) - target << "You feel the corporate tendrils of Nanotrasen try to invade your mind!" + to_chat(target, "You feel the corporate tendrils of Nanotrasen try to invade your mind!") + else - target << "You feel a surge of loyalty towards Nanotrasen." + to_chat(target, "You feel a surge of loyalty towards Nanotrasen.") + return 1 return 0 /obj/item/weapon/implant/loyalty/removed(mob/target, var/silent = 0) if(..()) if(target.stat != DEAD && !silent) - target << "You feel a sense of liberation as Nanotrasen's grip on your mind fades away." + to_chat(target, "You feel a sense of liberation as Nanotrasen's grip on your mind fades away.") + return 1 return 0 diff --git a/code/game/objects/items/weapons/implants/implant_misc.dm b/code/game/objects/items/weapons/implants/implant_misc.dm index 79b7285e2d4..24373783827 100644 --- a/code/game/objects/items/weapons/implants/implant_misc.dm +++ b/code/game/objects/items/weapons/implants/implant_misc.dm @@ -35,7 +35,8 @@ /obj/item/weapon/implant/adrenalin/activate() if(uses < 1) return 0 uses-- - imp_in << "You feel a sudden surge of energy!" + to_chat(imp_in, "You feel a sudden surge of energy!") + imp_in.SetStunned(0) imp_in.SetWeakened(0) imp_in.SetParalysis(0) diff --git a/code/game/objects/items/weapons/implants/implant_traitor.dm b/code/game/objects/items/weapons/implants/implant_traitor.dm index fdb30eaae8e..464ae5f74d5 100644 --- a/code/game/objects/items/weapons/implants/implant_traitor.dm +++ b/code/game/objects/items/weapons/implants/implant_traitor.dm @@ -31,7 +31,8 @@ if(!M.mind) return 0 if(M == user) - user << "Making yourself loyal to yourself was a great idea! Perhaps even the best idea ever! Actually, you just feel like an idiot." + to_chat(user, "Making yourself loyal to yourself was a great idea! Perhaps even the best idea ever! Actually, you just feel like an idiot.") + if(isliving(user)) var/mob/living/L = user L.adjustBrainLoss(20) @@ -44,7 +45,8 @@ qdel(src) return -1 H.implanting = 1 - H << "You feel completely loyal to [user.name]." + to_chat(H, "You feel completely loyal to [user.name].") + if(!(user.mind in ticker.mode:implanter)) ticker.mode:implanter[ref] = list() implanters = ticker.mode:implanter[ref] @@ -55,14 +57,16 @@ ticker.mode:implanter[ref] = implanters ticker.mode.traitors += H.mind H.mind.special_role = "traitor" - H << "You're now completely loyal to [user.name]! You now must lay down your life to protect them and assist in their goals at any cost." + to_chat(H, "You're now completely loyal to [user.name]! You now must lay down your life to protect them and assist in their goals at any cost.") + var/datum/objective/protect/p = new p.owner = H.mind p.target = user:mind p.explanation_text = "Obey every order from and protect [user:real_name], the [user:mind:assigned_role=="MODE" ? (user:mind:special_role) : (user:mind:assigned_role)]." H.mind.objectives += p for(var/datum/objective/objective in H.mind.objectives) - H << "Objective #1: [objective.explanation_text]" + to_chat(H, "Objective #1: [objective.explanation_text]") + ticker.mode.update_traitor_icons_added(user.mind) ticker.mode.update_traitor_icons_added(H.mind)//handles datahuds/observerhuds diff --git a/code/game/objects/items/weapons/implants/implantchair.dm b/code/game/objects/items/weapons/implants/implantchair.dm index 9a5633c0ba3..49a84275994 100644 --- a/code/game/objects/items/weapons/implants/implantchair.dm +++ b/code/game/objects/items/weapons/implants/implantchair.dm @@ -81,7 +81,8 @@ return var/mob/M = G.affecting if(M.buckled_mob) - usr << "[M] will not fit into [src] because they have a slime latched onto their head." + to_chat(usr, "[M] will not fit into [src] because they have a slime latched onto their head.") + return if(put_mob(M)) qdel(G) @@ -108,10 +109,12 @@ /obj/machinery/implantchair/put_mob(mob/living/carbon/M) if(!iscarbon(M)) - usr << "The [src.name] cannot hold this!" + to_chat(usr, "The [src.name] cannot hold this!") + return if(src.occupant) - usr << "The [src.name] is already occupied!" + to_chat(usr, "The [src.name] is already occupied!") + return if(M.client) M.client.perspective = EYE_PERSPECTIVE diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/game/objects/items/weapons/implants/implanter.dm index 0fd4aaa2218..866eee0cd80 100644 --- a/code/game/objects/items/weapons/implants/implanter.dm +++ b/code/game/objects/items/weapons/implants/implanter.dm @@ -33,7 +33,8 @@ if(user && M && (get_turf(M) == T) && src && imp) if(imp.implant(M, user)) if (M == user) - user << "You implant yourself." + to_chat(user, "You implant yourself.") + else M.visible_message("[user] has implanted [M].", "[user] implants you.") imp = null diff --git a/code/game/objects/items/weapons/implants/implantpad.dm b/code/game/objects/items/weapons/implants/implantpad.dm index 98aca2efe5d..1c79613d34c 100644 --- a/code/game/objects/items/weapons/implants/implantpad.dm +++ b/code/game/objects/items/weapons/implants/implantpad.dm @@ -27,7 +27,8 @@ if(!user || !C) return if(case) - user << "There's already an implant in the pad!" + to_chat(user, "There's already an implant in the pad!") + return user.unEquip(C) C.forceMove(src) @@ -36,7 +37,8 @@ /obj/item/weapon/implantpad/proc/dropcase(mob/user as mob) if(!case) - user << "There's no implant in the pad!" + to_chat(user, "There's no implant in the pad!") + return if(user) if(user.put_in_hands(case)) diff --git a/code/game/objects/items/weapons/legcuffs.dm b/code/game/objects/items/weapons/legcuffs.dm index 16fc9f046bd..1899911ba7b 100644 --- a/code/game/objects/items/weapons/legcuffs.dm +++ b/code/game/objects/items/weapons/legcuffs.dm @@ -31,7 +31,8 @@ var/thrown_from /obj/item/weapon/legcuffs/bolas/suicide_act(mob/living/user) - viewers(user) << "[user] is wrapping the [src.name] around \his neck! It looks like \he's trying to commit suicide." + to_chat(viewers(user), "[user] is wrapping the [src.name] around \his neck! It looks like \he's trying to commit suicide.") + return(OXYLOSS) /obj/item/weapon/legcuffs/bolas/throw_at(var/atom/A, throw_range, throw_speed) @@ -39,7 +40,8 @@ if(istype(usr, /mob/living/carbon/human)) //if the user is human var/mob/living/carbon/human/H = usr if((CLUMSY in H.mutations) && prob(50)) - H <<"You smack yourself in the face while swinging the [src]!" + to_chat(H, "You smack yourself in the face while swinging the [src]!") + H.Stun(2) H.drop_item(src) return diff --git a/code/game/objects/items/weapons/lighters.dm b/code/game/objects/items/weapons/lighters.dm index d80c28704ad..aef7bb1af73 100644 --- a/code/game/objects/items/weapons/lighters.dm +++ b/code/game/objects/items/weapons/lighters.dm @@ -45,7 +45,8 @@ if(prob(75)) user.visible_message("After a few attempts, [user] manages to light the [src].") else - user << "You burn yourself while lighting the lighter." + to_chat(user, "You burn yourself while lighting the lighter.") + user.adjustFireLoss(5) user.visible_message("After a few attempts, [user] manages to light the [src], they however burn their finger in the process.") diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index 040a42b4cb8..b523813dcb7 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -16,7 +16,8 @@ /obj/item/weapon/melee/energy/attack_self(mob/living/carbon/user) if(user.disabilities & CLUMSY && prob(50)) - user << "You accidentally cut yourself with [src], like a doofus!" + to_chat(user, "You accidentally cut yourself with [src], like a doofus!") + user.take_organ_damage(5,5) active = !active if (active) @@ -31,7 +32,8 @@ icon_state = "sword[item_color]" w_class = w_class_on playsound(user, 'sound/weapons/saberon.ogg', 35, 1) //changed it from 50% volume to 35% because deafness - user << "[src] is now active." + to_chat(user, "[src] is now active.") + else force = initial(force) throwforce = initial(throwforce) @@ -41,7 +43,8 @@ icon_state = initial(icon_state) w_class = initial(w_class) playsound(user, 'sound/weapons/saberoff.ogg', 35, 1) //changed it from 50% volume to 35% because deafness - user << "[src] can now be concealed." + to_chat(user, "[src] can now be concealed.") + if(istype(user,/mob/living/carbon/human)) var/mob/living/carbon/human/H = user H.update_inv_l_hand() @@ -106,7 +109,8 @@ var/obj/item/weapon/stock_parts/cell/C = R.cell if(active && !(C.use(hitcost))) attack_self() - R << "It's out of charge!" + to_chat(R, "It's out of charge!") + return ..() return @@ -152,11 +156,13 @@ ..() if(istype(W, /obj/item/weapon/melee/energy/sword/saber)) if(W == src) - user << "You try to attach the end of the energy sword to... itself. You're not very smart, are you?" + to_chat(user, "You try to attach the end of the energy sword to... itself. You're not very smart, are you?") + if(ishuman(user)) user.adjustBrainLoss(10) else - user << "You attach the ends of the two energy swords, making a single double-bladed weapon! You're cool." + to_chat(user, "You attach the ends of the two energy swords, making a single double-bladed weapon! You're cool.") + var/obj/item/weapon/twohanded/dualsaber/newSaber = new /obj/item/weapon/twohanded/dualsaber(user.loc) if(src.hacked) // That's right, we'll only check the "original" esword. newSaber.hacked = 1 @@ -170,7 +176,8 @@ if(hacked == 0) hacked = 1 item_color = "rainbow" - user << "RNBW_ENGAGE" + to_chat(user, "RNBW_ENGAGE") + if(active) icon_state = "swordrainbow" @@ -182,7 +189,8 @@ user.update_inv_l_hand() else - user << "It's already fabulous!" + to_chat(user, "It's already fabulous!") + /obj/item/weapon/melee/energy/sword/pirate name = "energy cutlass" diff --git a/code/game/objects/items/weapons/melee/misc.dm b/code/game/objects/items/weapons/melee/misc.dm index 7e95235ff4a..821e5dbe886 100644 --- a/code/game/objects/items/weapons/melee/misc.dm +++ b/code/game/objects/items/weapons/melee/misc.dm @@ -17,7 +17,8 @@ /obj/item/weapon/melee/chainofcommand/suicide_act(mob/user) - viewers(user) << "[user] is strangling \himself with the [src.name]! It looks like \he's trying to commit suicide." + to_chat(viewers(user), "[user] is strangling \himself with the [src.name]! It looks like \he's trying to commit suicide.") + return (OXYLOSS) diff --git a/code/game/objects/items/weapons/misc.dm b/code/game/objects/items/weapons/misc.dm index 90191efbf70..368f19dd0e7 100644 --- a/code/game/objects/items/weapons/misc.dm +++ b/code/game/objects/items/weapons/misc.dm @@ -93,7 +93,8 @@ afterattack(atom/A as mob|obj|turf|area, mob/living/user as mob|obj, flag, params) var/angle = get_angle(A, user) - //world << angle +// to_chat(world, angle) + angle = round(angle) + 45 if(angle > 180) angle -= 180 @@ -102,9 +103,11 @@ if(!angle) angle = 1 - //world << "adjusted [angle]" +// to_chat(world, "adjusted [angle]") + icon_state = "[angle]" - //world << "[angle] [(get_dist(user, A) - 1)]" +// to_chat(world, "[angle] [(get_dist(user, A) - 1)]") + user.Beam(A, "lightning", 'icons/obj/zap.dmi', 50, 15) /obj/item/weapon/newton diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index 521c75f63fd..3ea41bc420e 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -39,7 +39,8 @@ if(!proximity) return if(reagents.total_volume < 1) - user << "Your mop is dry!" + to_chat(user, "Your mop is dry!") + return var/turf/simulated/turf = A @@ -51,7 +52,8 @@ user.visible_message("[user] begins to clean \the [turf] with [src].", "You begin to clean \the [turf] with [src]...") if(do_after(user, src.mopspeed, target = turf)) - user << "You finish mopping." + to_chat(user, "You finish mopping.") + clean(turf) @@ -67,7 +69,8 @@ /obj/item/weapon/mop/wash(mob/user, atom/source) reagents.add_reagent("water", 5) - user << "You wet [src] in [source]." + to_chat(user, "You wet [src] in [source].") + playsound(loc, 'sound/effects/slosh.ogg', 25, 1) return 1 diff --git a/code/game/objects/items/weapons/pneumaticCannon.dm b/code/game/objects/items/weapons/pneumaticCannon.dm index e5889b923d2..af2987a8dfc 100644 --- a/code/game/objects/items/weapons/pneumaticCannon.dm +++ b/code/game/objects/items/weapons/pneumaticCannon.dm @@ -20,25 +20,30 @@ /obj/item/weapon/pneumatic_cannon/examine(mob/user) ..() if(!in_range(user, src)) - user << "You'll need to get closer to see any more." + to_chat(user, "You'll need to get closer to see any more.") + return for(var/obj/item/I in loadedItems) spawn(0) - user << "\icon [I] It has \the [I] loaded." + to_chat(user, "\icon [I] It has \the [I] loaded.") + if(tank) - user << "\icon [tank] It has \the [tank] mounted onto it." + to_chat(user, "\icon [tank] It has \the [tank] mounted onto it.") + /obj/item/weapon/pneumatic_cannon/attackby(obj/item/weapon/W, mob/user, params) ..() if(istype(W, /obj/item/weapon/tank/) && !tank) if(istype(W, /obj/item/weapon/tank/emergency_oxygen)) - user << "\The [W] is too small for \the [src]." + to_chat(user, "\The [W] is too small for \the [src].") + return updateTank(W, 0, user) return if(W.type == type) - user << "You're fairly certain that putting a pneumatic cannon inside another pneumatic cannon would cause a spacetime disruption." + to_chat(user, "You're fairly certain that putting a pneumatic cannon inside another pneumatic cannon would cause a spacetime disruption.") + return if(istype(W, /obj/item/weapon/wrench)) switch(pressureSetting) @@ -48,25 +53,30 @@ pressureSetting = 3 if(3) pressureSetting = 1 - user << "You tweak \the [src]'s pressure output to [pressureSetting]." + to_chat(user, "You tweak \the [src]'s pressure output to [pressureSetting].") + return if(istype(W, /obj/item/weapon/screwdriver) && tank) updateTank(tank, 1, user) return if(loadedWeightClass >= maxWeightClass) - user << "\The [src] can't hold any more items!" + to_chat(user, "\The [src] can't hold any more items!") + return if(istype(W, /obj/item)) var/obj/item/IW = W if((loadedWeightClass + IW.w_class) > maxWeightClass) - user << "\The [IW] won't fit into \the [src]!" + to_chat(user, "\The [IW] won't fit into \the [src]!") + return if(IW.w_class > src.w_class) - user << "\The [IW] is too large to fit into \the [src]!" + to_chat(user, "\The [IW] is too large to fit into \the [src]!") + return if(!user.unEquip(W)) return - user << "You load \the [IW] into \the [src]." + to_chat(user, "You load \the [IW] into \the [src].") + loadedItems.Add(IW) loadedWeightClass += IW.w_class IW.loc = src @@ -90,13 +100,16 @@ return var/discharge = 0 if(!loadedItems || !loadedWeightClass) - user << "\The [src] has nothing loaded." + to_chat(user, "\The [src] has nothing loaded.") + return if(!tank) - user << "\The [src] can't fire without a source of gas." + to_chat(user, "\The [src] can't fire without a source of gas.") + return if(tank && !tank.air_contents.remove(gasPerThrow * pressureSetting)) - user << "\The [src] lets out a weak hiss and doesn't react!" + to_chat(user, "\The [src] lets out a weak hiss and doesn't react!") + return if(user && (CLUMSY in user.mutations) && prob(75)) user.visible_message("[user] loses their grip on [src], causing it to go off!", "[src] slips out of your hands and goes off!") @@ -146,17 +159,20 @@ if(removing) if(!src.tank) return - user << "You detach \the [thetank] from \the [src]." + to_chat(user, "You detach \the [thetank] from \the [src].") + src.tank.loc = get_turf(user) user.put_in_hands(tank) src.tank = null if(!removing) if(src.tank) - user << "\The [src] already has a tank." + to_chat(user, "\The [src] already has a tank.") + return if(!user.unEquip(thetank)) return - user << "You hook \the [thetank] up to \the [src]." + to_chat(user, "You hook \the [thetank] up to \the [src].") + src.tank = thetank thetank.loc = src src.update_icons() diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm index f884e3b368b..e5733b50e38 100644 --- a/code/game/objects/items/weapons/power_cells.dm +++ b/code/game/objects/items/weapons/power_cells.dm @@ -18,7 +18,8 @@ var/minor_fault = 0 //If not 100% reliable, it will build up faults. suicide_act(mob/user) - viewers(user) << "[user] is licking the electrodes of the [src.name]! It looks like \he's trying to commit suicide." + to_chat(viewers(user), "[user] is licking the electrodes of the [src.name]! It looks like \he's trying to commit suicide.") + return (FIRELOSS) /obj/item/weapon/stock_parts/cell/crap diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm index 8458058c131..faab7fbef35 100644 --- a/code/game/objects/items/weapons/scrolls.dm +++ b/code/game/objects/items/weapons/scrolls.dm @@ -55,7 +55,8 @@ return if(thearea.tele_proof && !istype(thearea, /area/wizard_station)) - user << "A mysterious force disrupts your arcane spell matrix, and you remain where you are." + to_chat(user, "A mysterious force disrupts your arcane spell matrix, and you remain where you are.") + return var/datum/effect/system/harmless_smoke_spread/smoke = new /datum/effect/system/harmless_smoke_spread() @@ -74,7 +75,8 @@ L+=T if(!L.len) - user <<"The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry." + to_chat(user, "The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry.") + return if(user && user.buckled) diff --git a/code/game/objects/items/weapons/shards.dm b/code/game/objects/items/weapons/shards.dm index 70513198e39..a3c221d376c 100644 --- a/code/game/objects/items/weapons/shards.dm +++ b/code/game/objects/items/weapons/shards.dm @@ -16,8 +16,8 @@ hitsound = 'sound/weapons/bladeslice.ogg' /obj/item/weapon/shard/suicide_act(mob/user) - viewers(user) << pick("\red [user] is slitting \his wrists with \the [src]! It looks like \he's trying to commit suicide.", \ - "\red [user] is slitting \his throat with \the [src]! It looks like \he's trying to commit suicide.") + to_chat(viewers(user), pick("\red [user] is slitting \his wrists with \the [src]! It looks like \he's trying to commit suicide.", + "\red [user] is slitting \his throat with \the [src]! It looks like \he's trying to commit suicide.")) return (BRUTELOSS) /obj/item/weapon/shard/New() @@ -46,7 +46,8 @@ if(G.amount >= G.max_amount) continue G.attackby(NG, user) - user << "You add the newly-formed glass to the stack. It now contains [NG.amount] sheet\s." + to_chat(user, "You add the newly-formed glass to the stack. It now contains [NG.amount] sheet\s.") + qdel(src) ..() @@ -55,7 +56,8 @@ var/mob/living/M = AM if (M.incorporeal_move || M.flying)//you are incorporal or flying..no shard stepping! return - M << "\red You step on \the [src]!" + to_chat(M, "\red You step on \the [src]!") + playsound(src.loc, 'sound/effects/glass_step.ogg', 50, 1) // not sure how to handle metal shards with sounds if(ishuman(M)) var/mob/living/carbon/human/H = M diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm index 222960e9a5a..08586e876f1 100644 --- a/code/game/objects/items/weapons/shields.dm +++ b/code/game/objects/items/weapons/shields.dm @@ -70,7 +70,8 @@ /obj/item/weapon/shield/energy/attack_self(mob/living/carbon/human/user) if(user.disabilities & CLUMSY && prob(50)) - user << "You beat yourself in the head with [src]." + to_chat(user, "You beat yourself in the head with [src].") + user.take_organ_damage(5) active = !active icon_state = "eshield[active]" @@ -81,14 +82,16 @@ throw_speed = 2 w_class = 4 playsound(user, 'sound/weapons/saberon.ogg', 35, 1) - user << "[src] is now active." + to_chat(user, "[src] is now active.") + else force = 3 throwforce = 3 throw_speed = 3 w_class = 1 playsound(user, 'sound/weapons/saberoff.ogg', 35, 1) - user << "[src] can now be concealed." + to_chat(user, "[src] can now be concealed.") + if(istype(user,/mob/living/carbon/human)) var/mob/living/carbon/human/H = user H.update_inv_l_hand() @@ -123,14 +126,16 @@ throw_speed = 2 w_class = 4 slot_flags = SLOT_BACK - user << "You extend \the [src]." + to_chat(user, "You extend \the [src].") + else force = 3 throwforce = 3 throw_speed = 3 w_class = 3 slot_flags = null - user << "[src] can now be concealed." + to_chat(user, "[src] can now be concealed.") + if(istype(user,/mob/living/carbon/human)) var/mob/living/carbon/human/H = user H.update_inv_l_hand() @@ -157,10 +162,12 @@ /obj/item/weapon/cloaking_device/attack_self(mob/user as mob) src.active = !( src.active ) if (src.active) - user << "\blue The cloaking device is now active." + to_chat(user, "\blue The cloaking device is now active.") + src.icon_state = "shield1" else - user << "\blue The cloaking device is now inactive." + to_chat(user, "\blue The cloaking device is now inactive.") + src.icon_state = "shield0" src.add_fingerprint(user) return diff --git a/code/game/objects/items/weapons/soap.dm b/code/game/objects/items/weapons/soap.dm index 02f3289dad8..3c9a45fa59d 100644 --- a/code/game/objects/items/weapons/soap.dm +++ b/code/game/objects/items/weapons/soap.dm @@ -28,11 +28,13 @@ if(!proximity) return if(user.client && (target in user.client.screen)) - user << "You need to take that [target.name] off before 'cleaning' it." + to_chat(user, "You need to take that [target.name] off before 'cleaning' it.") + else user.visible_message("[user] begins to smear [src] on \the [target.name].") if(do_after(user, src.cleanspeed, target = target)) - user << "You 'clean' \the [target.name]." + to_chat(user, "You 'clean' \the [target.name].") + if(istype(target, /turf/simulated)) new /obj/effect/decal/cleanable/blood/gibs/cleangibs(target) else if (istype(target,/mob/living/carbon)) diff --git a/code/game/objects/items/weapons/staff.dm b/code/game/objects/items/weapons/staff.dm index 9cf7b4cce63..5b6149f159f 100644 --- a/code/game/objects/items/weapons/staff.dm +++ b/code/game/objects/items/weapons/staff.dm @@ -29,7 +29,8 @@ if(user.mind in ticker.mode.wizards) user.flying = wielded ? 1 : 0 if(wielded) - user << "You hold \the [src] between your legs." + to_chat(user, "You hold \the [src] between your legs.") + user.say("QUID 'ITCH") animate(user, pixel_y = pixel_y + 10 , time = 10, loop = 1, easing = SINE_EASING) else @@ -40,7 +41,8 @@ user.pixel_y -= 6 else if(wielded) - user << "You hold \the [src] between your legs." + to_chat(user, "You hold \the [src] between your legs.") + /obj/item/weapon/twohanded/staff/broom/attackby(var/obj/O, mob/user) if(istype(O, /obj/item/clothing/mask/horsehead)) diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 98c626c2595..bfdeef880fa 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -42,7 +42,8 @@ attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(crit_fail) - user << "\red The Bluespace generator isn't working." + to_chat(user, "\red The Bluespace generator isn't working.") + return else if(istype(W, /obj/item/weapon/storage/backpack/holding) && !W.crit_fail) var/response = alert(user, "Are you sure you want to put the bag of holding inside another bag of holding?","Are you sure you want to die?","Yes","No") @@ -65,9 +66,12 @@ proc/failcheck(mob/user as mob) if (prob(src.reliability)) return 1 //No failure if (prob(src.reliability)) - user << "\red The Bluespace portal resists your attempt to add another item." //light failure + to_chat(user, "\red The Bluespace portal resists your attempt to add another item.")//light failure + + else - user << "\red The Bluespace generator malfunctions!" + to_chat(user, "\red The Bluespace generator malfunctions!") + for (var/obj/O in src.contents) //it broke, delete what was in it qdel(O) crit_fail = 1 diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index ef0429347f0..707a5d06bec 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -93,7 +93,8 @@ /obj/item/weapon/storage/bag/plasticbag/mob_can_equip(M as mob, slot) if(slot==slot_head && contents.len) - M << "\red You need to empty the bag first!" + to_chat(M, "\red You need to empty the bag first!") + return 0 return ..() @@ -226,14 +227,16 @@ can_be_inserted(obj/item/W as obj, stop_messages = 0) if(!istype(W,/obj/item/stack/sheet) || istype(W,/obj/item/stack/sheet/mineral/sandstone) || istype(W,/obj/item/stack/sheet/wood)) if(!stop_messages) - usr << "The snatcher does not accept [W]." + to_chat(usr, "The snatcher does not accept [W].") + return 0 //I don't care, but the existing code rejects them for not being "sheets" *shrug* -Sayu var/current = 0 for(var/obj/item/stack/sheet/S in contents) current += S.amount if(capacity == current)//If it's full, you're done if(!stop_messages) - usr << "\red The snatcher is full." + to_chat(usr, "\red The snatcher is full.") + return 0 return 1 diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 118ca1855f0..af1e97bcd6a 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -413,9 +413,12 @@ proc/failcheck(mob/user as mob) if (prob(src.reliability)) return 1 //No failure if (prob(src.reliability)) - user << "\red The Bluespace portal resists your attempt to add another item." //light failure + to_chat(user, "\red The Bluespace portal resists your attempt to add another item.")//light failure + + else - user << "\red The Bluespace generator malfunctions!" + to_chat(user, "\red The Bluespace generator malfunctions!") + for (var/obj/O in src.contents) //it broke, delete what was in it qdel(O) crit_fail = 1 @@ -490,7 +493,8 @@ return if (istype(target, /turf/unsimulated) || istype(target, /turf/simulated/shuttle) || istype(target, /obj/item/weapon/storage) || istype(target, /obj/structure/table) || istype(target, /obj/structure/closet)) return - user << "Planting explosives..." + to_chat(user, "Planting explosives...") + user.visible_message("[user.name] is fiddling with their toolbelt.") if(ismob(target)) user.attack_log += "\[[time_stamp()]\] [user.real_name] tried planting [name] on [target:real_name] ([target:ckey])" @@ -508,7 +512,8 @@ target:attack_log += "\[[time_stamp()]\] Had the [name] planted on them by [user.real_name] ([user.ckey])" user.visible_message("\red [user.name] finished planting an explosive on [target.name]!") target.overlays += image('icons/obj/assemblies.dmi', "plastic-explosive2") - user << "You sacrifice your belt for the sake of justice. Timer counting down from 15." + to_chat(user, "You sacrifice your belt for the sake of justice. Timer counting down from 15.") + spawn(150) if(target) if(ismob(target) || isobj(target)) diff --git a/code/game/objects/items/weapons/storage/bible.dm b/code/game/objects/items/weapons/storage/bible.dm index b0106cd1f93..7ba74274c59 100644 --- a/code/game/objects/items/weapons/storage/bible.dm +++ b/code/game/objects/items/weapons/storage/bible.dm @@ -9,7 +9,8 @@ var/deity_name = "Christ" suicide_act(mob/user) - viewers(user) << "[user] stares into [src.name] and attempts to trascend understanding of the universe!" + to_chat(viewers(user), "[user] stares into [src.name] and attempts to trascend understanding of the universe!") + return (user.dust()) @@ -53,15 +54,18 @@ M.LAssailant = user if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") - user << "\red You don't have the dexterity to do this!" + to_chat(user, "\red You don't have the dexterity to do this!") + return if(!chaplain) - user << "\red The book sizzles in your hands." + to_chat(user, "\red The book sizzles in your hands.") + user.take_organ_damage(0,10) return if ((CLUMSY in user.mutations) && prob(50)) - user << "\red The [src] slips out of your hand and hits your head." + to_chat(user, "\red The [src] slips out of your hand and hits your head.") + user.take_organ_damage(10) user.Paralyse(20) return @@ -71,19 +75,23 @@ if (M.stat !=2) /*if((M.mind in ticker.mode.cult) && (prob(20))) - M << "\red The power of [src.deity_name] clears your mind of heresy!" - user << "\red You see how [M]'s eyes become clear, the cult no longer holds control over him!" + to_chat(M, "\red The power of [src.deity_name] clears your mind of heresy!") + + to_chat(user, "\red You see how [M]'s eyes become clear, the cult no longer holds control over him!") + ticker.mode.remove_cultist(M.mind)*/ if ((istype(M, /mob/living/carbon/human) && prob(60))) bless(M) for(var/mob/O in viewers(M, null)) O.show_message(text("\red [] heals [] with the power of [src.deity_name]!", user, M), 1) - M << "\red May the power of [src.deity_name] compel you to be healed!" + to_chat(M, "\red May the power of [src.deity_name] compel you to be healed!") + playsound(src.loc, "punch", 25, 1, -1) else if(ishuman(M) && !istype(M:head, /obj/item/clothing/head/helmet)) M.adjustBrainLoss(10) - M << "\red You feel dumber." + to_chat(M, "\red You feel dumber.") + for(var/mob/O in viewers(M, null)) O.show_message(text("\red [] beats [] over the head with []!", user, M, src), 1) playsound(src.loc, "punch", 25, 1, -1) @@ -97,17 +105,20 @@ if(!proximity) return if (istype(A, /turf/simulated/floor)) - user << "You hit the floor with the bible." + to_chat(user, "You hit the floor with the bible.") + if(user.mind && (user.mind.assigned_role == "Chaplain")) call(/obj/effect/rune/proc/revealrunes)(src) if(user.mind && (user.mind.assigned_role == "Chaplain")) if(A.reagents && A.reagents.has_reagent("water")) //blesses all the water in the holder - user << "You bless [A]." + to_chat(user, "You bless [A].") + var/water2holy = A.reagents.get_reagent_amount("water") A.reagents.del_reagent("water") A.reagents.add_reagent("holywater",water2holy) if(A.reagents && A.reagents.has_reagent("unholywater")) //yeah yeah, copy pasted code - sue me - user << "You purify [A]." + to_chat(user, "You purify [A].") + var/unholy2clean = A.reagents.get_reagent_amount("unholywater") A.reagents.del_reagent("unholywater") A.reagents.add_reagent("holywater",unholy2clean) diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index f460aaa1b47..a1cada9b549 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -29,11 +29,14 @@ return if(contents.len <= 0) - user << "There are no [src.icon_type]s left in the box." + to_chat(user, "There are no [src.icon_type]s left in the box.") + else if(contents.len == 1) - user << "There is one [src.icon_type] left in the box." + to_chat(user, "There is one [src.icon_type] left in the box.") + else - user << "There are [src.contents.len] [src.icon_type]s in the box." + to_chat(user, "There are [src.contents.len] [src.icon_type]s in the box.") + @@ -142,10 +145,12 @@ if(istype(W,/obj/item/toy/crayon)) switch(W:colourName) if("mime") - usr << "This crayon is too sad to be contained in this box." + to_chat(usr, "This crayon is too sad to be contained in this box.") + return if("rainbow") - usr << "This crayon is too powerful to be contained in this box." + to_chat(usr, "This crayon is too powerful to be contained in this box.") + return ..() @@ -217,12 +222,14 @@ var/obj/item/clothing/mask/cigarette/C = I lace_cigarette(C) user.equip_to_slot_if_possible(C, slot_wear_mask) - user << "You take \a [C.name] out of the pack." + to_chat(user, "You take \a [C.name] out of the pack.") + update_icon() got_cig = 1 break if(!got_cig) - user << "There are no smokables in the pack!" + to_chat(user, "There are no smokables in the pack!") + else ..() @@ -231,13 +238,15 @@ var/obj/item/weapon/match/M = W if(M.lit == 1) if(!stop_messages) - usr << "Putting a lit [W] in [src] probably isn't a good idea." + to_chat(usr, "Putting a lit [W] in [src] probably isn't a good idea.") + return 0 if(istype(W, /obj/item/weapon/lighter)) var/obj/item/weapon/lighter/L = W if(L.lit == 1) if(!stop_messages) - usr << "Putting [W] in [src] while lit probably isn't a good idea." + to_chat(usr, "Putting [W] in [src] while lit probably isn't a good idea.") + return 0 //if we get this far, handle the insertion checks as normal .=..() diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index b751481bfe0..c87af060e4f 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -248,9 +248,11 @@ if(istype(I, /obj/item/weapon/pen) || istype(I, /obj/item/device/flashlight/pen)) var/tmp_label = sanitize(input(user, "Enter a label for [name]","Label",label_text)) if(length(tmp_label) > MAX_NAME_LEN) - user << "The label can be at most [MAX_NAME_LEN] characters long." + to_chat(user, "The label can be at most [MAX_NAME_LEN] characters long.") + else - user << "You set the label to \"[tmp_label]\"." + to_chat(user, "You set the label to \"[tmp_label]\".") + label_text = tmp_label update_name_label() else diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm index 608f111060f..9ce695a7012 100644 --- a/code/game/objects/items/weapons/storage/lockbox.dm +++ b/code/game/objects/items/weapons/storage/lockbox.dm @@ -20,34 +20,40 @@ attackby(obj/item/weapon/W as obj, mob/user as mob, params) if (istype(W, /obj/item/weapon/card/id)) if(src.broken) - user << "\red It appears to be broken." + to_chat(user, "\red It appears to be broken.") + return if(src.allowed(user)) src.locked = !( src.locked ) if(src.locked) src.icon_state = src.icon_locked - user << "\red You lock the [src.name]!" + to_chat(user, "\red You lock the [src.name]!") + return else src.icon_state = src.icon_closed - user << "\red You unlock the [src.name]!" + to_chat(user, "\red You unlock the [src.name]!") + origin_tech = null //wipe out any origin tech if it's unlocked in any way so you can't double-dip tech levels at R&D. return else - user << "\red Access Denied" + to_chat(user, "\red Access Denied") + else if((istype(W, /obj/item/weapon/card/emag) || istype(W, /obj/item/weapon/melee/energy/blade)) && !broken) emag_act(user) return if(!locked) ..() else - user << "\red Its locked!" + to_chat(user, "\red Its locked!") + return show_to(mob/user as mob) if(locked) - user << "\red Its locked!" + to_chat(user, "\red Its locked!") + else ..() return @@ -56,7 +62,8 @@ if(!locked) return ..() if(!stop_messages) - usr << "[src] is locked!" + to_chat(usr, "[src] is locked!") + return 0 /obj/item/weapon/storage/lockbox/emag_act(user as mob) @@ -65,7 +72,8 @@ locked = 0 desc = "It appears to be broken." icon_state = src.icon_broken - user << "You unlock \the [src]." + to_chat(user, "You unlock \the [src].") + origin_tech = null //wipe out any origin tech if it's unlocked in any way so you can't double-dip tech levels at R&D. return diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm index d33f6e2ba7b..1a68163cbd7 100644 --- a/code/game/objects/items/weapons/storage/secure.dm +++ b/code/game/objects/items/weapons/storage/secure.dm @@ -29,7 +29,8 @@ examine(mob/user) if(..(user, 1)) - user << text("The service panel is [src.open ? "open" : "closed"].") + to_chat(user, text("The service panel is [src.open ? "open" : "closed"].")) + attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(locked) @@ -78,9 +79,11 @@ spark_system.start() playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1) playsound(src.loc, "sparks", 50, 1) - user << "You slice through the lock on [src]." + to_chat(user, "You slice through the lock on [src].") + else - user << "You short out the lock on [src]." + to_chat(user, "You short out the lock on [src].") + return @@ -144,7 +147,8 @@ if(!locked) return ..() if(!stop_messages) - usr << "[src] is locked!" + to_chat(usr, "[src] is locked!") + return 0 /obj/item/weapon/storage/secure/hear_talk(mob/living/M as mob, msg) @@ -172,7 +176,8 @@ attack_hand(mob/user as mob) if ((src.loc == user) && (src.locked == 1)) - usr << "\red [src] is locked and cannot be opened!" + to_chat(usr, "\red [src] is locked and cannot be opened!") + else if ((src.loc == user) && (!src.locked)) playsound(src.loc, "rustle", 50, 1, -5) if (user.s_active) diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 1440aa8dcf0..8eeeadea09c 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -235,7 +235,8 @@ return 0 //Means the item is already in the storage item if(contents.len >= storage_slots) if(!stop_messages) - usr << "[W] won't fit in [src], make some space!" + to_chat(usr, "[W] won't fit in [src], make some space!") + return 0 //Storage item is full if(can_hold.len) @@ -248,18 +249,21 @@ if(!stop_messages) if (istype(W, /obj/item/weapon/hand_labeler)) return 0 - usr << "[src] cannot hold [W]." + to_chat(usr, "[src] cannot hold [W].") + return 0 for(var/A in cant_hold) //Check for specific items which this container can't hold. if(istype(W, text2path(A) )) if(!stop_messages) - usr << "[src] cannot hold [W]." + to_chat(usr, "[src] cannot hold [W].") + return 0 if (W.w_class > max_w_class) if(!stop_messages) - usr << "[W] is too big for this [src]." + to_chat(usr, "[W] is too big for this [src].") + return 0 var/sum_w_class = W.w_class @@ -268,17 +272,20 @@ if(sum_w_class > max_combined_w_class) if(!stop_messages) - usr << "[src] is full, make some space." + to_chat(usr, "[src] is full, make some space.") + return 0 if(W.w_class >= src.w_class && (istype(W, /obj/item/weapon/storage))) if(!istype(src, /obj/item/weapon/storage/backpack/holding)) //bohs should be able to hold backpacks again. The override for putting a boh in a boh is in backpack.dm. if(!stop_messages) - usr << "[src] cannot hold [W] as it's a storage item of the same size." + to_chat(usr, "[src] cannot hold [W] as it's a storage item of the same size.") + return 0 //To prevent the stacking of same sized storage items. if(W.flags & NODROP) //SHOULD be handled in unEquip, but better safe than sorry. - usr << "\the [W] is stuck to your hand, you can't put it in \the [src]" + to_chat(usr, "\the [W] is stuck to your hand, you can't put it in \the [src]") + return 0 return 1 @@ -306,7 +313,8 @@ if(!prevent_warning && !istype(W, /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow)) for(var/mob/M in viewers(usr, null)) if (M == usr) - usr << "You put the [W] into [src]." + to_chat(usr, "You put the [W] into [src].") + else if (M in range(1)) //If someone is standing close enough, they can tell what it is... M.show_message("[usr] puts [W] into [src].") else if (W && W.w_class >= 3.0) //Otherwise they can only see large or normal items from a distance... @@ -359,7 +367,8 @@ ..() if(isrobot(user)) - user << "\blue You're a robot. No." + to_chat(user, "\blue You're a robot. No.") + return 1//Robots can't interact with storage items. if(!can_be_inserted(W)) @@ -406,9 +415,11 @@ collection_mode = !collection_mode switch (collection_mode) if(1) - usr << "[src] now picks up all items in a tile at once." + to_chat(usr, "[src] now picks up all items in a tile at once.") + if(0) - usr << "[src] now picks up one item at a time." + to_chat(usr, "[src] now picks up one item at a time.") + /obj/item/weapon/storage/verb/quick_empty() @@ -497,7 +508,8 @@ if ( !found ) // User is too far away return // Now make the cardboard - user << "You fold [src] flat." + to_chat(user, "You fold [src] flat.") + new src.foldable(get_turf(src)) qdel(src) //BubbleWrap END diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm index b1efb1168ff..a760475b9de 100644 --- a/code/game/objects/items/weapons/storage/toolbox.dm +++ b/code/game/objects/items/weapons/storage/toolbox.dm @@ -18,7 +18,8 @@ New() ..() if (src.type == /obj/item/weapon/storage/toolbox) - world << "BAD: [src] ([src.type]) spawned at [src.x] [src.y] [src.z]" + to_chat(world, "BAD: [src] ([src.type]) spawned at [src.x] [src.y] [src.z]") + qdel(src) /obj/item/weapon/storage/toolbox/emergency diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index 04c15fe1d97..d180686998a 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -55,24 +55,29 @@ /obj/item/weapon/melee/baton/examine(mob/user) ..(user) if(bcell) - user <<"The baton is [round(bcell.percent())]% charged." + to_chat(user, "The baton is [round(bcell.percent())]% charged.") + if(!bcell) - user <<"The baton does not have a power source installed." + to_chat(user, "The baton does not have a power source installed.") + /obj/item/weapon/melee/baton/attackby(obj/item/weapon/W, mob/user, params) if(istype(W, /obj/item/weapon/stock_parts/cell)) var/obj/item/weapon/stock_parts/cell/C = W if(bcell) - user << "[src] already has a cell." + to_chat(user, "[src] already has a cell.") + else if(C.maxcharge < hitcost) - user << "[src] requires a higher capacity cell." + to_chat(user, "[src] requires a higher capacity cell.") + return if(!user.unEquip(W)) return W.loc = src bcell = W - user << "You install a cell in [src]." + to_chat(user, "You install a cell in [src].") + update_icon() else if(istype(W, /obj/item/weapon/screwdriver)) @@ -80,7 +85,8 @@ bcell.updateicon() bcell.loc = get_turf(src.loc) bcell = null - user << "You remove the cell from the [src]." + to_chat(user, "You remove the cell from the [src].") + status = 0 update_icon() return @@ -90,14 +96,17 @@ /obj/item/weapon/melee/baton/attack_self(mob/user) if(bcell && bcell.charge > hitcost) status = !status - user << "[src] is now [status ? "on" : "off"]." + to_chat(user, "[src] is now [status ? "on" : "off"].") + playsound(loc, "sparks", 75, 1, -1) else status = 0 if(!bcell) - user << "[src] does not have a power source!" + to_chat(user, "[src] does not have a power source!") + else - user << "[src] is out of charge." + to_chat(user, "[src] is out of charge.") + update_icon() add_fingerprint(user) diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm index edf0c77e131..ae942d0df41 100644 --- a/code/game/objects/items/weapons/swords_axes_etc.dm +++ b/code/game/objects/items/weapons/swords_axes_etc.dm @@ -10,8 +10,10 @@ * Banhammer */ /obj/item/weapon/banhammer/attack(mob/M as mob, mob/user as mob) - M << " You have been banned FOR NO REISIN by [user]" - user << " You have BANNED [M]" + to_chat(M, " You have been banned FOR NO REISIN by [user]") + + to_chat(user, " You have BANNED [M]") + /* * Classic Baton @@ -33,7 +35,8 @@ if(on) add_fingerprint(user) if((CLUMSY in user.mutations) && prob(50)) - user << "You club yourself over the head." + to_chat(user, "You club yourself over the head.") + user.Weaken(3 * force) if(ishuman(user)) var/mob/living/carbon/human/H = user @@ -84,14 +87,16 @@ /obj/item/weapon/melee/classic_baton/telescopic/attack_self(mob/user as mob) on = !on if(on) - user << "You extend the baton." + to_chat(user, "You extend the baton.") + icon_state = "telebaton_1" item_state = "nullrod" w_class = 4 //doesnt fit in backpack when its on for balance force = 10 //stunbaton damage attack_verb = list("smacked", "struck", "cracked", "beaten") else - user << "You collapse the baton." + to_chat(user, "You collapse the baton.") + icon_state = "telebaton_0" item_state = null //no sprite for concealment even when in hand slot_flags = SLOT_BELT diff --git a/code/game/objects/items/weapons/table_rack_parts.dm b/code/game/objects/items/weapons/table_rack_parts.dm index d66945d1b75..6a1d65af07d 100644 --- a/code/game/objects/items/weapons/table_rack_parts.dm +++ b/code/game/objects/items/weapons/table_rack_parts.dm @@ -57,11 +57,13 @@ if (istype(W, /obj/item/stack/rods)) if (W:amount >= 4) new /obj/item/weapon/table_parts/reinforced( user.loc ) - user << "\blue You reinforce the [name]." + to_chat(user, "\blue You reinforce the [name].") + W:use(4) qdel(src) else if (W:amount < 4) - user << "\red You need at least four rods to do this." + to_chat(user, "\red You need at least four rods to do this.") + /obj/item/weapon/table_parts/attack_self(mob/user as mob) new /obj/structure/table( user.loc ) diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm index edbe4be2cd1..4d4e13324b1 100644 --- a/code/game/objects/items/weapons/tanks/jetpack.dm +++ b/code/game/objects/items/weapons/tanks/jetpack.dm @@ -29,7 +29,8 @@ return if(air_contents.oxygen < 10) - user << text("\red The meter on the [src.name] indicates you are almost out of air!") + to_chat(user, text("\red The meter on the [src.name] indicates you are almost out of air!")) + playsound(user, 'sound/effects/alert.ogg', 50, 1) @@ -37,7 +38,8 @@ set name = "Toggle Jetpack Stabilization" set category = "Object" src.stabilization_on = !( src.stabilization_on ) - usr << "You toggle the stabilization [stabilization_on? "on":"off"]." + to_chat(usr, "You toggle the stabilization [stabilization_on? "on":"off"].") + return @@ -133,7 +135,8 @@ return if(air_contents.carbon_dioxide < 10) - user << text("\red The meter on the [src.name] indicates you are almost out of air!") + to_chat(user, text("\red The meter on the [src.name] indicates you are almost out of air!")) + playsound(user, 'sound/effects/alert.ogg', 50, 1) @@ -142,7 +145,8 @@ var/obj/item/weapon/rig/holder /obj/item/weapon/tank/jetpack/rig/examine() - usr << "It's a jetpack. If you can see this, report it on the bug tracker." + to_chat(usr, "It's a jetpack. If you can see this, report it on the bug tracker.") + return 0 /obj/item/weapon/tank/jetpack/rig/allow_thrust(num, mob/living/user as mob) diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm index dc5425616ac..18de0bc0e7f 100644 --- a/code/game/objects/items/weapons/tanks/tank_types.dm +++ b/code/game/objects/items/weapons/tanks/tank_types.dm @@ -26,7 +26,8 @@ examine(mob/user) if(..(user, 0)) if(air_contents.oxygen < 10) - user << text("\red The meter on the [src.name] indicates you are almost out of air!") + to_chat(user, text("\red The meter on the [src.name] indicates you are almost out of air!")) + //playsound(usr, 'sound/effects/alert.ogg', 50, 1) @@ -71,8 +72,10 @@ examine(mob/user) if(..(user, 0)) if(air_contents.oxygen < 1 && loc==usr) - user << "\red The meter on the [src.name] indicates you are almost out of air!" - user << sound('sound/effects/alert.ogg') + to_chat(user, "\red The meter on the [src.name] indicates you are almost out of air!") + + to_chat(user, sound('sound/effects/alert.ogg')) + /obj/item/weapon/tank/air/New() ..() @@ -123,8 +126,10 @@ /obj/item/weapon/tank/plasma/plasmaman/examine(mob/user) if(..(user, 0)) if(air_contents.toxins < 0.2 && loc==usr) - user << text("\red The meter on the [src.name] indicates you are almost out of plasma!") - user << sound('sound/effects/alert.ogg') + to_chat(user, text("\red The meter on the [src.name] indicates you are almost out of plasma!")) + + to_chat(user, sound('sound/effects/alert.ogg')) + /* * Emergency Oxygen @@ -150,8 +155,10 @@ examine(mob/user) if(..(user, 0)) if(air_contents.oxygen < 0.2 && loc==usr) - user << text("\red The meter on the [src.name] indicates you are almost out of air!") - user << sound('sound/effects/alert.ogg') + to_chat(user, text("\red The meter on the [src.name] indicates you are almost out of air!")) + + to_chat(user, sound('sound/effects/alert.ogg')) + /obj/item/weapon/tank/emergency_oxygen/engi name = "extended-capacity emergency oxygen tank" @@ -191,7 +198,8 @@ /obj/item/weapon/tank/nitrogen/examine(mob/user) if(..(user, 0)) if(air_contents.nitrogen < 10) - user << text("\red The meter on the [src.name] indicates you are almost out of air!") + to_chat(user, text("\red The meter on the [src.name] indicates you are almost out of air!")) + //playsound(usr, 'sound/effects/alert.ogg', 50, 1) diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index cee2996904f..9565cb736ab 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -44,7 +44,9 @@ if (istype(src.loc, /obj/item/assembly)) icon = src.loc if (!in_range(src, user)) - if (icon == src) user << "\blue It's \a \icon[icon][src]! If you want any more information you'll need to get closer." + if (icon == src) + to_chat(user, "\blue It's \a \icon[icon][src]! If you want any more information you'll need to get closer.") + return var/celsius_temperature = src.air_contents.temperature-T0C @@ -63,7 +65,8 @@ else descriptive = "furiously hot" - user << "\blue \The \icon[icon][src] feels [descriptive]" + to_chat(user, "\blue \The \icon[icon][src] feels [descriptive]") + return @@ -166,7 +169,8 @@ if(location.internal == src) location.internal = null location.internals.icon_state = "internal0" - usr << "\blue You close the tank release valve." + to_chat(usr, "\blue You close the tank release valve.") + if (location.internals) location.internals.icon_state = "internal0" else @@ -181,11 +185,13 @@ if(can_open_valve) location.internal = src - usr << "\blue You open \the [src] valve." + to_chat(usr, "\blue You open \the [src] valve.") + if (location.internals) location.internals.icon_state = "internal1" else - usr << "\blue You need something to connect to \the [src]." + to_chat(usr, "\blue You need something to connect to \the [src].") + src.add_fingerprint(usr) return 1 @@ -232,7 +238,8 @@ if(!istype(src.loc,/obj/item/device/transfer_valve)) message_admins("Explosive tank rupture! last key to touch the tank was [src.fingerprintslast] (JMP)") log_game("Explosive tank rupture! last key to touch the tank was [src.fingerprintslast] at [x], [y], [z]") - //world << "\blue[x],[y] tank is exploding: [pressure] kPa" +// to_chat(world, "\blue[x],[y] tank is exploding: [pressure] kPa") + //Give the gas a chance to build up more pressure through reacting air_contents.react() air_contents.react() @@ -241,7 +248,8 @@ var/range = (pressure-TANK_FRAGMENT_PRESSURE)/TANK_FRAGMENT_SCALE var/turf/epicenter = get_turf(loc) - //world << "\blue Exploding Pressure: [pressure] kPa, intensity: [range]" +// to_chat(world, "\blue Exploding Pressure: [pressure] kPa, intensity: [range]") + explosion(epicenter, round(range*0.25), round(range*0.5), round(range), round(range*1.5)) if(istype(src.loc,/obj/item/device/transfer_valve)) @@ -250,7 +258,8 @@ qdel(src) else if(pressure > TANK_RUPTURE_PRESSURE) - //world << "\blue[x],[y] tank is rupturing: [pressure] kPa, integrity [integrity]" +// to_chat(world, "\blue[x],[y] tank is rupturing: [pressure] kPa, integrity [integrity]") + if(integrity <= 0) var/turf/simulated/T = get_turf(src) if(!T) @@ -262,7 +271,8 @@ integrity-- else if(pressure > TANK_LEAK_PRESSURE) - //world << "\blue[x],[y] tank is leaking: [pressure] kPa, integrity [integrity]" +// to_chat(world, "\blue[x],[y] tank is leaking: [pressure] kPa, integrity [integrity]") + if(integrity <= 0) var/turf/simulated/T = get_turf(src) if(!T) diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm index 328debd11fc..4d15aba974c 100644 --- a/code/game/objects/items/weapons/tanks/watertank.dm +++ b/code/game/objects/items/weapons/tanks/watertank.dm @@ -26,7 +26,8 @@ set name = "Toggle Mister" set category = "Object" if (usr.get_item_by_slot(slot_back) != src) - usr << "The watertank needs to be on your back to use." + to_chat(usr, "The watertank needs to be on your back to use.") + return if(usr.incapacitated()) return @@ -40,7 +41,8 @@ //Detach the nozzle into the user's hands if(!user.put_in_hands(noz)) on = 0 - user << "You need a free hand to hold the mister." + to_chat(user, "You need a free hand to hold the mister.") + return noz.loc = user else @@ -125,7 +127,8 @@ return /obj/item/weapon/reagent_containers/spray/mister/dropped(mob/user as mob) - user << "The mister snaps back onto the watertank." + to_chat(user, "The mister snaps back onto the watertank.") + tank.on = 0 loc = tank @@ -175,7 +178,8 @@ /obj/item/weapon/reagent_containers/spray/mister/janitor/attack_self(var/mob/user) amount_per_transfer_from_this = (amount_per_transfer_from_this == 10 ? 5 : 10) - user << "You [amount_per_transfer_from_this == 10 ? "remove" : "fix"] the nozzle. You'll now use [amount_per_transfer_from_this] units per spray." + to_chat(user, "You [amount_per_transfer_from_this == 10 ? "remove" : "fix"] the nozzle. You'll now use [amount_per_transfer_from_this] units per spray.") + //ATMOS FIRE FIGHTING BACKPACK @@ -240,22 +244,26 @@ if(EXTINGUISHER) nozzle_mode = NANOFROST tank.icon_state = "waterbackpackatmos_1" - user << "Swapped to nanofrost launcher" + to_chat(user, "Swapped to nanofrost launcher") + return if(NANOFROST) nozzle_mode = METAL_FOAM tank.icon_state = "waterbackpackatmos_2" - user << "Swapped to metal foam synthesizer" + to_chat(user, "Swapped to metal foam synthesizer") + return if(METAL_FOAM) nozzle_mode = EXTINGUISHER tank.icon_state = "waterbackpackatmos_0" - user << "Swapped to water extinguisher" + to_chat(user, "Swapped to water extinguisher") + return return /obj/item/weapon/extinguisher/mini/nozzle/dropped(mob/user as mob) - user << "The nozzle snaps back onto the tank!" + to_chat(user, "The nozzle snaps back onto the tank!") + tank.on = 0 loc = tank @@ -271,10 +279,12 @@ return //Safety check so you don't blast yourself trying to refill your tank var/datum/reagents/R = reagents if(R.total_volume < 100) - user << "You need at least 100 units of water to use the nanofrost launcher!" + to_chat(user, "You need at least 100 units of water to use the nanofrost launcher!") + return if(nanofrost_cooldown) - user << "Nanofrost launcher is still recharging" + to_chat(user, "Nanofrost launcher is still recharging") + return nanofrost_cooldown = 1 R.remove_any(100) @@ -300,7 +310,8 @@ if(src) metal_synthesis_cooldown-- else - user << "Metal foam mix is still being synthesized." + to_chat(user, "Metal foam mix is still being synthesized.") + return /obj/effect/nanofrost_container diff --git a/code/game/objects/items/weapons/tape.dm b/code/game/objects/items/weapons/tape.dm index 1f648ec2b3b..2eed4d02cef 100644 --- a/code/game/objects/items/weapons/tape.dm +++ b/code/game/objects/items/weapons/tape.dm @@ -14,7 +14,8 @@ /* -- Disabled for now until it has a use -- /obj/item/stack/tape_roll/attack_self(mob/user as mob) - user << "You remove a length of tape from [src]." + to_chat(user, "You remove a length of tape from [src].") + var/obj/item/weapon/ducttape/tape = new() user.put_in_hands(tape) @@ -71,7 +72,8 @@ if(!stuck) return - user << "You remove \the [initial(name)] from [stuck]." + to_chat(user, "You remove \the [initial(name)] from [stuck].") + user.unEquip(src) stuck.forceMove(get_turf(src)) @@ -91,8 +93,8 @@ if(target_turf != source_turf) dir_offset = get_dir(source_turf, target_turf) if(!(dir_offset in cardinal)) - user << "You cannot reach that from here." // can only place stuck papers in cardinal directions, to - return // reduce papers around corners issue. + to_chat(user, "You cannot reach that from here.")// can only place stuck papers in cardinal directions, to + return // reduce papers around corners issue. user.unEquip(src) forceMove(source_turf) diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm index 61663a82fb4..f0ecceabfe8 100644 --- a/code/game/objects/items/weapons/teleportation.dm +++ b/code/game/objects/items/weapons/teleportation.dm @@ -49,7 +49,8 @@ Frequency: var/turf/current_location = get_turf(usr)//What turf is the user on? if(!current_location ||( current_location.z in config.admin_levels))//If turf was not found or they're on z level 2. - usr << "\The [src] is malfunctioning." + to_chat(usr, "\The [src] is malfunctioning.") + return 1 if (href_list["refresh"]) @@ -108,7 +109,8 @@ Frequency: /obj/item/weapon/hand_tele/attack_self(mob/user as mob) var/turf/current_location = get_turf(user)//What turf is the user on? if(!current_location||(current_location.z in config.admin_levels)||current_location.z>=7)//If turf was not found or they're on z level 2 or >7 which does not currently exist. - user << "\The [src] is malfunctioning." + to_chat(user, "\The [src] is malfunctioning.") + return var/list/L = list( ) for(var/obj/machinery/computer/teleporter/com in world) diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index d01cc125918..8b5c0e3be2f 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -50,8 +50,8 @@ hitsound = 'sound/weapons/bladeslice.ogg' suicide_act(mob/user) - viewers(user) << pick("[user] is stabbing the [src.name] into \his temple! It looks like \he's trying to commit suicide.", \ - "[user] is stabbing the [src.name] into \his heart! It looks like \he's trying to commit suicide.") + to_chat(viewers(user), pick("[user] is stabbing the [src.name] into \his temple! It looks like \he's trying to commit suicide.", \ + "[user] is stabbing the [src.name] into \his heart! It looks like \he's trying to commit suicide.")) return(BRUTELOSS) /obj/item/weapon/screwdriver/New() @@ -173,7 +173,8 @@ /obj/item/weapon/weldingtool/examine(mob/user) if(..(user, 0)) - user << "It contains [get_fuel()] unit\s of fuel out of [max_fuel]." + to_chat(user, "It contains [get_fuel()] unit\s of fuel out of [max_fuel].") + /obj/item/weapon/weldingtool/suicide_act(mob/user) user.visible_message("[user] welds \his every orifice closed! It looks like \he's trying to commit suicide..") @@ -248,13 +249,16 @@ S.heal_damage(15,0,0,1) user.visible_message("\The [user] patches some dents on \the [M]'s [S.name] with \the [src].") else if(S.open != 2) - user << "Need more welding fuel!" + to_chat(user, "Need more welding fuel!") + return 1 else - user << "The damage is far too severe to patch over externally." + to_chat(user, "The damage is far too severe to patch over externally.") + return 1 else if(S.open != 2) - user << "Nothing to fix!" + to_chat(user, "Nothing to fix!") + else return ..() @@ -263,14 +267,16 @@ if(istype(O, /obj/structure/reagent_dispensers/fueltank) && in_range(src, O)) if(!welding) O.reagents.trans_to(src, max_fuel) - user << "[src] refueled." + to_chat(user, "[src] refueled.") + playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6) update_icon() return else message_admins("[key_name_admin(user)] triggered a fueltank explosion.") log_game("[key_name(user)] triggered a fueltank explosion.") - user << "That was stupid of you." + to_chat(user, "That was stupid of you.") + O.ex_act() return @@ -303,7 +309,8 @@ return 1 else if(M) - M << "\blue You need more welding fuel to complete this task." + to_chat(M, "\blue You need more welding fuel to complete this task.") + return 0 //Returns whether or not the welding tool is currently on. @@ -327,25 +334,30 @@ //Toggles the welder off and on /obj/item/weapon/weldingtool/proc/toggle(mob/user, message = 0) if(!status) - user << "[src] can't be turned on while unsecured!" + to_chat(user, "[src] can't be turned on while unsecured!") + return welding = !welding if(welding) if(get_fuel() >= 1) - user << "You switch [src] on." + to_chat(user, "You switch [src] on.") + force = 15 damtype = "fire" hitsound = 'sound/items/welder.ogg' update_icon() processing_objects |= src else - user << "You need more fuel!" + to_chat(user, "You need more fuel!") + welding = 0 else if(!message) - user << "You switch [src] off." + to_chat(user, "You switch [src] off.") + else - user << "[src] shuts off!" + to_chat(user, "[src] shuts off!") + force = 3 damtype = "brute" hitsound = "swing_hit" @@ -353,13 +365,16 @@ /obj/item/weapon/weldingtool/proc/flamethrower_screwdriver(obj/item/I, mob/user) if(welding) - user << "Turn it off first!" + to_chat(user, "Turn it off first!") + return status = !status if(status) - user << "You resecure [src]." + to_chat(user, "You resecure [src].") + else - user << "[src] can now be attached and modified." + to_chat(user, "[src] can now be attached and modified.") + add_fingerprint(user) /obj/item/weapon/weldingtool/proc/flamethrower_rods(obj/item/I, mob/user) @@ -372,10 +387,12 @@ loc = F F.weldtool = src add_fingerprint(user) - user << "You add a rod to a welder, starting to build a flamethrower." + to_chat(user, "You add a rod to a welder, starting to build a flamethrower.") + user.put_in_hands(F) else - user << "You need one rod to start building a flamethrower!" + to_chat(user, "You need one rod to start building a flamethrower!") + return /obj/item/weapon/weldingtool/largetank @@ -492,5 +509,6 @@ attack_self(mob/user as mob) open = !open - user << "\blue You [open?"open" : "close"] the conversion kit." + to_chat(user, "\blue You [open?"open" : "close"] the conversion kit.") + update_icon() diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index 61164a45298..26444e0cef2 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -43,9 +43,11 @@ user.update_inv_r_hand() user.update_inv_l_hand() if(isrobot(user)) - user << "You free up your module." + to_chat(user, "You free up your module.") + else - user << "You are now carrying the [name] with one hand." + to_chat(user, "You are now carrying the [name] with one hand.") + if(unwieldsound) playsound(loc, unwieldsound, 50, 1) var/obj/item/weapon/twohanded/offhand/O = user.get_inactive_hand() @@ -58,10 +60,12 @@ if(ishuman(user)) var/mob/living/carbon/human/H = user if(H.species.is_small) - user << "It's too heavy for you to wield fully." + to_chat(user, "It's too heavy for you to wield fully.") + return if(user.get_inactive_hand()) - user << "You need your other hand to be empty!" + to_chat(user, "You need your other hand to be empty!") + return wielded = 1 force = force_wielded @@ -71,9 +75,11 @@ user.update_inv_r_hand() user.update_inv_l_hand() if(isrobot(user)) - user << "You dedicate your module to [name]." + to_chat(user, "You dedicate your module to [name].") + else - user << "You grab the [name] with both hands." + to_chat(user, "You grab the [name] with both hands.") + if (wieldsound) playsound(loc, wieldsound, 50, 1) var/obj/item/weapon/twohanded/offhand/O = new(user) ////Let's reserve his other hand~ @@ -85,7 +91,8 @@ /obj/item/weapon/twohanded/mob_can_equip(mob/M, slot) //Cannot equip wielded items. if(wielded) - M << "Unwield the [name] first!" + to_chat(M, "Unwield the [name] first!") + return 0 return ..() @@ -138,7 +145,8 @@ /obj/item/weapon/twohanded/required/mob_can_equip(M as mob, slot) if(wielded) - M << "[src.name] is too cumbersome to carry with anything but your hands!" + to_chat(M, "[src.name] is too cumbersome to carry with anything but your hands!") + return 0 return ..() @@ -224,7 +232,8 @@ /obj/item/weapon/twohanded/dualsaber/attack(target as mob, mob/living/user as mob) ..() if((CLUMSY in user.mutations) && (wielded) &&prob(40)) - user << "\red You twirl around a bit before losing your balance and impaling yourself on the [src]." + to_chat(user, "\red You twirl around a bit before losing your balance and impaling yourself on the [src].") + user.take_organ_damage(20,25) return if((wielded) && prob(50)) @@ -268,11 +277,13 @@ if(istype(W, /obj/item/device/multitool)) if(hacked == 0) hacked = 1 - user << "2XRNBW_ENGAGE" + to_chat(user, "2XRNBW_ENGAGE") + blade_color = "rainbow" update_icon() else - user << "It's starting to look like a triple rainbow - no, nevermind." + to_chat(user, "It's starting to look like a triple rainbow - no, nevermind.") + //spears /obj/item/weapon/twohanded/spear @@ -301,7 +312,8 @@ //Putting heads on spears /obj/item/weapon/organ/head/attackby(var/obj/item/weapon/W, var/mob/living/user, params) if(istype(W, /obj/item/weapon/twohanded/spear)) - user << "You stick the head onto the spear and stand it upright on the ground." + to_chat(user, "You stick the head onto the spear and stand it upright on the ground.") + var/obj/structure/headspear/HS = new /obj/structure/headspear(user.loc) var/matrix/M = matrix() src.transform = M @@ -316,7 +328,8 @@ /obj/item/weapon/twohanded/spear/attackby(var/obj/item/I, var/mob/living/user) if(istype(I, /obj/item/weapon/organ/head)) - user << "You stick the head onto the spear and stand it upright on the ground." + to_chat(user, "You stick the head onto the spear and stand it upright on the ground.") + var/obj/structure/headspear/HS = new /obj/structure/headspear(user.loc) var/matrix/M = matrix() I.transform = M diff --git a/code/game/objects/items/weapons/vending_items.dm b/code/game/objects/items/weapons/vending_items.dm index 517ec5ce2cb..13a1d15860e 100644 --- a/code/game/objects/items/weapons/vending_items.dm +++ b/code/game/objects/items/weapons/vending_items.dm @@ -23,9 +23,11 @@ /obj/item/weapon/vending_refill/examine(mob/user) ..(user) if(charges) - user << "It can restock [charges] item(s)." + to_chat(user, "It can restock [charges] item(s).") + else - user << "It's empty!" + to_chat(user, "It's empty!") + //NOTE I decided to go for about 1/3 of a machine's capacity diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index c77015ca0d1..f3453803635 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -12,7 +12,8 @@ /obj/item/weapon/banhammer/suicide_act(mob/user) - viewers(user) << "[user] is hitting \himself with the [src.name]! It looks like \he's trying to ban \himself from life." + to_chat(viewers(user), "[user] is hitting \himself with the [src.name]! It looks like \he's trying to ban \himself from life.") + return (BRUTELOSS|FIRELOSS|TOXLOSS|OXYLOSS) /obj/item/weapon/nullrod @@ -31,7 +32,8 @@ var/transform_via = list(/obj/item/clothing/suit/armor/riot/knight/templar, /obj/item/clothing/suit/chaplain_hoodie/fluff/chronx) suicide_act(mob/user) - viewers(user) << "[user] is impaling \himself with the [src.name]! It looks like \he's trying to commit suicide." + to_chat(viewers(user), "[user] is impaling \himself with the [src.name]! It looks like \he's trying to commit suicide.") + return (BRUTELOSS|FIRELOSS) /obj/item/weapon/nullrod/attack(mob/M as mob, mob/living/user as mob) //Paste from old-code to decult with a null rod. @@ -47,7 +49,8 @@ msg_admin_attack("[key_name_admin(user)] attacked [key_name_admin(M)] with [src.name] (INTENT: [uppertext(user.a_intent)])") if ((CLUMSY in user.mutations) && prob(50)) - user << "\red The rod slips out of your hand and hits your head." + to_chat(user, "\red The rod slips out of your hand and hits your head.") + user.take_organ_damage(10) user.Paralyse(20) return @@ -56,7 +59,8 @@ if(M.mind.vampire) if(ishuman(M)) if(!M.mind.vampire.get_ability(/datum/vampire_passive/full)) - M << "The nullrod's power interferes with your own!" + to_chat(M, "The nullrod's power interferes with your own!") + M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2) ..() @@ -67,7 +71,8 @@ if(istype(I, T)) //Only the Chaplain's holy armor is capable fo performing this feat. if(!transformed) // can't turn a sword into a sword. var/obj/item/S = new transform_into() - user << "You sheath the [src] into the [I]'s scabbard, transforming it into \a [S]." + to_chat(user, "You sheath the [src] into the [I]'s scabbard, transforming it into \a [S].") + user.unEquip(src) qdel(src) user.put_in_hands(S) @@ -98,7 +103,8 @@ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") suicide_act(mob/user) - viewers(user) << "[user] is impaling \himself with the [src.name]! It looks like \he's trying to commit suicide." + to_chat(viewers(user), "[user] is impaling \himself with the [src.name]! It looks like \he's trying to commit suicide.") + return(BRUTELOSS) /obj/item/weapon/sord/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) @@ -124,7 +130,8 @@ return 1 suicide_act(mob/user) - viewers(user) << "[user] is falling on the [src.name]! It looks like \he's trying to commit suicide." + to_chat(viewers(user), "[user] is falling on the [src.name]! It looks like \he's trying to commit suicide.") + return(BRUTELOSS) /obj/item/weapon/claymore/ceremonial @@ -147,7 +154,8 @@ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") suicide_act(mob/user) - viewers(user) << "[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku." + to_chat(viewers(user), "[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.") + return(BRUTELOSS) /obj/item/weapon/katana/IsShield() @@ -192,7 +200,8 @@ obj/item/weapon/wirerod/attackby(var/obj/item/I, mob/user as mob, params) user.unEquip(I) user.put_in_hands(S) - user << "You fasten the glass shard to the top of the rod with the cable." + to_chat(user, "You fasten the glass shard to the top of the rod with the cable.") + qdel(I) qdel(src) @@ -204,7 +213,8 @@ obj/item/weapon/wirerod/attackby(var/obj/item/I, mob/user as mob, params) user.unEquip(I) user.put_in_hands(P) - user << "You fasten the wirecutters to the top of the rod with the cable, prongs outward." + to_chat(user, "You fasten the wirecutters to the top of the rod with the cable, prongs outward.") + qdel(I) qdel(src) diff --git a/code/game/objects/items/weapons/whetstone.dm b/code/game/objects/items/weapons/whetstone.dm index bc9fae1a118..009262c39ce 100644 --- a/code/game/objects/items/weapons/whetstone.dm +++ b/code/game/objects/items/weapons/whetstone.dm @@ -13,28 +13,35 @@ /obj/item/weapon/whetstone/attackby(obj/item/I, mob/user, params) if(used) - user << "The whetstone is too worn to use again." + to_chat(user, "The whetstone is too worn to use again.") + return if(I.force >= max || I.throwforce >= max)//no esword sharpening - user << "[I] is much too powerful to sharpen further." + to_chat(user, "[I] is much too powerful to sharpen further.") + return if(requires_sharpness && !I.edge) - user << "You can only sharpen items that are already sharp, such as knives." + to_chat(user, "You can only sharpen items that are already sharp, such as knives.") + return if(istype(I, /obj/item/weapon/twohanded))//some twohanded items should still be sharpenable, but handle force differently. therefore i need this stuff var/obj/item/weapon/twohanded/TH = I if(TH.force_wielded >= max) - user << "[TH] is much too powerful to sharpen further." + to_chat(user, "[TH] is much too powerful to sharpen further.") + return if(TH.wielded) - user << "[TH] must be unwielded before it can be sharpened." + to_chat(user, "[TH] must be unwielded before it can be sharpened.") + return if(TH.force_wielded > initial(TH.force_wielded)) - user << "[TH] has already been refined before. It cannot be sharpened further." + to_chat(user, "[TH] has already been refined before. It cannot be sharpened further.") + return TH.force_wielded = Clamp(TH.force_wielded + increment, 0, max)//wieldforce is increased since normal force wont stay if(I.force > initial(I.force)) - user << "[I] has already been refined before. It cannot be sharpened further." + to_chat(user, "[I] has already been refined before. It cannot be sharpened further.") + return user.visible_message("[user] sharpens [I] with [src]!", "You sharpen [I], making it much more deadly than before.") if(!requires_sharpness) diff --git a/code/game/objects/items/weapons/wires.dm b/code/game/objects/items/weapons/wires.dm index e1b943f7897..98c2565cf72 100644 --- a/code/game/objects/items/weapons/wires.dm +++ b/code/game/objects/items/weapons/wires.dm @@ -12,7 +12,8 @@ attack_verb = list("whipped", "lashed", "disciplined", "tickled") suicide_act(mob/user) - viewers(user) << "\red [user] is strangling \himself with the [src.name]! It looks like \he's trying to commit suicide." + to_chat(viewers(user), "\red [user] is strangling \himself with the [src.name]! It looks like \he's trying to commit suicide.") + return (OXYLOSS) @@ -28,9 +29,11 @@ /obj/item/weapon/wire/attack_self(mob/user as mob) if (src.laying) src.laying = 0 - user << "\blue You're done laying wire!" + to_chat(user, "\blue You're done laying wire!") + else - user << "\blue You are not using this to lay wire..." + to_chat(user, "\blue You are not using this to lay wire...") + return diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index ec288220060..f9883fa1c9c 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -68,11 +68,13 @@ for(var/obj/O in range(0, src)) if(O.density == 1 && O != src && !istype(O, /obj/machinery/door/window)) //Ignores windoors, as those already block climbing, otherwise a windoor on the opposite side of a table would prevent climbing. - user << "\red You cannot climb [src], as it is blocked by \a [O]!" + to_chat(user, "\red You cannot climb [src], as it is blocked by \a [O]!") + return for(var/turf/T in range(0, src)) if(T.density == 1) - user << "\red You cannot climb [src], as it is blocked by \a [T]!" + to_chat(user, "\red You cannot climb [src], as it is blocked by \a [T]!") + return var/turf/T = src.loc if(!T || !istype(T)) return @@ -108,14 +110,16 @@ if(M.lying) return //No spamming this on people. M.Weaken(5) - M << "\red You topple as \the [src] moves under you!" + to_chat(M, "\red You topple as \the [src] moves under you!") + if(prob(25)) var/damage = rand(15,30) var/mob/living/carbon/human/H = M if(!istype(H)) - H << "\red You land heavily!" + to_chat(H, "\red You land heavily!") + M.adjustBruteLoss(damage) return @@ -134,12 +138,14 @@ affecting = H.get_organ("head") if(affecting) - M << "\red You land heavily on your [affecting.name]!" + to_chat(M, "\red You land heavily on your [affecting.name]!") + affecting.take_damage(damage, 0) if(affecting.parent) affecting.parent.add_autopsy_data("Misadventure", damage) else - H << "\red You land heavily!" + to_chat(H, "\red You land heavily!") + H.adjustBruteLoss(damage) H.UpdateDamageIcon() @@ -152,12 +158,14 @@ if(!Adjacent(user)) return 0 if (user.restrained() || user.buckled) - user << "You need your hands and legs free for this." + to_chat(user, "You need your hands and legs free for this.") + return 0 if (user.stat || user.paralysis || user.sleeping || user.lying || user.weakened) return 0 if (issilicon(user)) - user << "You need hands for this." + to_chat(user, "You need hands for this.") + return 0 return 1 diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm index 6604649ad4c..060da01f5e5 100644 --- a/code/game/objects/structures/artstuff.dm +++ b/code/game/objects/structures/artstuff.dm @@ -139,15 +139,18 @@ var/global/list/globalBlankCanvases[AMT_OF_CANVASES] ..(user) if(in_range(user, src) && get_turf(src) && user.client && ishuman(user)) //Let only humans be the robust zoominators. I'm too spooked other mobs trying to use it may get broken huds. if(src.loc == user || get_turf(src) == get_turf(user)) - user << "[src] has to be on the ground to focus on it!" + to_chat(user, "[src] has to be on the ground to focus on it!") + return - user << "You focus on \the [src]." + to_chat(user, "You focus on \the [src].") + user.client.screen = list() //This is because screen objects go way past the view bounds we set, therefore not allowing stretch to fit to zoom in properly. user.client.reset_stretch = winget(user.client, "mapwindow.map", "icon-size") //Remember previous icon-size user.client.view = 3 //Decrease view winset(user.client, "mapwindow.map", "icon-size=0") //Enable stretch-to-fit user.client.viewingCanvas = 1 //Reset everything we just changed as soon as client tries to move else - user << "It is too far away." + to_chat(user, "It is too far away.") + #undef AMT_OF_CANVASES \ No newline at end of file diff --git a/code/game/objects/structures/barsign.dm b/code/game/objects/structures/barsign.dm index 8957329c4a1..e70050d348a 100644 --- a/code/game/objects/structures/barsign.dm +++ b/code/game/objects/structures/barsign.dm @@ -50,10 +50,12 @@ /obj/structure/sign/barsign/attack_hand(mob/user as mob) if (!src.allowed(user)) - user << "Access denied." + to_chat(user, "Access denied.") + return if (broken) - user << "The controls seem unresponsive." + to_chat(user, "The controls seem unresponsive.") + return pick_sign() @@ -62,15 +64,18 @@ /obj/structure/sign/barsign/attackby(var/obj/item/I, var/mob/user) if(!allowed(user)) - user << "Access denied." + to_chat(user, "Access denied.") + return if( istype(I, /obj/item/weapon/screwdriver)) if(!panel_open) - user << "You open the maintenance panel." + to_chat(user, "You open the maintenance panel.") + set_sign(new /datum/barsign/hiddensigns/signoff) panel_open = 1 else - user << "You close the maintenance panel." + to_chat(user, "You close the maintenance panel.") + if(!broken && !emagged) set_sign(pick(barsigns)) else if(emagged) @@ -82,17 +87,21 @@ if(istype(I, /obj/item/stack/cable_coil) && panel_open) var/obj/item/stack/cable_coil/C = I if(emagged) //Emagged, not broken by EMP - user << "Sign has been damaged beyond repair!" + to_chat(user, "Sign has been damaged beyond repair!") + return else if(!broken) - user << "This sign is functioning properly!" + to_chat(user, "This sign is functioning properly!") + return if(C.use(2)) - user << "You replace the burnt wiring." + to_chat(user, "You replace the burnt wiring.") + broken = 0 else - user << "You need at least two lengths of cable!" + to_chat(user, "You need at least two lengths of cable!") + @@ -105,9 +114,11 @@ /obj/structure/sign/barsign/emag_act(mob/user) if(broken || emagged) - user << "Nothing interesting happens!" + to_chat(user, "Nothing interesting happens!") + return - user << "You emag the barsign. Takeover in progress..." + to_chat(user, "You emag the barsign. Takeover in progress...") + sleep(100) //10 seconds set_sign(new /datum/barsign/hiddensigns/syndibarsign) emagged = 1 diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index af608addbf8..1a247e06f88 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -169,12 +169,15 @@ LINEN BINS /obj/structure/bedsheetbin/examine(mob/user) ..(user) if(amount < 1) - user << "There are no bed sheets in the bin." + to_chat(user, "There are no bed sheets in the bin.") + return if(amount == 1) - user << "There is one bed sheet in the bin." + to_chat(user, "There is one bed sheet in the bin.") + return - user << "There are [amount] bed sheets in the bin." + to_chat(user, "There are [amount] bed sheets in the bin.") + /obj/structure/bedsheetbin/update_icon() @@ -190,12 +193,14 @@ LINEN BINS I.loc = src sheets.Add(I) amount++ - user << "You put [I] in [src]." + to_chat(user, "You put [I] in [src].") + else if(amount && !hidden && I.w_class < 4) //make sure there's sheets to hide it among, make sure nothing else is hidden in there. user.drop_item() I.loc = src hidden = I - user << "You hide [I] among the sheets." + to_chat(user, "You hide [I] among the sheets.") + @@ -213,11 +218,13 @@ LINEN BINS B.loc = user.loc user.put_in_hands(B) - user << "You take [B] out of [src]." + to_chat(user, "You take [B] out of [src].") + if(hidden) hidden.loc = user.loc - user << "[hidden] falls out of [B]!" + to_chat(user, "[hidden] falls out of [B]!") + hidden = null @@ -237,7 +244,8 @@ LINEN BINS B = new /obj/item/weapon/bedsheet(loc) B.loc = loc - user << "You telekinetically remove [B] from [src]." + to_chat(user, "You telekinetically remove [B] from [src].") + update_icon() if(hidden) diff --git a/code/game/objects/structures/coathanger.dm b/code/game/objects/structures/coathanger.dm index 13136868954..5fb9bfa63e9 100644 --- a/code/game/objects/structures/coathanger.dm +++ b/code/game/objects/structures/coathanger.dm @@ -25,7 +25,8 @@ coat.loc = src update_icon() else - user << "You cannot hang [W] on [src]" + to_chat(user, "You cannot hang [W] on [src]") + return ..() /obj/structure/coatrack/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index b395e55fc0e..a7c2238976f 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -135,7 +135,8 @@ /obj/structure/closet/proc/toggle(mob/user as mob) if(!(src.opened ? src.close() : src.open())) - user << "It won't budge!" + to_chat(user, "It won't budge!") + return // this should probably use dump_contents() @@ -193,7 +194,8 @@ var/obj/item/weapon/rcs/E = W if(E.rcell && (E.rcell.charge >= E.chargecost)) if(!(src.z in config.contact_levels)) - user << "The rapid-crate-sender can't locate any telepads!" + to_chat(user, "The rapid-crate-sender can't locate any telepads!") + return if(E.mode == 0) if(!E.teleporting) @@ -211,14 +213,16 @@ var/desc = input("Please select a telepad.", "RCS") in L E.pad = L[desc] playsound(E.loc, 'sound/machines/click.ogg', 50, 1) - user << "\blue Teleporting [src.name]..." + to_chat(user, "\blue Teleporting [src.name]...") + E.teleporting = 1 if(!do_after(user, 50, target = src)) E.teleporting = 0 return E.teleporting = 0 if(user in contents) - user << "Error: User located in container--aborting for safety." + to_chat(user, "Error: User located in container--aborting for safety.") + playsound(E.loc, 'sound/machines/buzz-sigh.ogg', 50, 1) return var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread @@ -226,21 +230,24 @@ s.start() do_teleport(src, E.pad, 0) E.rcell.use(E.chargecost) - user << "Teleport successful. [round(E.rcell.charge/E.chargecost)] charge\s left." + to_chat(user, "Teleport successful. [round(E.rcell.charge/E.chargecost)] charge\s left.") + return else E.rand_x = rand(50,200) E.rand_y = rand(50,200) var/L = locate(E.rand_x, E.rand_y, 6) playsound(E.loc, 'sound/machines/click.ogg', 50, 1) - user << "\blue Teleporting [src.name]..." + to_chat(user, "\blue Teleporting [src.name]...") + E.teleporting = 1 if(!do_after(user, 50, target = src)) E.teleporting = 0 return E.teleporting = 0 if(user in contents) - user << "Error: User located in container--aborting for safety." + to_chat(user, "Error: User located in container--aborting for safety.") + playsound(E.loc, 'sound/machines/buzz-sigh.ogg', 50, 1) return var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread @@ -248,10 +255,12 @@ s.start() do_teleport(src, L) E.rcell.use(E.chargecost) - user << "Teleport successful. [round(E.rcell.charge/E.chargecost)] charge\s left." + to_chat(user, "Teleport successful. [round(E.rcell.charge/E.chargecost)] charge\s left.") + return else - user << "Out of charges." + to_chat(user, "Out of charges.") + return if(src.opened) @@ -262,7 +271,8 @@ if(istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W if(!WT.remove_fuel(0,user)) - user << "You need more welding fuel to complete this task." + to_chat(user, "You need more welding fuel to complete this task.") + return new /obj/item/stack/sheet/metal(src.loc) for(var/mob/M in viewers(src)) @@ -280,10 +290,12 @@ else if(istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W if(src == user.loc) - user << "You can not [welded?"unweld":"weld"] the locker from inside." + to_chat(user, "You can not [welded?"unweld":"weld"] the locker from inside.") + return if(!WT.remove_fuel(0,user)) - user << "You need more welding fuel to complete this task." + to_chat(user, "You need more welding fuel to complete this task.") + return src.welded = !src.welded src.update_icon() @@ -326,11 +338,13 @@ return if(!src.open()) - user << "It won't budge!" + to_chat(user, "It won't budge!") + if(!lastbang) lastbang = 1 for (var/mob/M in hearers(src, null)) - M << text("BANG, bang!", max(0, 5 - get_dist(src, M))) + to_chat(M, text("BANG, bang!", max(0, 5 - get_dist(src, M)))) + spawn(30) lastbang = 0 @@ -342,7 +356,8 @@ /obj/structure/closet/attack_self_tk(mob/user as mob) src.add_fingerprint(user) if(!src.toggle()) - usr << "It won't budge!" + to_chat(usr, "It won't budge!") + /obj/structure/closet/verb/verb_toggleopen() set src in oview(1) @@ -356,7 +371,8 @@ src.add_fingerprint(usr) src.toggle(usr) else - usr << "This mob type can't use this verb." + to_chat(usr, "This mob type can't use this verb.") + /obj/structure/closet/update_icon()//Putting the welded stuff in updateicon() so it's easy to overwrite for special cases (Fridges, cabinets, and whatnot) overlays.Cut() @@ -389,7 +405,8 @@ //okay, so the closet is either welded or locked... resist!!! L.changeNext_move(CLICK_CD_BREAKOUT) L.last_special = world.time + CLICK_CD_BREAKOUT - L << "You lean on the back of \the [src] and start pushing the door open. (this will take about [breakout_time] minutes)" + to_chat(L, "You lean on the back of \the [src] and start pushing the door open. (this will take about [breakout_time] minutes)") + for(var/mob/O in viewers(usr.loc)) O.show_message("The [src] begins to shake violently!", 1) @@ -406,7 +423,8 @@ //Well then break it! welded = 0 update_icon() - usr << "You successfully break out!" + to_chat(usr, "You successfully break out!") + for(var/mob/O in viewers(L.loc)) O.show_message("\the [usr] successfully broke out of \the [src]!", 1) if(istype(src.loc, /obj/structure/bigDelivery)) //nullspace ect.. read the comment above diff --git a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm index bfc9e385353..756fd860361 100644 --- a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm +++ b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm @@ -34,7 +34,8 @@ if(!L.stat) L.do_alert_animation(L) egged = 1 - alerted << sound('sound/machines/chime.ogg') + to_chat(alerted, sound('sound/machines/chime.ogg')) + ..() /mob/living/proc/do_alert_animation(atom/A) diff --git a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm index 82897dfe61a..c67b4e7f60d 100644 --- a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm +++ b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm @@ -23,11 +23,13 @@ if (isrobot(user) || src.locked) if(istype(O, /obj/item/device/multitool)) - user << "\red Resetting circuitry..." + to_chat(user, "\red Resetting circuitry...") + playsound(user, 'sound/machines/lockreset.ogg', 50, 1) if(do_after(user, 20, target = src)) src.locked = 0 - user << " You disable the locking modules." + to_chat(user, " You disable the locking modules.") + update_icon() return else if(istype(O, /obj/item/weapon)) @@ -43,7 +45,8 @@ user.do_attack_animation(src) playsound(user, 'sound/effects/Glasshit.ogg', 100, 1) //We don't want this playing every time if(W.force < 15) - user << "\blue The cabinet's protective glass glances off the hit." + to_chat(user, "\blue The cabinet's protective glass glances off the hit.") + else src.hitstaken++ if(src.hitstaken == 4) @@ -56,12 +59,14 @@ if (istype(O, /obj/item/weapon/twohanded/fireaxe) && src.localopened) if(!fireaxe) if(O:wielded) - user << "\red Unwield the axe first." + to_chat(user, "\red Unwield the axe first.") + return fireaxe = O user.drop_item(O) src.contents += O - user << "\blue You place the fire axe back in the [src.name]." + to_chat(user, "\blue You place the fire axe back in the [src.name].") + update_icon() else if(src.smashed) @@ -84,14 +89,17 @@ spawn(10) update_icon() return else - user << "\red Resetting circuitry..." + to_chat(user, "\red Resetting circuitry...") + sleep(50) src.locked = 1 - user << "\blue You re-enable the locking modules." + to_chat(user, "\blue You re-enable the locking modules.") + playsound(user, 'sound/machines/lockenable.ogg', 50, 1) if(do_after(user,20, target = src)) src.locked = 1 - user << " You re-enable the locking modules." + to_chat(user, " You re-enable the locking modules.") + return else localopened = !localopened @@ -112,13 +120,15 @@ hasaxe = 1 if(src.locked) - user <<"\red The cabinet won't budge!" + to_chat(user, "\red The cabinet won't budge!") + return if(localopened) if(fireaxe) user.put_in_hands(fireaxe) fireaxe = null - user << "\blue You take the fire axe from the [name]." + to_chat(user, "\blue You take the fire axe from the [name].") + src.add_fingerprint(user) update_icon() else @@ -145,7 +155,8 @@ attack_tk(mob/user as mob) if(localopened && fireaxe) fireaxe.forceMove(loc) - user << "\blue You telekinetically remove the fire axe." + to_chat(user, "\blue You telekinetically remove the fire axe.") + fireaxe = null update_icon() return @@ -157,9 +168,11 @@ if (isrobot(usr) || src.locked || src.smashed) if(src.locked) - usr << "\red The cabinet won't budge!" + to_chat(usr, "\red The cabinet won't budge!") + else if(src.smashed) - usr << "\blue The protective glass is broken!" + to_chat(usr, "\blue The protective glass is broken!") + return localopened = !localopened @@ -176,23 +189,29 @@ if(fireaxe) usr.put_in_hands(fireaxe) fireaxe = null - usr << "\blue You take the Fire axe from the [name]." + to_chat(usr, "\blue You take the Fire axe from the [name].") + else - usr << "\blue The [src.name] is empty." + to_chat(usr, "\blue The [src.name] is empty.") + else - usr << "\blue The [src.name] is closed." + to_chat(usr, "\blue The [src.name] is closed.") + update_icon() attack_ai(mob/user as mob) if(src.smashed) - user << "\red The security of the cabinet is compromised." + to_chat(user, "\red The security of the cabinet is compromised.") + return else locked = !locked if(locked) - user << "\red Cabinet locked." + to_chat(user, "\red Cabinet locked.") + else - user << "\blue Cabinet unlocked." + to_chat(user, "\blue Cabinet unlocked.") + return update_icon() //Template: fireaxe[has fireaxe][is opened][hits taken][is smashed]. If you want the opening or closing animations, add "opening" or "closing" right after the numbers diff --git a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm index 70a8d5bd9d2..be590c3028e 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm @@ -66,12 +66,14 @@ if (W) W.forceMove(loc) else if(istype(W, /obj/item/weapon/card/id)) if(src.broken) - user << "\red It appears to be broken." + to_chat(user, "\red It appears to be broken.") + return var/obj/item/weapon/card/id/I = W if(!I || !I.registered_name) return if(src == user.loc) - user << "You can't reach the lock from inside." + to_chat(user, "You can't reach the lock from inside.") + else if(src.allowed(user) || !src.registered_name || (istype(I) && (src.registered_name == I.registered_name))) //they can open all lockers, or nobody owns this, or they own this locker src.locked = !( src.locked ) @@ -86,9 +88,11 @@ src.registered_name = I.registered_name src.desc = "Owned by [I.registered_name]." else - user << "\red Access Denied" + to_chat(user, "\red Access Denied") + else if((istype(W, /obj/item/weapon/card/emag) || istype(W, /obj/item/weapon/melee/energy/blade)) && !broken) emag_act(user) else - user << "\red Access Denied" + to_chat(user, "\red Access Denied") + return diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm index 1c2a34c719d..e756a8961c5 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm @@ -48,22 +48,27 @@ /obj/structure/closet/secure_closet/proc/togglelock(mob/user as mob) if(src.opened) - user << "Close the locker first." + to_chat(user, "Close the locker first.") + return if(src.broken) - user << "The locker appears to be broken." + to_chat(user, "The locker appears to be broken.") + return if(user.loc == src) - user << "You can't reach the lock from inside." + to_chat(user, "You can't reach the lock from inside.") + return if(src.allowed(user)) src.locked = !src.locked for(var/mob/O in viewers(user, 3)) if((O.client && !( O.blinded ))) - O << "The locker has been [locked ? null : "un"]locked by [user]." + to_chat(O, "The locker has been [locked ? null : "un"]locked by [user].") + update_icon() else - user << "Access Denied" + to_chat(user, "Access Denied") + /obj/structure/closet/secure_closet/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(istype(W, /obj/item/weapon/rcs)) @@ -74,7 +79,8 @@ if(src.large) src.MouseDrop_T(W:affecting, user) //act like they were dragged onto the closet else - user << "The locker is too small to stuff [W:affecting] into!" + to_chat(user, "The locker is too small to stuff [W:affecting] into!") + if(isrobot(user)) return user.drop_item() @@ -94,7 +100,8 @@ desc = "It appears to be broken." icon_state = icon_off flick(icon_broken, src) - user << "You unlock \the [src]." + to_chat(user, "You unlock \the [src].") + /obj/structure/closet/secure_closet/attack_hand(mob/user as mob) src.add_fingerprint(user) @@ -115,7 +122,8 @@ src.add_fingerprint(usr) src.togglelock(usr) else - usr << "This mob type can't use this verb." + to_chat(usr, "This mob type can't use this verb.") + /obj/structure/closet/secure_closet/update_icon()//Putting the welded stuff in updateicon() so it's easy to overwrite for special cases (Fridges, cabinets, and whatnot) overlays.Cut() @@ -141,7 +149,8 @@ //okay, so the closet is either welded or locked... resist!!! L.changeNext_move(CLICK_CD_BREAKOUT) L.last_special = world.time + CLICK_CD_BREAKOUT - L << "You lean on the back of \the [src] and start pushing the door open. (this will take about [breakout_time] minutes)" + to_chat(L, "You lean on the back of \the [src] and start pushing the door open. (this will take about [breakout_time] minutes)") + for(var/mob/O in viewers(src)) O.show_message("The [src] begins to shake violently!", 1) @@ -166,7 +175,8 @@ locked = 0 welded = 0 update_icon() - usr << "\red You successfully break out!" + to_chat(usr, "\red You successfully break out!") + for(var/mob/O in viewers(L.loc)) O.show_message("\the [usr] successfully broke out of \the [src]!", 1) if(istype(src.loc, /obj/structure/bigDelivery)) //Do this to prevent contents from being opened into nullspace (read: bluespace) diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm index 6a5bf87680e..a96ce0b2ba8 100644 --- a/code/game/objects/structures/crates_lockers/closets/statue.dm +++ b/code/game/objects/structures/crates_lockers/closets/statue.dm @@ -67,7 +67,8 @@ if(S.mind) for(var/mob/M in contents) S.mind.transfer_to(M) - M << "As the animating magic wears off you feel yourself coming back to your senses. You are yourself again!" + to_chat(M, "As the animating magic wears off you feel yourself coming back to your senses. You are yourself again!") + break qdel(S) diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index df48bf96d7c..749ede4270c 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -85,7 +85,8 @@ var/obj/item/weapon/rcs/E = W if(E.rcell && (E.rcell.charge >= E.chargecost)) if(!(src.z in config.player_levels)) - user << "The rapid-crate-sender can't locate any telepads!" + to_chat(user, "The rapid-crate-sender can't locate any telepads!") + return if(E.mode == 0) if(!E.teleporting) @@ -103,7 +104,8 @@ var/desc = input("Please select a telepad.", "RCS") in L E.pad = L[desc] playsound(E.loc, 'sound/machines/click.ogg', 50, 1) - user << "\blue Teleporting [src.name]..." + to_chat(user, "\blue Teleporting [src.name]...") + E.teleporting = 1 if(!do_after(user, 50, target = src)) E.teleporting = 0 @@ -114,14 +116,16 @@ s.start() do_teleport(src, E.pad, 0) E.rcell.use(E.chargecost) - user << "Teleport successful. [round(E.rcell.charge/E.chargecost)] charge\s left." + to_chat(user, "Teleport successful. [round(E.rcell.charge/E.chargecost)] charge\s left.") + return else E.rand_x = rand(50,200) E.rand_y = rand(50,200) var/L = locate(E.rand_x, E.rand_y, 6) playsound(E.loc, 'sound/machines/click.ogg', 50, 1) - user << "\blue Teleporting [src.name]..." + to_chat(user, "\blue Teleporting [src.name]...") + E.teleporting = 1 if(!do_after(user, 50, target = src)) E.teleporting = 0 @@ -132,17 +136,20 @@ s.start() do_teleport(src, L) E.rcell.use(E.chargecost) - user << "Teleport successful. [round(E.rcell.charge/E.chargecost)] charge\s left." + to_chat(user, "Teleport successful. [round(E.rcell.charge/E.chargecost)] charge\s left.") + return else - user << "Out of charges." + to_chat(user, "Out of charges.") + return if(opened) if(isrobot(user)) return if(!user.drop_item()) //couldn't drop the item - user << "\The [W] is stuck to your hand, you cannot put it in \the [src]!" + to_chat(user, "\The [W] is stuck to your hand, you cannot put it in \the [src]!") + return if(W) W.forceMove(loc) @@ -150,22 +157,26 @@ return else if(istype(W, /obj/item/stack/cable_coil)) if(rigged) - user << "[src] is already rigged!" + to_chat(user, "[src] is already rigged!") + return - user << "You rig [src]." + to_chat(user, "You rig [src].") + user.drop_item() qdel(W) rigged = 1 return else if(istype(W, /obj/item/device/radio/electropack)) if(rigged) - user << "You attach [W] to [src]." + to_chat(user, "You attach [W] to [src].") + user.drop_item() W.forceMove(src) return else if(istype(W, /obj/item/weapon/wirecutters)) if(rigged) - user << "You cut away the wiring." + to_chat(user, "You cut away the wiring.") + playsound(loc, 'sound/items/Wirecutter.ogg', 100, 1) rigged = 0 return @@ -193,7 +204,8 @@ /obj/structure/closet/crate/attack_hand(mob/user as mob) if(manifest) - user << "You tear the manifest off of the crate." + to_chat(user, "You tear the manifest off of the crate.") + playsound(src.loc, 'sound/items/poster_ripped.ogg', 75, 1) manifest.forceMove(loc) if(ishuman(user)) @@ -253,19 +265,23 @@ /obj/structure/closet/crate/secure/proc/togglelock(mob/user as mob) if(src.opened) - user << "Close the crate first." + to_chat(user, "Close the crate first.") + return if(src.broken) - user << "The crate appears to be broken." + to_chat(user, "The crate appears to be broken.") + return if(src.allowed(user)) src.locked = !src.locked for(var/mob/O in viewers(user, 3)) if((O.client && !( O.blinded ))) - O << "The crate has been [locked ? null : "un"]locked by [user]." + to_chat(O, "The crate has been [locked ? null : "un"]locked by [user].") + update_icon() else - user << "Access Denied" + to_chat(user, "Access Denied") + /obj/structure/closet/crate/secure/verb/verb_togglelock() set src in oview(1) // One square distance @@ -279,11 +295,13 @@ src.add_fingerprint(usr) src.togglelock(usr) else - usr << "This mob type can't use this verb." + to_chat(usr, "This mob type can't use this verb.") + /obj/structure/closet/crate/secure/attack_hand(mob/user as mob) if(manifest) - user << "You tear the manifest off of the crate." + to_chat(user, "You tear the manifest off of the crate.") + playsound(src.loc, 'sound/items/poster_ripped.ogg', 75, 1) manifest.forceMove(loc) if(ishuman(user)) @@ -316,7 +334,8 @@ src.locked = 0 src.broken = 1 update_icon() - user << "You unlock \the [src]." + to_chat(user, "You unlock \the [src].") + return /obj/structure/closet/crate/secure/emp_act(severity) diff --git a/code/game/objects/structures/crates_lockers/crittercrate.dm b/code/game/objects/structures/crates_lockers/crittercrate.dm index b3f9dac3d04..5b432a63f00 100644 --- a/code/game/objects/structures/crates_lockers/crittercrate.dm +++ b/code/game/objects/structures/crates_lockers/crittercrate.dm @@ -35,7 +35,8 @@ src.add_fingerprint(user) if(src.loc == user.loc) - user << "It won't budge!" + to_chat(user, "It won't budge!") + toggle() else toggle() diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm index 3166c61eb31..e413a558a9e 100644 --- a/code/game/objects/structures/crates_lockers/largecrate.dm +++ b/code/game/objects/structures/crates_lockers/largecrate.dm @@ -18,7 +18,8 @@ /obj/structure/largecrate/attack_hand(mob/user as mob) if(manifest) - user << "You tear the manifest off of the crate." + to_chat(user, "You tear the manifest off of the crate.") + playsound(src.loc, 'sound/items/poster_ripped.ogg', 75, 1) manifest.forceMove(loc) if(ishuman(user)) @@ -27,7 +28,8 @@ update_icon() return else - user << "You need a crowbar to pry this open!" + to_chat(user, "You need a crowbar to pry this open!") + return /obj/structure/largecrate/attackby(obj/item/weapon/W as obj, mob/user as mob, params) diff --git a/code/game/objects/structures/crates_lockers/walllocker.dm b/code/game/objects/structures/crates_lockers/walllocker.dm index 03a81a7ca5b..f61584bc6af 100644 --- a/code/game/objects/structures/crates_lockers/walllocker.dm +++ b/code/game/objects/structures/crates_lockers/walllocker.dm @@ -30,10 +30,12 @@ if (istype(user, /mob/living/silicon/ai)) //Added by Strumpetplaya - AI shouldn't be able to return //activate emergency lockers. This fixes that. (Does this make sense, the AI can't call attack_hand, can it? --Mloc) if(!amount) - usr << "It's empty." + to_chat(usr, "It's empty.") + return if(amount) - usr << "You take out some items from \the [src]." + to_chat(usr, "You take out some items from \the [src].") + for(var/path in spawnitems) new path(src.loc) amount-- diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 938fcc2ccf3..c1b3f9c6ca9 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -32,14 +32,16 @@ var/global/list/captain_display_cases = list() circuit = W circuit.forceMove(src) state++ - user << "You add the airlock electronics to the frame." + to_chat(user, "You add the airlock electronics to the frame.") + playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) if(istype(W, /obj/item/weapon/crowbar)) new /obj/machinery/constructable_frame/machine_frame(T) var/obj/item/stack/sheet/glass/G = new /obj/item/stack/sheet/glass(T) G.amount = 5 qdel(src) - user << "You pry the glass out of the frame." + to_chat(user, "You pry the glass out of the frame.") + playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1) return @@ -64,13 +66,15 @@ var/global/list/captain_display_cases = list() sensor.forceMove(T) sensor = null state-- - user << "You pry the electronics out of the frame." + to_chat(user, "You pry the electronics out of the frame.") + playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1) if(isprox(W) && !isprox(sensor)) user.drop_item() sensor = W sensor.forceMove(src) - user << "You add the proximity sensor to the frame." + to_chat(user, "You add the proximity sensor to the frame.") + playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) if(pstate != state) @@ -126,11 +130,14 @@ var/global/list/captain_display_cases = list() /obj/structure/displaycase/examine(mob/user) ..(user) - user << "Peering through the glass, you see that it contains:" + to_chat(user, "Peering through the glass, you see that it contains:") + if(occupant) - user << "\icon[occupant] \A [occupant]." + to_chat(user, "\icon[occupant] \A [occupant].") + else - user << "Nothing." + to_chat(user, "Nothing.") + /obj/structure/displaycase/proc/dump() if(occupant) @@ -213,13 +220,16 @@ var/global/list/captain_display_cases = list() if(istype(W, /obj/item/weapon/card)) var/obj/item/weapon/card/id/I = W if(!check_access(I)) - user << "Access denied." + to_chat(user, "Access denied.") + return locked = !locked if(!locked) - user << "\icon[src] \The [src] clicks as locks release, and it slowly opens for you." + to_chat(user, "\icon[src] \The [src] clicks as locks release, and it slowly opens for you.") + else - user << "\icon[src] You close \the [src] and swipe your card, locking it." + to_chat(user, "\icon[src] You close \the [src] and swipe your card, locking it.") + update_icon() return if(istype(W,/obj/item/weapon/crowbar) && (!locked || destroyed)) @@ -259,14 +269,17 @@ var/global/list/captain_display_cases = list() ..() else if(!locked) dump() - user << "You smash \the [W] into the delicate electronics at the bottom of the case, and deactivate the hover field." + to_chat(user, "You smash \the [W] into the delicate electronics at the bottom of the case, and deactivate the hover field.") + update_icon() else if(locked) - user << "It's locked, you can't put anything into it." + to_chat(user, "It's locked, you can't put anything into it.") + return if(!occupant) - user << "You insert \the [W] into \the [src], and it floats as the hoverfield activates." + to_chat(user, "You insert \the [W] into \the [src], and it floats as the hoverfield activates.") + user.drop_item() W.forceMove(src) occupant=W @@ -276,7 +289,8 @@ var/global/list/captain_display_cases = list() if (destroyed || (!locked && user.a_intent == I_HARM)) if(occupant) dump() - user << "You smash your fist into the delicate electronics at the bottom of the case, and deactivate the hover field." + to_chat(user, "You smash your fist into the delicate electronics at the bottom of the case, and deactivate the hover field.") + src.add_fingerprint(user) update_icon() else @@ -293,19 +307,23 @@ var/global/list/captain_display_cases = list() var/mob/living/carbon/human/H = user var/print = H.get_full_print() if(!ue) - user << "Your press your thumb against the fingerprint scanner, registering your identity with the case." + to_chat(user, "Your press your thumb against the fingerprint scanner, registering your identity with the case.") + ue = print return if(ue != print) - user << "Access denied." + to_chat(user, "Access denied.") + return if(occupant) - user << "Your press your thumb against the fingerprint scanner, and deactivate the hover field built into the case." + to_chat(user, "Your press your thumb against the fingerprint scanner, and deactivate the hover field built into the case.") + dump() update_icon() else - src << "\icon[src] \The [src] is empty!" + to_chat(src, "\icon[src] \The [src] is empty!") + else user.visible_message("[user.name] gently runs his hands over \the [src] in appreciation of its contents.", \ "You gently run your hands over \the [src] in appreciation of its contents.", \ diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index 998f6520361..9042147343a 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -157,7 +157,8 @@ obj/structure/door_assembly/multi_tile/Move() user.visible_message("[user] welds the [glass] plating off the airlock assembly.", "You start to weld the [glass] plating off the airlock assembly.") if(do_after(user, 40, target = src)) if(!src || !WT.isOn()) return - user << "\blue You welded the [glass] plating off!" + to_chat(user, "\blue You welded the [glass] plating off!") + var/M = text2path("/obj/item/stack/sheet/mineral/[glass]") new M(src.loc, 2) glass = 0 @@ -165,18 +166,21 @@ obj/structure/door_assembly/multi_tile/Move() user.visible_message("[user] welds the glass panel out of the airlock assembly.", "You start to weld the glass panel out of the airlock assembly.") if(do_after(user, 40, target = src)) if(!src || !WT.isOn()) return - user << "\blue You welded the glass panel out!" + to_chat(user, "\blue You welded the glass panel out!") + new /obj/item/stack/sheet/rglass(src.loc) glass = 0 else if(!anchored) user.visible_message("[user] dissassembles the airlock assembly.", "You start to dissassemble the airlock assembly.") if(do_after(user, 40, target = src)) if(!src || !WT.isOn()) return - user << "\blue You dissasembled the airlock assembly!" + to_chat(user, "\blue You dissasembled the airlock assembly!") + new /obj/item/stack/sheet/metal(src.loc, 4) qdel(src) else - user << "\blue You need more welding fuel." + to_chat(user, "\blue You need more welding fuel.") + return else if(istype(W, /obj/item/weapon/wrench) && state == 0) @@ -188,7 +192,8 @@ obj/structure/door_assembly/multi_tile/Move() if(do_after(user, 40, target = src)) if(!src) return - user << "\blue You [anchored? "un" : ""]secured the airlock assembly!" + to_chat(user, "\blue You [anchored? "un" : ""]secured the airlock assembly!") + anchored = !anchored else if(istype(W, /obj/item/stack/cable_coil) && state == 0 && anchored ) @@ -198,7 +203,8 @@ obj/structure/door_assembly/multi_tile/Move() if(!src) return coil.use(1) src.state = 1 - user << "\blue You wire the Airlock!" + to_chat(user, "\blue You wire the Airlock!") + else if(istype(W, /obj/item/weapon/wirecutters) && state == 1 ) playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) @@ -206,7 +212,8 @@ obj/structure/door_assembly/multi_tile/Move() if(do_after(user, 40, target = src)) if(!src) return - user << "\blue You cut the airlock wires.!" + to_chat(user, "\blue You cut the airlock wires.!") + new/obj/item/stack/cable_coil(src.loc, 1) src.state = 0 @@ -218,7 +225,8 @@ obj/structure/door_assembly/multi_tile/Move() if(do_after(user, 40, target = src)) if(!src) return - user << "\blue You installed the airlock electronics!" + to_chat(user, "\blue You installed the airlock electronics!") + src.state = 2 src.name = "Near finished Airlock Assembly" src.electronics = W @@ -231,7 +239,8 @@ obj/structure/door_assembly/multi_tile/Move() if(do_after(user, 40, target = src)) if(!src) return - user << "\blue You removed the airlock electronics!" + to_chat(user, "\blue You removed the airlock electronics!") + src.state = 1 src.name = "Wired Airlock Assembly" var/obj/item/weapon/airlock_electronics/ae @@ -250,7 +259,8 @@ obj/structure/door_assembly/multi_tile/Move() playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) user.visible_message("[user] adds [S.name] to the airlock assembly.", "You start to install [S.name] into the airlock assembly.") if(do_after(user, 40, target = src)) - user << "\blue You installed reinforced glass windows into the airlock assembly!" + to_chat(user, "\blue You installed reinforced glass windows into the airlock assembly!") + S.use(1) glass = 1 else if(istype(S, /obj/item/stack/sheet/mineral) && S.sheettype) @@ -259,17 +269,20 @@ obj/structure/door_assembly/multi_tile/Move() playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) user.visible_message("[user] adds [S.name] to the airlock assembly.", "You start to install [S.name] into the airlock assembly.") if(do_after(user, 40, target = src)) - user << "\blue You installed [M] plating into the airlock assembly!" + to_chat(user, "\blue You installed [M] plating into the airlock assembly!") + S.use(2) glass = "[M]" else if(istype(W, /obj/item/weapon/screwdriver) && state == 2 ) playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) - user << "\blue Now finishing the airlock." + to_chat(user, "\blue Now finishing the airlock.") + if(do_after(user, 40, target = src)) if(!src) return - user << "\blue You finish the airlock!" + to_chat(user, "\blue You finish the airlock!") + var/path if(istext(glass)) path = text2path("/obj/machinery/door/airlock/[glass]") diff --git a/code/game/objects/structures/electricchair.dm b/code/game/objects/structures/electricchair.dm index 0486ad2358a..7361fb20831 100644 --- a/code/game/objects/structures/electricchair.dm +++ b/code/game/objects/structures/electricchair.dm @@ -40,9 +40,11 @@ if(usr.stat || !usr.canmove || usr.restrained()) return if(last_time + delay_time > world.time) - usr << "\The [src] is not ready yet!" + to_chat(usr, "\The [src] is not ready yet!") + return - usr << "You activate \the [src]." + to_chat(usr, "You activate \the [src].") + shock() return @@ -78,7 +80,8 @@ visible_message("The electric chair went off!", "You hear a deep sharp shock!") if(buckled_mob) buckled_mob.burn_skin(90) - buckled_mob << "You feel a deep shock course through your body!" + to_chat(buckled_mob, "You feel a deep shock course through your body!") + sleep(1) buckled_mob.burn_skin(90) sleep(5) diff --git a/code/game/objects/structures/engicart.dm b/code/game/objects/structures/engicart.dm index 85fee295e38..fd3140f857a 100644 --- a/code/game/objects/structures/engicart.dm +++ b/code/game/objects/structures/engicart.dm @@ -18,7 +18,8 @@ user.drop_item() I.loc = src updateUsrDialog() - user << "You put [I] into [src]." + to_chat(user, "You put [I] into [src].") + return /obj/structure/engineeringcart/attackby(obj/item/I, mob/user, params) var/fail_msg = "There is already one of those in [src]." @@ -29,56 +30,64 @@ myglass=I update_icon() else - user << fail_msg + to_chat(user, fail_msg) + else if(istype(I, /obj/item/stack/sheet/metal)) if(!mymetal) put_in_cart(I, user) mymetal=I update_icon() else - user << fail_msg + to_chat(user, fail_msg) + else if(istype(I, /obj/item/stack/sheet/plasteel)) if(!myplasteel) put_in_cart(I, user) myplasteel=I update_icon() else - user << fail_msg + to_chat(user, fail_msg) + else if(istype(I, /obj/item/device/flashlight)) if(!myflashlight) put_in_cart(I, user) myflashlight=I update_icon() else - user << fail_msg + to_chat(user, fail_msg) + else if(istype(I, /obj/item/weapon/storage/toolbox/mechanical)) if(!mybluetoolbox) put_in_cart(I, user) mybluetoolbox=I update_icon() else - user << fail_msg + to_chat(user, fail_msg) + else if(istype(I, /obj/item/weapon/storage/toolbox/electrical)) if(!myyellowtoolbox) put_in_cart(I, user) myyellowtoolbox=I update_icon() else - user << fail_msg + to_chat(user, fail_msg) + else if(istype(I, /obj/item/weapon/storage/toolbox)) if(!myredtoolbox) put_in_cart(I, user) myredtoolbox=I update_icon() else - user << fail_msg + to_chat(user, fail_msg) + else if(istype(I, /obj/item/taperoll/engineering/)) if(!myengitape) put_in_cart(I, user) myengitape=I update_icon() else - user << fail_msg + to_chat(user, fail_msg) + else if(istype(I, /obj/item/weapon/wrench)) if (!anchored && !isinspace()) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) @@ -95,7 +104,8 @@ "You hear ratchet.") anchored = 0 else - usr << "You cannot interface your modules [src]!" + to_chat(usr, "You cannot interface your modules [src]!") + /obj/structure/engineeringcart/attack_hand(mob/user) user.set_machine(src) @@ -128,42 +138,50 @@ if(href_list["glass"]) if(myglass) user.put_in_hands(myglass) - user << "You take [myglass] from [src]." + to_chat(user, "You take [myglass] from [src].") + myglass = null if(href_list["metal"]) if(mymetal) user.put_in_hands(mymetal) - user << "You take [mymetal] from [src]." + to_chat(user, "You take [mymetal] from [src].") + mymetal = null if(href_list["plasteel"]) if(myplasteel) user.put_in_hands(myplasteel) - user << "You take [myplasteel] from [src]." + to_chat(user, "You take [myplasteel] from [src].") + myplasteel = null if(href_list["flashlight"]) if(myflashlight) user.put_in_hands(myflashlight) - user << "You take [myflashlight] from [src]." + to_chat(user, "You take [myflashlight] from [src].") + myflashlight = null if(href_list["bluetoolbox"]) if(mybluetoolbox) user.put_in_hands(mybluetoolbox) - user << "You take [mybluetoolbox] from [src]." + to_chat(user, "You take [mybluetoolbox] from [src].") + mybluetoolbox = null if(href_list["redtoolbox"]) if(myredtoolbox) user.put_in_hands(myredtoolbox) - user << "You take [myredtoolbox] from [src]." + to_chat(user, "You take [myredtoolbox] from [src].") + myredtoolbox = null if(href_list["yellowtoolbox"]) if(myyellowtoolbox) user.put_in_hands(myyellowtoolbox) - user << "You take [myyellowtoolbox] from [src]." + to_chat(user, "You take [myyellowtoolbox] from [src].") + myyellowtoolbox = null if(href_list["engitape"]) if(myengitape) user.put_in_hands(myengitape) - user << "You take [myengitape] from [src]." + to_chat(user, "You take [myengitape] from [src].") + myengitape = null update_icon() diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index f8b3317253a..4f448aa4c7a 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -17,7 +17,8 @@ user.drop_item(O) contents += O has_extinguisher = O - user << "You place [O] in [src]." + to_chat(user, "You place [O] in [src].") + else opened = !opened else @@ -34,11 +35,13 @@ if (user.hand) temp = H.organs_by_name["l_hand"] if(temp && !temp.is_usable()) - user << "You try to move your [temp.name], but cannot!" + to_chat(user, "You try to move your [temp.name], but cannot!") + return if(has_extinguisher) user.put_in_hands(has_extinguisher) - user << "You take [has_extinguisher] from [src]." + to_chat(user, "You take [has_extinguisher] from [src].") + has_extinguisher = null opened = 1 else @@ -48,7 +51,8 @@ /obj/structure/extinguisher_cabinet/attack_tk(mob/user) if(has_extinguisher) has_extinguisher.loc = loc - user << "You telekinetically remove [has_extinguisher] from [src]." + to_chat(user, "You telekinetically remove [has_extinguisher] from [src].") + has_extinguisher = null opened = 1 else diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index 668ddc029e5..ceb6604db60 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -77,17 +77,20 @@ /obj/structure/falsewall/attackby(obj/item/weapon/W, mob/user, params) if(opening) - user << "You must wait until the door has stopped moving." + to_chat(user, "You must wait until the door has stopped moving.") + return if(density) var/turf/T = get_turf(src) if(T.density) - user << "[src] is blocked!" + to_chat(user, "[src] is blocked!") + return if(istype(W, /obj/item/weapon/screwdriver)) if (!istype(T, /turf/simulated/floor)) - user << "[src] bolts must be tightened on the floor!" + to_chat(user, "[src] bolts must be tightened on the floor!") + return user.visible_message("[user] tightens some bolts on the wall.", "You tighten the bolts on the wall.") ChangeToWall() @@ -96,7 +99,8 @@ if(WT.remove_fuel(0,user)) dismantle(user) else - user << "You can't reach, close it first!" + to_chat(user, "You can't reach, close it first!") + if(istype(W, /obj/item/weapon/gun/energy/plasmacutter) || istype(W, /obj/item/weapon/pickaxe/drill/diamonddrill) || istype(W, /obj/item/weapon/pickaxe/drill/jackhammer) || istype(W, /obj/item/weapon/melee/energy/blade)) dismantle(user) diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index 80964a3b108..3d62fcbc902 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -287,12 +287,14 @@ if(istype(I, /obj/item/weapon/hatchet) && !stump) if(indestructable) //this bush marks the edge of the map, you can't destroy it - user << "\red You flail away at the undergrowth, but it's too thick here." + to_chat(user, "\red You flail away at the undergrowth, but it's too thick here.") + else user.visible_message("\red [user] begins clearing away [src].","\red You begin clearing away [src].") spawn(rand(15,30)) if(get_dist(user,src) < 2) - user << "\blue You clear away [src]." + to_chat(user, "\blue You clear away [src].") + var/obj/item/stack/sheet/wood/W = new(src.loc) W.amount = rand(3,15) if(prob(50)) diff --git a/code/game/objects/structures/foodcart.dm b/code/game/objects/structures/foodcart.dm index c1a3a388d48..0bb65409cf1 100644 --- a/code/game/objects/structures/foodcart.dm +++ b/code/game/objects/structures/foodcart.dm @@ -26,7 +26,8 @@ user.drop_item() I.loc = src updateUsrDialog() - user << "You put [I] into [src]." + to_chat(user, "You put [I] into [src].") + return /obj/structure/foodcart/attackby(obj/item/I, mob/user, params) @@ -42,7 +43,8 @@ success = 1 break; if(!success) - user << fail_msg + to_chat(user, fail_msg) + else if(istype(I, /obj/item/weapon/reagent_containers/food/drinks)) var/success = 0 for(var/s=1,s<=6,s++) @@ -53,7 +55,8 @@ success = 1 break; if(!success) - user << fail_msg + to_chat(user, fail_msg) + else if(istype(I, /obj/item/weapon/wrench)) if (!anchored && !isinspace()) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) @@ -70,7 +73,8 @@ "You hear ratchet.") anchored = 0 else - usr << "You cannot interface your modules [src]!" + to_chat(usr, "You cannot interface your modules [src]!") + /obj/structure/foodcart/attack_hand(mob/user) user.set_machine(src) @@ -112,62 +116,74 @@ if(href_list["f1"]) if(food_slots[1]) user.put_in_hands(food_slots[1]) - user << "You take [food_slots[1]] from [src]." + to_chat(user, "You take [food_slots[1]] from [src].") + food_slots[1] = null if(href_list["f2"]) if(food_slots[2]) user.put_in_hands(food_slots[2]) - user << "You take [food_slots[2]] from [src]." + to_chat(user, "You take [food_slots[2]] from [src].") + food_slots[2] = null if(href_list["f3"]) if(food_slots[3]) user.put_in_hands(food_slots[3]) - user << "You take [food_slots[3]] from [src]." + to_chat(user, "You take [food_slots[3]] from [src].") + food_slots[3] = null if(href_list["f4"]) if(food_slots[4]) user.put_in_hands(food_slots[4]) - user << "You take [food_slots[4]] from [src]." + to_chat(user, "You take [food_slots[4]] from [src].") + food_slots[4] = null if(href_list["f5"]) if(food_slots[5]) user.put_in_hands(food_slots[5]) - user << "You take [food_slots[5]] from [src]." + to_chat(user, "You take [food_slots[5]] from [src].") + food_slots[5] = null if(href_list["f6"]) if(food_slots[6]) user.put_in_hands(food_slots[6]) - user << "You take [food_slots[6]] from [src]." + to_chat(user, "You take [food_slots[6]] from [src].") + food_slots[6] = null if(href_list["d1"]) if(drink_slots[1]) user.put_in_hands(drink_slots[1]) - user << "You take [drink_slots[1]] from [src]." + to_chat(user, "You take [drink_slots[1]] from [src].") + drink_slots[1] = null if(href_list["d2"]) if(drink_slots[2]) user.put_in_hands(drink_slots[2]) - user << "You take [drink_slots[2]] from [src]." + to_chat(user, "You take [drink_slots[2]] from [src].") + drink_slots[2] = null if(href_list["d3"]) if(drink_slots[3]) user.put_in_hands(drink_slots[3]) - user << "You take [drink_slots[3]] from [src]." + to_chat(user, "You take [drink_slots[3]] from [src].") + drink_slots[3] = null if(href_list["d4"]) if(drink_slots[4]) user.put_in_hands(drink_slots[4]) - user << "You take [drink_slots[4]] from [src]." + to_chat(user, "You take [drink_slots[4]] from [src].") + drink_slots[4] = null if(href_list["d5"]) if(drink_slots[5]) user.put_in_hands(drink_slots[5]) - user << "You take [drink_slots[5]] from [src]." + to_chat(user, "You take [drink_slots[5]] from [src].") + drink_slots[5] = null if(href_list["d6"]) if(drink_slots[6]) user.put_in_hands(drink_slots[6]) - user << "You take [drink_slots[6]] from [src]." + to_chat(user, "You take [drink_slots[6]] from [src].") + drink_slots[6] = null update_icon() //Not really needed without overlays, but keeping just in case diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index af20468279e..a295300fb03 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -32,62 +32,76 @@ if(istype(W, /obj/item/weapon/wrench) && state == 0) if(anchored && !istype(src,/obj/structure/girder/displaced)) playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) - user << "\blue Now disassembling the girder" + to_chat(user, "\blue Now disassembling the girder") + if(do_after(user,40, target = src)) if(!src) return - user << "\blue You dissasembled the girder!" + to_chat(user, "\blue You dissasembled the girder!") + refundMetal(metalUsed) qdel(src) else if(!anchored) playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) - user << "\blue Now securing the girder" + to_chat(user, "\blue Now securing the girder") + if(get_turf(user, 40)) - user << "\blue You secured the girder!" + to_chat(user, "\blue You secured the girder!") + new/obj/structure/girder( src.loc ) qdel(src) else if(istype(W, /obj/item/weapon/gun/energy/plasmacutter)) - user << "\blue Now slicing apart the girder" + to_chat(user, "\blue Now slicing apart the girder") + if(do_after(user,30, target = src)) if(!src) return - user << "\blue You slice apart the girder!" + to_chat(user, "\blue You slice apart the girder!") + refundMetal(metalUsed) qdel(src) else if(istype(W, /obj/item/weapon/pickaxe/drill/diamonddrill)) - user << "\blue You drill through the girder!" + to_chat(user, "\blue You drill through the girder!") + refundMetal(metalUsed) qdel(src) else if(istype(W, /obj/item/weapon/pickaxe/drill/jackhammer)) playsound(src.loc, 'sound/weapons/sonic_jackhammer.ogg', 100, 1) - user << "You Disintegrate the girder!" + to_chat(user, "You Disintegrate the girder!") + refundMetal(metalUsed) qdel(src) else if(istype(W, /obj/item/weapon/screwdriver) && state == 2 && istype(src,/obj/structure/girder/reinforced)) playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) - user << "\blue Now unsecuring support struts" + to_chat(user, "\blue Now unsecuring support struts") + if(do_after(user,40, target = src)) if(!src) return - user << "\blue You unsecured the support struts!" + to_chat(user, "\blue You unsecured the support struts!") + state = 1 else if(istype(W, /obj/item/weapon/wirecutters) && istype(src,/obj/structure/girder/reinforced) && state == 1) playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) - user << "\blue Now removing support struts" + to_chat(user, "\blue Now removing support struts") + if(do_after(user,40, target = src)) if(!src) return - user << "\blue You removed the support struts!" + to_chat(user, "\blue You removed the support struts!") + new/obj/structure/girder( src.loc ) qdel(src) else if(istype(W, /obj/item/weapon/crowbar) && state == 0 && anchored ) playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) - user << "\blue Now dislodging the girder" + to_chat(user, "\blue Now dislodging the girder") + if(do_after(user, 40, target = src)) if(!src) return - user << "\blue You dislodged the girder!" + to_chat(user, "\blue You dislodged the girder!") + new/obj/structure/girder/displaced( src.loc ) qdel(src) @@ -100,16 +114,19 @@ if(!anchored) if(S.amount < 2) return S.use(2) - user << "\blue You create a false wall! Push on it to open or close the passage." + to_chat(user, "\blue You create a false wall! Push on it to open or close the passage.") + new /obj/structure/falsewall (src.loc) qdel(src) else if(S.amount < 2) return ..() - user << "\blue Now adding plating..." + to_chat(user, "\blue Now adding plating...") + if (do_after(user,40, target = src)) if(!src || !S || S.amount < 2) return S.use(2) - user << "\blue You added the plating!" + to_chat(user, "\blue You added the plating!") + var/turf/Tsrc = get_turf(src) Tsrc.ChangeTurf(/turf/simulated/wall) for(var/turf/simulated/wall/X in Tsrc.loc) @@ -121,17 +138,20 @@ if(!anchored) if(S.amount < 2) return S.use(2) - user << "\blue You create a false wall! Push on it to open or close the passage." + to_chat(user, "\blue You create a false wall! Push on it to open or close the passage.") + new /obj/structure/falsewall/reinforced (src.loc) qdel(src) else if (src.icon_state == "reinforced") //I cant believe someone would actually write this line of code... if(S.amount < 1) return ..() - user << "\blue Now finalising reinforced wall." + to_chat(user, "\blue Now finalising reinforced wall.") + if(do_after(user, 50, target = src)) if(!src || !S || S.amount < 1) return S.use(1) - user << "\blue Wall fully reinforced!" + to_chat(user, "\blue Wall fully reinforced!") + var/turf/Tsrc = get_turf(src) Tsrc.ChangeTurf(/turf/simulated/wall/r_wall) for(var/turf/simulated/wall/r_wall/X in Tsrc.loc) @@ -140,11 +160,13 @@ return else if(S.amount < 1) return ..() - user << "\blue Now reinforcing girders" + to_chat(user, "\blue Now reinforcing girders") + if (do_after(user,60, target = src)) if(!src || !S || S.amount < 1) return S.use(1) - user << "\blue Girders reinforced!" + to_chat(user, "\blue Girders reinforced!") + new/obj/structure/girder/reinforced( src.loc ) qdel(src) return @@ -154,17 +176,20 @@ if(!anchored) if(S.amount < 2) return S.use(2) - user << "\blue You create a false wall! Push on it to open or close the passage." + to_chat(user, "\blue You create a false wall! Push on it to open or close the passage.") + var/F = text2path("/obj/structure/falsewall/[M]") new F (src.loc) qdel(src) else if(S.amount < 2) return ..() - user << "\blue Now adding plating..." + to_chat(user, "\blue Now adding plating...") + if (do_after(user,40, target = src)) if(!src || !S || S.amount < 2) return S.use(2) - user << "\blue You added the plating!" + to_chat(user, "\blue You added the plating!") + var/turf/Tsrc = get_turf(src) Tsrc.ChangeTurf(text2path("/turf/simulated/wall/mineral/[M]")) for(var/turf/simulated/wall/mineral/X in Tsrc.loc) @@ -179,7 +204,8 @@ if (P.pipe_type in list(0, 1, 5)) //simple pipes, simple bends, and simple manifolds. user.drop_item() P.loc = src.loc - user << "\blue You fit the pipe into the [src]!" + to_chat(user, "\blue You fit the pipe into the [src]!") + else ..() @@ -241,19 +267,24 @@ /obj/structure/cultgirder/attackby(obj/item/W as obj, mob/user as mob, params) if(istype(W, /obj/item/weapon/wrench)) playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) - user << "\blue Now disassembling the girder" + to_chat(user, "\blue Now disassembling the girder") + if(do_after(user,40, target = src)) - user << "\blue You dissasembled the girder!" + to_chat(user, "\blue You dissasembled the girder!") + dismantle() else if(istype(W, /obj/item/weapon/gun/energy/plasmacutter)) - user << "\blue Now slicing apart the girder" + to_chat(user, "\blue Now slicing apart the girder") + if(do_after(user,30, target = src)) - user << "\blue You slice apart the girder!" + to_chat(user, "\blue You slice apart the girder!") + dismantle() else if(istype(W, /obj/item/weapon/pickaxe/drill/diamonddrill)) - user << "\blue You drill through the girder!" + to_chat(user, "\blue You drill through the girder!") + dismantle() /obj/structure/cultgirder/proc/dismantle() diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 12bdb0c42d9..17d6d1b0262 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -170,18 +170,22 @@ else dir_to_set = 4 else - user << "You can't reach." + to_chat(user, "You can't reach.") + return //Only works for cardinal direcitons, diagonals aren't supposed to work like this. for(var/obj/structure/window/WINDOW in loc) if(WINDOW.dir == dir_to_set) - user << "There is already a window facing this way there." + to_chat(user, "There is already a window facing this way there.") + return - user << "You start placing the window." + to_chat(user, "You start placing the window.") + if(do_after(user,20, target = src)) if(!src) return //Grille destroyed while waiting for(var/obj/structure/window/WINDOW in loc) if(WINDOW.dir == dir_to_set)//checking this for a 2nd time to check if a window was made while we were waiting. - user << "There is already a window facing this way there." + to_chat(user, "There is already a window facing this way there.") + return var/obj/structure/window/WD if(istype(W,/obj/item/stack/sheet/rglass)) @@ -198,7 +202,8 @@ WD.state = 0 var/obj/item/stack/ST = W ST.use(1) - user << "You place the [WD] on [src]." + to_chat(user, "You place the [WD] on [src].") + WD.update_icon() return //window placing end diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index d422d25dfd2..d6a73d7f07c 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -7,7 +7,8 @@ /obj/item/inflatable/attack_self(mob/user) playsound(loc, 'sound/items/zip.ogg', 75, 1) - user << "\blue You inflate [src]." + to_chat(user, "\blue You inflate [src].") + var/obj/structure/inflatable/R = new /obj/structure/inflatable(user.loc) src.transfer_fingerprints_to(R) R.add_fingerprint(user) @@ -150,7 +151,8 @@ /obj/item/inflatable/door/attack_self(mob/user) playsound(loc, 'sound/items/zip.ogg', 75, 1) - user << "\blue You inflate [src]." + to_chat(user, "\blue You inflate [src].") + var/obj/structure/inflatable/door/R = new /obj/structure/inflatable/door(user.loc) src.transfer_fingerprints_to(R) R.add_fingerprint(user) @@ -262,7 +264,8 @@ icon_state = "folded_wall_torn" /obj/item/inflatable/torn/attack_self(mob/user) - user << "The inflatable wall is too torn to be inflated!" + to_chat(user, "The inflatable wall is too torn to be inflated!") + add_fingerprint(user) /obj/item/inflatable/door/torn @@ -272,7 +275,8 @@ icon_state = "folded_door_torn" /obj/item/inflatable/door/torn/attack_self(mob/user) - user << "The inflatable door is too torn to be inflated!" + to_chat(user, "The inflatable door is too torn to be inflated!") + add_fingerprint(user) /obj/item/weapon/storage/briefcase/inflatable diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 6e2f0763369..30a4080b3b4 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -32,24 +32,28 @@ /obj/structure/stool/bed/chair/janicart/examine(mob/user) ..() if(floorbuffer) - user << "It has been upgraded with a floor buffer." + to_chat(user, "It has been upgraded with a floor buffer.") + /obj/structure/stool/bed/chair/janicart/attackby(obj/item/I, mob/user, params) if(istype(I, keytype)) - user << "Hold [I] in one of your hands while you drive this [callme]." + to_chat(user, "Hold [I] in one of your hands while you drive this [callme].") + else if(istype(I, /obj/item/weapon/storage/bag/trash)) if(keytype == /obj/item/key/janitor) if(!user.drop_item()) return - user << "You hook the trashbag onto the [callme]." + to_chat(user, "You hook the trashbag onto the [callme].") + I.loc = src mybag = I else if(istype(I, /obj/item/janiupgrade)) if(keytype == /obj/item/key/janitor) floorbuffer = 1 qdel(I) - user << "You upgrade the [callme] with the floor buffer." + to_chat(user, "You upgrade the [callme] with the floor buffer.") + update_icon() /obj/structure/stool/bed/chair/janicart/update_icon() @@ -90,7 +94,8 @@ spawn(2) move_delay = 0 else - user << "You'll need the keys in one of your hands to drive this [callme]." + to_chat(user, "You'll need the keys in one of your hands to drive this [callme].") + /obj/structure/stool/bed/chair/janicart/Bump(atom/A) if(buckled_mob && istype(A, /obj/machinery/door)) @@ -245,17 +250,20 @@ /obj/structure/janitorialcart/proc/wet_mop(obj/item/weapon/mop, mob/user) if(reagents.total_volume < 1) - user << "[src] is out of water!" + to_chat(user, "[src] is out of water!") + else reagents.trans_to(mop, 5) // - user << "You wet [mop] in [src]." + to_chat(user, "You wet [mop] in [src].") + playsound(loc, 'sound/effects/slosh.ogg', 25, 1) /obj/structure/janitorialcart/proc/put_in_cart(obj/item/I, mob/user) user.drop_item() I.loc = src updateUsrDialog() - user << "You put [I] into [src]." + to_chat(user, "You put [I] into [src].") + return @@ -271,38 +279,44 @@ if(!mymop) m.janicart_insert(user, src) else - user << fail_msg + to_chat(user, fail_msg) + else if(istype(I, /obj/item/weapon/storage/bag/trash)) if(!mybag) var/obj/item/weapon/storage/bag/trash/t=I t.janicart_insert(user, src) else - user << fail_msg + to_chat(user, fail_msg) + else if(istype(I, /obj/item/weapon/reagent_containers/spray/cleaner)) if(!myspray) put_in_cart(I, user) myspray=I update_icon() else - user << fail_msg + to_chat(user, fail_msg) + else if(istype(I, /obj/item/device/lightreplacer)) if(!myreplacer) var/obj/item/device/lightreplacer/l=I l.janicart_insert(user,src) else - user << fail_msg + to_chat(user, fail_msg) + else if(istype(I, /obj/item/weapon/caution)) if(signs < max_signs) put_in_cart(I, user) signs++ update_icon() else - user << "[src] can't hold any more signs." + to_chat(user, "[src] can't hold any more signs.") + else if(istype(I, /obj/item/weapon/crowbar)) user.visible_message("[user] begins to empty the contents of [src].") if(do_after(user, 30, target = src)) - usr << "You empty the contents of [src]'s bucket onto the floor." + to_chat(usr, "You empty the contents of [src]'s bucket onto the floor.") + reagents.reaction(src.loc) src.reagents.clear_reagents() else if(istype(I, /obj/item/weapon/wrench)) @@ -323,7 +337,8 @@ else if(mybag) mybag.attackby(I, user, params) else - usr << "You cannot interface your modules [src]!" + to_chat(usr, "You cannot interface your modules [src]!") + /obj/structure/janitorialcart/attack_hand(mob/user) user.set_machine(src) @@ -352,29 +367,34 @@ if(href_list["garbage"]) if(mybag) user.put_in_hands(mybag) - user << "You take [mybag] from [src]." + to_chat(user, "You take [mybag] from [src].") + mybag = null if(href_list["mop"]) if(mymop) user.put_in_hands(mymop) - user << "You take [mymop] from [src]." + to_chat(user, "You take [mymop] from [src].") + mymop = null if(href_list["spray"]) if(myspray) user.put_in_hands(myspray) - user << "You take [myspray] from [src]." + to_chat(user, "You take [myspray] from [src].") + myspray = null if(href_list["replacer"]) if(myreplacer) user.put_in_hands(myreplacer) - user << "You take [myreplacer] from [src]." + to_chat(user, "You take [myreplacer] from [src].") + myreplacer = null if(href_list["sign"]) if(signs) var/obj/item/weapon/caution/Sign = locate() in src if(Sign) user.put_in_hands(Sign) - user << "You take \a [Sign] from [src]." + to_chat(user, "You take \a [Sign] from [src].") + signs-- else WARNING("Signs ([signs]) didn't match contents") diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index 297c63a333c..7e61e34ccb4 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -13,16 +13,19 @@ add_fingerprint(user) if(istype(I, /obj/item/weapon/wrench)) if(anchored) - user << "You unwrench [src] from the floor." + to_chat(user, "You unwrench [src] from the floor.") + anchored = 0 else - user << "You wrench [src] into place." + to_chat(user, "You wrench [src] into place.") + anchored = 1 else if(istype(I, /obj/item/stack/rods)) var/obj/item/stack/rods/R = I if(R.get_amount() >= 4) R.use(4) - user << "You add spikes to the frame." + to_chat(user, "You add spikes to the frame.") + new /obj/structure/kitchenspike(loc) add_fingerprint(user) qdel(src) @@ -45,18 +48,21 @@ if(!buckled_mob) playsound(loc, 'sound/items/Crowbar.ogg', 100, 1) if(do_after(user, 20, target = src)) - user << "You pry the spikes out of the frame." + to_chat(user, "You pry the spikes out of the frame.") + new /obj/item/stack/rods(loc, 4) new /obj/structure/kitchenspike_frame(loc) add_fingerprint(user) qdel(src) else - user << "You can't do that while something's on the spike!" + to_chat(user, "You can't do that while something's on the spike!") + return if(!istype(G, /obj/item/weapon/grab) || !G.affecting) return if(buckled_mob) - user << "The spike already has something on it, finish collecting its meat first!" + to_chat(user, "The spike already has something on it, finish collecting its meat first!") + else if(isliving(G.affecting)) if(!buckled_mob) @@ -65,7 +71,8 @@ G.affecting.visible_message("[user] slams [G.affecting] onto the meat spike!", "[user] slams you onto the meat spike!", "You hear a squishy wet noise.") qdel(G) return - user << "You can't use that on the spike!" + to_chat(user, "You can't use that on the spike!") + return /obj/structure/kitchenspike/proc/spike(var/mob/living/victim) @@ -123,7 +130,8 @@ M.adjustBruteLoss(30) if(!do_after(M, 1200, target = src)) if(M && M.buckled) - M << "You fail to free yourself!" + to_chat(M, "You fail to free yourself!") + return if(!M.buckled) return diff --git a/code/game/objects/structures/lamarr_cage.dm b/code/game/objects/structures/lamarr_cage.dm index 1be4d60dea0..66a3d9cbcb0 100644 --- a/code/game/objects/structures/lamarr_cage.dm +++ b/code/game/objects/structures/lamarr_cage.dm @@ -69,10 +69,12 @@ if (src.destroyed) return else - usr << text("\blue You kick the lab cage.") + to_chat(usr, text("\blue You kick the lab cage.")) + for(var/mob/O in oviewers()) if ((O.client && !( O.blinded ))) - O << text("\red [] kicks the lab cage.", usr) + to_chat(O, text("\red [] kicks the lab cage.", usr)) + src.health -= 2 healthcheck() return diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 6b27e8104d2..55f25ed49cb 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -58,7 +58,8 @@ if (istype(C, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = C if(WT.remove_fuel(0, user)) - user << "\blue Slicing lattice joints ..." + to_chat(user, "\blue Slicing lattice joints ...") + new /obj/item/stack/rods(src.loc) qdel(src) diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index 78f67ab8847..95c22d434f8 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -111,13 +111,16 @@ attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(istype(W,/obj/item/weapon/pickaxe)) var/obj/item/weapon/pickaxe/digTool = W - user << "You start digging the [name]." + to_chat(user, "You start digging the [name].") + if(do_after(user,digTool.digspeed*hardness, target = src) && src) - user << "You finished digging." + to_chat(user, "You finished digging.") + Dismantle() else if(istype(W,/obj/item/weapon)) //not sure, can't not just weapons get passed to this proc? hardness -= W.force/100 - user << "You hit the [name] with your [W.name]!" + to_chat(user, "You hit the [name] with your [W.name]!") + CheckHardness() else attack_hand(user) diff --git a/code/game/objects/structures/misc.dm b/code/game/objects/structures/misc.dm index fc9a0d4584c..77c5268ba7b 100644 --- a/code/game/objects/structures/misc.dm +++ b/code/game/objects/structures/misc.dm @@ -15,7 +15,8 @@ return attack_hand(user) attack_hand(mob/user as mob) - user << "Civilians: NT is recruiting! Please head SOUTH to the NT Recruitment office to join the station's crew!" + to_chat(user, "Civilians: NT is recruiting! Please head SOUTH to the NT Recruitment office to join the station's crew!") + /obj/structure/ninjatele @@ -48,12 +49,15 @@ playsound(user.loc, 'sound/effects/sparks2.ogg', 50, 1) anim(user.loc,user,'icons/mob/mob.dmi',,"phasein",,user.dir) - user <<"\blue VOID-Shift translocation successful" + to_chat(user, "\blue VOID-Shift translocation successful") + if("No") - user <<"\red Process aborted!" + to_chat(user, "\red Process aborted!") + return else - user<< "\red FĆAL �Rr�R: µ§er n¤t rec¤gnized, c-c¤ntr-r¤£§-£§ £¤cked." \ No newline at end of file + to_chat(user, "\red FĆAL �Rr�R: µ§er n¤t rec¤gnized, c-c¤ntr-r¤£§-£§ £¤cked.") + diff --git a/code/game/objects/structures/mop_bucket.dm b/code/game/objects/structures/mop_bucket.dm index 4988e7d465e..2bb20afb82d 100644 --- a/code/game/objects/structures/mop_bucket.dm +++ b/code/game/objects/structures/mop_bucket.dm @@ -23,16 +23,19 @@ /obj/structure/mopbucket/examine(mob/user) if(..(user, 1)) - usr << text("\icon[] [] contains [] units of water left!", src, src.name, src.reagents.total_volume) + to_chat(usr, text("\icon[] [] contains [] units of water left!", src, src.name, src.reagents.total_volume)) + /obj/structure/mopbucket/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if (istype(W, /obj/item/weapon/mop)) if (src.reagents.total_volume >= 2) src.reagents.trans_to(W, 2) - user << "\blue You wet the mop" + to_chat(user, "\blue You wet the mop") + playsound(src.loc, 'sound/effects/slosh.ogg', 25, 1) if (src.reagents.total_volume < 1) - user << "\blue Out of water!" + to_chat(user, "\blue Out of water!") + return /obj/structure/mopbucket/ex_act(severity) diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 4e255976e18..7b0ba512971 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -150,7 +150,8 @@ if (CM.stat || CM.restrained()) return - CM << "You attempt to slide yourself out of \the [src]..." + to_chat(CM, "You attempt to slide yourself out of \the [src]...") + src.attack_hand(CM) @@ -192,7 +193,8 @@ if (user != O) for(var/mob/B in viewers(user, 3)) if ((B.client && !( B.blinded ))) - B << text("\red [] stuffs [] into []!", user, O, src) + to_chat(B, text("\red [] stuffs [] into []!", user, O, src)) + return /obj/structure/m_tray/Destroy() @@ -274,7 +276,8 @@ /obj/structure/crematorium/attack_hand(mob/user as mob) if (cremating) - usr << "\red It's locked." + to_chat(usr, "\red It's locked.") + return if ((connected) && (locked == 0)) for(var/atom/movable/A as mob|obj in connected.loc) @@ -388,7 +391,8 @@ if (CM.stat || CM.restrained()) return - CM << "You attempt to slide yourself out of \the [src]..." + to_chat(CM, "You attempt to slide yourself out of \the [src]...") + src.attack_hand(CM) /* @@ -429,7 +433,8 @@ if (user != O) for(var/mob/B in viewers(user, 3)) if ((B.client && !( B.blinded ))) - B << text("\red [] stuffs [] into []!", user, O, src) + to_chat(B, text("\red [] stuffs [] into []!", user, O, src)) + //Foreach goto(99) return @@ -446,7 +451,8 @@ if (!C.cremating) C.cremate(user) else - usr << "\red Access denied." + to_chat(usr, "\red Access denied.") + return /hook/Login/proc/update_morgue(var/client/client, var/mob/L) diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm index 8a5f144aac2..81d36be51d9 100644 --- a/code/game/objects/structures/musician.dm +++ b/code/game/objects/structures/musician.dm @@ -79,18 +79,22 @@ cur_acc[i] = "n" for(var/line in lines) - //world << line +// to_chat(world, line) + for(var/beat in splittext(lowertext(line), ",")) - //world << "beat: [beat]" +// to_chat(world, "beat: [beat]") + var/list/notes = splittext(beat, "/") for(var/note in splittext(notes[1], "-")) - //world << "note: [note]" +// to_chat(world, "note: [note]") + if(!playing || shouldStopPlaying(user))//If the instrument is playing, or special case playing = 0 return if(lentext(note) == 0) continue - //world << "Parse: [copytext(note,1,2)]" +// to_chat(world, "Parse: [copytext(note,1,2)]") + var/cur_note = text2ascii(note) - 96 if(cur_note < 1 || cur_note > 7) continue @@ -172,12 +176,14 @@ else tempo = sanitize_tempo(5) // default 120 BPM if(lines.len > 50) - usr << "Too many lines!" + to_chat(usr, "Too many lines!") + lines.Cut(51) var/linenum = 1 for(var/l in lines) if(lentext(l) > 50) - usr << "Line [linenum] too long!" + to_chat(usr, "Line [linenum] too long!") + lines.Remove(l) else linenum++ @@ -301,7 +307,8 @@ if (istype(O, /obj/item/weapon/wrench)) if (!anchored && !isinspace()) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << " You begin to tighten \the [src] to the floor..." + to_chat(user, " You begin to tighten \the [src] to the floor...") + if (do_after(user, 20, target = src)) user.visible_message( \ "[user] tightens \the [src]'s casters.", \ @@ -310,7 +317,8 @@ anchored = 1 else if(anchored) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << " You begin to loosen \the [src]'s casters..." + to_chat(user, " You begin to loosen \the [src]'s casters...") + if (do_after(user, 40, target = src)) user.visible_message( \ "[user] loosens \the [src]'s casters.", \ diff --git a/code/game/objects/structures/noticeboard.dm b/code/game/objects/structures/noticeboard.dm index d5997adfda9..12893155709 100644 --- a/code/game/objects/structures/noticeboard.dm +++ b/code/game/objects/structures/noticeboard.dm @@ -25,9 +25,11 @@ O.loc = src notices++ icon_state = "nboard0[notices]" //update sprite - user << "You pin the paper to the noticeboard." + to_chat(user, "You pin the paper to the noticeboard.") + else - user << "You reach to pin your paper to the board but hesitate. You are certain your paper will not be seen among the many others already attached." + to_chat(user, "You reach to pin your paper to the board but hesitate. You are certain your paper will not be seen among the many others already attached.") + /obj/structure/noticeboard/attack_hand(user as mob) var/dat = "Noticeboard
      " @@ -65,7 +67,8 @@ add_fingerprint(usr) P.attackby(usr.l_hand, usr) else - usr << "You'll need something to write with!" + to_chat(usr, "You'll need something to write with!") + if(href_list["read"]) var/obj/item/weapon/paper/P = locate(href_list["read"]) diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index c95f3aa2b09..c34e36404cd 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -42,9 +42,11 @@ FLOOR SAFES /obj/structure/safe/proc/check_unlocked(mob/user, canhear) if(user && canhear) if(tumbler_1_pos == tumbler_1_open) - user << "You hear a [pick("tonk", "krunk", "plunk")] from [src]." + to_chat(user, "You hear a [pick("tonk", "krunk", "plunk")] from [src].") + if(tumbler_2_pos == tumbler_2_open) - user << "You hear a [pick("tink", "krink", "plink")] from [src]." + to_chat(user, "You hear a [pick("tink", "krink", "plink")] from [src].") + if(tumbler_1_pos == tumbler_1_open && tumbler_2_pos == tumbler_2_open) if(user) visible_message("[pick("Spring", "Sprang", "Sproing", "Clunk", "Krunk")]!") return 1 @@ -95,13 +97,15 @@ FLOOR SAFES if(href_list["open"]) if(check_unlocked()) - user << "You [open ? "close" : "open"] [src]." + to_chat(user, "You [open ? "close" : "open"] [src].") + open = !open update_icon() updateUsrDialog() return else - user << "You can't [open ? "close" : "open"] [src], the lock is engaged!" + to_chat(user, "You can't [open ? "close" : "open"] [src], the lock is engaged!") + return if(href_list["decrement"]) @@ -109,11 +113,13 @@ FLOOR SAFES if(dial == tumbler_1_pos + 1 || dial == tumbler_1_pos - 71) tumbler_1_pos = decrement(tumbler_1_pos) if(canhear) - user << "You hear a [pick("clack", "scrape", "clank")] from [src]." + to_chat(user, "You hear a [pick("clack", "scrape", "clank")] from [src].") + if(tumbler_1_pos == tumbler_2_pos + 37 || tumbler_1_pos == tumbler_2_pos - 35) tumbler_2_pos = decrement(tumbler_2_pos) if(canhear) - user << "You hear a [pick("click", "chink", "clink")] from [src]." + to_chat(user, "You hear a [pick("click", "chink", "clink")] from [src].") + check_unlocked(user, canhear) updateUsrDialog() return @@ -123,11 +129,13 @@ FLOOR SAFES if(dial == tumbler_1_pos - 1 || dial == tumbler_1_pos + 71) tumbler_1_pos = increment(tumbler_1_pos) if(canhear) - user << "You hear a [pick("clack", "scrape", "clank")] from [src]." + to_chat(user, "You hear a [pick("clack", "scrape", "clank")] from [src].") + if(tumbler_1_pos == tumbler_2_pos - 37 || tumbler_1_pos == tumbler_2_pos + 35) tumbler_2_pos = increment(tumbler_2_pos) if(canhear) - user << "You hear a [pick("click", "chink", "clink")] from [src]." + to_chat(user, "You hear a [pick("click", "chink", "clink")] from [src].") + check_unlocked(user, canhear) updateUsrDialog() return @@ -147,18 +155,22 @@ FLOOR SAFES if(I.w_class + space <= maxspace) space += I.w_class if(!user.drop_item()) - user << "\The [I] is stuck to your hand, you cannot put it in the safe!" + to_chat(user, "\The [I] is stuck to your hand, you cannot put it in the safe!") + return I.loc = src - user << "You put [I] in [src]." + to_chat(user, "You put [I] in [src].") + updateUsrDialog() return else - user << "[I] won't fit in [src]." + to_chat(user, "[I] won't fit in [src].") + return else if(istype(I, /obj/item/clothing/accessory/stethoscope)) - user << "Hold [I] in one of your hands while you manipulate the dial!" + to_chat(user, "Hold [I] in one of your hands while you manipulate the dial!") + return diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index 7e35851f693..82c8ed08829 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -25,7 +25,8 @@ /obj/structure/sign/attackby(obj/item/tool as obj, mob/user as mob) //deconstruction if(istype(tool, /obj/item/weapon/screwdriver) && !istype(src, /obj/structure/sign/double)) - user << "You unfasten the sign with your [tool]." + to_chat(user, "You unfasten the sign with your [tool].") + var/obj/item/sign/S = new(src.loc) S.name = name S.desc = desc @@ -61,7 +62,8 @@ S.name = name S.desc = desc S.icon_state = sign_state - user << "You fasten \the [S] with your [tool]." + to_chat(user, "You fasten \the [S] with your [tool].") + qdel(src) else ..() diff --git a/code/game/objects/structures/spirit_board.dm b/code/game/objects/structures/spirit_board.dm index f4ba32b3286..cb26f8ca054 100644 --- a/code/game/objects/structures/spirit_board.dm +++ b/code/game/objects/structures/spirit_board.dm @@ -15,11 +15,13 @@ if(O.client) var/area/A = get_area(src) if(A) - O << "\blue Someone has begun playing with a [src.name] in [A.name]!. (Teleport)" + to_chat(O, "\blue Someone has begun playing with a [src.name] in [A.name]!. (Teleport)") + /obj/structure/spirit_board/examine(mob/user) ..(user) - user << "[initial(desc)] The planchette is sitting at \"[planchette]\"." + to_chat(user, "[initial(desc)] The planchette is sitting at \"[planchette]\".") + /obj/structure/spirit_board/attack_hand(mob/user as mob) if(..()) @@ -69,7 +71,8 @@ light_amount = 10 if(light_amount > 2) - M << "It's too bright here to use [src.name]!" + to_chat(M, "It's too bright here to use [src.name]!") + return 0 //mobs in range check @@ -77,12 +80,14 @@ for(var/mob/living/L in orange(1,src)) if(L.ckey && L.client) if((world.time - L.client.inactivity) < (world.time - 300) || L.stat != CONSCIOUS || L.restrained())//no playing with braindeads or corpses or handcuffed dudes. - M << "[L] doesn't seem to be paying attention..." + to_chat(M, "[L] doesn't seem to be paying attention...") + else users_in_range++ if(users_in_range < 2) - M << "There aren't enough people to use the [src.name]!" + to_chat(M, "There aren't enough people to use the [src.name]!") + return 0 return 1 \ No newline at end of file diff --git a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm index 2c81fd09af3..859b4ba0186 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm @@ -34,7 +34,8 @@ "You hear squelching...") if(!do_after(M, 1200, target = src)) if(M && M.buckled) - M << "You fail to escape \the [src]!" + to_chat(M, "You fail to escape \the [src]!") + return if(!M.buckled) return diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index 671381f952d..d61c34e48bc 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -118,10 +118,12 @@ /obj/item/roller_holder/attack_self(mob/user as mob) if(!held) - user << " The rack is empty." + to_chat(user, " The rack is empty.") + return - user << "You deploy the roller bed." + to_chat(user, "You deploy the roller bed.") + var/obj/structure/stool/bed/roller/R = new /obj/structure/stool/bed/roller(user.loc) R.add_fingerprint(user) qdel(held) diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index 2b5b1bd3ecb..b41ed314674 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -21,7 +21,8 @@ if(istype(W, /obj/item/assembly/shock_kit)) var/obj/item/assembly/shock_kit/SK = W if(!SK.status) - user << "[SK] is not ready to be attached!" + to_chat(user, "[SK] is not ready to be attached!") + return user.drop_item() var/obj/structure/stool/bed/chair/e_chair/E = new /obj/structure/stool/bed/chair/e_chair(src.loc) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index a915ebcdd32..90d8b578b83 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -199,10 +199,12 @@ if(get_dist(src, user) < 2) var/obj/item/weapon/grab/G = I if(G.affecting.buckled) - user << "[G.affecting] is buckled to [G.affecting.buckled]!" + to_chat(user, "[G.affecting] is buckled to [G.affecting.buckled]!") + return 0 if(G.state < GRAB_AGGRESSIVE) - user << "You need a better grip to do that!" + to_chat(user, "You need a better grip to do that!") + return 0 if(!G.confirm()) return 0 @@ -221,7 +223,8 @@ return if (istype(W, /obj/item/weapon/wrench)) - user << "\blue Now disassembling table" + to_chat(user, "\blue Now disassembling table") + playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user,50, target = src)) destroy() @@ -279,7 +282,8 @@ return if(!flip(get_cardinal_dir(usr,src))) - usr << "It won't budge." + to_chat(usr, "It won't budge.") + return usr.visible_message("[usr] flips \the [src]!") @@ -296,7 +300,8 @@ set src in oview(1) if (!unflip()) - usr << "It won't budge." + to_chat(usr, "It won't budge.") + return @@ -383,7 +388,8 @@ return if (istype(I, /obj/item/weapon/wrench)) - user << "\blue Now disassembling the wooden table" + to_chat(user, "\blue Now disassembling the wooden table") + playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) sleep(50) new /obj/item/weapon/table_parts/wood( src.loc ) @@ -434,7 +440,8 @@ return if (istype(W, /obj/item/weapon/wrench)) - user << "\blue Now disassembling the wooden table" + to_chat(user, "\blue Now disassembling the wooden table") + playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) sleep(50) new /obj/item/weapon/table_parts/wood( src.loc ) @@ -482,23 +489,28 @@ if(istype(I, /obj/item/stack/sheet/glass)) var/obj/item/stack/sheet/glass/G = I if(G.amount >= 2) - user << "You start to add the glass to \the [src]." + to_chat(user, "You start to add the glass to \the [src].") + if(do_after(user, 10, target = src)) G.use(2) - user << "You add the glass to \the [src]." + to_chat(user, "You add the glass to \the [src].") + playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) new /obj/structure/table/glass(loc) qdel(src) else - user << "You don't have enough glass! You need at least 2 sheets." + to_chat(user, "You don't have enough glass! You need at least 2 sheets.") + return if(iswrench(I)) - user << "You start to deconstruct \the [src]." + to_chat(user, "You start to deconstruct \the [src].") + playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) if(do_after(user, 10, target = src)) playsound(src.loc, 'sound/items/Deconstruct.ogg', 75, 1) - user << "You dismantle \the [src]." + to_chat(user, "You dismantle \the [src].") + new /obj/item/stack/sheet/metal(loc) new /obj/item/stack/sheet/metal(loc) qdel(src) @@ -533,7 +545,8 @@ return if (istype(I, /obj/item/weapon/wrench)) - user << "\blue Now disassembling the glass table" + to_chat(user, "\blue Now disassembling the glass table") + playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) sleep(50) new /obj/item/weapon/table_parts/glass( src.loc ) @@ -595,18 +608,22 @@ var/obj/item/weapon/weldingtool/WT = W if(WT.remove_fuel(0, user)) if(src.status == 2) - user << "\blue Now weakening the reinforced table" + to_chat(user, "\blue Now weakening the reinforced table") + playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) if (do_after(user, 50, target = src)) if(!src || !WT.isOn()) return - user << "\blue Table weakened" + to_chat(user, "\blue Table weakened") + src.status = 1 else - user << "\blue Now strengthening the reinforced table" + to_chat(user, "\blue Now strengthening the reinforced table") + playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) if (do_after(user, 50, target = src)) if(!src || !WT.isOn()) return - user << "\blue Table strengthened" + to_chat(user, "\blue Table strengthened") + src.status = 2 return return diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm index 3d8b13ff08b..fcfa8161a75 100644 --- a/code/game/objects/structures/tank_dispenser.dm +++ b/code/game/objects/structures/tank_dispenser.dm @@ -49,9 +49,11 @@ I.loc = src oxytanks.Add(I) oxygentanks++ - user << "You put [I] in [src]." + to_chat(user, "You put [I] in [src].") + else - user << "[src] is full." + to_chat(user, "[src] is full.") + updateUsrDialog() return if(istype(I, /obj/item/weapon/tank/plasma)) @@ -60,17 +62,21 @@ I.loc = src platanks.Add(I) plasmatanks++ - user << "You put [I] in [src]." + to_chat(user, "You put [I] in [src].") + else - user << "[src] is full." + to_chat(user, "[src] is full.") + updateUsrDialog() return if(istype(I, /obj/item/weapon/wrench)) if(anchored) - user << "You lean down and unwrench [src]." + to_chat(user, "You lean down and unwrench [src].") + anchored = 0 else - user << "You wrench [src] into place." + to_chat(user, "You wrench [src] into place.") + anchored = 1 return @@ -88,7 +94,8 @@ else O = new /obj/item/weapon/tank/oxygen(loc) O.loc = loc - usr << "You take [O] out of [src]." + to_chat(usr, "You take [O] out of [src].") + oxygentanks-- update_icon() if(href_list["plasma"]) @@ -100,7 +107,8 @@ else P = new /obj/item/weapon/tank/plasma(loc) P.loc = loc - usr << "You take [P] out of [src]." + to_chat(usr, "You take [P] out of [src].") + plasmatanks-- update_icon() add_fingerprint(usr) diff --git a/code/game/objects/structures/target_stake.dm b/code/game/objects/structures/target_stake.dm index bb7ab804d9c..b3bbcce9c2b 100644 --- a/code/game/objects/structures/target_stake.dm +++ b/code/game/objects/structures/target_stake.dm @@ -30,7 +30,8 @@ W.loc = loc W.layer = 3.1 pinned_target = W - user << "You slide the target into the stake." + to_chat(user, "You slide the target into the stake.") + return attack_hand(mob/user as mob) @@ -44,9 +45,11 @@ if(ishuman(user)) if(!user.get_active_hand()) user.put_in_hands(pinned_target) - user << "You take the target out of the stake." + to_chat(user, "You take the target out of the stake.") + else pinned_target.loc = get_turf(user) - user << "You take the target out of the stake." + to_chat(user, "You take the target out of the stake.") + pinned_target = null \ No newline at end of file diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm index 48cc9feccf7..c8efd45a075 100644 --- a/code/game/objects/structures/transit_tubes/station.dm +++ b/code/game/objects/structures/transit_tubes/station.dm @@ -36,7 +36,8 @@ if(!pod_moving && icon_state == "open" && istype(AM, /mob/living) && !is_type_in_list(AM, disallowed_mobs)) for(var/obj/structure/transit_tube_pod/pod in loc) if(pod.contents.len) - AM << "" + to_chat(AM, "") + return else if(!pod.moving && pod.dir in directions()) AM.forceMove(pod) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index b322a84de5b..42dfe596d1d 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -28,7 +28,8 @@ if(cistern && !open) if(!contents.len) - user << "The cistern is empty." + to_chat(user, "The cistern is empty.") + return else var/obj/item/I = pick(contents) @@ -36,7 +37,8 @@ user.put_in_hands(I) else I.loc = get_turf(src) - user << "You find [I] in the cistern." + to_chat(user, "You find [I] in the cistern.") + w_items -= I.w_class return @@ -50,7 +52,8 @@ /obj/structure/toilet/attackby(obj/item/I, mob/living/user, params) if(istype(I, /obj/item/weapon/crowbar)) - user << "You start to [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]..." + to_chat(user, "You start to [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]...") + playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 50, 1) if(do_after(user, 30, target = src)) user.visible_message("[user] [cistern ? "replaces the lid on the cistern" : "lifts the lid off the cistern"]!", "You [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]!", "You hear grinding porcelain.") @@ -64,7 +67,8 @@ var/obj/item/weapon/reagent_containers/RG = I if(RG.is_open_container()) RG.reagents.add_reagent("toiletwater", min(RG.volume - RG.reagents.total_volume, RG.amount_per_transfer_from_this)) - user << "You fill [RG] from [src]. Gross." + to_chat(user, "You fill [RG] from [src]. Gross.") + return if(istype(I, /obj/item/weapon/grab)) @@ -76,7 +80,8 @@ var/mob/living/GM = G.affecting if(G.state >= GRAB_AGGRESSIVE) if(GM.loc != get_turf(src)) - user << "[GM] needs to be on [src]!" + to_chat(user, "[GM] needs to be on [src]!") + return if(!swirlie) if(open) @@ -96,21 +101,26 @@ GM.visible_message("[user] slams [GM.name] into [src]!", "[user] slams [GM.name] into [src]!") GM.adjustBruteLoss(5) else - user << "You need a tighter grip!" + to_chat(user, "You need a tighter grip!") + if(cistern) if(I.w_class > 3) - user << "[I] does not fit!" + to_chat(user, "[I] does not fit!") + return if(w_items + I.w_class > 5) - user << "The cistern is full!" + to_chat(user, "The cistern is full!") + return if(!user.drop_item()) - user << "\The [I] is stuck to your hand, you cannot put it in the cistern!" + to_chat(user, "\The [I] is stuck to your hand, you cannot put it in the cistern!") + return I.loc = src w_items += I.w_class - user << "You carefully place [I] into the cistern." + to_chat(user, "You carefully place [I] into the cistern.") + return @@ -133,14 +143,16 @@ var/mob/living/GM = G.affecting if(G.state >= GRAB_AGGRESSIVE) if(GM.loc != get_turf(src)) - user << "[GM.name] needs to be on [src]." + to_chat(user, "[GM.name] needs to be on [src].") + return user.changeNext_move(CLICK_CD_MELEE) playsound(src.loc, 'sound/effects/bang.ogg', 25, 1) user.visible_message("[user] slams [GM] into [src]!", "You slam [GM] into [src]!") GM.adjustBruteLoss(8) else - user << "You need a tighter grip!" + to_chat(user, "You need a tighter grip!") + /obj/machinery/shower @@ -181,9 +193,11 @@ /obj/machinery/shower/attackby(obj/item/I as obj, mob/user as mob, params) if(I.type == /obj/item/device/analyzer) - user << "The water temperature seems to be [watertemp]." + to_chat(user, "The water temperature seems to be [watertemp].") + if(istype(I, /obj/item/weapon/wrench)) - user << "You begin to adjust the temperature valve with the [I]." + to_chat(user, "You begin to adjust the temperature valve with the [I].") + if(do_after(user, 50, target = src)) switch(watertemp) if("normal") @@ -252,7 +266,8 @@ var/mob/living/L = O L.ExtinguishMob() L.fire_stacks = -20 //Douse ourselves with water to avoid fire more easily - L << "You've been drenched in water!" + to_chat(L, "You've been drenched in water!") + if(iscarbon(O)) var/mob/living/carbon/M = O if(M.r_hand) @@ -343,12 +358,14 @@ if(watertemp == "freezing") //C.bodytemperature = max(80, C.bodytemperature - 80) - C << "The water is freezing!" + to_chat(C, "The water is freezing!") + return if(watertemp == "boiling") //C.bodytemperature = min(500, C.bodytemperature + 35) C.adjustFireLoss(5) - C << "The water is searing!" + to_chat(C, "The water is searing!") + return @@ -385,11 +402,13 @@ if (user.hand) temp = H.organs_by_name["l_hand"] if(temp && !temp.is_usable()) - user << "You try to move your [temp.name], but cannot!" + to_chat(user, "You try to move your [temp.name], but cannot!") + return if(busy) - user << "Someone's already washing here." + to_chat(user, "Someone's already washing here.") + return var/selected_area = parse_zone(user.zone_sel.selecting) var/washing_face = 0 @@ -421,7 +440,8 @@ /obj/structure/sink/attackby(obj/item/O, mob/user, params) if(busy) - user << "Someone's already washing here!" + to_chat(user, "Someone's already washing here!") + return if(!(istype(O))) diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index e8ad95cbe3b..99bd41d7040 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -82,7 +82,8 @@ obj/structure/windoor_assembly/Destroy() if(do_after(user, 40, target = src)) if(!src || !WT.isOn()) return - user << "You dissasembled the windoor assembly!" + to_chat(user, "You dissasembled the windoor assembly!") + var/obj/item/stack/sheet/rglass/RG = new (get_turf(src), 5) RG.add_fingerprint(user) if(secure) @@ -96,7 +97,8 @@ obj/structure/windoor_assembly/Destroy() if(istype(W, /obj/item/weapon/wrench) && !anchored) for(var/obj/machinery/door/window/WD in src.loc) if(WD.dir == src.dir) - user << "There is already a windoor in that location." + to_chat(user, "There is already a windoor in that location.") + return playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) user.visible_message("[user] secures the windoor assembly to the floor.", "You start to secure the windoor assembly to the floor.") @@ -106,9 +108,11 @@ obj/structure/windoor_assembly/Destroy() return for(var/obj/machinery/door/window/WD in src.loc) if(WD.dir == src.dir) - user << "There is already a windoor in that location." + to_chat(user, "There is already a windoor in that location.") + return - user << "You've secured the windoor assembly!" + to_chat(user, "You've secured the windoor assembly!") + src.anchored = 1 if(src.secure) src.name = "secure anchored windoor assembly" @@ -123,7 +127,8 @@ obj/structure/windoor_assembly/Destroy() if(do_after(user, 40, target = src)) if(!src || !src.anchored) return - user << "You've unsecured the windoor assembly!" + to_chat(user, "You've unsecured the windoor assembly!") + src.anchored = 0 if(src.secure) src.name = "secure windoor assembly" @@ -134,16 +139,19 @@ obj/structure/windoor_assembly/Destroy() else if(istype(W, /obj/item/stack/sheet/plasteel) && !secure) var/obj/item/stack/sheet/plasteel/P = W if(P.amount < 2) - user << "You need more plasteel to do this." + to_chat(user, "You need more plasteel to do this.") + return - user << "You start to reinforce the windoor with plasteel." + to_chat(user, "You start to reinforce the windoor with plasteel.") + if(do_after(user,40, target = src)) if(!src || secure) return P.use(2) - user << "You reinforce the windoor." + to_chat(user, "You reinforce the windoor.") + src.secure = 1 if(src.anchored) src.name = "secure anchored windoor assembly" @@ -159,7 +167,8 @@ obj/structure/windoor_assembly/Destroy() return var/obj/item/stack/cable_coil/CC = W CC.use(1) - user << "You wire the windoor!" + to_chat(user, "You wire the windoor!") + src.state = "02" if(src.secure) src.name = "secure wired windoor assembly" @@ -179,7 +188,8 @@ obj/structure/windoor_assembly/Destroy() if(!src || src.state != "02") return - user << "You cut the windoor wires!" + to_chat(user, "You cut the windoor wires!") + new/obj/item/stack/cable_coil(get_turf(user), 1) src.state = "01" if(src.secure) @@ -198,7 +208,8 @@ obj/structure/windoor_assembly/Destroy() if(!src || src.electronics) W.loc = src.loc return - user << "You've installed the airlock electronics!" + to_chat(user, "You've installed the airlock electronics!") + src.name = "near finished windoor assembly" src.electronics = W else @@ -215,7 +226,8 @@ obj/structure/windoor_assembly/Destroy() if(do_after(user, 40, target = src)) if(!src || !electronics) return - user << "You've removed the airlock electronics!" + to_chat(user, "You've removed the airlock electronics!") + src.name = "wired windoor assembly" var/obj/item/weapon/airlock_electronics/ae ae = electronics @@ -236,7 +248,8 @@ obj/structure/windoor_assembly/Destroy() //Crowbar to complete the assembly, Step 7 complete. else if(istype(W, /obj/item/weapon/crowbar)) if(!src.electronics) - usr << "The assembly is missing electronics." + to_chat(usr, "The assembly is missing electronics.") + return usr << browse(null, "window=windoor_access") playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) @@ -247,7 +260,8 @@ obj/structure/windoor_assembly/Destroy() if(src.loc && src.electronics) density = 1 //Shouldn't matter but just incase - user << "You finish the windoor!" + to_chat(user, "You finish the windoor!") + if(secure) var/obj/machinery/door/window/brigdoor/windoor = new /obj/machinery/door/window/brigdoor(src.loc) @@ -308,7 +322,8 @@ obj/structure/windoor_assembly/Destroy() if(usr.stat || !usr.canmove || usr.restrained()) return if (src.anchored) - usr << "It is fastened to the floor; therefore, you can't rotate it!" + to_chat(usr, "It is fastened to the floor; therefore, you can't rotate it!") + return 0 //if(src.state != "01") //update_nearby_tiles(need_rebuild=1) //Compel updates before @@ -331,11 +346,13 @@ obj/structure/windoor_assembly/Destroy() return if(src.facing == "l") - usr << "The windoor will now slide to the right." + to_chat(usr, "The windoor will now slide to the right.") + src.facing = "r" else src.facing = "l" - usr << "The windoor will now slide to the left." + to_chat(usr, "The windoor will now slide to the left.") + update_icon() return diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index fbfc694432e..a0a3e91cdaa 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -210,21 +210,25 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f if(reinf && state >= 1) state = 3 - state playsound(loc, 'sound/items/Screwdriver.ogg', 75, 1) - user << (state == 1 ? "You have unfastened the window from the frame." : "You have fastened the window to the frame.") + to_chat(user, (state == 1 ? "You have unfastened the window from the frame." : "You have fastened the window to the frame.")) + else if(reinf && state == 0) anchored = !anchored update_nearby_icons() playsound(loc, 'sound/items/Screwdriver.ogg', 75, 1) - user << (anchored ? "You have fastened the frame to the floor." : "You have unfastened the frame from the floor.") + to_chat(user, (anchored ? "You have fastened the frame to the floor." : "You have unfastened the frame from the floor.")) + else if(!reinf) anchored = !anchored update_nearby_icons() playsound(loc, 'sound/items/Screwdriver.ogg', 75, 1) - user << (anchored ? "You have fastened the window to the floor." : "You have unfastened the window.") + to_chat(user, (anchored ? "You have fastened the window to the floor." : "You have unfastened the window.")) + else if(istype(W, /obj/item/weapon/crowbar) && reinf && state <= 1) state = 1 - state playsound(loc, 'sound/items/Crowbar.ogg', 75, 1) - user << (state ? "You have pried the window into the frame." : "You have pried the window out of the frame.") + to_chat(user, (state ? "You have pried the window into the frame." : "You have pried the window out of the frame.")) + else if(istype(W, /obj/item/weapon/wrench) && !anchored && health > 7) //Disassemble deconstructed window into parts playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) for(var/i=0;iYou have disassembled the window." + to_chat(user, "You have disassembled the window.") + disassembled = 1 density = 0 air_update_turf(1) @@ -288,7 +293,8 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f return if(anchored) - usr << "It is fastened to the floor therefore you can't rotate it!" + to_chat(usr, "It is fastened to the floor therefore you can't rotate it!") + return 0 dir = turn(dir, 90) @@ -307,7 +313,8 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f return if(anchored) - usr << "It is fastened to the floor therefore you can't rotate it!" + to_chat(usr, "It is fastened to the floor therefore you can't rotate it!") + return 0 dir = turn(dir, 270) diff --git a/code/game/response_team.dm b/code/game/response_team.dm index 20ed7e6c1ed..9ded0a7102d 100644 --- a/code/game/response_team.dm +++ b/code/game/response_team.dm @@ -19,15 +19,18 @@ var/send_emergency_team return if(!ticker) - usr << "\red The game hasn't started yet!" + to_chat(usr, "\red The game hasn't started yet!") + return if(ticker.current_state == 1) - usr << "\red The round hasn't started yet!" + to_chat(usr, "\red The round hasn't started yet!") + return if(send_emergency_team) - usr << "\red Central Command has already dispatched an emergency response team!" + to_chat(usr, "\red Central Command has already dispatched an emergency response team!") + return if(alert("Do you want to dispatch an Emergency Response Team?",,"Yes","No") != "Yes") @@ -39,7 +42,8 @@ var/send_emergency_team return if(send_emergency_team) - usr << "\red Central Command has already dispatched an emergency response team!" + to_chat(usr, "\red Central Command has already dispatched an emergency response team!") + return var/ert_type = pick_ert_type() @@ -76,28 +80,34 @@ var/send_emergency_team set desc = "Join the Emergency Response Team. Only possible if it has been called by the crew." if(!istype(usr,/mob/dead/observer) && !istype(usr,/mob/new_player)) - usr << "You need to be an observer or new player to use this." + to_chat(usr, "You need to be an observer or new player to use this.") + return if(!send_emergency_team) - usr << "No emergency response team is currently being sent." + to_chat(usr, "No emergency response team is currently being sent.") + return if(jobban_isbanned(usr, "Emergency Response Team")) - usr << "You are jobbanned from the emergency reponse team!" + to_chat(usr, "You are jobbanned from the emergency reponse team!") + return var/player_age_check = check_client_age(usr.client, responseteam_age) if(player_age_check && config.use_age_restriction_for_antags) - usr << "This role is not yet available to you. You need to wait another [player_age_check] days." + to_chat(usr, "This role is not yet available to you. You need to wait another [player_age_check] days.") + return if(src.has_enabled_antagHUD == 1 && config.antag_hud_restricted) - usr << "\blue Upon using the antagHUD you forfeited the ability to join the round." + to_chat(usr, "\blue Upon using the antagHUD you forfeited the ability to join the round.") + return if(response_team_members.len > 6) - usr << "The emergency response team is already full!" + to_chat(usr, "The emergency response team is already full!") + return for (var/obj/effect/landmark/L in landmarks_list) diff --git a/code/game/sound.dm b/code/game/sound.dm index df40c88dcb0..83422072932 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -93,12 +93,15 @@ var/const/FALLOFF_SOUNDS = 0.5 S.falloff = (falloff ? falloff : FALLOFF_SOUNDS) if(!is_global) S.environment = 2 - src << S + to_chat(src, S) + /client/proc/playtitlemusic() if(!ticker || !ticker.login_music || config.disable_lobby_music) return if(prefs.sound & SOUND_LOBBY) - src << sound(ticker.login_music, repeat = 0, wait = 0, volume = 85, channel = 1) // MAD JAMS + to_chat(src, sound(ticker.login_music, repeat = 0, wait = 0, volume = 85, channel = 1))// MAD JAMS + + /proc/get_rand_frequency() return rand(32000, 55000) //Frequency stuff only works with 45kbps oggs. diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 7e4eef04c26..92f81302629 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -152,15 +152,19 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3"," if(broken || burnt) broken = 0 burnt = 0 - user << "You remove the broken plating." + to_chat(user, "You remove the broken plating.") + else if(istype(src, /turf/simulated/floor/wood)) - user << "You forcefully pry off the planks, destroying them in the process." + to_chat(user, "You forcefully pry off the planks, destroying them in the process.") + else if(!builtin_tile) - user << "You are unable to pry up \the [src] with a crowbar." + to_chat(user, "You are unable to pry up \the [src] with a crowbar.") + return 1 else - user << "You remove \the [builtin_tile.singular_name]." + to_chat(user, "You remove \the [builtin_tile.singular_name].") + builtin_tile.loc = src builtin_tile = null //deassociate tile, it no longer belongs to this turf make_plating() diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm index c1a74d07973..ed15e8a23bf 100644 --- a/code/game/turfs/simulated/floor/fancy_floor.dm +++ b/code/game/turfs/simulated/floor/fancy_floor.dm @@ -14,7 +14,8 @@ if(istype(C, /obj/item/weapon/screwdriver)) if(broken || burnt) return - user << "You unscrew the planks." + to_chat(user, "You unscrew the planks.") + new floor_tile(src) make_plating() playsound(src, 'sound/items/Screwdriver.ogg', 80, 1) @@ -42,7 +43,8 @@ if(istype(C, /obj/item/weapon/shovel)) new /obj/item/weapon/ore/glass(src) new /obj/item/weapon/ore/glass(src) //Make some sand if you shovel grass - user << "You shovel the grass." + to_chat(user, "You shovel the grass.") + make_plating() /turf/simulated/floor/carpet diff --git a/code/game/turfs/simulated/floor/light_floor.dm b/code/game/turfs/simulated/floor/light_floor.dm index 8149dae593a..3ee2d78813d 100644 --- a/code/game/turfs/simulated/floor/light_floor.dm +++ b/code/game/turfs/simulated/floor/light_floor.dm @@ -68,16 +68,20 @@ qdel(C) state = LIGHTFLOOR_ON update_icon() - user << "You replace the light bulb." + to_chat(user, "You replace the light bulb.") + else - user << "The light bulb seems fine, no need to replace it." + to_chat(user, "The light bulb seems fine, no need to replace it.") + if(istype(C,/obj/item/device/multitool)) if(state != 0) if(state < LIGHTFLOOR_PURPLE) state++ else state = LIGHTFLOOR_ON - user << "You change \the [src]'s light bulb color." + to_chat(user, "You change \the [src]'s light bulb color.") + update_icon() else - user << "\The [src]'s light bulb appears to have burned out." \ No newline at end of file + to_chat(user, "\The [src]'s light bulb appears to have burned out.") + diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index 608a5a2f16b..7890b8a180a 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -27,20 +27,24 @@ if(istype(C, /obj/item/stack/rods)) if(broken || burnt) - user << "Repair the plating first!" + to_chat(user, "Repair the plating first!") + return 1 var/obj/item/stack/rods/R = C if (R.get_amount() < 2) - user << "You need two rods to make a reinforced floor!" + to_chat(user, "You need two rods to make a reinforced floor!") + return 1 else - user << "You begin reinforcing the floor..." + to_chat(user, "You begin reinforcing the floor...") + if(do_after(user, 30, target = src)) if (R.get_amount() >= 2 && !istype(src, /turf/simulated/floor/engine)) ChangeTurf(/turf/simulated/floor/engine) playsound(src, 'sound/items/Deconstruct.ogg', 80, 1) R.use(2) - user << "You reinforce the floor." + to_chat(user, "You reinforce the floor.") + return 1 else if(istype(C, /obj/item/stack/tile)) @@ -51,14 +55,16 @@ ChangeTurf(W.turf_type) playsound(src, 'sound/weapons/Genhit.ogg', 50, 1) else - user << "This section is too damaged to support a tile! Use a welder to fix the damage." + to_chat(user, "This section is too damaged to support a tile! Use a welder to fix the damage.") + return 1 else if(istype(C, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/welder = C if( welder.isOn() && (broken || burnt) ) if(welder.remove_fuel(0,user)) - user << "You fix some dents on the broken plating." + to_chat(user, "You fix some dents on the broken plating.") + playsound(src, 'sound/items/Welder.ogg', 80, 1) icon_state = icon_plating burnt = 0 @@ -104,7 +110,8 @@ if(!C || !user) return if(istype(C, /obj/item/weapon/wrench)) - user << "You begin removing rods..." + to_chat(user, "You begin removing rods...") + playsound(src, 'sound/items/Ratchet.ogg', 80, 1) if(do_after(user, 30, target = src)) if(!istype(src, /turf/simulated/floor/engine)) @@ -224,7 +231,8 @@ return if(!broken && isscrewdriver(C)) - user << "You unscrew the catwalk's rods." + to_chat(user, "You unscrew the catwalk's rods.") + new /obj/item/stack/rods(src, 1) ReplaceWithLattice() for(var/direction in cardinal) diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index c6534203db3..514da6e3f02 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -47,18 +47,23 @@ . = ..(user) if(!damage) - user << "It looks fully intact." + to_chat(user, "It looks fully intact.") + else var/dam = damage / damage_cap if(dam <= 0.3) - user << "It looks slightly damaged." + to_chat(user, "It looks slightly damaged.") + else if(dam <= 0.6) - user << "It looks moderately damaged." + to_chat(user, "It looks moderately damaged.") + else - user << "It looks heavily damaged." + to_chat(user, "It looks heavily damaged.") + if(rotting) - user << "There is fungus growing on [src]." + to_chat(user, "There is fungus growing on [src].") + /turf/simulated/wall/proc/update_icon() if(!damage_overlays[1]) //list hasn't been populated @@ -232,7 +237,8 @@ var/turf/simulated/floor/F = src F.burn_tile() F.icon_state = "wall_thermite" - user << "The thermite starts melting through the wall." + to_chat(user, "The thermite starts melting through the wall.") + spawn(100) if(O) qdel(O) @@ -247,13 +253,16 @@ if(M.environment_smash >= 2) if(M.environment_smash == 3) dismantle_wall(1) - M << "You smash through the wall." + to_chat(M, "You smash through the wall.") + else - M << text("You smash against the wall.") + to_chat(M, text("You smash against the wall.")) + take_damage(rand(25, 75)) return - M << "\blue You push the wall but nothing happens!" + to_chat(M, "\blue You push the wall but nothing happens!") + return /turf/simulated/wall/attack_hand(mob/user as mob) @@ -261,25 +270,30 @@ if (HULK in user.mutations) if (prob(hardness) || rotting) playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1) - user << text("You smash through the wall.") + to_chat(user, text("You smash through the wall.")) + user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) dismantle_wall(1) return else playsound(src, 'sound/effects/bang.ogg', 50, 1) - user << text("You punch the wall.") + to_chat(user, text("You punch the wall.")) + return if(rotting) if(hardness <= 10) - user << "This wall feels rather unstable." + to_chat(user, "This wall feels rather unstable.") + return else - user << "The wall crumbles under your touch." + to_chat(user, "The wall crumbles under your touch.") + dismantle_wall() return - user << "You push the wall but nothing happens!" + to_chat(user, "You push the wall but nothing happens!") + playsound(src, 'sound/weapons/Genhit.ogg', 25, 1) src.add_fingerprint(user) ..() @@ -288,7 +302,8 @@ /turf/simulated/wall/attackby(obj/item/weapon/W as obj, mob/user as mob, params) user.changeNext_move(CLICK_CD_MELEE) if (!user.IsAdvancedToolUser()) - user << "You don't have the dexterity to do this!" + to_chat(user, "You don't have the dexterity to do this!") + return //get the user's location @@ -298,14 +313,16 @@ if(istype(W, /obj/item/weapon/weldingtool) ) var/obj/item/weapon/weldingtool/WT = W if(WT.remove_fuel(0,user)) - user << "You burn away the fungi with \the [WT]." + to_chat(user, "You burn away the fungi with \the [WT].") + playsound(src, 'sound/items/Welder.ogg', 10, 1) for(var/obj/effect/E in src) if(E.name == "Wallrot") qdel(E) rotting = 0 return else if(!is_sharp(W) && W.force >= 10 || W.force >= 20) - user << "\The [src] crumbles away under the force of your [W.name]." + to_chat(user, "\The [src] crumbles away under the force of your [W.name].") + src.dismantle_wall(1) return @@ -325,7 +342,8 @@ var/obj/item/weapon/melee/energy/blade/EB = W EB.spark_system.start() - user << "You slash \the [src] with \the [EB]; the thermite ignites!" + to_chat(user, "You slash \the [src] with \the [EB]; the thermite ignites!") + playsound(src, "sparks", 50, 1) playsound(src, 'sound/weapons/blade1.ogg', 50, 1) @@ -343,54 +361,66 @@ if(WT.remove_fuel(0,user)) if(response == "Repair") - user << "You start repairing the damage to [src]." + to_chat(user, "You start repairing the damage to [src].") + playsound(src, 'sound/items/Welder.ogg', 100, 1) if(do_after(user, max(5, damage / 5), target = src) && WT && WT.isOn()) - user << "You finish repairing the damage to [src]." + to_chat(user, "You finish repairing the damage to [src].") + take_damage(-damage) else if(response == "Dismantle") - user << "You begin slicing through the outer plating." + to_chat(user, "You begin slicing through the outer plating.") + playsound(src, 'sound/items/Welder.ogg', 100, 1) if(do_after(user, 100, target = src) && WT && WT.isOn()) - user << "You remove the outer plating." + to_chat(user, "You remove the outer plating.") + dismantle_wall() else - user << "You stop slicing through [src]." + to_chat(user, "You stop slicing through [src].") + return else - user << "You need more welding fuel to complete this task." + to_chat(user, "You need more welding fuel to complete this task.") + return else if(istype(W, /obj/item/weapon/gun/energy/plasmacutter)) - user << "You begin slicing through the outer plating." + to_chat(user, "You begin slicing through the outer plating.") + playsound(src, 'sound/items/Welder.ogg', 100, 1) if(do_after(user, mineral == "diamond" ? 120 : 60, target = src)) - user << "You remove the outer plating." + to_chat(user, "You remove the outer plating.") + dismantle_wall() visible_message("[user] slices apart \the [src]!","You hear metal being sliced apart.") //DRILLING else if (istype(W, /obj/item/weapon/pickaxe/drill/diamonddrill)) - user << "You begin to drill though the wall." + to_chat(user, "You begin to drill though the wall.") + if(do_after(user, mineral == "diamond" ? 120 : 60, target = src)) - user << "Your drill tears though the last of the reinforced plating." + to_chat(user, "Your drill tears though the last of the reinforced plating.") + dismantle_wall() visible_message("[user] drills through \the [src]!","You hear the grinding of metal.") else if (istype(W, /obj/item/weapon/pickaxe/drill/jackhammer)) - user << "You begin to disintegrates the wall." + to_chat(user, "You begin to disintegrates the wall.") + if(do_after(user, mineral == "diamond" ? 60 : 30, target = src)) - user << "Your jackhammer disintegrate the reinforced plating." + to_chat(user, "Your jackhammer disintegrate the reinforced plating.") + dismantle_wall() visible_message("[user] disintegrates \the [src]!","You hear the grinding of metal.") @@ -398,7 +428,8 @@ var/obj/item/weapon/melee/energy/blade/EB = W EB.spark_system.start() - user << "You stab \the [EB] into the wall and begin to slice it apart." + to_chat(user, "You stab \the [EB] into the wall and begin to slice it apart.") + playsound(src, "sparks", 50, 1) if(do_after(user, mineral == "diamond" ? 140 : 70, target = src)) diff --git a/code/game/turfs/simulated/walls_reinforced.dm b/code/game/turfs/simulated/walls_reinforced.dm index 41c5df5656c..882b03f9136 100644 --- a/code/game/turfs/simulated/walls_reinforced.dm +++ b/code/game/turfs/simulated/walls_reinforced.dm @@ -16,7 +16,8 @@ /turf/simulated/wall/r_wall/attackby(obj/item/W as obj, mob/user as mob, params) user.changeNext_move(CLICK_CD_MELEE) if (!user.IsAdvancedToolUser()) - user << "You don't have the dexterity to do this!" + to_chat(user, "You don't have the dexterity to do this!") + return //get the user's location @@ -26,14 +27,16 @@ if(istype(W, /obj/item/weapon/weldingtool) ) var/obj/item/weapon/weldingtool/WT = W if( WT.remove_fuel(0,user) ) - user << "You burn away the fungi with \the [WT]." + to_chat(user, "You burn away the fungi with \the [WT].") + playsound(src, 'sound/items/Welder.ogg', 10, 1) for(var/obj/effect/E in src) if(E.name == "Wallrot") qdel(E) rotting = 0 return else if(!is_sharp(W) && W.force >= 10 || W.force >= 20) - user << "\The [src] crumbles away under the force of your [W.name]." + to_chat(user, "\The [src] crumbles away under the force of your [W.name].") + src.dismantle_wall() return @@ -53,7 +56,8 @@ var/obj/item/weapon/melee/energy/blade/EB = W EB.spark_system.start() - user << "You slash \the [src] with \the [EB]; the thermite ignites!" + to_chat(user, "You slash \the [src] with \the [EB]; the thermite ignites!") + playsound(src, "sparks", 50, 1) playsound(src, 'sound/weapons/blade1.ogg', 50, 1) @@ -61,20 +65,24 @@ return else if(istype(W, /obj/item/weapon/melee/energy/blade)) - user << "This wall is too thick to slice through. You will need to find a different path." + to_chat(user, "This wall is too thick to slice through. You will need to find a different path.") + return if(damage && istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W if(WT.remove_fuel(0,user)) - user << "You start repairing the damage to [src]." + to_chat(user, "You start repairing the damage to [src].") + playsound(src, 'sound/items/Welder.ogg', 100, 1) if(do_after(user, max(5, damage / 5), target = src) && WT && WT.isOn()) - user << "You finish repairing the damage to [src]." + to_chat(user, "You finish repairing the damage to [src].") + take_damage(-damage) return else - user << "You need more welding fuel to complete this task." + to_chat(user, "You need more welding fuel to complete this task.") + return @@ -86,18 +94,21 @@ d_state = 1 update_icon() new /obj/item/stack/rods(src) - user << "You cut the outer grille." + to_chat(user, "You cut the outer grille.") + return if(1) if (istype(W, /obj/item/weapon/screwdriver)) - user << "You begin removing the support lines." + to_chat(user, "You begin removing the support lines.") + playsound(src, 'sound/items/Screwdriver.ogg', 100, 1) if(do_after(user, 40, target = src) && d_state == 1) d_state = 2 update_icon() - user << "You remove the support lines." + to_chat(user, "You remove the support lines.") + return //REPAIRING (replacing the outer grille for cosmetic damage) @@ -107,92 +118,110 @@ d_state = 0 update_icon() src.icon_state = "r_wall" - user << "You replace the outer grille." + to_chat(user, "You replace the outer grille.") + else - user << "You don't have enough rods for that!" + to_chat(user, "You don't have enough rods for that!") + if(2) if(istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W if(WT.remove_fuel(0,user)) - user << "You begin slicing through the metal cover." + to_chat(user, "You begin slicing through the metal cover.") + playsound(src, 'sound/items/Welder.ogg', 100, 1) if(do_after(user, 60, target = src) && d_state == 2) d_state = 3 update_icon() - user << "You press firmly on the cover, dislodging it." + to_chat(user, "You press firmly on the cover, dislodging it.") + else - user << "You need more welding fuel to complete this task." + to_chat(user, "You need more welding fuel to complete this task.") + return if(istype(W, /obj/item/weapon/gun/energy/plasmacutter)) - user << "You begin slicing through the metal cover." + to_chat(user, "You begin slicing through the metal cover.") + playsound(src, 'sound/items/Welder.ogg', 100, 1) if(do_after(user, 40, target = src) && d_state == 2) d_state = 3 update_icon() - user << "You press firmly on the cover, dislodging it." + to_chat(user, "You press firmly on the cover, dislodging it.") + return if(3) if(istype(W, /obj/item/weapon/crowbar)) - user << "You struggle to pry off the cover." + to_chat(user, "You struggle to pry off the cover.") + playsound(src, 'sound/items/Crowbar.ogg', 100, 1) if(do_after(user, 100, target = src) && d_state == 3) d_state = 4 update_icon() - user << "You pry off the cover." + to_chat(user, "You pry off the cover.") + return if(4) if(istype(W, /obj/item/weapon/wrench)) - user << "You start loosening the anchoring bolts which secure the support rods to their frame." + to_chat(user, "You start loosening the anchoring bolts which secure the support rods to their frame.") + playsound(src, 'sound/items/Ratchet.ogg', 100, 1) if(do_after(user, 40, target = src) && d_state == 4) d_state = 5 update_icon() - user << "You remove the bolts anchoring the support rods." + to_chat(user, "You remove the bolts anchoring the support rods.") + return if(5) if(istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W if(WT.remove_fuel(0,user)) - user << "You begin slicing through the support rods." + to_chat(user, "You begin slicing through the support rods.") + playsound(src, 'sound/items/Welder.ogg', 100, 1) if(do_after(user, 100, target = src) && d_state == 5) d_state = 6 update_icon() new /obj/item/stack/rods(src) - user << "The support rods drop out as you cut them loose from the frame." + to_chat(user, "The support rods drop out as you cut them loose from the frame.") + else - user << "You need more welding fuel to complete this task." + to_chat(user, "You need more welding fuel to complete this task.") + return if(istype(W, /obj/item/weapon/gun/energy/plasmacutter)) - user << "You begin slicing through the support rods." + to_chat(user, "You begin slicing through the support rods.") + playsound(src, 'sound/items/Welder.ogg', 100, 1) if(do_after(user, 70, target = src) && d_state == 5) d_state = 6 update_icon() new /obj/item/stack/rods( src ) - user << "The support rods drop out as you cut them loose from the frame." + to_chat(user, "The support rods drop out as you cut them loose from the frame.") + return if(6) if(istype(W, /obj/item/weapon/crowbar)) - user << "You struggle to pry off the outer sheath." + to_chat(user, "You struggle to pry off the outer sheath.") + playsound(src, 'sound/items/Crowbar.ogg', 100, 1) if(do_after(user, 100, target = src) && d_state == 6) - user << "You pry off the outer sheath." + to_chat(user, "You pry off the outer sheath.") + dismantle_wall() return @@ -200,34 +229,41 @@ //DRILLING if(istype(W, /obj/item/weapon/pickaxe/drill/diamonddrill)) - user << "You begin to drill though the wall." + to_chat(user, "You begin to drill though the wall.") + if(do_after(user, 200, target = src)) - user << "Your drill tears through the last of the reinforced plating." + to_chat(user, "Your drill tears through the last of the reinforced plating.") + dismantle_wall() if(istype(W,/obj/item/weapon/pickaxe/drill/jackhammer)) - user << "You begin to disintegrate the wall." + to_chat(user, "You begin to disintegrate the wall.") + if(do_after(user, 100, target = src)) - user << "Your sonic jackhammer disintegrates the reinforced plating." + to_chat(user, "Your sonic jackhammer disintegrates the reinforced plating.") + dismantle_wall() //REPAIRING else if(istype(W, /obj/item/stack/sheet/metal) && d_state) var/obj/item/stack/sheet/metal/MS = W - user << "You begin patching-up the wall with \a [MS]." + to_chat(user, "You begin patching-up the wall with \a [MS].") + if(do_after(user, max(20 * d_state, 100), target = src) && d_state) if(!MS.use(1)) - user << "You don't have enough metal for that!" + to_chat(user, "You don't have enough metal for that!") + return d_state = 0 update_icon() smooth_icon_neighbors(src) - user << "You repair the last of the damage." + to_chat(user, "You repair the last of the damage.") + //APC diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index eb4b7671d71..f8da6e361f2 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -38,19 +38,23 @@ var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) if(L) if(R.use(1)) - user << "You begin constructing catwalk..." + to_chat(user, "You begin constructing catwalk...") + playsound(src, 'sound/weapons/Genhit.ogg', 50, 1) qdel(L) ChangeTurf(/turf/simulated/floor/plating/airless/catwalk) else - user << "You need two rods to build a catwalk!" + to_chat(user, "You need two rods to build a catwalk!") + return if(R.use(1)) - user << "Constructing support lattice..." + to_chat(user, "Constructing support lattice...") + playsound(src, 'sound/weapons/Genhit.ogg', 50, 1) ReplaceWithLattice() else - user << "You need one rod to build a lattice." + to_chat(user, "You need one rod to build a lattice.") + return if(istype(C, /obj/item/stack/tile/plasteel)) @@ -60,12 +64,15 @@ if(S.use(1)) qdel(L) playsound(src, 'sound/weapons/Genhit.ogg', 50, 1) - user << "You build a floor." + to_chat(user, "You build a floor.") + ChangeTurf(/turf/simulated/floor/plating) else - user << "You need one floor tile to build a floor!" + to_chat(user, "You need one floor tile to build a floor!") + else - user << "The plating is going to need some support! Place metal rods first." + to_chat(user, "The plating is going to need some support! Place metal rods first.") + /turf/space/Entered(atom/movable/A as mob|obj) ..() @@ -107,9 +114,12 @@ target_z = y_arr[cur_y] /* //debug - world << "Src.z = [src.z] in global map X = [cur_x], Y = [cur_y]" - world << "Target Z = [target_z]" - world << "Next X = [next_x]" + to_chat(world, "Src.z = [src.z] in global map X = [cur_x], Y = [cur_y]") + + to_chat(world, "Target Z = [target_z]") + + to_chat(world, "Next X = [next_x]") + //debug */ if(target_z) @@ -132,9 +142,12 @@ target_z = y_arr[cur_y] /* //debug - world << "Src.z = [src.z] in global map X = [cur_x], Y = [cur_y]" - world << "Target Z = [target_z]" - world << "Next X = [next_x]" + to_chat(world, "Src.z = [src.z] in global map X = [cur_x], Y = [cur_y]") + + to_chat(world, "Target Z = [target_z]") + + to_chat(world, "Next X = [next_x]") + //debug */ if(target_z) @@ -156,9 +169,12 @@ target_z = y_arr[next_y] /* //debug - world << "Src.z = [src.z] in global map X = [cur_x], Y = [cur_y]" - world << "Next Y = [next_y]" - world << "Target Z = [target_z]" + to_chat(world, "Src.z = [src.z] in global map X = [cur_x], Y = [cur_y]") + + to_chat(world, "Next Y = [next_y]") + + to_chat(world, "Target Z = [target_z]") + //debug */ if(target_z) @@ -181,9 +197,12 @@ target_z = y_arr[next_y] /* //debug - world << "Src.z = [src.z] in global map X = [cur_x], Y = [cur_y]" - world << "Next Y = [next_y]" - world << "Target Z = [target_z]" + to_chat(world, "Src.z = [src.z] in global map X = [cur_x], Y = [cur_y]") + + to_chat(world, "Next Y = [next_y]") + + to_chat(world, "Target Z = [target_z]") + //debug */ if(target_z) diff --git a/code/game/vehicles/spacepods/equipment.dm b/code/game/vehicles/spacepods/equipment.dm index 5053012df1a..f3678e57701 100644 --- a/code/game/vehicles/spacepods/equipment.dm +++ b/code/game/vehicles/spacepods/equipment.dm @@ -1,11 +1,13 @@ /obj/item/device/spacepod_equipment/weaponry/proc/fire_weapons() if(my_atom.next_firetime > world.time) - usr << "Your weapons are recharging." + to_chat(usr, "Your weapons are recharging.") + return var/turf/firstloc var/turf/secondloc if(!my_atom.equipment_system || !my_atom.equipment_system.weapon_system) - usr << "Missing equipment or weapons." + to_chat(usr, "Missing equipment or weapons.") + my_atom.verbs -= text2path("[type]/proc/fire_weapons") return my_atom.battery.use(shot_cost) diff --git a/code/game/vehicles/spacepods/parts.dm b/code/game/vehicles/spacepods/parts.dm index 28ec839b967..a70c203fd3c 100644 --- a/code/game/vehicles/spacepods/parts.dm +++ b/code/game/vehicles/spacepods/parts.dm @@ -59,11 +59,13 @@ var/obj/item/stack/rods/R = O var/list/linkedparts = find_square() if(!linkedparts) - user << "You cannot assemble a pod frame because you do not have the necessary assembly." + to_chat(user, "You cannot assemble a pod frame because you do not have the necessary assembly.") + return var/obj/structure/spacepod_frame/pod = new /obj/structure/spacepod_frame(src.loc) pod.dir = src.dir - user << "You strut the pod frame together." + to_chat(user, "You strut the pod frame together.") + R.use(10) for(var/obj/item/pod_parts/pod_frame/F in linkedparts) if(1 == turn(F.dir, -F.link_angle)) //if the part links north during construction, as the bottom left part always does @@ -72,7 +74,8 @@ qdel(F) playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1) if(istype(O, /obj/item/weapon/wrench)) - user << "You [!anchored ? "secure \the [src] in place." : "remove the securing bolts."]" + to_chat(user, "You [!anchored ? "secure \the [src] in place." : "remove the securing bolts."]") + anchored = !anchored density = anchored playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1) @@ -82,7 +85,8 @@ set category = "Object" set src in oview(1) if(anchored) - usr << "\The [src] is securely bolted!" + to_chat(usr, "\The [src] is securely bolted!") + return 0 src.dir = turn(src.dir, -90) return 1 diff --git a/code/game/vehicles/spacepods/pod_fabricator.dm b/code/game/vehicles/spacepods/pod_fabricator.dm index a3d9e4911a3..3452c95f851 100644 --- a/code/game/vehicles/spacepods/pod_fabricator.dm +++ b/code/game/vehicles/spacepods/pod_fabricator.dm @@ -499,7 +499,8 @@ default_deconstruction_crowbar(W) return 1 else - user << "You can't load \the [name] while it's opened." + to_chat(user, "You can't load \the [name] while it's opened.") + return 1 if(istype(W, /obj/item/stack)) @@ -525,10 +526,12 @@ return ..() if(being_built) - user << "\The [src] is currently processing. Please wait until completion." + to_chat(user, "\The [src] is currently processing. Please wait until completion.") + return if(res_max_amount - resources[material] < MINERAL_MATERIAL_AMOUNT) //overstuffing the fabricator - user << "\The [src] [material2name(material)] storage is full." + to_chat(user, "\The [src] [material2name(material)] storage is full.") + return var/obj/item/stack/sheet/stack = W var/sname = "[stack.name]" @@ -538,12 +541,14 @@ var/transfer_amount = min(stack.amount, round((res_max_amount - resources[material])/MINERAL_MATERIAL_AMOUNT,1)) resources[material] += transfer_amount * MINERAL_MATERIAL_AMOUNT stack.use(transfer_amount) - user << "You insert [transfer_amount] [sname] sheet\s into \the [src]." + to_chat(user, "You insert [transfer_amount] [sname] sheet\s into \the [src].") + sleep(10) updateUsrDialog() overlays -= "fab-load-[material2name(material)]" //No matter what the overlay shall still be deleted else - user << "\The [src] cannot hold any more [sname] sheet\s." + to_chat(user, "\The [src] cannot hold any more [sname] sheet\s.") + return /obj/machinery/spod_part_fabricator/proc/material2name(var/ID) diff --git a/code/game/vehicles/spacepods/spacepod.dm b/code/game/vehicles/spacepods/spacepod.dm index 4463c7b61a3..63ed986856c 100644 --- a/code/game/vehicles/spacepods/spacepod.dm +++ b/code/game/vehicles/spacepods/spacepod.dm @@ -146,7 +146,8 @@ user.changeNext_move(CLICK_CD_MELEE) deal_damage(15) playsound(src.loc, 'sound/weapons/slash.ogg', 50, 1, -1) - user << "\red You slash at \the [src]!" + to_chat(user, "\red You slash at \the [src]!") + visible_message("\red The [user] slashes at [src.name]'s armor!") return @@ -160,25 +161,35 @@ S.wait = 0 //No queue S.channel = 0 //Any channel S.volume = 50 - occupant << S + to_chat(occupant, S) + if(occupant2) - occupant2 << S + to_chat(occupant2, S) + if(occupant && oldhealth > health && !health) var/sound/S = sound('sound/effects/engine_alert1.ogg') S.wait = 0 S.channel = 0 S.volume = 50 - occupant << S + to_chat(occupant, S) + if(occupant2) - occupant2 << S + to_chat(occupant2, S) + if(!health) spawn(0) - if(occupant) occupant << "Critical damage to the vessel detected, core explosion imminent!" - if(occupant2) occupant2 << "Critical damage to the vessel detected, core explosion imminent!" + if(occupant) + to_chat(occupant, "Critical damage to the vessel detected, core explosion imminent!") + if(occupant2) + to_chat(occupant2, "Critical damage to the vessel detected, core explosion imminent!") + for(var/i = 10, i >= 0; --i) - if(occupant) occupant << "[i]" - if(occupant2) occupant2 << "[i]" + if(occupant) + to_chat(occupant, "[i]") + if(occupant2) + to_chat(occupant2, "[i]") + if(i == 0) explosion(loc, 2, 4, 8) qdel(src) @@ -201,11 +212,13 @@ if(H) H.forceMove(get_turf(src)) H.ex_act(severity + 1) - H << "You are forcefully thrown from \the [src]!" + to_chat(H, "You are forcefully thrown from \the [src]!") + if(H2) H2.forceMove(get_turf(src)) H2.ex_act(severity + 1) - H2 << "You are forcefully thrown from \the [src]!" + to_chat(H2, "You are forcefully thrown from \the [src]!") + qdel(ion_trail) qdel(src) if(2) @@ -218,8 +231,12 @@ occupant_sanity_check() switch(severity) if(1) - if(src.occupant) src.occupant << "The pod console flashes 'Heavy EMP WAVE DETECTED'." //warn the occupants - if(src.occupant2) src.occupant2 << "The pod console flashes 'Heavy EMP WAVE DETECTED'." //warn the occupants + if(occupant) + to_chat(occupant, "The pod console flashes 'Heavy EMP WAVE DETECTED'.")//warn the occupants + if(occupant2) + to_chat(occupant2, "The pod console flashes 'Heavy EMP WAVE DETECTED'.")//warn the occupants + + if(battery) battery.charge = max(0, battery.charge - 5000) //Cell EMP act is too weak, this pod needs to be sapped. @@ -229,27 +246,33 @@ processing_objects.Add(src) if(2) - if(src.occupant) src.occupant << "The pod console flashes 'EMP WAVE DETECTED'." //warn the occupants - if(src.occupant2) src.occupant2 << "The pod console flashes 'EMP WAVE DETECTED'." //warn the occupants + if(occupant) + to_chat(occupant, "The pod console flashes 'EMP WAVE DETECTED'.")//warn the occupants + if(occupant2) + to_chat(occupant2, "The pod console flashes 'EMP WAVE DETECTED'.")//warn the occupants - src.deal_damage(40) + + deal_damage(40) if(battery) battery.charge = max(0, battery.charge - 2500) //Cell EMP act is too weak, this pod needs to be sapped. - if(src.empcounter < 20) - src.empcounter = 20 //Disable movement for 20 ticks. + if(empcounter < 20) + empcounter = 20 //Disable movement for 20 ticks. processing_objects.Add(src) /obj/spacepod/attackby(obj/item/W as obj, mob/user as mob, params) if(iscrowbar(W)) hatch_open = !hatch_open playsound(loc, 'sound/items/Crowbar.ogg', 50, 1) - user << "You [hatch_open ? "open" : "close"] the maintenance hatch." + to_chat(user, "You [hatch_open ? "open" : "close"] the maintenance hatch.") + if(istype(W, /obj/item/weapon/stock_parts/cell)) if(!hatch_open) - user << "\red The maintenance hatch is closed!" + to_chat(user, "\red The maintenance hatch is closed!") + return if(battery) - user << "The pod already has a battery." + to_chat(user, "The pod already has a battery.") + return user.drop_item(W) battery = W @@ -257,17 +280,21 @@ return if(istype(W, /obj/item/device/spacepod_equipment)) if(!hatch_open) - user << "\red The maintenance hatch is closed!" + to_chat(user, "\red The maintenance hatch is closed!") + return if(!equipment_system) - user << "The pod has no equipment datum, yell at pomf" + to_chat(user, "The pod has no equipment datum, yell at pomf") + return if(istype(W, /obj/item/device/spacepod_equipment/weaponry)) if(equipment_system.weapon_system) - user << "The pod already has a weapon system, remove it first." + to_chat(user, "The pod already has a weapon system, remove it first.") + return else - user << "You insert \the [W] into the equipment system." + to_chat(user, "You insert \the [W] into the equipment system.") + user.drop_item(W) W.forceMove(src) equipment_system.weapon_system = W @@ -276,10 +303,12 @@ if(istype(W, /obj/item/device/spacepod_equipment/misc)) if(equipment_system.misc_system) - user << "The pod already has a miscellaneous system, remove it first." + to_chat(user, "The pod already has a miscellaneous system, remove it first.") + return else - user << "You insert \the [W] into the equipment system." + to_chat(user, "You insert \the [W] into the equipment system.") + user.drop_item(W) W.forceMove(src) equipment_system.misc_system = W @@ -287,10 +316,12 @@ return if(istype(W, /obj/item/device/spacepod_equipment/cargo)) if(equipment_system.cargo_system) - user << "The pod already has a cargo system, remove it first." + to_chat(user, "The pod already has a cargo system, remove it first.") + return else - user << "You insert \the [W] into the cargo system." + to_chat(user, "You insert \the [W] into the cargo system.") + user.drop_item(W) W.forceMove(src) equipment_system.cargo_system = W @@ -299,28 +330,34 @@ if(istype(W, /obj/item/weapon/weldingtool)) if(!hatch_open) - user << "\red You must open the maintenance hatch before attempting repairs." + to_chat(user, "\red You must open the maintenance hatch before attempting repairs.") + return var/obj/item/weapon/weldingtool/WT = W if(!WT.isOn()) - user << "\red The welder must be on for this task." + to_chat(user, "\red The welder must be on for this task.") + return if (health < initial(health)) - user << "\blue You start welding the spacepod..." + to_chat(user, "\blue You start welding the spacepod...") + playsound(loc, 'sound/items/Welder.ogg', 50, 1) if(do_after(user, 20, target = src)) if(!src || !WT.remove_fuel(3, user)) return repair_damage(10) - user << "\blue You mend some [pick("dents","bumps","damage")] with \the [WT]" + to_chat(user, "\blue You mend some [pick("dents","bumps","damage")] with \the [WT]") + else - user << "\blue \The [src] is fully repaired!" + to_chat(user, "\blue \The [src] is fully repaired!") + /obj/spacepod/attack_hand(mob/user as mob) if(!hatch_open) return ..() if(!equipment_system || !istype(equipment_system)) - user << "The pod has no equpment datum, or is the wrong type, yell at pomf." + to_chat(user, "The pod has no equpment datum, or is the wrong type, yell at pomf.") + return var/list/possible = list() if(battery) @@ -341,50 +378,61 @@ switch(input(user, "Remove which equipment?", null, null) as null|anything in possible) if("Energy Cell") if(user.put_in_any_hand_if_possible(battery)) - user << "You remove \the [battery] from the space pod" + to_chat(user, "You remove \the [battery] from the space pod") + battery = null if("Weapon System") SPE = equipment_system.weapon_system if(user.put_in_any_hand_if_possible(SPE)) - user << "You remove \the [SPE] from the equipment system." + to_chat(user, "You remove \the [SPE] from the equipment system.") + SPE.removed(user) SPE.my_atom = null equipment_system.weapon_system = null else - user << "You need an open hand to do that." + to_chat(user, "You need an open hand to do that.") + if("Misc. System") SPE = equipment_system.misc_system if(user.put_in_any_hand_if_possible(SPE)) - user << "You remove \the [SPE] from the equipment system." + to_chat(user, "You remove \the [SPE] from the equipment system.") + SPE.removed(user) SPE.my_atom = null equipment_system.misc_system = null else - user << "You need an open hand to do that." + to_chat(user, "You need an open hand to do that.") + if("Cargo System") SPE = equipment_system.cargo_system if(user.put_in_any_hand_if_possible(SPE)) - user << "You remove \the [SPE] from the equipment system." + to_chat(user, "You remove \the [SPE] from the equipment system.") + SPE.removed(user) SPE.my_atom = null equipment_system.cargo_system = null else - user << "You need an open hand to do that." + to_chat(user, "You need an open hand to do that.") + /* if("engine system") SPE = equipment_system.engine_system if(user.put_in_any_hand_if_possible(SPE)) - user << "You remove \the [SPE] from the equipment system." + to_chat(user, "You remove \the [SPE] from the equipment system.") + equipment_system.engine_system = null else - user << "You need an open hand to do that." + to_chat(user, "You need an open hand to do that.") + if("shield system") SPE = equipment_system.shield_system if(user.put_in_any_hand_if_possible(SPE)) - user << "You remove \the [SPE] from the equipment system." + to_chat(user, "You remove \the [SPE] from the equipment system.") + equipment_system.shield_system = null else - user << "You need an open hand to do that." + to_chat(user, "You need an open hand to do that.") + */ return @@ -442,7 +490,8 @@ if(usr!=src.occupant) return use_internal_tank = !use_internal_tank - src.occupant << "Now taking air from [use_internal_tank?"internal airtank":"environment"]." + to_chat(occupant, "Now taking air from [use_internal_tank?"internal airtank":"environment"].") + return /obj/spacepod/proc/add_cabin() @@ -517,7 +566,8 @@ if(M != user && M.stat == DEAD && allow2enter) if(occupant2 && !occupant) - usr << "You can't put a corpse into the driver's seat!" + to_chat(usr, "You can't put a corpse into the driver's seat!") + return 0 if(!occupant2) visible_message("[user.name] starts loading [M.name] into the pod!") @@ -532,15 +582,19 @@ if(equipment_system.cargo_system && istype(equipment_system.cargo_system,/obj/item/device/spacepod_equipment/cargo/ore)) var/obj/item/device/spacepod_equipment/cargo/ore/C = equipment_system.cargo_system if(!C.box) - user << "You begin loading \the [O] into \the [src]'s [equipment_system.cargo_system]" + to_chat(user, "You begin loading \the [O] into \the [src]'s [equipment_system.cargo_system]") + if(do_after(user, 40, target = src)) C.box = O O.forceMove(C) - user << "You load \the [O] into \the [src]'s [equipment_system.cargo_system]!" + to_chat(user, "You load \the [O] into \the [src]'s [equipment_system.cargo_system]!") + else - user << "You fail to load \the [O] into \the [src]'s [equipment_system.cargo_system]" + to_chat(user, "You fail to load \the [O] into \the [src]'s [equipment_system.cargo_system]") + else - user << "\The [src] already has \an [C.box]" + to_chat(user, "\The [src] already has \an [C.box]") + /obj/spacepod/verb/enter_pod(mob/user = usr) set category = "Object" @@ -551,7 +605,8 @@ return if(get_dist(src, user) > 2 || get_dist(usr, user) > 1) - usr << "They are too far away to put inside" + to_chat(usr, "They are too far away to put inside") + return if(!istype(user)) @@ -565,12 +620,14 @@ return 0 if(fukkendisk) - user << "The nuke-disk is locking the door every time you try to open it. You get the feeling that it doesn't want to go into the spacepod." + to_chat(user, "The nuke-disk is locking the door every time you try to open it. You get the feeling that it doesn't want to go into the spacepod.") + return 0 for(var/mob/living/carbon/slime/S in range(1,usr)) if(S.Victim == user) - user << "You're too busy getting your life sucked out of you." + to_chat(user, "You're too busy getting your life sucked out of you.") + return 0 move_inside(user) @@ -591,9 +648,11 @@ add_fingerprint(user) playsound(src, 'sound/machines/windowdoor.ogg', 50, 1) else - user << "[occupant] was faster. Try better next time, loser." + to_chat(user, "[occupant] was faster. Try better next time, loser.") + else - user << "You stop entering \the [src]." + to_chat(user, "You stop entering \the [src].") + else if(!occupant2) visible_message("[user] starts to climb into \the [src].") @@ -605,11 +664,14 @@ add_fingerprint(user) playsound(src, 'sound/machines/windowdoor.ogg', 50, 1) else - user << "[occupant] was faster. Try better next time, loser." + to_chat(user, "[occupant] was faster. Try better next time, loser.") + else - user << "You stop entering \the [src]." + to_chat(user, "You stop entering \the [src].") + else - user << "You can't fit in \the [src], it's full!" + to_chat(user, "You can't fit in \the [src], it's full!") + /obj/spacepod/proc/occupant_sanity_check() if(occupant) @@ -651,15 +713,21 @@ switch(spos) if(0) return if(1) - if(occupant2) occupant2 << "[occupant.name] climbs out of the pod!" + if(occupant2) + to_chat(occupant2, "[occupant.name] climbs out of the pod!") + occupant.forceMove(src.loc) occupant = null - user << "You climb out of \the [src]." + to_chat(user, "You climb out of \the [src].") + if(2) - if(occupant) occupant << "[occupant2.name] climbs out of the pod!" + if(occupant) + to_chat(occupant, "[occupant2.name] climbs out of the pod!") + occupant2.forceMove(src.loc) occupant2 = null - user << "You climb out of \the [src]." + to_chat(user, "You climb out of \the [src].") + /obj/spacepod/verb/exit_pod2() set name = "Eject Secondary Seat" @@ -669,16 +737,20 @@ occupant_sanity_check() if(!occupant2) - usr << "There is no one in the second seat." + to_chat(usr, "There is no one in the second seat.") + return if(usr == occupant2) - usr << "How do you plan to do that? The eject button is out of reach." + to_chat(usr, "How do you plan to do that? The eject button is out of reach.") + return if(usr == occupant) - usr << "You eject [occupant2.name]." - occupant2 << "\The [src] ejects you forcefully!" + to_chat(usr, "You eject [occupant2.name].") + + to_chat(occupant2, "\The [src] ejects you forcefully!") + inertia_dir = 0 occupant2.forceMove(src.loc) occupant2 = null @@ -690,11 +762,13 @@ if(CheckIfOccupant2(usr)) if(!allow2enter) - usr << "You can't [allow2enter ? "lock" : "unlock"] the doors from your seat." + to_chat(usr, "You can't [allow2enter ? "lock" : "unlock"] the doors from your seat.") + return allow2enter = !allow2enter - usr << "You [allow2enter ? "unlock" : "lock"] the doors." + to_chat(usr, "You [allow2enter ? "unlock" : "lock"] the doors.") + /obj/spacepod/verb/toggleDoors() @@ -717,10 +791,12 @@ else P.close() return 1 - usr << "Access denied." + to_chat(usr, "Access denied.") + return - usr << "You are not close to any pod doors." + to_chat(usr, "You are not close to any pod doors.") + return @@ -731,7 +807,8 @@ set category = "Spacepod" set src = usr.loc if(!equipment_system.weapon_system) - usr << "\The [src] has no weapons!" + to_chat(usr, "\The [src] has no weapons!") + return equipment_system.weapon_system.fire_weapons() @@ -742,7 +819,8 @@ set category = "Spacepod" set src = usr.loc if(!equipment_system.cargo_system) - usr << "\The [src] has no cargo system!" + to_chat(usr, "\The [src] has no cargo system!") + return equipment_system.cargo_system.unload() @@ -759,7 +837,8 @@ set_light(lights_power) else set_light(0) - occupant << "Toggled lights [lights ? "on" : "off"]." + to_chat(occupant, "Toggled lights [lights ? "on" : "off"].") + return /obj/spacepod/proc/enter_after(delay as num, var/mob/user as mob, var/numticks = 5) @@ -852,15 +931,20 @@ else if(!battery) - user << "No energy cell detected." + to_chat(user, "No energy cell detected.") + else if(battery.charge < 1) - user << "Not enough charge left." + to_chat(user, "Not enough charge left.") + else if(!health) - user << "She's dead, Jim" + to_chat(user, "She's dead, Jim") + else if(empcounter != 0) - user << "The pod control interface isn't responding. The console indicates [empcounter] seconds before reboot." + to_chat(user, "The pod control interface isn't responding. The console indicates [empcounter] seconds before reboot.") + else - user << "Unknown error has occurred, yell at the coders." + to_chat(user, "Unknown error has occurred, yell at the coders.") + return 0 battery.charge = max(0, battery.charge - 1) next_move = world.time + move_delay diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index d4f90164e2c..69fc81e195b 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -5,43 +5,49 @@ var/global/moderator_ooc_colour = "#184880" var/global/admin_ooc_colour = "#b82e00" /client/verb/ooc(msg as text) - set name = "OOC" + set name = "OOC" set category = "OOC" - if(!mob) + if(!mob) return if(IsGuestKey(key)) - src << "Guests may not use OOC." + to_chat(src, "Guests may not use OOC.") + return msg = trim(sanitize(copytext(msg, 1, MAX_MESSAGE_LEN))) - if(!msg) + if(!msg) return if(!(prefs.toggles & CHAT_OOC)) - src << "You have OOC muted." + to_chat(src, "You have OOC muted.") + return if(!check_rights(R_ADMIN|R_MOD,0)) if(!config.ooc_allowed) - src << "OOC is globally muted." + to_chat(src, "OOC is globally muted.") + return if(!config.dooc_allowed && (mob.stat == DEAD)) - usr << "OOC for dead mobs has been turned off." + to_chat(usr, "OOC for dead mobs has been turned off.") + return if(prefs.muted & MUTE_OOC) - src << "You cannot use OOC (muted)." + to_chat(src, "You cannot use OOC (muted).") + return if(handle_spam_prevention(msg, MUTE_OOC)) return if(findtext(msg, "byond://")) - src << "Advertising other servers is not allowed." + to_chat(src, "Advertising other servers is not allowed.") + log_admin("[key_name(src)] has attempted to advertise in OOC: [msg]") message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]") return log_ooc("[mob.name]/[key] : [msg]") - + var/display_colour = normal_ooc_colour if(holder && !holder.fakekey) display_colour = mentor_ooc_colour @@ -52,12 +58,12 @@ var/global/admin_ooc_colour = "#b82e00" display_colour = src.prefs.ooccolor else display_colour = admin_ooc_colour - + if(prefs.unlock_content) if(display_colour == normal_ooc_colour) if((prefs.toggles & MEMBER_PUBLIC)) display_colour = member_ooc_colour - + for(var/client/C in clients) if(C.prefs.toggles & CHAT_OOC) var/display_name = src.key @@ -70,15 +76,18 @@ var/global/admin_ooc_colour = "#b82e00" display_name = "[holder.fakekey]/([src.key])" else display_name = holder.fakekey - C << "OOC: [display_name]: [msg]" + to_chat(C, "OOC: [display_name]: [msg]") + /proc/toggle_ooc() config.ooc_allowed = ( !config.ooc_allowed ) if (config.ooc_allowed) - world << "The OOC channel has been globally enabled!" + to_chat(world, "The OOC channel has been globally enabled!") + else - world << "The OOC channel has been globally disabled!" - + to_chat(world, "The OOC channel has been globally disabled!") + + /proc/auto_toggle_ooc(var/on) if(config.auto_toggle_ooc_during_round && config.ooc_allowed != on) toggle_ooc() @@ -87,29 +96,29 @@ var/global/admin_ooc_colour = "#b82e00" set name = "Set Player OOC Colour" set desc = "Modifies the default player OOC color." set category = "Server" - + if(!check_rights(R_SERVER)) return - + normal_ooc_colour = newColor message_admins("[key_name_admin(usr)] has set the default player OOC color to [newColor]") log_admin("[key_name(usr)] has set the default player OOC color to [newColor]") feedback_add_details("admin_verb","SOOC") - + /client/proc/reset_ooc() set name = "Reset Player OOC Color" set desc = "Returns the default player OOC color to default." set category = "Server" - + if(!check_rights(R_SERVER)) return - + normal_ooc_colour = initial(normal_ooc_colour) message_admins("[key_name_admin(usr)] has reset the default player OOC color") log_admin("[key_name(usr)] has reset the default player OOC color") - + feedback_add_details("admin_verb","ROOC") - + /client/proc/colorooc() set name = "Set Your OOC Color" set desc = "Allows you to pick a custom OOC color." @@ -121,8 +130,9 @@ var/global/admin_ooc_colour = "#b82e00" if(new_ooccolor) prefs.ooccolor = new_ooccolor prefs.save_preferences(src) - usr << "Your OOC color has been set to [new_ooccolor]." - + to_chat(usr, "Your OOC color has been set to [new_ooccolor].") + + feedback_add_details("admin_verb","OC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/resetcolorooc() @@ -134,50 +144,57 @@ var/global/admin_ooc_colour = "#b82e00" prefs.ooccolor = initial(prefs.ooccolor) prefs.save_preferences(src) - usr << "Your OOC color has been reset." - + to_chat(usr, "Your OOC color has been reset.") + + feedback_add_details("admin_verb","ROC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/looc(msg as text) - set name = "LOOC" + set name = "LOOC" set desc = "Local OOC, seen only by those in view." set category = "OOC" - if(!mob) + if(!mob) return if(IsGuestKey(key)) - src << "Guests may not use OOC." + to_chat(src, "Guests may not use OOC.") + return msg = trim(sanitize(copytext(msg, 1, MAX_MESSAGE_LEN))) - if(!msg) + if(!msg) return if(!(prefs.toggles & CHAT_LOOC)) - src << "You have LOOC muted." + to_chat(src, "You have LOOC muted.") + return if(!check_rights(R_ADMIN|R_MOD,0)) if(!config.looc_allowed) - src << "LOOC is globally muted." + to_chat(src, "LOOC is globally muted.") + return if(!config.dooc_allowed && (mob.stat == DEAD)) - usr << "LOOC for dead mobs has been turned off." + to_chat(usr, "LOOC for dead mobs has been turned off.") + return if(prefs.muted & MUTE_OOC) - src << "You cannot use LOOC (muted)." + to_chat(src, "You cannot use LOOC (muted).") + return if(handle_spam_prevention(msg,MUTE_OOC)) return if(findtext(msg, "byond://")) - src << "Advertising other servers is not allowed." + to_chat(src, "Advertising other servers is not allowed.") + log_admin("[key_name(src)] has attempted to advertise in LOOC: [msg]") message_admins("[key_name_admin(src)] has attempted to advertise in LOOC: [msg]") return log_ooc("(LOCAL) [mob.name]/[key] : [msg]") - - var/mob/source = mob.get_looc_source() + + var/mob/source = mob.get_looc_source() var/list/heard = get_mobs_in_view(7, source) var/display_name = key @@ -186,7 +203,7 @@ var/global/admin_ooc_colour = "#b82e00" if(mob.stat != DEAD) display_name = mob.name - for(var/client/target in clients) + for(var/client/target in clients) if(target.prefs.toggles & CHAT_LOOC) var/prefix = "" var/admin_stuff = "" @@ -215,8 +232,9 @@ var/global/admin_ooc_colour = "#b82e00" prefix = "(R)" if(send) - target << "LOOC[prefix]: [display_name][admin_stuff]: [msg]" - + to_chat(target, "LOOC[prefix]: [display_name][admin_stuff]: [msg]") + + /mob/proc/get_looc_source() return src @@ -224,4 +242,3 @@ var/global/admin_ooc_colour = "#b82e00" if(eyeobj) return eyeobj return src - \ No newline at end of file diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm index dab208d415f..78da8e2169f 100644 --- a/code/game/verbs/suicide.dm +++ b/code/game/verbs/suicide.dm @@ -53,20 +53,24 @@ set hidden = 1 if (stat == DEAD) - src << "You're already dead!" + to_chat(src, "You're already dead!") + return if (!ticker) - src << "You can't commit suicide before the game starts!" + to_chat(src, "You can't commit suicide before the game starts!") + return // No more borergrief, one way or the other if(has_brain_worms()) - src << "You try to bring yourself to commit suicide, but - something prevents you!" + to_chat(src, "You try to bring yourself to commit suicide, but - something prevents you!") + return if (suiciding) - src << "You're already committing suicide! Be patient!" + to_chat(src, "You're already committing suicide! Be patient!") + return var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No") @@ -80,7 +84,8 @@ do_suicide(damagetype, held_item) return - viewers(src) << "[src] [pick(species.suicide_messages)] It looks like they're trying to commit suicide." + to_chat(viewers(src), "[src] [pick(species.suicide_messages)] It looks like they're trying to commit suicide.") + do_suicide(0) updatehealth() @@ -89,22 +94,26 @@ set hidden = 1 if (stat == 2) - src << "You're already dead!" + to_chat(src, "You're already dead!") + return if (!ticker) - src << "You can't commit suicide before the game starts!" + to_chat(src, "You can't commit suicide before the game starts!") + return if (suiciding) - src << "You're already committing suicide! Be patient!" + to_chat(src, "You're already committing suicide! Be patient!") + return var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No") if(confirm == "Yes") suiciding = 1 - viewers(loc) << "\red [src]'s brain is growing dull and lifeless. It looks like it's lost the will to live." + to_chat(viewers(loc), "\red [src]'s brain is growing dull and lifeless. It looks like it's lost the will to live.") + spawn(50) death(0) suiciding = 0 @@ -114,18 +123,21 @@ set hidden = 1 if (stat == 2) - src << "You're already dead!" + to_chat(src, "You're already dead!") + return if (suiciding) - src << "You're already committing suicide! Be patient!" + to_chat(src, "You're already committing suicide! Be patient!") + return var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No") if(confirm == "Yes") suiciding = 1 - viewers(src) << "\red [src] is powering down. It looks like \he's trying to commit suicide." + to_chat(viewers(src), "\red [src] is powering down. It looks like \he's trying to commit suicide.") + //put em at -175 adjustOxyLoss(max(maxHealth * 2 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) updatehealth() @@ -134,18 +146,21 @@ set hidden = 1 if (stat == 2) - src << "You're already dead!" + to_chat(src, "You're already dead!") + return if (suiciding) - src << "You're already committing suicide! Be patient!" + to_chat(src, "You're already committing suicide! Be patient!") + return var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No") if(confirm == "Yes") suiciding = 1 - viewers(src) << "\red [src] is powering down. It looks like \he's trying to commit suicide." + to_chat(viewers(src), "\red [src] is powering down. It looks like \he's trying to commit suicide.") + //put em at -175 adjustOxyLoss(max(maxHealth * 2 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) updatehealth() @@ -165,24 +180,28 @@ M.show_message("\blue [src] flashes a message across its screen, \"Wiping core files. Please acquire a new personality to continue using pAI device functions.\"", 3, "\blue [src] bleeps electronically.", 2) death(0) else - src << "Aborting suicide attempt." + to_chat(src, "Aborting suicide attempt.") + /mob/living/carbon/alien/humanoid/verb/suicide() set hidden = 1 if (stat == 2) - src << "You're already dead!" + to_chat(src, "You're already dead!") + return if (suiciding) - src << "You're already committing suicide! Be patient!" + to_chat(src, "You're already committing suicide! Be patient!") + return var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No") if(confirm == "Yes") suiciding = 1 - viewers(src) << "\red [src] is thrashing wildly! It looks like \he's trying to commit suicide." + to_chat(viewers(src), "\red [src] is thrashing wildly! It looks like \he's trying to commit suicide.") + //put em at -175 adjustOxyLoss(max(175 - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) updatehealth() @@ -191,11 +210,13 @@ /mob/living/carbon/slime/verb/suicide() set hidden = 1 if (stat == 2) - src << "You're already dead!" + to_chat(src, "You're already dead!") + return if (suiciding) - src << "You're already committing suicide! Be patient!" + to_chat(src, "You're already committing suicide! Be patient!") + return var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No") diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm index 87e8231e272..5e4a871b4bb 100644 --- a/code/game/verbs/who.dm +++ b/code/game/verbs/who.dm @@ -63,7 +63,8 @@ msg += "[line]\n" msg += "Total Players: [length(Lines)]" - src << msg + to_chat(src, msg) + /client/verb/adminwho() set category = "Admin" @@ -127,4 +128,5 @@ num_mods_online++ msg = "Current Admins ([num_admins_online]):\n" + msg + "\nCurrent Mods/Mentors ([num_mods_online]):\n" + modmsg - src << msg + to_chat(src, msg) + diff --git a/code/modules/admin/DB ban/functions.dm b/code/modules/admin/DB ban/functions.dm index 72cee4a7b4c..b638a6f8a9c 100644 --- a/code/modules/admin/DB ban/functions.dm +++ b/code/modules/admin/DB ban/functions.dm @@ -93,7 +93,8 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration = if(blockselfban) if(a_ckey == ckey) - usr << "You cannot apply this ban type on yourself." + to_chat(usr, "You cannot apply this ban type on yourself.") + return var/who @@ -118,13 +119,15 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration = if(adm_query.NextRow()) var/adm_bans = text2num(adm_query.item[1]) if(adm_bans >= MAX_ADMIN_BANS_PER_ADMIN) - usr << "You already logged [MAX_ADMIN_BANS_PER_ADMIN] admin ban(s) or more. Do not abuse this function!" + to_chat(usr, "You already logged [MAX_ADMIN_BANS_PER_ADMIN] admin ban(s) or more. Do not abuse this function!") + return var/sql = "INSERT INTO [format_table_name("ban")] (`id`,`bantime`,`serverip`,`bantype`,`reason`,`job`,`duration`,`rounds`,`expiration_time`,`ckey`,`computerid`,`ip`,`a_ckey`,`a_computerid`,`a_ip`,`who`,`adminwho`,`edits`,`unbanned`,`unbanned_datetime`,`unbanned_ckey`,`unbanned_computerid`,`unbanned_ip`) VALUES (null, Now(), '[serverip]', '[bantype_str]', '[reason]', '[job]', [(duration)?"[duration]":"0"], [(rounds)?"[rounds]":"0"], Now() + INTERVAL [(duration>0) ? duration : 0] MINUTE, '[ckey]', '[computerid]', '[ip]', '[a_ckey]', '[a_computerid]', '[a_ip]', '[who]', '[adminwho]', '', null, null, null, null, null)" var/DBQuery/query_insert = dbcon.NewQuery(sql) query_insert.Execute() - usr << "\blue Ban saved to database." + to_chat(usr, "\blue Ban saved to database.") + message_admins("[key_name_admin(usr)] has added a [bantype_str] for [ckey] [(job)?"([job])":""] [(duration > 0)?"([duration] minutes)":""] with the reason: \"[reason]\" to the ban database.",1) if(announceinirc) @@ -192,17 +195,20 @@ datum/admins/proc/DB_ban_unban(var/ckey, var/bantype, var/job = "") ban_number++; if(ban_number == 0) - usr << "\red Database update failed due to no bans fitting the search criteria. If this is not a legacy ban you should contact the database admin." + to_chat(usr, "\red Database update failed due to no bans fitting the search criteria. If this is not a legacy ban you should contact the database admin.") + return if(ban_number > 1) - usr << "\red Database update failed due to multiple bans fitting the search criteria. Note down the ckey, job and current time and contact the database admin." + to_chat(usr, "\red Database update failed due to multiple bans fitting the search criteria. Note down the ckey, job and current time and contact the database admin.") + return if(istext(ban_id)) ban_id = text2num(ban_id) if(!isnum(ban_id)) - usr << "\red Database update failed due to a ban ID mismatch. Contact the database admin." + to_chat(usr, "\red Database update failed due to a ban ID mismatch. Contact the database admin.") + return DB_ban_unban_by_id(ban_id) @@ -212,7 +218,8 @@ datum/admins/proc/DB_ban_edit(var/banid = null, var/param = null) if(!check_rights(R_BAN)) return if(!isnum(banid) || !istext(param)) - usr << "Cancelled" + to_chat(usr, "Cancelled") + return var/DBQuery/query = dbcon.NewQuery("SELECT ckey, duration, reason FROM [format_table_name("ban")] WHERE id = [banid]") @@ -228,7 +235,8 @@ datum/admins/proc/DB_ban_edit(var/banid = null, var/param = null) duration = query.item[2] reason = query.item[3] else - usr << "Invalid ban id. Contact the database admin" + to_chat(usr, "Invalid ban id. Contact the database admin") + return reason = sql_sanitize_text(reason) @@ -240,7 +248,8 @@ datum/admins/proc/DB_ban_edit(var/banid = null, var/param = null) value = input("Insert the new reason for [pckey]'s ban", "New Reason", "[reason]", null) as null|text value = sql_sanitize_text(value) if(!value) - usr << "Cancelled" + to_chat(usr, "Cancelled") + return var/DBQuery/update_query = dbcon.NewQuery("UPDATE [format_table_name("ban")] SET reason = '[value]', edits = CONCAT(edits,'- [eckey] changed ban reason from \\\"[reason]\\\" to \\\"[value]\\\"
      ') WHERE id = [banid]") @@ -250,7 +259,8 @@ datum/admins/proc/DB_ban_edit(var/banid = null, var/param = null) if(!value) value = input("Insert the new duration (in minutes) for [pckey]'s ban", "New Duration", "[duration]", null) as null|num if(!isnum(value) || !value) - usr << "Cancelled" + to_chat(usr, "Cancelled") + return var/DBQuery/update_query = dbcon.NewQuery("UPDATE [format_table_name("ban")] SET duration = [value], edits = CONCAT(edits,'- [eckey] changed ban duration from [duration] to [value]
      '), expiration_time = DATE_ADD(bantime, INTERVAL [value] MINUTE) WHERE id = [banid]") @@ -261,10 +271,12 @@ datum/admins/proc/DB_ban_edit(var/banid = null, var/param = null) DB_ban_unban_by_id(banid) return else - usr << "Cancelled" + to_chat(usr, "Cancelled") + return else - usr << "Cancelled" + to_chat(usr, "Cancelled") + return datum/admins/proc/DB_ban_unban_by_id(var/id) @@ -287,11 +299,13 @@ datum/admins/proc/DB_ban_unban_by_id(var/id) ban_number++; if(ban_number == 0) - usr << "\red Database update failed due to a ban id not being present in the database." + to_chat(usr, "\red Database update failed due to a ban id not being present in the database.") + return if(ban_number > 1) - usr << "\red Database update failed due to multiple bans having the same ID. Contact the database admin." + to_chat(usr, "\red Database update failed due to multiple bans having the same ID. Contact the database admin.") + return if(!src.owner || !istype(src.owner, /client)) @@ -328,7 +342,8 @@ datum/admins/proc/DB_ban_unban_by_id(var/id) establish_db_connection() if(!dbcon.IsConnected()) - usr << "\red Failed to establish database connection" + to_chat(usr, "\red Failed to establish database connection") + return var/output = "
      " diff --git a/code/modules/admin/NewBan.dm b/code/modules/admin/NewBan.dm index b871ada026d..9421c1e8102 100644 --- a/code/modules/admin/NewBan.dm +++ b/code/modules/admin/NewBan.dm @@ -106,19 +106,27 @@ var/savefile/Banlist Banlist.cd = "/base" if ( Banlist.dir.Find("[ckey][computerid]") ) - usr << text("\red Ban already exists.") + to_chat(usr, text("\red Ban already exists.")) + return 0 else Banlist.dir.Add("[ckey][computerid]") Banlist.cd = "/base/[ckey][computerid]" - Banlist["key"] << ckey - Banlist["id"] << computerid - Banlist["ip"] << address - Banlist["reason"] << reason - Banlist["bannedby"] << bannedby - Banlist["temp"] << temp + to_chat(Banlist["key"], ckey) + + to_chat(Banlist["id"], computerid) + + to_chat(Banlist["ip"], address) + + to_chat(Banlist["reason"], reason) + + to_chat(Banlist["bannedby"], bannedby) + + to_chat(Banlist["temp"], temp) + if (temp) - Banlist["minutes"] << bantimestamp + to_chat(Banlist["minutes"], bantimestamp) + if(!temp) add_note(ckey, "Permanently banned - [reason]", null, bannedby, 0) else @@ -211,17 +219,24 @@ var/savefile/Banlist Banlist.cd = "/base" Banlist.dir.Add("trash[i]trashid[i]") Banlist.cd = "/base/trash[i]trashid[i]" - Banlist["key"] << "trash[i]" + to_chat(Banlist["key"], "trash[i]") + else Banlist.cd = "/base" Banlist.dir.Add("[last]trashid[i]") Banlist.cd = "/base/[last]trashid[i]" - Banlist["key"] << last - Banlist["id"] << "trashid[i]" - Banlist["reason"] << "Trashban[i]." - Banlist["temp"] << a - Banlist["minutes"] << CMinutes + rand(1,2000) - Banlist["bannedby"] << "trashmin" + to_chat(Banlist["key"], last) + + to_chat(Banlist["id"], "trashid[i]") + + to_chat(Banlist["reason"], "Trashban[i].") + + to_chat(Banlist["temp"], a) + + to_chat(Banlist["minutes"], CMinutes + rand(1,2000)) + + to_chat(Banlist["bannedby"], "trashmin") + last = "trash[i]" Banlist.cd = "/base" diff --git a/code/modules/admin/ToRban.dm b/code/modules/admin/ToRban.dm index ea70d023758..9f0cb711547 100644 --- a/code/modules/admin/ToRban.dm +++ b/code/modules/admin/ToRban.dm @@ -35,9 +35,12 @@ var/cleaned = copytext(line,13,length(line)-19) if(!cleaned) continue F[cleaned] << 1 - F["last_update"] << world.realtime + to_chat(F["last_update"], world.realtime) + diary << "ToR data updated!" - if(usr) usr << "ToRban updated." + if(usr) + to_chat(usr, "ToRban updated.") + return 1 diary << "ToR data update aborted: no data." return 0 @@ -72,16 +75,20 @@ var/choice = input(src,"Please select an IP address to remove from the ToR banlist:","Remove ToR ban",null) as null|anything in F.dir if(choice) F.dir.Remove(choice) - src << "Address removed" + to_chat(src, "Address removed") + if("remove all") - src << "[TORFILE] was [fdel(TORFILE)?"":"not "]removed." + to_chat(src, "[TORFILE] was [fdel(TORFILE)?"":"not "]removed.") + if("find") var/input = input(src,"Please input an IP address to search for:","Find ToR ban",null) as null|text if(input) if(ToRban_isbanned(input)) - src << "Address is a known ToR address" + to_chat(src, "Address is a known ToR address") + else - src << "Address is not a known ToR address" + to_chat(src, "Address is not a known ToR address") + return #undef TORFILE diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 67a141f74ba..ae25bc50c72 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -9,7 +9,8 @@ var/global/nologevent = 0 log_adminwarn(msg) for(var/client/C in admins) if(R_SERVER & C.holder.rights) - C << msg + to_chat(C, msg) + /proc/msg_admin_attack(var/text) //Toggleable Attack Messages log_attack(text) @@ -20,7 +21,8 @@ var/global/nologevent = 0 if(C.prefs.toggles & CHAT_ATTACKLOGS) if(!istype(C, /mob/living)) var/msg = rendered - C << msg + to_chat(C, msg) + ///////////////////////////////////////////////////////////////////////////////////////////////Panels @@ -31,7 +33,8 @@ var/global/nologevent = 0 set desc="Edit player (respawn, ban, heal, etc)" if(!M) - usr << "You seem to be selecting a mob that doesn't exist anymore." + to_chat(usr, "You seem to be selecting a mob that doesn't exist anymore.") + return if(!check_rights(R_ADMIN|R_MOD)) @@ -470,8 +473,10 @@ var/global/nologevent = 0 else dat+="I'm sorry to break your immersion. This shit's bugged. Report this bug to Agouri, polyxenitopalidou@gmail.com" - //world << "Channelname: [src.admincaster_feed_channel.channel_name] [src.admincaster_feed_channel.author]" - //world << "Msg: [src.admincaster_feed_message.author] [src.admincaster_feed_message.body]" +// to_chat(world, "Channelname: [src.admincaster_feed_channel.channel_name] [src.admincaster_feed_channel.author]") + +// to_chat(world, "Msg: [src.admincaster_feed_message.author] [src.admincaster_feed_message.body]") + usr << browse(dat, "window=admincaster_main;size=400x600") onclose(usr, "admincaster_main") @@ -546,7 +551,8 @@ var/global/nologevent = 0 if(!check_rights(R_SERVER,0)) message = adminscrub(message,500) message = replacetext(message, "\n", "
      ") // required since we're putting it in a

      tag - world << "[usr.client.holder.fakekey ? "Administrator" : usr.key] Announces:

      [message]

      " + to_chat(world, "[usr.client.holder.fakekey ? "Administrator" : usr.key] Announces:

      [message]

      ") + log_admin("Announce: [key_name(usr)] : [message]") feedback_add_details("admin_verb","A") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -572,9 +578,11 @@ var/global/nologevent = 0 config.looc_allowed = !(config.looc_allowed) if (config.looc_allowed) - world << "The LOOC channel has been globally enabled!" + to_chat(world, "The LOOC channel has been globally enabled!") + else - world << "The LOOC channel has been globally disabled!" + to_chat(world, "The LOOC channel has been globally disabled!") + log_and_message_admins("toggled LOOC.") feedback_add_details("admin_verb","TLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -588,9 +596,11 @@ var/global/nologevent = 0 config.dsay_allowed = !(config.dsay_allowed) if (config.dsay_allowed) - world << "Deadchat has been globally enabled!" + to_chat(world, "Deadchat has been globally enabled!") + else - world << "Deadchat has been globally disabled!" + to_chat(world, "Deadchat has been globally disabled!") + log_admin("[key_name(usr)] toggled deadchat.") message_admins("[key_name_admin(usr)] toggled deadchat.", 1) feedback_add_details("admin_verb","TDSAY") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc @@ -626,7 +636,8 @@ var/global/nologevent = 0 feedback_add_details("admin_verb","SN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return 1 else - usr << "Error: Start Now: Game has already started." + to_chat(usr, "Error: Start Now: Game has already started.") + return 0 /datum/admins/proc/toggleenter() @@ -639,9 +650,11 @@ var/global/nologevent = 0 enter_allowed = !( enter_allowed ) if (!( enter_allowed )) - world << "New players may no longer enter the game." + to_chat(world, "New players may no longer enter the game.") + else - world << "New players may now enter the game." + to_chat(world, "New players may now enter the game.") + log_admin("[key_name(usr)] toggled new player game entering.") message_admins("[key_name_admin(usr)] toggled new player game entering.", 1) world.update_status() @@ -657,9 +670,11 @@ var/global/nologevent = 0 config.allow_ai = !( config.allow_ai ) if (!( config.allow_ai )) - world << "The AI job is no longer chooseable." + to_chat(world, "The AI job is no longer chooseable.") + else - world << "The AI job is chooseable now." + to_chat(world, "The AI job is chooseable now.") + message_admins("[key_name_admin(usr)] toggled AI allowed.") log_admin("[key_name(usr)] toggled AI allowed.") world.update_status() @@ -675,9 +690,11 @@ var/global/nologevent = 0 abandon_allowed = !( abandon_allowed ) if (abandon_allowed) - world << "You may now respawn." + to_chat(world, "You may now respawn.") + else - world << "You may no longer respawn :(" + to_chat(world, "You may no longer respawn :(") + message_admins("[key_name_admin(usr)] toggled respawn to [abandon_allowed ? "On" : "Off"].", 1) log_admin("[key_name(usr)] toggled respawn to [abandon_allowed ? "On" : "Off"].") world.update_status() @@ -711,10 +728,12 @@ var/global/nologevent = 0 return //alert("Round end delayed", null, null, null, null, null) going = !( going ) if (!( going )) - world << "The game start has been delayed." + to_chat(world, "The game start has been delayed.") + log_admin("[key_name(usr)] delayed the game.") else - world << "The game will start soon." + to_chat(world, "The game will start soon.") + log_admin("[key_name(usr)] removed the delay.") feedback_add_details("admin_verb","DELAY") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -802,10 +821,12 @@ var/global/nologevent = 0 return if(!istype(M)) - usr << "This can only be used on instances of type /mob" + to_chat(usr, "This can only be used on instances of type /mob") + return if(!M.mind) - usr << "This mob has no mind!" + to_chat(usr, "This mob has no mind!") + return M.mind.edit_memory() @@ -821,9 +842,11 @@ var/global/nologevent = 0 guests_allowed = !( guests_allowed ) if (!( guests_allowed )) - world << "Guests may no longer enter the game." + to_chat(world, "Guests may no longer enter the game.") + else - world << "Guests may now enter the game." + to_chat(world, "Guests may now enter the game.") + log_admin("[key_name(usr)] toggled guests game entering [guests_allowed?"":"dis"]allowed.") message_admins("\blue [key_name_admin(usr)] toggled guests game entering [guests_allowed?"":"dis"]allowed.", 1) feedback_add_details("admin_verb","TGU") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -833,25 +856,33 @@ var/global/nologevent = 0 for(var/mob/living/silicon/S in mob_list) ai_number++ if(isAI(S)) - usr << "AI [key_name(S, usr)]'s laws:" + to_chat(usr, "AI [key_name(S, usr)]'s laws:") + else if(isrobot(S)) var/mob/living/silicon/robot/R = S - usr << "CYBORG [key_name(S, usr)]'s [R.connected_ai?"(Slaved to: [R.connected_ai])":"(Independent)"] laws:" + to_chat(usr, "CYBORG [key_name(S, usr)]'s [R.connected_ai?"(Slaved to: [R.connected_ai])":"(Independent)"] laws:") + else if (ispAI(S)) var/mob/living/silicon/pai/P = S - usr << "pAI [key_name(S, usr)]'s laws:" - usr << "[P.pai_law0]" - if(P.pai_laws) usr << "[P.pai_laws]" + to_chat(usr, "pAI [key_name(S, usr)]'s laws:") + to_chat(usr, "[P.pai_law0]") + if(P.pai_laws) + to_chat(usr, "[P.pai_laws]") + continue // Skip showing normal silicon laws for pAIs - they don't have any else - usr << "SILICON [key_name(S, usr)]'s laws:" + to_chat(usr, "SILICON [key_name(S, usr)]'s laws:") + if (S.laws == null) - usr << "[key_name(S, usr)]'s laws are null. Contact a coder." + to_chat(usr, "[key_name(S, usr)]'s laws are null. Contact a coder.") + else S.laws.show_laws(usr) if(!ai_number) - usr << "No AI's located." //Just so you know the thing is actually working and not just ignoring you. + to_chat(usr, "No AI's located.")//Just so you know the thing is actually working and not just ignoring you. + + log_admin("[key_name(usr)] checked the AI laws") message_admins("[key_name_admin(usr)] checked the AI laws") @@ -932,7 +963,8 @@ var/gamma_ship_location = 1 // 0 = station , 1 = space if(kick_only_afk && !C.is_afk()) //Ignore clients who are not afk continue if(message) - C << message + to_chat(C, message) + kicked_client_names.Add("[C.ckey]") del(C) return kicked_client_names diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm index 89b02c12d8c..8b7125608d7 100644 --- a/code/modules/admin/admin_investigate.dm +++ b/code/modules/admin/admin_investigate.dm @@ -23,7 +23,8 @@ if(!message) return var/F = investigate_subject2file(subject) if(!F) return - F << "[time_stamp()] \ref[src] ([x],[y],[z]) || [src] [message]
      " + to_chat(F, "[time_stamp()] \ref[src] ([x],[y],[z]) || [src] [message]
      ") + //ADMINVERBS /client/proc/investigate_show( subject in list("hrefs","notes","pda","singulo","atmos","watchlist","ntsl","gold core","cult", "experimentor", "wires") ) @@ -34,7 +35,8 @@ if("singulo") //general one-round-only stuff var/F = investigate_subject2file(subject) if(!F) - src << "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed." + to_chat(src, "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed.") + return src << browse(F,"window=investigate[subject];size=800x300") @@ -43,51 +45,59 @@ if(href_logfile) src << browse(href_logfile,"window=investigate[subject];size=800x300") else - src << "Error: admin_investigate: No href logfile found." + to_chat(src, "Error: admin_investigate: No href logfile found.") + return else - src << "Error: admin_investigate: Href Logging is not on." + to_chat(src, "Error: admin_investigate: Href Logging is not on.") + return if("pda") //general one-round-only stuff var/F = investigate_subject2file(subject) if(!F) - src << "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed." + to_chat(src, "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed.") + return src << browse(F,"window=investigate[subject];size=800x300") if("cult") var/F = investigate_subject2file(subject) if(!F) - src << "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed." + to_chat(src, "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed.") + return src << browse(F,"window=investigate[subject];size=800x300") if("atmos") var/F = investigate_subject2file(subject) if(!F) - src << "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed." + to_chat(src, "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed.") + return src << browse(F,"window=investigate[subject];size=800x300") if("ntsl") var/F = investigate_subject2file(subject) if(!F) - src << "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed." + to_chat(src, "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed.") + return src << browse(F,"window=investigate[subject];size=800x300") if("experimentor") var/F = investigate_subject2file(subject) if(!F) - src << "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed." + to_chat(src, "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed.") + return src << browse(F,"window=investigate[subject];size=800x300") if("wires") var/F = investigate_subject2file(subject) if(!F) - src << "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed." + to_chat(src, "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed.") + return src << browse(F,"window=investigate[subject];size=800x300") diff --git a/code/modules/admin/admin_memo.dm b/code/modules/admin/admin_memo.dm index 355a82aa697..5c6abd131c7 100644 --- a/code/modules/admin/admin_memo.dm +++ b/code/modules/admin/admin_memo.dm @@ -4,7 +4,8 @@ if(!check_rights(R_SERVER)) return if(!dbcon.IsConnected()) - src << "Failed to establish database connection." + to_chat(src, "Failed to establish database connection.") + return var/memotask = input(usr,"Choose task.","Memo") in list("Show","Write","Edit","Remove") if(!memotask) @@ -17,7 +18,8 @@ if(!task) return if(!dbcon.IsConnected()) - src << "Failed to establish database connection." + to_chat(src, "Failed to establish database connection.") + return var/sql_ckey = sanitizeSQL(src.ckey) switch(task) @@ -28,7 +30,8 @@ log_game("SQL ERROR obtaining ckey from memo table. Error : \[[err]\]\n") return if(query_memocheck.NextRow()) - src << "You already have set a memo." + to_chat(src, "You already have set a memo.") + return var/memotext = input(src,"Write your Memo","Memo") as message if(!memotext) @@ -53,7 +56,8 @@ var/lkey = query_memolist.item[1] memolist += "[lkey]" if(!memolist.len) - src << "No memos found in database." + to_chat(src, "No memos found in database.") + return var/target_ckey = input(src, "Select whose memo to edit", "Select memo") as null|anything in memolist if(!target_ckey) @@ -100,7 +104,8 @@ output += "
      Last edit by [last_editor] (Click here to see edit log)" output += "
      [memotext]
      " if(!output && !silent) - src << "No memos found in database." + to_chat(src, "No memos found in database.") + return src << output if("Remove") @@ -114,7 +119,8 @@ var/ckey = query_memodellist.item[1] memolist += "[ckey]" if(!memolist.len) - src << "No memos found in database." + to_chat(src, "No memos found in database.") + return var/target_ckey = input(src, "Select whose memo to delete", "Select memo") as null|anything in memolist if(!target_ckey) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 500fa010700..d3f0cd336bc 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -258,7 +258,8 @@ var/list/admin_verbs_proccall = list ( remove_admin_verbs() verbs += /client/proc/show_verbs - src << "Almost all of your adminverbs have been hidden." + to_chat(src, "Almost all of your adminverbs have been hidden.") + feedback_add_details("admin_verb","TAVVH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return @@ -272,7 +273,8 @@ var/list/admin_verbs_proccall = list ( verbs -= /client/proc/show_verbs add_admin_verbs() - src << "All of your adminverbs are now visible." + to_chat(src, "All of your adminverbs are now visible.") + feedback_add_details("admin_verb","TAVVS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/admin_ghost() @@ -290,7 +292,8 @@ var/list/admin_verbs_proccall = list ( log_admin("[key_name(usr)] re-entered their body") feedback_add_details("admin_verb","P") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! else if(istype(mob,/mob/new_player)) - src << "Error: Aghost: Can't admin-ghost whilst in the lobby. Join or observe first." + to_chat(src, "Error: Aghost: Can't admin-ghost whilst in the lobby. Join or observe first.") + else //ghostize var/mob/body = mob @@ -311,11 +314,13 @@ var/list/admin_verbs_proccall = list ( if(mob) if(mob.invisibility == INVISIBILITY_OBSERVER) mob.invisibility = initial(mob.invisibility) - mob << "Invisimin off. Invisibility reset." + to_chat(mob, "Invisimin off. Invisibility reset.") + //TODO: Make some kind of indication for the badmin that they are currently invisible else mob.invisibility = INVISIBILITY_OBSERVER - mob << "Invisimin on. You are now as invisible as a ghost." + to_chat(mob, "Invisimin on. You are now as invisible as a ghost.") + /client/proc/player_panel() set name = "Player Panel" @@ -474,7 +479,8 @@ var/list/admin_verbs_proccall = list ( if(!warned_ckey || !istext(warned_ckey)) return if(warned_ckey in admin_datums) - usr << "Error: warn(): You can't warn admins." + to_chat(usr, "Error: warn(): You can't warn admins.") + return var/datum/preferences/D @@ -483,7 +489,8 @@ var/list/admin_verbs_proccall = list ( else D = preferences_datums[warned_ckey] if(!D) - src << "Error: warn(): No such ckey found." + to_chat(src, "Error: warn(): No such ckey found.") + return if(++D.warns >= MAX_WARNS) //uh ohhhh...you'reee iiiiin trouuuubble O:) @@ -491,7 +498,8 @@ var/list/admin_verbs_proccall = list ( if(C) message_admins("[key_name_admin(src)] has warned [key_name_admin(C)] resulting in a [AUTOBANTIME] minute ban") log_admin("[key_name(src)] has warned [key_name(C)] resulting in a [AUTOBANTIME] minute ban") - C << "You have been autobanned due to a warning by [ckey].
      This is a temporary ban, it will be removed in [AUTOBANTIME] minutes." + to_chat(C, "You have been autobanned due to a warning by [ckey].
      This is a temporary ban, it will be removed in [AUTOBANTIME] minutes.") + del(C) else message_admins("[key_name_admin(src)] has warned [warned_ckey] resulting in a [AUTOBANTIME] minute ban") @@ -500,7 +508,8 @@ var/list/admin_verbs_proccall = list ( feedback_inc("ban_warn",1) else if(C) - C << "You have been formally warned by an administrator.
      Further warnings will result in an autoban.
      " + to_chat(C, "You have been formally warned by an administrator.
      Further warnings will result in an autoban.
      ") + message_admins("[key_name_admin(src)] has warned [key_name_admin(C)]. They have [MAX_WARNS-D.warns] strikes remaining.") log_admin("[key_name(src)] has warned [key_name(C)]. They have [MAX_WARNS-D.warns] strikes remaining.") else @@ -643,10 +652,12 @@ var/list/admin_verbs_proccall = list ( if(air_processing_killed) air_processing_killed = 0 - usr << "Enabled air processing." + to_chat(usr, "Enabled air processing.") + else air_processing_killed = 1 - usr << "Disabled air processing." + to_chat(usr, "Disabled air processing.") + feedback_add_details("admin_verb","KA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] used 'kill air'.") message_admins("\blue [key_name_admin(usr)] used 'kill air'.", 1) @@ -663,7 +674,8 @@ var/list/admin_verbs_proccall = list ( deadmin() verbs += /client/proc/readmin deadmins += ckey - src << "You are now a normal player." + to_chat(src, "You are now a normal player.") + feedback_add_details("admin_verb","DAS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/readmin() @@ -686,7 +698,8 @@ var/list/admin_verbs_proccall = list ( else if(!dbcon.IsConnected()) message_admins("Warning, MySQL database is not connected.") - src << "Warning, MYSQL database is not connected." + to_chat(src, "Warning, MYSQL database is not connected.") + return var/sql_ckey = sanitizeSQL(ckey) var/DBQuery/query = dbcon.NewQuery("SELECT rank FROM [format_table_name("admin")] WHERE ckey = '[sql_ckey]'") @@ -697,7 +710,8 @@ var/list/admin_verbs_proccall = list ( if(config.admin_legacy_system) if(admin_ranks[rank] == null) error("Error while re-adminning [src], admin rank ([rank]) does not exist.") - src << "Error while re-adminning, admin rank ([rank]) does not exist." + to_chat(src, "Error while re-adminning, admin rank ([rank]) does not exist.") + return D = new(rank, admin_ranks[rank], ckey) @@ -710,10 +724,12 @@ var/list/admin_verbs_proccall = list ( var/admin_rank = query.item[2] var/flags = query.item[3] if(!admin_ckey) - src << "Error while re-adminning, ckey [admin_ckey] was not found in the admin database." + to_chat(src, "Error while re-adminning, ckey [admin_ckey] was not found in the admin database.") + return if(admin_rank == "Removed") //This person was de-adminned. They are only in the admin list for archive purposes. - src << "Error while re-adminning, ckey [admin_ckey] is not an admin." + to_chat(src, "Error while re-adminning, ckey [admin_ckey] is not an admin.") + return if(istext(flags)) @@ -728,7 +744,8 @@ var/list/admin_verbs_proccall = list ( feedback_add_details("admin_verb","RAS") return else - src << "You are already an admin." + to_chat(src, "You are already an admin.") + verbs -= /client/proc/readmin deadmins -= ckey return @@ -743,10 +760,12 @@ var/list/admin_verbs_proccall = list ( if(config) if(config.log_hrefs) config.log_hrefs = 0 - src << "Stopped logging hrefs" + to_chat(src, "Stopped logging hrefs") + else config.log_hrefs = 1 - src << "Started logging hrefs" + to_chat(src, "Started logging hrefs") + /client/proc/check_ai_laws() set name = "Check AI Laws" @@ -820,7 +839,8 @@ var/list/admin_verbs_proccall = list ( return if(!H.client) - usr << "Only mobs with clients can alter their own appearance." + to_chat(usr, "Only mobs with clients can alter their own appearance.") + return switch(alert("Do you wish for [H] to be allowed to select non-whitelisted races?","Alter Mob Appearance","Yes","No","Cancel")) @@ -844,7 +864,8 @@ var/list/admin_verbs_proccall = list ( if (J.current_positions >= J.total_positions && J.total_positions != -1) jobs += J.title if (!jobs.len) - usr << "There are no fully staffed jobs." + to_chat(usr, "There are no fully staffed jobs.") + return var/job = input("Please select job slot to free", "Free Job Slot") as null|anything in jobs if (job) @@ -862,9 +883,11 @@ var/list/admin_verbs_proccall = list ( prefs.toggles ^= CHAT_ATTACKLOGS prefs.save_preferences(src) if (prefs.toggles & CHAT_ATTACKLOGS) - usr << "You now will get attack log messages" + to_chat(usr, "You now will get attack log messages") + else - usr << "You now won't get attack log messages" + to_chat(usr, "You now won't get attack log messages") + /client/proc/toggledrones() set name = "Toggle Maintenance Drones" @@ -887,9 +910,11 @@ var/list/admin_verbs_proccall = list ( prefs.toggles ^= CHAT_DEBUGLOGS prefs.save_preferences(src) if (prefs.toggles & CHAT_DEBUGLOGS) - usr << "You now will get debug log messages" + to_chat(usr, "You now will get debug log messages") + else - usr << "You now won't get debug log messages" + to_chat(usr, "You now won't get debug log messages") + /client/proc/man_up(mob/T as mob in mob_list) set category = "Admin" @@ -899,8 +924,10 @@ var/list/admin_verbs_proccall = list ( if(!check_rights(R_ADMIN)) return - T << "Man up and deal with it." - T << "Move on." + to_chat(T, "Man up and deal with it.") + + to_chat(T, "Move on.") + log_admin("[key_name(usr)] told [key_name(T)] to man up and deal with it.") message_admins("[key_name_admin(usr)] told [key_name(T)] to man up and deal with it.") @@ -917,8 +944,10 @@ var/list/admin_verbs_proccall = list ( if(confirm == "Yes") for (var/mob/T as mob in mob_list) - T << "
      Man up.
      Deal with it.

      Move on.

      " - T << 'sound/voice/ManUp1.ogg' + to_chat(T, "
      Man up.
      Deal with it.

      Move on.

      ") + + to_chat(T, 'sound/voice/ManUp1.ogg') + log_admin("[key_name(usr)] told everyone to man up and deal with it.") message_admins("[key_name_admin(usr)] told everyone to man up and deal with it.") diff --git a/code/modules/admin/banappearance.dm b/code/modules/admin/banappearance.dm index 7ecbde4c3fb..80cc4839956 100644 --- a/code/modules/admin/banappearance.dm +++ b/code/modules/admin/banappearance.dm @@ -32,7 +32,8 @@ DEBUG set name = "list all appearances" for(var/s in appearance_keylist) - world << s + to_chat(world, s) + /mob/verb/reload_appearances() set name = "reload appearances" @@ -69,7 +70,8 @@ DEBUG /proc/appearance_savebanfile() var/savefile/S=new("data/appearance_full.ban") - S["keys[0]"] << appearance_keylist + to_chat(S["keys[0]"], appearance_keylist) + /proc/appearance_unban(mob/M) appearance_remove("[M.ckey]") diff --git a/code/modules/admin/banjob.dm b/code/modules/admin/banjob.dm index a28de25ee39..c2123489299 100644 --- a/code/modules/admin/banjob.dm +++ b/code/modules/admin/banjob.dm @@ -40,7 +40,8 @@ DEBUG set name = "list all jobbans" for(var/s in jobban_keylist) - world << s + to_chat(world, s) + /mob/verb/reload_jobbans() set name = "reload jobbans" @@ -92,7 +93,8 @@ DEBUG /proc/jobban_savebanfile() var/savefile/S=new("data/job_full.ban") - S["keys[0]"] << jobban_keylist + to_chat(S["keys[0]"], jobban_keylist) + /proc/jobban_unban(mob/M, rank) jobban_remove("[M.ckey] - [rank]") diff --git a/code/modules/admin/buildmode.dm b/code/modules/admin/buildmode.dm index ebe37bc9697..fb1a9f6356e 100644 --- a/code/modules/admin/buildmode.dm +++ b/code/modules/admin/buildmode.dm @@ -149,45 +149,79 @@ /datum/click_intercept/buildmode/proc/show_help(mob/user) switch(mode) if(BASIC_BUILDMODE) - user << "***********************************************************" - user << "Left Mouse Button = Construct / Upgrade" - user << "Right Mouse Button = Deconstruct / Delete / Downgrade" - user << "Left Mouse Button + ctrl = R-Window" - user << "Left Mouse Button + alt = Airlock" - user << "" - user << "Use the button in the upper left corner to" - user << "change the direction of built objects." - user << "***********************************************************" + to_chat(user, "***********************************************************") + + to_chat(user, "Left Mouse Button = Construct / Upgrade") + + to_chat(user, "Right Mouse Button = Deconstruct / Delete / Downgrade") + + to_chat(user, "Left Mouse Button + ctrl = R-Window") + + to_chat(user, "Left Mouse Button + alt = Airlock") + + to_chat(user, "") + + to_chat(user, "Use the button in the upper left corner to") + + to_chat(user, "change the direction of built objects.") + + to_chat(user, "***********************************************************") + if(ADV_BUILDMODE) - user << "***********************************************************" - user << "Right Mouse Button on buildmode button = Set object type" - user << "Left Mouse Button on turf/obj = Place objects" - user << "Right Mouse Button = Delete objects" - user << "" - user << "Use the button in the upper left corner to" - user << "change the direction of built objects." - user << "***********************************************************" + to_chat(user, "***********************************************************") + + to_chat(user, "Right Mouse Button on buildmode button = Set object type") + + to_chat(user, "Left Mouse Button on turf/obj = Place objects") + + to_chat(user, "Right Mouse Button = Delete objects") + + to_chat(user, "") + + to_chat(user, "Use the button in the upper left corner to") + + to_chat(user, "change the direction of built objects.") + + to_chat(user, "***********************************************************") + if(VAR_BUILDMODE) - user << "***********************************************************" - user << "Right Mouse Button on buildmode button = Select var(type) & value" - user << "Left Mouse Button on turf/obj/mob = Set var(type) & value" - user << "Right Mouse Button on turf/obj/mob = Reset var's value" - user << "***********************************************************" + to_chat(user, "***********************************************************") + + to_chat(user, "Right Mouse Button on buildmode button = Select var(type) & value") + + to_chat(user, "Left Mouse Button on turf/obj/mob = Set var(type) & value") + + to_chat(user, "Right Mouse Button on turf/obj/mob = Reset var's value") + + to_chat(user, "***********************************************************") + if(THROW_BUILDMODE) - user << "***********************************************************" - user << "Left Mouse Button on turf/obj/mob = Select" - user << "Right Mouse Button on turf/obj/mob = Throw" - user << "***********************************************************" + to_chat(user, "***********************************************************") + + to_chat(user, "Left Mouse Button on turf/obj/mob = Select") + + to_chat(user, "Right Mouse Button on turf/obj/mob = Throw") + + to_chat(user, "***********************************************************") + if(AREA_BUILDMODE) - user << "***********************************************************" - user << "Left Mouse Button on turf/obj/mob = Select corner" - user << "Right Mouse Button on buildmode button = Select generator" - user << "***********************************************************" + to_chat(user, "***********************************************************") + + to_chat(user, "Left Mouse Button on turf/obj/mob = Select corner") + + to_chat(user, "Right Mouse Button on buildmode button = Select generator") + + to_chat(user, "***********************************************************") + if(COPY_BUILDMODE) - user << "***********************************************************" - user << "Left Mouse Button on obj/turf/mob = Spawn a Copy of selected target" - user << "Right Mouse Button on obj/mob = Select target to copy" - user << "***********************************************************" + to_chat(user, "***********************************************************") + + to_chat(user, "Left Mouse Button on obj/turf/mob = Spawn a Copy of selected target") + + to_chat(user, "Right Mouse Button on obj/mob = Select target to copy") + + to_chat(user, "***********************************************************") + /datum/click_intercept/buildmode/proc/change_settings(mob/user) switch(mode) @@ -351,13 +385,15 @@ log_admin("Build Mode: [key_name(user)] modified [object.name]'s [varholder] to [valueholder]") object.vars[varholder] = valueholder else - user << "[initial(object.name)] does not have a var called '[varholder]'" + to_chat(user, "[initial(object.name)] does not have a var called '[varholder]'") + if(right_click) if(object.vars.Find(varholder)) log_admin("Build Mode: [key_name(user)] modified [object.name]'s [varholder] to [valueholder]") object.vars[varholder] = initial(object.vars[varholder]) else - user << "[initial(object.name)] does not have a var called '[varholder]'" + to_chat(user, "[initial(object.name)] does not have a var called '[varholder]'") + if(THROW_BUILDMODE) if(left_click) @@ -377,7 +413,8 @@ if(left_click) //rectangular if(cornerA && cornerB) if(!generator_path) - user << "Select generator type first." + to_chat(user, "Select generator type first.") + else var/datum/mapGenerator/G = new generator_path G.defineRegion(cornerA.loc,cornerB.loc,1) @@ -394,5 +431,6 @@ DuplicateObject(stored, perfectcopy=1, sameloc=0,newloc=T) else if(right_click) if(ismovableatom(object)) // No copying turfs for now. - user << "[object] set as template." + to_chat(user, "[object] set as template.") + stored = object diff --git a/code/modules/admin/create_poll.dm b/code/modules/admin/create_poll.dm index 6e690b469ac..16fa5b0db84 100644 --- a/code/modules/admin/create_poll.dm +++ b/code/modules/admin/create_poll.dm @@ -4,7 +4,8 @@ if(!check_rights(R_PERMISSIONS)) return if(!dbcon.IsConnected()) - src << "Failed to establish database connection." + to_chat(src, "Failed to establish database connection.") + return var/returned = create_poll_function() if(returned) @@ -26,7 +27,8 @@ log_admin("[key_name(usr)] has created a new server poll. Poll Type: [polltype] - Admin Only: [adminonly ? "Yes" : "No"] - Question: [question]") message_admins("[key_name_admin(usr)] has created a new server poll. Poll Type: [polltype] - Admin Only: [adminonly ? "Yes" : "No"]
      Question: [question]") else - src << "Poll question created without any options, poll will be deleted." + to_chat(src, "Poll question created without any options, poll will be deleted.") + var/DBQuery/query_del_poll = dbcon.NewQuery("DELETE FROM [format_table_name("poll_question")] WHERE id = [returned]") if(!query_del_poll.Execute()) var/err = query_del_poll.ErrorMsg() @@ -63,7 +65,8 @@ if(query_validate_time.NextRow()) endtime = query_validate_time.item[1] if(!endtime) - src << "Datetime entered is invalid." + to_chat(src, "Datetime entered is invalid.") + return var/DBQuery/query_time_later = dbcon.NewQuery("SELECT TIMESTAMP('[endtime]') < NOW()") if(!query_time_later.Execute()) @@ -73,7 +76,8 @@ if(query_time_later.NextRow()) var/checklate = text2num(query_time_later.item[1]) if(checklate) - src << "Datetime entered is not later than current server time." + to_chat(src, "Datetime entered is not later than current server time.") + return var/adminonly switch(alert("Admin only poll?",,"Yes","No","Cancel")) @@ -132,7 +136,8 @@ if(!maxval) return pollid if(minval >= maxval) - src << "Minimum rating value can't be more than maximum rating value" + to_chat(src, "Minimum rating value can't be more than maximum rating value") + return pollid descmin = input("Optional: Set description for minimum rating","Minimum rating description") as message|null if(descmin) diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index 572dfdbcf01..c34ad32c2d1 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -47,7 +47,8 @@ generally it would be used like so: proc/admin_proc() if(!check_rights(R_ADMIN)) return - world << "you have enough rights!" + to_chat(world, "you have enough rights!") + NOTE: it checks usr! not src! So if you're checking somebody's rank in a proc which they did not call you will have to do something like if(client.holder.rights & R_ADMIN) yourself. @@ -60,13 +61,15 @@ you will have to do something like if(client.holder.rights & R_ADMIN) yourself. return 1 else if(show_msg) - user << "Error: You do not have sufficient rights to do that. You require one of the following flags:[rights2text(rights_required," ")]." + to_chat(user, "Error: You do not have sufficient rights to do that. You require one of the following flags:[rights2text(rights_required," ")].") + else if(user.client.holder) return 1 else if(show_msg) - user << "Error: You are not an admin." + to_chat(user, "Error: You are not an admin.") + return 0 //probably a bit iffy - will hopefully figure out a better solution @@ -78,7 +81,8 @@ you will have to do something like if(client.holder.rights & R_ADMIN) yourself. if(usr.client.holder.rights != other.holder.rights) if( (usr.client.holder.rights & other.holder.rights) == other.holder.rights ) return 1 //we have all the rights they have and more - usr << "Error: Cannot proceed. They have more or equal rights to us." + to_chat(usr, "Error: Cannot proceed. They have more or equal rights to us.") + return 0 /client/proc/deadmin() diff --git a/code/modules/admin/machine_upgrade.dm b/code/modules/admin/machine_upgrade.dm index a0e97c4ae7b..79cfac4d63a 100644 --- a/code/modules/admin/machine_upgrade.dm +++ b/code/modules/admin/machine_upgrade.dm @@ -6,7 +6,8 @@ return if(!istype(M)) - usr << "This can only be used on subtypes of /obj/machinery." + to_chat(usr, "This can only be used on subtypes of /obj/machinery.") + return var/new_rating = input("Enter new rating:","Num") as num diff --git a/code/modules/admin/newbanjob.dm b/code/modules/admin/newbanjob.dm index 7a879468d85..aa9a755b107 100644 --- a/code/modules/admin/newbanjob.dm +++ b/code/modules/admin/newbanjob.dm @@ -141,19 +141,27 @@ var/savefile/Banlistjob Banlistjob.cd = "/base" if ( Banlistjob.dir.Find("[ckey][computerid][rank]") ) - usr << text("\red Banjob already exists.") + to_chat(usr, text("\red Banjob already exists.")) + return 0 else Banlistjob.dir.Add("[ckey][computerid][rank]") Banlistjob.cd = "/base/[ckey][computerid][rank]" - Banlistjob["key"] << ckey - Banlistjob["id"] << computerid - Banlistjob["rank"] << rank - Banlistjob["reason"] << reason - Banlistjob["bannedby"] << bannedby - Banlistjob["temp"] << temp + to_chat(Banlistjob["key"], ckey) + + to_chat(Banlistjob["id"], computerid) + + to_chat(Banlistjob["rank"], rank) + + to_chat(Banlistjob["reason"], reason) + + to_chat(Banlistjob["bannedby"], bannedby) + + to_chat(Banlistjob["temp"], temp) + if (temp) - Banlistjob["minutes"] << bantimestamp + to_chat(Banlistjob["minutes"], bantimestamp) + return 1 @@ -219,22 +227,30 @@ var/savefile/Banlistjob /*/datum/admins/proc/permjobban(ckey, computerid, reason, bannedby, temp, minutes, rank) if(AddBanjob(ckey, computerid, reason, usr.ckey, 0, 0, job)) - M << "\redYou have been banned from [job] by [usr.client.ckey].\nReason: [reason]." - M << "\red This is a permanent ban." + to_chat(M, "\redYou have been banned from [job] by [usr.client.ckey].\nReason: [reason].") + + to_chat(M, "\red This is a permanent ban.") + if(config.banappeals) - M << "\red To try to resolve this matter head to [config.banappeals]" + to_chat(M, "\red To try to resolve this matter head to [config.banappeals]") + else - M << "\red No ban appeals URL has been set." + to_chat(M, "\red No ban appeals URL has been set.") + log_admin("[usr.client.ckey] has banned from [job] [ckey].\nReason: [reason]\nThis is a permanent ban.") message_admins("\blue[usr.client.ckey] has banned from [job] [ckey].\nReason: [reason]\nThis is a permanent ban.") /datum/admins/proc/timejobban(ckey, computerid, reason, bannedby, temp, minutes, rank) if(AddBanjob(ckey, computerid, reason, usr.ckey, 1, mins, job)) - M << "\redYou have been jobbanned from [job] by [usr.client.ckey].\nReason: [reason]." - M << "\red This is a temporary ban, it will be removed in [mins] minutes." + to_chat(M, "\redYou have been jobbanned from [job] by [usr.client.ckey].\nReason: [reason].") + + to_chat(M, "\red This is a temporary ban, it will be removed in [mins] minutes.") + if(config.banappeals) - M << "\red To try to resolve this matter head to [config.banappeals]" + to_chat(M, "\red To try to resolve this matter head to [config.banappeals]") + else - M << "\red No ban appeals URL has been set." + to_chat(M, "\red No ban appeals URL has been set.") + log_admin("[usr.client.ckey] has jobbanned from [job] [ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.") message_admins("\blue[usr.client.ckey] has banned from [job] [ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.")*/ //////////////////////////////////// DEBUG //////////////////////////////////// @@ -253,17 +269,24 @@ var/savefile/Banlistjob Banlistjob.cd = "/base" Banlistjob.dir.Add("trash[i]trashid[i]") Banlistjob.cd = "/base/trash[i]trashid[i]" - Banlistjob["key"] << "trash[i]" + to_chat(Banlistjob["key"], "trash[i]") + else Banlistjob.cd = "/base" Banlistjob.dir.Add("[last]trashid[i]") Banlistjob.cd = "/base/[last]trashid[i]" - Banlistjob["key"] << last - Banlistjob["id"] << "trashid[i]" - Banlistjob["reason"] << "Trashban[i]." - Banlistjob["temp"] << a - Banlistjob["minutes"] << CMinutes + rand(1,2000) - Banlistjob["bannedby"] << "trashmin" + to_chat(Banlistjob["key"], last) + + to_chat(Banlistjob["id"], "trashid[i]") + + to_chat(Banlistjob["reason"], "Trashban[i].") + + to_chat(Banlistjob["temp"], a) + + to_chat(Banlistjob["minutes"], CMinutes + rand(1,2000)) + + to_chat(Banlistjob["bannedby"], "trashmin") + last = "trash[i]" Banlistjob.cd = "/base" diff --git a/code/modules/admin/permissionverbs/permissionedit.dm b/code/modules/admin/permissionverbs/permissionedit.dm index 19ca9ef9b4f..9d4cd3f0071 100644 --- a/code/modules/admin/permissionverbs/permissionedit.dm +++ b/code/modules/admin/permissionverbs/permissionedit.dm @@ -63,7 +63,8 @@ establish_db_connection() if(!dbcon.IsConnected()) - usr << "\red Failed to establish database connection" + to_chat(usr, "\red Failed to establish database connection") + return if(!adm_ckey || !new_rank) @@ -91,14 +92,16 @@ insert_query.Execute() var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `test`.[format_table_name("admin_log")] (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Added new admin [adm_ckey] to rank [new_rank]');") log_query.Execute() - usr << "\blue New admin added." + to_chat(usr, "\blue New admin added.") + else if(!isnull(admin_id) && isnum(admin_id)) var/DBQuery/insert_query = dbcon.NewQuery("UPDATE [format_table_name("admin")] SET rank = '[new_rank]' WHERE id = [admin_id]") insert_query.Execute() var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `test`.[format_table_name("admin_log")] (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Edited the rank of [adm_ckey] to [new_rank]');") log_query.Execute() - usr << "\blue Admin rank changed." + to_chat(usr, "\blue Admin rank changed.") + /datum/admins/proc/log_admin_permission_modification(var/adm_ckey, var/new_permission) if(config.admin_legacy_system) @@ -112,7 +115,8 @@ establish_db_connection() if(!dbcon.IsConnected()) - usr << "\red Failed to establish database connection" + to_chat(usr, "\red Failed to establish database connection") + return if(!adm_ckey || !new_permission) @@ -146,13 +150,15 @@ insert_query.Execute() var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `test`.[format_table_name("admin_log")] (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Removed permission [rights2text(new_permission)] (flag = [new_permission]) to admin [adm_ckey]');") log_query.Execute() - usr << "\blue Permission removed." + to_chat(usr, "\blue Permission removed.") + else //This admin doesn't have this permission, so we are adding it. var/DBQuery/insert_query = dbcon.NewQuery("UPDATE [format_table_name("admin")] SET flags = '[admin_rights | new_permission]' WHERE id = [admin_id]") insert_query.Execute() var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `test`.[format_table_name("admin_log")] (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Added permission [rights2text(new_permission)] (flag = [new_permission]) to admin [adm_ckey]')") log_query.Execute() - usr << "\blue Permission added." + to_chat(usr, "\blue Permission added.") + /datum/admins/proc/updateranktodb(ckey,newrank) establish_db_connection() diff --git a/code/modules/admin/sql_notes.dm b/code/modules/admin/sql_notes.dm index 7678814f0c6..16507468bdb 100644 --- a/code/modules/admin/sql_notes.dm +++ b/code/modules/admin/sql_notes.dm @@ -2,7 +2,8 @@ if(checkrights && !check_rights(R_ADMIN|R_MOD)) return if(!dbcon.IsConnected()) - usr << "Failed to establish database connection." + to_chat(usr, "Failed to establish database connection.") + return if(!target_ckey) var/new_ckey = ckey(input(usr,"Who would you like to add a note for?","Enter a ckey",null) as text|null) @@ -15,7 +16,8 @@ log_game("SQL ERROR obtaining ckey from player table. Error : \[[err]\]\n") return if(!query_find_ckey.NextRow()) - usr << "[new_ckey] has not been seen before, you can only add notes to known players." + to_chat(usr, "[new_ckey] has not been seen before, you can only add notes to known players.") + return else target_ckey = new_ckey @@ -53,7 +55,8 @@ var/notetext var/adminckey if(!dbcon.IsConnected()) - usr << "Failed to establish database connection." + to_chat(usr, "Failed to establish database connection.") + return if(!note_id) return @@ -80,7 +83,8 @@ if(!check_rights(R_ADMIN|R_MOD)) return if(!dbcon.IsConnected()) - usr << "Failed to establish database connection." + to_chat(usr, "Failed to establish database connection.") + return if(!note_id) return diff --git a/code/modules/admin/stickyban.dm b/code/modules/admin/stickyban.dm index 94f7a84daa1..e88ecaf70de 100644 --- a/code/modules/admin/stickyban.dm +++ b/code/modules/admin/stickyban.dm @@ -21,7 +21,8 @@ return ckey = ckey(ckey) if (get_stickyban_from_ckey(ckey)) - usr << "Error: Can not add a stickyban: User already has a current sticky ban" + to_chat(usr, "Error: Can not add a stickyban: User already has a current sticky ban") + if (data["reason"]) ban["message"] = data["reason"] @@ -43,12 +44,14 @@ var/ban = get_stickyban_from_ckey(ckey) if (!ban) - usr << "Error: No sticky ban for [ckey] found!" + to_chat(usr, "Error: No sticky ban for [ckey] found!") + return if (alert("Are you sure you want to remove the sticky ban on [ckey]?","Are you sure","Yes","No") == "No") return if (!get_stickyban_from_ckey(ckey)) - usr << "Error: The ban disappeared." + to_chat(usr, "Error: The ban disappeared.") + return world.SetConfig("ban", ckey, null) @@ -64,7 +67,8 @@ var/alt = ckey(data["alt"]) var/ban = get_stickyban_from_ckey(ckey) if (!ban) - usr << "Error: No sticky ban for [ckey] found!" + to_chat(usr, "Error: No sticky ban for [ckey] found!") + return var/found = 0 @@ -75,7 +79,8 @@ break if (!found) - usr << "Error: [alt] is not linked to [ckey]'s sticky ban!" + to_chat(usr, "Error: [alt] is not linked to [ckey]'s sticky ban!") + return if (alert("Are you sure you want to disassociate [alt] from [ckey]'s sticky ban? \nNote: Nothing stops byond from re-linking them","Are you sure","Yes","No") == "No") @@ -84,7 +89,8 @@ //we have to do this again incase something changes ban = get_stickyban_from_ckey(ckey) if (!ban) - usr << "Error: The ban disappeared." + to_chat(usr, "Error: The ban disappeared.") + return found = 0 @@ -95,7 +101,8 @@ break if (!found) - usr << "Error: [alt] link to [ckey]'s sticky ban disappeared." + to_chat(usr, "Error: [alt] link to [ckey]'s sticky ban disappeared.") + return world.SetConfig("ban",ckey,list2stickyban(ban)) @@ -109,7 +116,8 @@ var/ckey = data["ckey"] var/ban = get_stickyban_from_ckey(ckey) if (!ban) - usr << "Error: No sticky ban for [ckey] found!" + to_chat(usr, "Error: No sticky ban for [ckey] found!") + return var/oldreason = ban["message"] var/reason = input(usr,"Reason","Reason","[ban["message"]]") as text|null @@ -118,7 +126,8 @@ //we have to do this again incase something changed while we waited for input ban = get_stickyban_from_ckey(ckey) if (!ban) - usr << "Error: The ban disappeared." + to_chat(usr, "Error: The ban disappeared.") + return ban["message"] = "[reason]" diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index b0de84846f0..6b122a48ee8 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -17,11 +17,15 @@ if(!C) return - C << 'sound/effects/adminhelp.ogg' + to_chat(C, 'sound/effects/adminhelp.ogg') + + + to_chat(C, "- AdminHelp Rejected! -") + + to_chat(C, "Your admin help was rejected.") + + to_chat(C, "Please try to be calm, clear, and descriptive in admin helps, do not assume the admin has seen any related events, and clearly state the names of anybody you are reporting. If you asked a question, please ensure it was clear what you were asking.") - C << "- AdminHelp Rejected! -" - C << "Your admin help was rejected." - C << "Please try to be calm, clear, and descriptive in admin helps, do not assume the admin has seen any related events, and clearly state the names of anybody you are reporting. If you asked a question, please ensure it was clear what you were asking." message_admins("[key_name_admin(usr)] rejected [key_name_admin(C.mob)]'s admin help") log_admin("[key_name(usr)] rejected [key_name(C.mob)]'s admin help") @@ -34,35 +38,43 @@ if("1") log_admin("[key_name(usr)] has spawned a traitor.") if(!src.makeTraitors()) - usr << "\red Unfortunately there weren't enough candidates available." + to_chat(usr, "\red Unfortunately there weren't enough candidates available.") + if("2") log_admin("[key_name(usr)] has spawned a changeling.") if(!src.makeChanglings()) - usr << "\red Unfortunately there weren't enough candidates available." + to_chat(usr, "\red Unfortunately there weren't enough candidates available.") + if("3") log_admin("[key_name(usr)] has spawned revolutionaries.") if(!src.makeRevs()) - usr << "\red Unfortunately there weren't enough candidates available." + to_chat(usr, "\red Unfortunately there weren't enough candidates available.") + if("4") log_admin("[key_name(usr)] has spawned a cultists.") if(!src.makeCult()) - usr << "\red Unfortunately there weren't enough candidates available." + to_chat(usr, "\red Unfortunately there weren't enough candidates available.") + if("5") log_admin("[key_name(usr)] has spawned a malf AI.") if(!src.makeMalfAImode()) - usr << "\red Unfortunately there weren't enough candidates available." + to_chat(usr, "\red Unfortunately there weren't enough candidates available.") + if("6") log_admin("[key_name(usr)] has spawned a wizard.") if(!src.makeWizard()) - usr << "\red Unfortunately there weren't enough candidates available." + to_chat(usr, "\red Unfortunately there weren't enough candidates available.") + if("7") log_admin("[key_name(usr)] has spawned vampires.") if(!src.makeVampires()) - usr << "\red Unfortunately there weren't enough candidates available." + to_chat(usr, "\red Unfortunately there weren't enough candidates available.") + if("8") log_admin("[key_name(usr)] has spawned vox raiders.") if(!src.makeVoxRaiders()) - usr << "\red Unfortunately there weren't enough candidates available." + to_chat(usr, "\red Unfortunately there weren't enough candidates available.") + else if(href_list["dbsearchckey"] || href_list["dbsearchadmin"] || href_list["dbsearchip"] || href_list["dbsearchcid"] || href_list["dbsearchbantype"]) var/adminckey = href_list["dbsearchadmin"] @@ -102,39 +114,46 @@ switch(bantype) if(BANTYPE_PERMA) if(!banckey || !banreason) - usr << "Not enough parameters (Requires ckey and reason)" + to_chat(usr, "Not enough parameters (Requires ckey and reason)") + return banduration = null banjob = null if(BANTYPE_TEMP) if(!banckey || !banreason || !banduration) - usr << "Not enough parameters (Requires ckey, reason and duration)" + to_chat(usr, "Not enough parameters (Requires ckey, reason and duration)") + return banjob = null if(BANTYPE_JOB_PERMA) if(!banckey || !banreason || !banjob) - usr << "Not enough parameters (Requires ckey, reason and job)" + to_chat(usr, "Not enough parameters (Requires ckey, reason and job)") + return banduration = null if(BANTYPE_JOB_TEMP) if(!banckey || !banreason || !banjob || !banduration) - usr << "Not enough parameters (Requires ckey, reason and job)" + to_chat(usr, "Not enough parameters (Requires ckey, reason and job)") + return if(BANTYPE_APPEARANCE) if(!banckey || !banreason) - usr << "Not enough parameters (Requires ckey and reason)" + to_chat(usr, "Not enough parameters (Requires ckey and reason)") + return banduration = null banjob = null if(BANTYPE_ADMIN_PERMA) if(!banckey || !banreason) - usr << "Not enough parameters (Requires ckey and reason)" + to_chat(usr, "Not enough parameters (Requires ckey and reason)") + return banduration = null banjob = null if(BANTYPE_ADMIN_TEMP) if(!banckey || !banreason || !banduration) - usr << "Not enough parameters (Requires ckey, reason and duration)" + to_chat(usr, "Not enough parameters (Requires ckey, reason and duration)") + return banjob = null @@ -172,14 +191,16 @@ var/new_ckey = ckey(input(usr,"New admin's ckey","Admin ckey", null) as text|null) if(!new_ckey) return if(new_ckey in admin_datums) - usr << "Error: Topic 'editrights': [new_ckey] is already an admin" + to_chat(usr, "Error: Topic 'editrights': [new_ckey] is already an admin") + return adm_ckey = new_ckey task = "rank" else if(task != "show") adm_ckey = ckey(href_list["ckey"]) if(!adm_ckey) - usr << "Error: Topic 'editrights': No valid ckey" + to_chat(usr, "Error: Topic 'editrights': No valid ckey") + return var/datum/admins/D = admin_datums[adm_ckey] @@ -212,7 +233,8 @@ if(config.admin_legacy_system) new_rank = ckeyEx(new_rank) if(!new_rank) - usr << "Error: Topic 'editrights': Invalid rank" + to_chat(usr, "Error: Topic 'editrights': Invalid rank") + return if(config.admin_legacy_system) if(admin_ranks.len) @@ -306,7 +328,8 @@ var/mob/M = locate(href_list["mob"]) if(!ismob(M)) - usr << "This can only be used on instances of type /mob" + to_chat(usr, "This can only be used on instances of type /mob") + return var/delmob = 0 @@ -400,10 +423,14 @@ ban_unban_log_save("[key_name(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [duration]") message_admins("\blue [key_name_admin(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [duration]", 1) Banlist.cd = "/base/[banfolder]" - Banlist["reason"] << reason - Banlist["temp"] << temp - Banlist["minutes"] << minutes - Banlist["bannedby"] << usr.ckey + to_chat(Banlist["reason"], reason) + + to_chat(Banlist["temp"], temp) + + to_chat(Banlist["minutes"], minutes) + + to_chat(Banlist["bannedby"], usr.ckey) + Banlist.cd = "/base" feedback_inc("ban_edit",1) unbanpanel() @@ -415,16 +442,19 @@ return var/mob/M = locate(href_list["appearanceban"]) if(!ismob(M)) - usr << "This can only be used on instances of type /mob" + to_chat(usr, "This can only be used on instances of type /mob") + return if(!M.ckey) //sanity - usr << "This mob has no ckey" + to_chat(usr, "This mob has no ckey") + return var/banreason = appearance_isbanned(M) if(banreason) /* if(!config.ban_legacy_system) - usr << "Unfortunately, database based unbanning cannot be done through this panel" + to_chat(usr, "Unfortunately, database based unbanning cannot be done through this panel") + DB_ban_panel(M.ckey) return */ switch(alert("Reason: '[banreason]' Remove appearance ban?","Please Confirm","Yes","No")) @@ -435,7 +465,8 @@ DB_ban_unban(M.ckey, BANTYPE_APPEARANCE) appearance_unban(M) message_admins("\blue [key_name_admin(usr)] removed [key_name_admin(M)]'s appearance ban", 1) - M << "\red[usr.client.ckey] has removed your appearance ban." + to_chat(M, "\red[usr.client.ckey] has removed your appearance ban.") + else switch(alert("Appearance ban [M.ckey]?",,"Yes","No", "Cancel")) if("Yes") @@ -449,13 +480,18 @@ appearance_fullban(M, "[reason]; By [usr.ckey] on [time2text(world.realtime)]") add_note(M.ckey, "Appearance banned - [reason]", null, usr, 0) message_admins("\blue [key_name_admin(usr)] appearance banned [key_name_admin(M)]", 1) - M << "\redYou have been appearance banned by [usr.client.ckey]." - M << "\red The reason is: [reason]" - M << "\red Appearance ban can be lifted only upon request." + to_chat(M, "\redYou have been appearance banned by [usr.client.ckey].") + + to_chat(M, "\red The reason is: [reason]") + + to_chat(M, "\red Appearance ban can be lifted only upon request.") + if(config.banappeals) - M << "\red To try to resolve this matter head to [config.banappeals]" + to_chat(M, "\red To try to resolve this matter head to [config.banappeals]") + else - M << "\red No ban appeals URL has been set." + to_chat(M, "\red No ban appeals URL has been set.") + if("No") return @@ -464,14 +500,17 @@ var/mob/M = locate(href_list["jobban2"]) if(!ismob(M)) - usr << "This can only be used on instances of type /mob" + to_chat(usr, "This can only be used on instances of type /mob") + return if(!M.ckey) //sanity - usr << "This mob has no ckey" + to_chat(usr, "This mob has no ckey") + return if(!job_master) - usr << "Job Master has not been setup!" + to_chat(usr, "Job Master has not been setup!") + return var/dat = "" @@ -795,7 +834,8 @@ var/mob/M = locate(href_list["jobban4"]) if(!ismob(M)) - usr << "This can only be used on instances of type /mob" + to_chat(usr, "This can only be used on instances of type /mob") + return if(M != usr) //we can jobban ourselves @@ -804,7 +844,8 @@ return if(!job_master) - usr << "Job Master has not been setup!" + to_chat(usr, "Job Master has not been setup!") + return //get jobs for department if specified, otherwise just returnt he one job in a list. @@ -873,7 +914,8 @@ switch(alert("Temporary Ban?",,"Yes","No", "Cancel")) if("Yes") if(config.ban_legacy_system) - usr << "\red Your server is using the legacy banning system, which does not support temporary job bans. Consider upgrading. Aborting ban." + to_chat(usr, "\red Your server is using the legacy banning system, which does not support temporary job bans. Consider upgrading. Aborting ban.") + return var/mins = input(usr,"How long (in minutes)?","Ban time",1440) as num|null if(!mins) @@ -896,9 +938,12 @@ msg += ", [job]" add_note(M.ckey, "Banned from [msg] - [reason]", null, usr, 0) message_admins("\blue [key_name_admin(usr)] banned [key_name_admin(M)] from [msg] for [mins] minutes", 1) - M << "\redYou have been jobbanned by [usr.client.ckey] from: [msg]." - M << "\red The reason is: [reason]" - M << "\red This jobban will be lifted in [mins] minutes." + to_chat(M, "\redYou have been jobbanned by [usr.client.ckey] from: [msg].") + + to_chat(M, "\red The reason is: [reason]") + + to_chat(M, "\red This jobban will be lifted in [mins] minutes.") + href_list["jobban2"] = 1 // lets it fall through and refresh return 1 if("No") @@ -916,9 +961,12 @@ else msg += ", [job]" add_note(M.ckey, "Banned from [msg] - [reason]", null, usr, 0) message_admins("\blue [key_name_admin(usr)] banned [key_name_admin(M)] from [msg]", 1) - M << "\redYou have been jobbanned by [usr.client.ckey] from: [msg]." - M << "\red The reason is: [reason]" - M << "\red Jobban can be lifted only upon request." + to_chat(M, "\redYou have been jobbanned by [usr.client.ckey] from: [msg].") + + to_chat(M, "\red The reason is: [reason]") + + to_chat(M, "\red Jobban can be lifted only upon request.") + href_list["jobban2"] = 1 // lets it fall through and refresh return 1 if("Cancel") @@ -928,7 +976,8 @@ //all jobs in joblist are banned already OR we didn't give a reason (implying they shouldn't be banned) if(joblist.len) //at least 1 banned job exists in joblist so we have stuff to unban. if(!config.ban_legacy_system) - usr << "Unfortunately, database based unbanning cannot be done through this panel" + to_chat(usr, "Unfortunately, database based unbanning cannot be done through this panel") + DB_ban_panel(M.ckey) return var/msg @@ -949,7 +998,8 @@ continue if(msg) message_admins("\blue [key_name_admin(usr)] unbanned [key_name_admin(M)] from [msg]", 1) - M << "\redYou have been un-jobbanned by [usr.client.ckey] from [msg]." + to_chat(M, "\redYou have been un-jobbanned by [usr.client.ckey] from [msg].") + href_list["jobban2"] = 1 // lets it fall through and refresh return 1 return 0 //we didn't do anything! @@ -959,7 +1009,8 @@ if (ismob(M)) if(!check_if_greater_rights_than(M.client)) return - M << "\red You have been kicked from the server" + to_chat(M, "\red You have been kicked from the server") + log_admin("[key_name(usr)] booted [key_name(M)].") message_admins("\blue [key_name_admin(usr)] booted [key_name_admin(M)].", 1) //M.client = null @@ -1043,15 +1094,19 @@ return AddBan(M.ckey, M.computer_id, reason, usr.ckey, 1, mins) ban_unban_log_save("[usr.client.ckey] has banned [M.ckey]. - Reason: [reason] - This will be removed in [mins] minutes.") - M << "\redYou have been banned by [usr.client.ckey].\nReason: [reason]." - M << "\red This is a temporary ban, it will be removed in [mins] minutes." + to_chat(M, "\redYou have been banned by [usr.client.ckey].\nReason: [reason].") + + to_chat(M, "\red This is a temporary ban, it will be removed in [mins] minutes.") + feedback_inc("ban_tmp",1) DB_ban_record(BANTYPE_TEMP, M, mins, reason) feedback_inc("ban_tmp_mins",mins) if(config.banappeals) - M << "\red To try to resolve this matter head to [config.banappeals]" + to_chat(M, "\red To try to resolve this matter head to [config.banappeals]") + else - M << "\red No ban appeals URL has been set." + to_chat(M, "\red No ban appeals URL has been set.") + log_admin("[key_name(usr)] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.") message_admins("\blue [key_name_admin(usr)] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.") @@ -1067,12 +1122,16 @@ AddBan(M.ckey, M.computer_id, reason, usr.ckey, 0, 0, M.lastKnownIP) if("No") AddBan(M.ckey, M.computer_id, reason, usr.ckey, 0, 0) - M << "\redYou have been banned by [usr.client.ckey].\nReason: [reason]." - M << "\red This is a permanent ban." + to_chat(M, "\redYou have been banned by [usr.client.ckey].\nReason: [reason].") + + to_chat(M, "\red This is a permanent ban.") + if(config.banappeals) - M << "\red To try to resolve this matter head to [config.banappeals]" + to_chat(M, "\red To try to resolve this matter head to [config.banappeals]") + else - M << "\red No ban appeals URL has been set." + to_chat(M, "\red No ban appeals URL has been set.") + ban_unban_log_save("[usr.client.ckey] has permabanned [M.ckey]. - Reason: [reason] - This is a permanent ban.") log_admin("[key_name(usr)] has banned [M.ckey].\nReason: [reason]\nThis is a permanent ban.") message_admins("\blue[key_name_admin(usr)] has banned [M.ckey].\nReason: [reason]\nThis is a permanent ban.") @@ -1178,7 +1237,8 @@ master_mode = href_list["c_mode2"] log_admin("[key_name(usr)] set the mode as [master_mode].") message_admins("\blue [key_name_admin(usr)] set the mode as [master_mode].", 1) - world << "\blue The mode is now: [master_mode]" + to_chat(world, "\blue The mode is now: [master_mode]") + Game() // updates the main game menu world.save_mode(master_mode) .(href, list("c_mode"=1)) @@ -1201,7 +1261,8 @@ var/mob/living/carbon/human/H = locate(href_list["monkeyone"]) if(!istype(H)) - usr << "This can only be used on instances of type /mob/living/carbon/human" + to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + return log_admin("[key_name(usr)] attempting to monkeyize [key_name(H)]") @@ -1214,7 +1275,8 @@ var/mob/living/carbon/human/H = locate(href_list["corgione"]) if(!istype(H)) - usr << "This can only be used on instances of type /mob/living/carbon/human" + to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + return log_admin("[key_name(usr)] attempting to corgize [key_name(H)]") @@ -1226,7 +1288,8 @@ var/mob/M = locate(href_list["forcespeech"]) if(!ismob(M)) - usr << "this can only be used on instances of type /mob" + to_chat(usr, "this can only be used on instances of type /mob") + var/speech = input("What will [key_name(M)] say?.", "Force speech", "")// Don't need to sanitize, since it does that in say(), we also trust our admins. if(!speech) return @@ -1243,10 +1306,12 @@ var/mob/M = locate(href_list["sendtoprison"]) if(!ismob(M)) - usr << "This can only be used on instances of type /mob" + to_chat(usr, "This can only be used on instances of type /mob") + return if(istype(M, /mob/living/silicon/ai)) - usr << "This cannot be used on instances of type /mob/living/silicon/ai" + to_chat(usr, "This cannot be used on instances of type /mob/living/silicon/ai") + return var/turf/prison_cell = pick(prisonwarp) @@ -1276,7 +1341,8 @@ prisoner.equip_to_slot_or_del(new /obj/item/clothing/under/color/orange(prisoner), slot_w_uniform) prisoner.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(prisoner), slot_shoes) - M << "\red You have been sent to the prison station!" + to_chat(M, "\red You have been sent to the prison station!") + log_admin("[key_name(usr)] sent [key_name(M)] to the prison station.") message_admins("\blue [key_name_admin(usr)] sent [key_name_admin(M)] to the prison station.", 1) @@ -1287,11 +1353,13 @@ var/mob/M = locate(href_list["sendbacktolobby"]) if(!isobserver(M)) - usr << "You can only send ghost players back to the Lobby." + to_chat(usr, "You can only send ghost players back to the Lobby.") + return if(!M.client) - usr << "[M] doesn't seem to have an active client." + to_chat(usr, "[M] doesn't seem to have an active client.") + return if(alert(usr, "Send [key_name(M)] back to Lobby?", "Message", "Yes", "No") != "Yes") @@ -1312,10 +1380,12 @@ var/mob/M = locate(href_list["tdome1"]) if(!ismob(M)) - usr << "This can only be used on instances of type /mob" + to_chat(usr, "This can only be used on instances of type /mob") + return if(istype(M, /mob/living/silicon/ai)) - usr << "This cannot be used on instances of type /mob/living/silicon/ai" + to_chat(usr, "This cannot be used on instances of type /mob/living/silicon/ai") + return for(var/obj/item/I in M) @@ -1329,7 +1399,8 @@ sleep(5) M.loc = pick(tdome1) spawn(50) - M << "\blue You have been sent to the Thunderdome." + to_chat(M, "\blue You have been sent to the Thunderdome.") + log_admin("[key_name(usr)] has sent [key_name(M)] to the thunderdome. (Team 1)") message_admins("[key_name_admin(usr)] has sent [key_name_admin(M)] to the thunderdome. (Team 1)", 1) @@ -1341,10 +1412,12 @@ var/mob/M = locate(href_list["tdome2"]) if(!ismob(M)) - usr << "This can only be used on instances of type /mob" + to_chat(usr, "This can only be used on instances of type /mob") + return if(istype(M, /mob/living/silicon/ai)) - usr << "This cannot be used on instances of type /mob/living/silicon/ai" + to_chat(usr, "This cannot be used on instances of type /mob/living/silicon/ai") + return for(var/obj/item/I in M) @@ -1358,7 +1431,8 @@ sleep(5) M.loc = pick(tdome2) spawn(50) - M << "\blue You have been sent to the Thunderdome." + to_chat(M, "\blue You have been sent to the Thunderdome.") + log_admin("[key_name(usr)] has sent [key_name(M)] to the thunderdome. (Team 2)") message_admins("[key_name_admin(usr)] has sent [key_name_admin(M)] to the thunderdome. (Team 2)", 1) @@ -1370,17 +1444,20 @@ var/mob/M = locate(href_list["tdomeadmin"]) if(!ismob(M)) - usr << "This can only be used on instances of type /mob" + to_chat(usr, "This can only be used on instances of type /mob") + return if(istype(M, /mob/living/silicon/ai)) - usr << "This cannot be used on instances of type /mob/living/silicon/ai" + to_chat(usr, "This cannot be used on instances of type /mob/living/silicon/ai") + return M.Paralyse(5) sleep(5) M.loc = pick(tdomeadmin) spawn(50) - M << "\blue You have been sent to the Thunderdome." + to_chat(M, "\blue You have been sent to the Thunderdome.") + log_admin("[key_name(usr)] has sent [key_name(M)] to the thunderdome. (Admin.)") message_admins("[key_name_admin(usr)] has sent [key_name_admin(M)] to the thunderdome. (Admin.)", 1) @@ -1392,10 +1469,12 @@ var/mob/M = locate(href_list["tdomeobserve"]) if(!ismob(M)) - usr << "This can only be used on instances of type /mob" + to_chat(usr, "This can only be used on instances of type /mob") + return if(istype(M, /mob/living/silicon/ai)) - usr << "This cannot be used on instances of type /mob/living/silicon/ai" + to_chat(usr, "This cannot be used on instances of type /mob/living/silicon/ai") + return for(var/obj/item/I in M) @@ -1413,7 +1492,8 @@ sleep(5) M.loc = pick(tdomeobserve) spawn(50) - M << "\blue You have been sent to the Thunderdome." + to_chat(M, "\blue You have been sent to the Thunderdome.") + log_admin("[key_name(usr)] has sent [key_name(M)] to the thunderdome. (Observer.)") message_admins("[key_name_admin(usr)] has sent [key_name_admin(M)] to the thunderdome. (Observer.)", 1) @@ -1425,17 +1505,20 @@ var/mob/M = locate(href_list["aroomwarp"]) if(!ismob(M)) - usr << "This can only be used on instances of type /mob" + to_chat(usr, "This can only be used on instances of type /mob") + return if(istype(M, /mob/living/silicon/ai)) - usr << "This cannot be used on instances of type /mob/living/silicon/ai" + to_chat(usr, "This cannot be used on instances of type /mob/living/silicon/ai") + return M.Paralyse(5) sleep(5) M.loc = pick(aroomwarp) spawn(50) - M << "\blue You have been sent to the Admin Room!." + to_chat(M, "\blue You have been sent to the Admin Room!.") + log_admin("[key_name(usr)] has sent [key_name(M)] to the Admin Room") message_admins("[key_name_admin(usr)] has sent [key_name_admin(M)] to the Admin Room", 1) @@ -1445,7 +1528,8 @@ var/mob/living/L = locate(href_list["revive"]) if(!istype(L)) - usr << "This can only be used on instances of type /mob/living" + to_chat(usr, "This can only be used on instances of type /mob/living") + return L.revive() @@ -1457,7 +1541,8 @@ var/mob/living/carbon/human/H = locate(href_list["makeai"]) if(!istype(H)) - usr << "This can only be used on instances of type /mob/living/carbon/human" + to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + return message_admins("\red Admin [key_name_admin(usr)] AIized [key_name_admin(H)]!", 1) @@ -1478,7 +1563,8 @@ var/mob/living/carbon/human/H = locate(href_list["makealien"]) if(!istype(H)) - usr << "This can only be used on instances of type /mob/living/carbon/human" + to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + return usr.client.cmd_admin_alienize(H) @@ -1488,7 +1574,8 @@ var/mob/living/carbon/human/H = locate(href_list["makeslime"]) if(!istype(H)) - usr << "This can only be used on instances of type /mob/living/carbon/human" + to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + return usr.client.cmd_admin_slimeize(H) @@ -1498,7 +1585,8 @@ var/mob/living/carbon/human/H = locate(href_list["makesuper"]) if(!istype(H)) - usr << "This can only be used on instances of type /mob/living/carbon/human" + to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + return usr.client.cmd_admin_super(H) @@ -1508,7 +1596,8 @@ var/mob/living/carbon/human/H = locate(href_list["makerobot"]) if(!istype(H)) - usr << "This can only be used on instances of type /mob/living/carbon/human" + to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + return usr.client.cmd_admin_robotize(H) @@ -1518,7 +1607,8 @@ var/mob/M = locate(href_list["makeanimal"]) if(istype(M, /mob/new_player)) - usr << "This cannot be used on instances of type /mob/new_player" + to_chat(usr, "This cannot be used on instances of type /mob/new_player") + return usr.client.cmd_admin_animalize(M) @@ -1528,7 +1618,8 @@ var/mob/dead/observer/G = locate(href_list["incarn_ghost"]) if(!istype(G)) - usr << "This will only work on /mob/dead/observer" + to_chat(usr, "This will only work on /mob/dead/observer") + log_admin("[key_name(G)] was incarnated by [key_name(src.owner)]") message_admins("[key_name_admin(G)] was incarnated by [key_name_admin(src.owner)]") G.incarnate_ghost() @@ -1538,7 +1629,8 @@ var/mob/living/carbon/human/H = locate(href_list["togmutate"]) if(!istype(H)) - usr << "This can only be used on instances of type /mob/living/carbon/human" + to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + return var/block=text2num(href_list["block"]) //testing("togmutate([href_list["block"]] -> [block])") @@ -1594,7 +1686,8 @@ else if(href_list["adminmoreinfo"]) var/mob/M = locate(href_list["adminmoreinfo"]) if(!ismob(M)) - usr << "This can only be used on instances of type /mob" + to_chat(usr, "This can only be used on instances of type /mob") + return var/location_description = "" @@ -1634,19 +1727,26 @@ if(MALE,FEMALE) gender_description = "[M.gender]" else gender_description = "[M.gender]" - src.owner << "Info about [M.name]: " - src.owner << "Mob type = [M.type]; Gender = [gender_description] Damage = [health_description]" - src.owner << "Name = [M.name]; Real_name = [M.real_name]; Mind_name = [M.mind?"[M.mind.name]":""]; Key = [M.key];" - src.owner << "Location = [location_description];" - src.owner << "[special_role_description]" - src.owner << "(PM) (PP) (VV) (SM) (FLW) (CA)" + to_chat(src.owner, "Info about [M.name]: ") + + to_chat(src.owner, "Mob type = [M.type]; Gender = [gender_description] Damage = [health_description]") + + to_chat(src.owner, "Name = [M.name]; Real_name = [M.real_name]; Mind_name = [M.mind?"[M.mind.name]":""]; Key = [M.key];") + + to_chat(src.owner, "Location = [location_description];") + + to_chat(src.owner, "[special_role_description]") + + to_chat(src.owner, "(PM) (PP) (VV) (SM) (FLW) (CA)") + else if(href_list["adminspawncookie"]) if(!check_rights(R_ADMIN|R_EVENT)) return var/mob/living/carbon/human/H = locate(href_list["adminspawncookie"]) if(!ishuman(H)) - usr << "This can only be used on instances of type /mob/living/carbon/human" + to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + return H.equip_to_slot_or_del( new /obj/item/weapon/reagent_containers/food/snacks/cookie(H), slot_l_hand ) @@ -1663,28 +1763,32 @@ log_admin("[key_name(H)] got their cookie, spawned by [key_name(src.owner)]") message_admins("[key_name_admin(H)] got their cookie, spawned by [key_name_admin(src.owner)]") feedback_inc("admin_cookies_spawned",1) - H << "\blue Your prayers have been answered!! You received the best cookie!" + to_chat(H, "\blue Your prayers have been answered!! You received the best cookie!") + else if(href_list["BlueSpaceArtillery"]) if(!check_rights(R_ADMIN|R_EVENT)) return var/mob/living/M = locate(href_list["BlueSpaceArtillery"]) if(!isliving(M)) - usr << "This can only be used on instances of type /mob/living" + to_chat(usr, "This can only be used on instances of type /mob/living") + return if(alert(src.owner, "Are you sure you wish to hit [key_name(M)] with Bluespace Artillery?", "Confirm Firing?" , "Yes" , "No") != "Yes") return if(BSACooldown) - src.owner << "Standby. Reload cycle in progress. Gunnery crews ready in five seconds!" + to_chat(src.owner, "Standby. Reload cycle in progress. Gunnery crews ready in five seconds!") + return BSACooldown = 1 spawn(50) BSACooldown = 0 - M << "You've been hit by bluespace artillery!" + to_chat(M, "You've been hit by bluespace artillery!") + log_admin("[key_name(M)] has been hit by Bluespace Artillery fired by [key_name(src.owner)]") message_admins("[key_name_admin(M)] has been hit by Bluespace Artillery fired by [key_name_admin(src.owner)]") @@ -1714,19 +1818,23 @@ var/mob/living/carbon/human/H = locate(href_list["CentcommReply"]) if(!istype(H)) - usr << "This can only be used on instances of type /mob/living/carbon/human" + to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + return if(!istype(H.l_ear, /obj/item/device/radio/headset) && !istype(H.r_ear, /obj/item/device/radio/headset)) - usr << "The person you are trying to contact is not wearing a headset" + to_chat(usr, "The person you are trying to contact is not wearing a headset") + return var/input = input(src.owner, "Please enter a message to reply to [key_name(H)] via their headset.","Outgoing message from Centcomm", "") if(!input) return - src.owner << "You sent [input] to [H] via a secure channel." + to_chat(src.owner, "You sent [input] to [H] via a secure channel.") + log_admin("[key_name(src.owner)] replied to [key_name(H)]'s Centcomm message with the message [input].") message_admins("[key_name_admin(src.owner)] replied to [key_name_admin(H)]'s Centcom message with: \"[input]\"") - H << "You hear something crackle in your headset for a moment before a voice speaks. \"Please stand by for a message from Central Command. Message as follows. [input]. Message ends.\"" + to_chat(H, "You hear something crackle in your headset for a moment before a voice speaks. \"Please stand by for a message from Central Command. Message as follows. [input]. Message ends.\"") + else if(href_list["SyndicateReply"]) if(!check_rights(R_ADMIN)) @@ -1734,37 +1842,46 @@ var/mob/living/carbon/human/H = locate(href_list["SyndicateReply"]) if(!istype(H)) - usr << "This can only be used on instances of type /mob/living/carbon/human" + to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + return if(H.stat != 0) - usr << "The person you are trying to contact is not conscious." + to_chat(usr, "The person you are trying to contact is not conscious.") + return if(!istype(H.l_ear, /obj/item/device/radio/headset) && !istype(H.r_ear, /obj/item/device/radio/headset)) - usr << "The person you are trying to contact is not wearing a headset" + to_chat(usr, "The person you are trying to contact is not wearing a headset") + return var/input = input(src.owner, "Please enter a message to reply to [key_name(H)] via their headset.","Outgoing message from The Syndicate", "") if(!input) return - src.owner << "You sent [input] to [H] via a secure channel." + to_chat(src.owner, "You sent [input] to [H] via a secure channel.") + log_admin("[src.owner] replied to [key_name(H)]'s Syndicate message with the message [input].") - H << "You hear something crackle in your headset for a moment before a voice speaks. \"Please stand by for a message from your benefactor. Message as follows, agent. [input]. Message ends.\"" + to_chat(H, "You hear something crackle in your headset for a moment before a voice speaks. \"Please stand by for a message from your benefactor. Message as follows, agent. [input]. Message ends.\"") + else if(href_list["HONKReply"]) var/mob/living/carbon/human/H = locate(href_list["HONKReply"]) if(!istype(H)) - usr << "This can only be used on instances of type /mob/living/carbon/human" + to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + return if(!istype(H.l_ear, /obj/item/device/radio/headset) && !istype(H.r_ear, /obj/item/device/radio/headset)) - usr << "The person you are trying to contact is not wearing a headset" + to_chat(usr, "The person you are trying to contact is not wearing a headset") + return var/input = input(src.owner, "Please enter a message to reply to [key_name(H)] via their headset.","Outgoing message from HONKplanet", "") if(!input) return - src.owner << "You sent [input] to [H] via a secure channel." + to_chat(src.owner, "You sent [input] to [H] via a secure channel.") + log_admin("[src.owner] replied to [key_name(H)]'s HONKplanet message with the message [input].") - H << "You hear something crackle in your headset for a moment before a voice speaks. \"Please stand by for a message from your HONKbrothers. Message as follows, HONK. [input]. Message ends, HONK.\"" + to_chat(H, "You hear something crackle in your headset for a moment before a voice speaks. \"Please stand by for a message from your HONKbrothers. Message as follows, HONK. [input]. Message ends, HONK.\"") + else if(href_list["ErtReply"]) if(!check_rights(R_ADMIN)) @@ -1773,21 +1890,26 @@ if(alert(src.owner, "Accept or Deny ERT request?", "CentComm Response", "Accept", "Deny") == "Deny") var/mob/living/carbon/human/H = locate(href_list["ErtReply"]) if(!istype(H)) - usr << "This can only be used on instances of type /mob/living/carbon/human" + to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + return if(H.stat != 0) - usr << "The person you are trying to contact is not conscious." + to_chat(usr, "The person you are trying to contact is not conscious.") + return if(!istype(H.l_ear, /obj/item/device/radio/headset) && !istype(H.r_ear, /obj/item/device/radio/headset)) - usr << "The person you are trying to contact is not wearing a headset" + to_chat(usr, "The person you are trying to contact is not wearing a headset") + return var/input = input(src.owner, "Please enter a reason for denying [key_name(H)]'s ERT request.","Outgoing message from CentComm", "") if(!input) return - src.owner << "You sent [input] to [H] via a secure channel." + to_chat(src.owner, "You sent [input] to [H] via a secure channel.") + log_admin("[src.owner] denied [key_name(H)]'s ERT request with the message [input].") - H << "You hear something crackle in your headset for a moment before a voice speaks. \"Your ERT request has been denied for the following reasons: [input]. Message ends.\"" + to_chat(H, "You hear something crackle in your headset for a moment before a voice speaks. \"Your ERT request has been denied for the following reasons: [input]. Message ends.\"") + else src.owner.response_team() @@ -1815,7 +1937,8 @@ usr << browse(data, "window=[B.name]") else - usr << "\red The faxed item is not viewable. This is probably a bug, and should be reported on the tracker: [fax.type]" + to_chat(usr, "\red The faxed item is not viewable. This is probably a bug, and should be reported on the tracker: [fax.type]") + else if (href_list["AdminFaxViewPage"]) if(!check_rights(R_ADMIN)) @@ -1947,14 +2070,16 @@ if(destination != "All Departments") if(!fax.receivefax(P)) - src.owner << "\red Message transmission failed." + to_chat(src.owner, "\red Message transmission failed.") + return else for(var/obj/machinery/photocopier/faxmachine/F in allfaxes) if((F.z in config.station_levels)) spawn(0) if(!F.receivefax(P)) - src.owner << "\red Message transmission to [F.department] failed." + to_chat(src.owner, "\red Message transmission to [F.department] failed.") + var/datum/fax/admin/A = new /datum/fax/admin() A.name = P.name @@ -1969,11 +2094,13 @@ A.sent_by = usr A.sent_at = world.time - src.owner << "\blue Message transmitted successfully." + to_chat(src.owner, "\blue Message transmitted successfully.") + if(notify == "Yes") var/mob/living/carbon/human/H = sender if(istype(H) && H.stat == CONSCIOUS && (istype(H.l_ear, /obj/item/device/radio/headset) || istype(H.r_ear, /obj/item/device/radio/headset))) - sender << "Your headset pings, notifying you that a reply to your fax has arrived." + to_chat(sender, "Your headset pings, notifying you that a reply to your fax has arrived.") + if(sender) log_admin("[key_name(src.owner)] replied to a fax message from [key_name(sender)]: [input]") message_admins("[key_name_admin(src.owner)] replied to a fax message from [key_name_admin(sender)] (VIEW).", 1) @@ -2028,7 +2155,8 @@ var/mob/M = locate(href_list["traitor"]) if(!ismob(M)) - usr << "This can only be used on instances of type /mob." + to_chat(usr, "This can only be used on instances of type /mob.") + return show_traitor_panel(M) @@ -2097,7 +2225,8 @@ switch(where) if("inhand") if (!iscarbon(usr) && !isrobot(usr)) - usr << "Can only spawn in hand when you're a carbon mob or cyborg." + to_chat(usr, "Can only spawn in hand when you're a carbon mob or cyborg.") + where = "onfloor" target = usr @@ -2109,10 +2238,12 @@ target = locate(loc.x + X,loc.y + Y,loc.z + Z) if("inmarked") if(!marked_datum) - usr << "You don't have any object marked. Abandoning spawn." + to_chat(usr, "You don't have any object marked. Abandoning spawn.") + return else if(!istype(marked_datum,/atom)) - usr << "The object you have marked cannot be used as a target. Target must be of type /atom. Abandoning spawn." + to_chat(usr, "The object you have marked cannot be used as a target. Target must be of type /atom. Abandoning spawn.") + return else target = marked_datum @@ -2176,7 +2307,8 @@ message_admins("[key_name_admin(usr)] has kicked [afkonly ? "all AFK" : "all"] clients from the lobby. [length(listkicked)] clients kicked: [strkicked ? strkicked : "--"]") log_admin("[key_name(usr)] has kicked [afkonly ? "all AFK" : "all"] clients from the lobby. [length(listkicked)] clients kicked: [strkicked ? strkicked : "--"]") else - usr << "You may only use this when the game is running." + to_chat(usr, "You may only use this when the game is running.") + else if(href_list["memoeditlist"]) if(!check_rights(R_SERVER)) return @@ -2254,7 +2386,8 @@ feedback_add_details("admin_secrets_fun_used","TriAI") if("gravity") if(!(ticker && ticker.mode)) - usr << "Please wait until the game starts! Not sure how it will work otherwise." + to_chat(usr, "Please wait until the game starts! Not sure how it will work otherwise.") + return gravity_is_on = !gravity_is_on for(var/area/A in world) @@ -2416,11 +2549,14 @@ M.show_message(text("\blue The chilling wind suddenly stops..."), 1) /* if("shockwave") ok = 1 - world << "\red ALERT: STATION STRESS CRITICAL" + to_chat(world, "\red ALERT: STATION STRESS CRITICAL") + sleep(60) - world << "\red ALERT: STATION STRESS CRITICAL. TOLERABLE LEVELS EXCEEDED!" + to_chat(world, "\red ALERT: STATION STRESS CRITICAL. TOLERABLE LEVELS EXCEEDED!") + sleep(80) - world << "\red ALERT: STATION STRUCTURAL STRESS CRITICAL. SAFETY MECHANISMS FAILED!" + to_chat(world, "\red ALERT: STATION STRUCTURAL STRESS CRITICAL. SAFETY MECHANISMS FAILED!") + sleep(40) for(var/mob/M in world) shake_camera(M, 400, 1) @@ -2474,7 +2610,8 @@ message_admins("[key_name_admin(usr)] fixed all lights", 1) if("floorlava") if(floorIsLava) - usr << "The floor is lava already." + to_chat(usr, "The floor is lava already.") + return feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","LF") @@ -2531,7 +2668,8 @@ feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","RET") for(var/mob/living/carbon/human/H in player_list) - H << "\red You suddenly feel stupid." + to_chat(H, "\red You suddenly feel stupid.") + H.setBrainLoss(60) message_admins("[key_name_admin(usr)] made everybody retarded") if("fakeguns") @@ -2552,7 +2690,8 @@ W.item_state = "w_suit" W.item_color = "schoolgirl" message_admins("[key_name_admin(usr)] activated Japanese Animes mode") - world << sound('sound/AI/animes.ogg') + to_chat(world, sound('sound/AI/animes.ogg')) + if("eagles")//SCRAW feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","EgL") @@ -2658,7 +2797,8 @@ if(usr) log_admin("[key_name(usr)] used secret [href_list["secretsfun"]]") if (ok) - world << text("A secret has been activated by []!", usr.key) + to_chat(world, text("A secret has been activated by []!", usr.key)) + else if(href_list["secretsadmin"]) if(!check_rights(R_ADMIN)) return @@ -2735,7 +2875,8 @@ if (usr) log_admin("[key_name(usr)] used secret [href_list["secretsadmin"]]") if (ok) - world << text("A secret has been activated by []!", usr.key) + to_chat(world, text("A secret has been activated by []!", usr.key)) + else if(href_list["secretscoder"]) if(!check_rights(R_DEBUG)) return diff --git a/code/modules/admin/verbs/BrokenInhands.dm b/code/modules/admin/verbs/BrokenInhands.dm index 1d414c7ebf9..dd135db1c50 100644 --- a/code/modules/admin/verbs/BrokenInhands.dm +++ b/code/modules/admin/verbs/BrokenInhands.dm @@ -31,6 +31,8 @@ if(text) var/F = file("broken_hand_icons.txt") fdel(F) - F << text - world << "Completed and written to [F]" + to_chat(F, text) + + to_chat(world, "Completed and written to [F]") + diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index e58e59209f6..b8fafe55e93 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -25,7 +25,8 @@ if(!query_text || length(query_text) < 1) return - //world << query_text +// to_chat(world, query_text) + var/list/query_list = SDQL2_tokenize(query_text) @@ -147,8 +148,10 @@ for(var/v in vals) d.vars[v] = vals[v] catch(var/exception/e) - usr << "A runtime error has occured during the execution of your query and your query has been aborted." - usr << "[e]" + to_chat(usr, "A runtime error has occured during the execution of your query and your query has been aborted.") + + to_chat(usr, "[e]") + /proc/SDQL_parse(list/query_list) var/datum/SDQL_parser/parser = new() @@ -174,7 +177,8 @@ querys[querys_pos] = parsed_tree querys_pos++ else //There was an error so don't run anything, and tell the user which query has errored. - usr << "Parsing error on [querys_pos]\th query. Nothing was executed." + to_chat(usr, "Parsing error on [querys_pos]\th query. Nothing was executed.") + return list() query_tree = list() do_parse = 0 @@ -195,22 +199,28 @@ for(var/item in query_tree) if(istype(item, /list)) - usr << "[spaces](" + to_chat(usr, "[spaces](") + SDQL_testout(item, indent + 1) - usr << "[spaces])" + to_chat(usr, "[spaces])") + else - usr << "[spaces][item]" + to_chat(usr, "[spaces][item]") + if(!isnum(item) && query_tree[item]) if(istype(query_tree[item], /list)) - usr << "[spaces] (" + to_chat(usr, "[spaces] (") + SDQL_testout(query_tree[item], indent + 2) - usr << "[spaces] )" + to_chat(usr, "[spaces] )") + else - usr << "[spaces] [query_tree[item]]" + to_chat(usr, "[spaces] [query_tree[item]]") + /proc/SDQL_from_objs(list/tree) if("world" in tree) @@ -320,7 +330,8 @@ if("or", "||") result = (result || val) else - usr << "SDQL2: Unknown op [op]" + to_chat(usr, "SDQL2: Unknown op [op]") + result = null else result = val @@ -388,11 +399,13 @@ return null else if(expression[start] == "\[" && start < expression.len) if(lowertext(copytext(expression[start + 1], 1, 3)) != "0x") - usr << "Invalid ref syntax: [expression[start + 1]]" + to_chat(usr, "Invalid ref syntax: [expression[start + 1]]") + return null v = locate("\[[expression[start + 1]]\]") if(!v) - usr << "Invalid ref: [expression[start + 1]]" + to_chat(usr, "Invalid ref: [expression[start + 1]]") + return null start++ else @@ -448,7 +461,8 @@ else if(char == "'") if(word != "") - usr << "SDQL2: You have an error in your SDQL syntax, unexpected ' in query: \"[query_text]\" following \"[word]\". Please check your syntax, and try again." + to_chat(usr, "SDQL2: You have an error in your SDQL syntax, unexpected ' in query: \"[query_text]\" following \"[word]\". Please check your syntax, and try again.") + return null word = "'" @@ -468,7 +482,8 @@ word += char if(i > len) - usr << "SDQL2: You have an error in your SDQL syntax, unmatched ' in query: \"[query_text]\". Please check your syntax, and try again." + to_chat(usr, "SDQL2: You have an error in your SDQL syntax, unmatched ' in query: \"[query_text]\". Please check your syntax, and try again.") + return null query_list += "[word]'" @@ -476,7 +491,8 @@ else if(char == "\"") if(word != "") - usr << "SDQL2: You have an error in your SDQL syntax, unexpected \" in query: \"[query_text]\" following \"[word]\". Please check your syntax, and try again." + to_chat(usr, "SDQL2: You have an error in your SDQL syntax, unexpected \" in query: \"[query_text]\" following \"[word]\". Please check your syntax, and try again.") + return null word = "\"" @@ -496,7 +512,8 @@ word += char if(i > len) - usr << "SDQL2: You have an error in your SDQL syntax, unmatched \" in query: \"[query_text]\". Please check your syntax, and try again." + to_chat(usr, "SDQL2: You have an error in your SDQL syntax, unmatched \" in query: \"[query_text]\". Please check your syntax, and try again.") + return null query_list += "[word]\"" diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm b/code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm index f2ec46111ba..e564876c39f 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm @@ -60,7 +60,8 @@ /datum/SDQL_parser/proc/parse_error(error_message) error = 1 - usr << "SQDL2 Parsing Error: [error_message]" + to_chat(usr, "SQDL2 Parsing Error: [error_message]") + return query.len + 1 /datum/SDQL_parser/proc/parse() diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 494961eb767..936fd7b3404 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -9,7 +9,8 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," //handle muting and automuting if(prefs.muted & MUTE_ADMINHELP) - src << "Error: Admin-PM: You cannot send adminhelps (Muted)." + to_chat(src, "Error: Admin-PM: You cannot send adminhelps (Muted).") + return adminhelped = 1 //Determines if they get the message to reply by clicking the name. @@ -112,17 +113,22 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," msg = "[selected_type]: [key_name(src, 1, 1, selected_type)] (?) (PP) (VV) (SM) ([admin_jump_link(mob, "holder")]) (CA) (REJT) [ai_found ? " (CL)" : ""]: [msg]" for(var/client/X in mentorholders + modholders + adminholders) if(X.prefs.sound & SOUND_ADMINHELP) - X << 'sound/effects/adminhelp.ogg' - X << msg + to_chat(X, 'sound/effects/adminhelp.ogg') + + to_chat(X, msg) + if("Adminhelp") msg = "[selected_type]: [key_name(src, 1, 1, selected_type)] (?) (PP) (VV) (SM) ([admin_jump_link(mob, "holder")]) (CA) (REJT) [ai_found ? " (CL)" : ""]: [msg]" for(var/client/X in modholders + adminholders) if(X.prefs.sound & SOUND_ADMINHELP) - X << 'sound/effects/adminhelp.ogg' - X << msg + to_chat(X, 'sound/effects/adminhelp.ogg') + + to_chat(X, msg) + //show it to the person adminhelping too - src << "[selected_type]: [original_msg]" + to_chat(src, "[selected_type]: [original_msg]") + var/admin_number_present = adminholders.len - admin_number_afk log_admin("[selected_type]: [key_name(src)]: [original_msg] - heard by [admin_number_present] non-AFK admins.") diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm index 14613d4567f..98d24ed5526 100644 --- a/code/modules/admin/verbs/adminjump.dm +++ b/code/modules/admin/verbs/adminjump.dm @@ -19,7 +19,8 @@ var/turf/T = pick_n_take(turfs) if(!T) - src << "Nowhere to jump to!" + to_chat(src, "Nowhere to jump to!") + return admin_forcemove(usr, T) @@ -56,7 +57,8 @@ feedback_add_details("admin_verb","JM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! admin_forcemove(A, M.loc) else - A << "This mob is not located in the game world." + to_chat(A, "This mob is not located in the game world.") + /client/proc/jumptocoord(tx as num, ty as num, tz as num) set category = "Admin" @@ -85,7 +87,8 @@ keys += M.client var/selection = input("Please, select a player!", "Admin Jumping", null, null) as null|anything in sortKey(keys) if(!selection) - src << "No keys found." + to_chat(src, "No keys found.") + return var/mob/M = selection:mob log_admin("[key_name(usr)] jumped to [key_name(M)]") diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 18fc3ef07c7..2bb2450d1ea 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -3,7 +3,8 @@ set category = null set name = "Admin PM Mob" if(!holder) - src << "Error: Admin-PM-Context: Only administrators may use this command." + to_chat(src, "Error: Admin-PM-Context: Only administrators may use this command.") + return if( !ismob(M) || !M.client ) return cmd_admin_pm(M.client,null) @@ -14,7 +15,8 @@ set category = "Admin" set name = "Admin PM Name" if(!holder) - src << "Error: Admin-PM-Panel: Only administrators may use this command." + to_chat(src, "Error: Admin-PM-Panel: Only administrators may use this command.") + return var/list/client/targets[0] for(var/client/T) @@ -37,7 +39,8 @@ set category = "Admin" set name = "Admin PM Key" if(!holder) - src << "Error: Admin-PM-Panel: Only administrators may use this command." + to_chat(src, "Error: Admin-PM-Panel: Only administrators may use this command.") + return var/list/client/targets[0] for(var/client/T) @@ -60,7 +63,8 @@ //Fetching a message if needed. src is the sender and C is the target client /client/proc/cmd_admin_pm(whom, msg, type = "PM") if(prefs.muted & MUTE_ADMINHELP) - src << "Error: Private-Message: You are unable to use PM-s (muted)." + to_chat(src, "Error: Private-Message: You are unable to use PM-s (muted).") + return var/client/C @@ -73,7 +77,8 @@ if(!C) if(holder) - src << "Error: Private-Message: Client not found." + to_chat(src, "Error: Private-Message: Client not found.") + else adminhelp(msg) //admin we are replying to left. adminhelp instead return @@ -81,7 +86,8 @@ /*if(C && C.last_pm_recieved + config.simultaneous_pm_warning_timeout > world.time && holder) //send a warning to admins, but have a delay popup for mods if(holder.rights & R_ADMIN) - src << "\red Simultaneous PMs warning: that player has been PM'd in the last [config.simultaneous_pm_warning_timeout / 10] seconds by: [C.ckey_last_pm]" + to_chat(src, "\red Simultaneous PMs warning: that player has been PM'd in the last [config.simultaneous_pm_warning_timeout / 10] seconds by: [C.ckey_last_pm]") + else if(alert("That player has been PM'd in the last [config.simultaneous_pm_warning_timeout / 10] seconds by: [C.ckey_last_pm]","Simultaneous PMs warning","Continue","Cancel") == "Cancel") return*/ @@ -94,7 +100,8 @@ return if(!C) if(holder) - src << "Error: Admin-PM: Client not found." + to_chat(src, "Error: Admin-PM: Client not found.") + else adminhelp(msg) //admin we are replying to has vanished, adminhelp instead return @@ -125,7 +132,8 @@ recieve_pm_type = holder.rank else if(!C.holder) - src << "Error: Admin-PM: Non-admin to non-admin PM communication is forbidden." + to_chat(src, "Error: Admin-PM: Non-admin to non-admin PM communication is forbidden.") + return var/recieve_message = "" @@ -133,7 +141,8 @@ if(holder && !C.holder) recieve_message = "-- Click the [recieve_pm_type]'s name to reply --\n" if(C.adminhelped) - C << recieve_message + to_chat(C, recieve_message) + C.adminhelped = 0 //AdminPM popup for ApocStation and anybody else who wants to use it. Set it with POPUP_ADMIN_PM in config.txt ~Carn @@ -150,8 +159,10 @@ return recieve_message = "[type] from-[recieve_pm_type][key_name(src, C, C.holder ? 1 : 0, type)]: [msg]" - C << recieve_message - src << "[send_pm_type][type] to-[key_name(C, src, holder ? 1 : 0, type)]: [msg]" + to_chat(C, recieve_message) + + to_chat(src, "[send_pm_type][type] to-[key_name(C, src, holder ? 1 : 0, type)]: [msg]") + /*if(holder && !C.holder) C.last_pm_recieved = world.time @@ -160,7 +171,8 @@ //play the recieving admin the adminhelp sound (if they have them enabled) //non-admins shouldn't be able to disable this if(C.prefs.sound & SOUND_ADMINHELP) - C << 'sound/effects/adminhelp.ogg' + to_chat(C, 'sound/effects/adminhelp.ogg') + log_admin("PM: [key_name(src)]->[key_name(C)]: [msg]") //we don't use message_admins here because the sender/receiver might get it too @@ -172,17 +184,21 @@ switch(type) if("Mentorhelp") if(check_rights(R_ADMIN|R_MOD|R_MENTOR, 0, X.mob)) - X << "[type]: [key_name(src, X, 0, type)]->[key_name(C, X, 0, type)]: [msg]" + to_chat(X, "[type]: [key_name(src, X, 0, type)]->[key_name(C, X, 0, type)]: [msg]") + if("Adminhelp") if(check_rights(R_ADMIN|R_MOD, 0, X.mob)) - X << "[type]: [key_name(src, X, 0, type)]->[key_name(C, X, 0, type)]: [msg]" + to_chat(X, "[type]: [key_name(src, X, 0, type)]->[key_name(C, X, 0, type)]: [msg]") + else if(check_rights(R_ADMIN|R_MOD, 0, X.mob)) - X << "[type]: [key_name(src, X, 0, type)]->[key_name(C, X, 0, type)]: [msg]" + to_chat(X, "[type]: [key_name(src, X, 0, type)]->[key_name(C, X, 0, type)]: [msg]") + /client/proc/cmd_admin_irc_pm() if(prefs.muted & MUTE_ADMINHELP) - src << "Error: Private-Message: You are unable to use PM-s (muted)." + to_chat(src, "Error: Private-Message: You are unable to use PM-s (muted).") + return var/msg = input(src,"Message:", "Private message to admins on IRC / 400 character limit") as text|null @@ -193,17 +209,21 @@ sanitize(msg) if(length(msg) > 400) // TODO: if message length is over 400, divide it up into seperate messages, the message length restriction is based on IRC limitations. Probably easier to do this on the bots ends. - src << "\red Your message was not sent because it was more then 400 characters find your message below for ease of copy/pasting" - src << "\blue [msg]" + to_chat(src, "\red Your message was not sent because it was more then 400 characters find your message below for ease of copy/pasting") + + to_chat(src, "\blue [msg]") + return send2adminirc("PlayerPM from [key_name(src)]: [html_decode(msg)]") - src << "IRC PM to-IRC-Admins: [msg]" + to_chat(src, "IRC PM to-IRC-Admins: [msg]") + log_admin("PM: [key_name(src)]->IRC: [msg]") for(var/client/X in admins) if(X == src) continue if(check_rights(R_ADMIN|R_MOD|R_MENTOR, 0, X.mob)) - X << "PM: [key_name(src, X, 0)]->IRC-Admins: \blue [msg]" + to_chat(X, "PM: [key_name(src, X, 0)]->IRC-Admins: \blue [msg]") + diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm index 63ae34e248d..2cd44302a1d 100644 --- a/code/modules/admin/verbs/adminsay.dm +++ b/code/modules/admin/verbs/adminsay.dm @@ -12,7 +12,8 @@ if(check_rights(R_ADMIN,0)) for(var/client/C in admins) if(R_ADMIN & C.holder.rights) - C << "ADMIN: [key_name(usr, 1)] ([admin_jump_link(mob, "holder")]): [msg]" + to_chat(C, "ADMIN: [key_name(usr, 1)] ([admin_jump_link(mob, "holder")]): [msg]") + feedback_add_details("admin_verb","M") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -35,6 +36,7 @@ spanclass = "mod_channel_admin" for(var/client/C in admins) if(check_rights(R_ADMIN|R_MOD, 0, C.mob)) - C << "MOD: [key_name(usr, 1)] ([admin_jump_link(mob, C.holder)]): [msg]" + to_chat(C, "MOD: [key_name(usr, 1)] ([admin_jump_link(mob, C.holder)]): [msg]") + feedback_add_details("admin_verb","MS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! \ No newline at end of file diff --git a/code/modules/admin/verbs/antag-ooc.dm b/code/modules/admin/verbs/antag-ooc.dm index 400c60b2dea..de28cfab042 100644 --- a/code/modules/admin/verbs/antag-ooc.dm +++ b/code/modules/admin/verbs/antag-ooc.dm @@ -14,7 +14,8 @@ for(var/mob/M in mob_list) if((M.mind && M.mind.special_role && M.client) || (M.client && M.client.holder && (M.client.holder.rights & R_ADMIN)) ) - M << "AOOC: [display_name]: [msg]" + to_chat(M, "AOOC: [display_name]: [msg]") + log_ooc("(ANTAG) [key] : [msg]") diff --git a/code/modules/admin/verbs/atmosdebug.dm b/code/modules/admin/verbs/atmosdebug.dm index f4e163394cb..f6f7f985fea 100644 --- a/code/modules/admin/verbs/atmosdebug.dm +++ b/code/modules/admin/verbs/atmosdebug.dm @@ -3,30 +3,36 @@ set name = "Check Piping" set background = 1 if(!src.holder) - src << "Only administrators may use this command." + to_chat(src, "Only administrators may use this command.") + return feedback_add_details("admin_verb","CP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! if(alert("WARNING: This command should not be run on a live server. Do you want to continue?", "Check Piping", "No", "Yes") == "No") return - usr << "Checking for disconnected pipes..." + to_chat(usr, "Checking for disconnected pipes...") + //all plumbing - yes, some things might get stated twice, doesn't matter. for (var/obj/machinery/atmospherics/plumbing in world) if (plumbing.nodealert) - usr << "Unconnected [plumbing.name] located at [plumbing.x],[plumbing.y],[plumbing.z] ([get_area(plumbing.loc)])" + to_chat(usr, "Unconnected [plumbing.name] located at [plumbing.x],[plumbing.y],[plumbing.z] ([get_area(plumbing.loc)])") + //Manifolds for (var/obj/machinery/atmospherics/pipe/manifold/pipe in world) if (!pipe.node1 || !pipe.node2 || !pipe.node3) - usr << "Unconnected [pipe.name] located at [pipe.x],[pipe.y],[pipe.z] ([get_area(pipe.loc)])" + to_chat(usr, "Unconnected [pipe.name] located at [pipe.x],[pipe.y],[pipe.z] ([get_area(pipe.loc)])") + //Pipes for (var/obj/machinery/atmospherics/pipe/simple/pipe in world) if (!pipe.node1 || !pipe.node2) - usr << "Unconnected [pipe.name] located at [pipe.x],[pipe.y],[pipe.z] ([get_area(pipe.loc)])" + to_chat(usr, "Unconnected [pipe.name] located at [pipe.x],[pipe.y],[pipe.z] ([get_area(pipe.loc)])") + + + to_chat(usr, "Checking for overlapping pipes...") - usr << "Checking for overlapping pipes..." next_turf: for(var/turf/T in world) for(var/dir in cardinal) @@ -35,15 +41,18 @@ if(dir & pipe.initialize_directions) check++ if(check > 1) - usr << "Overlapping pipe ([pipe.name]) located at [T.x],[T.y],[T.z] ([get_area(T)])" + to_chat(usr, "Overlapping pipe ([pipe.name]) located at [T.x],[T.y],[T.z] ([get_area(T)])") + continue next_turf - usr << "Done" + to_chat(usr, "Done") + /client/proc/powerdebug() set category = "Mapping" set name = "Check Power" if(!src.holder) - src << "Only administrators may use this command." + to_chat(src, "Only administrators may use this command.") + return feedback_add_details("admin_verb","CPOW") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -51,9 +60,11 @@ if (!PN.nodes || !PN.nodes.len) if(PN.cables && (PN.cables.len > 1)) var/obj/structure/cable/C = PN.cables[1] - usr << "Powernet with no nodes! (number [PN.number]) - example cable at [C.x], [C.y], [C.z] in area [get_area(C.loc)]" + to_chat(usr, "Powernet with no nodes! (number [PN.number]) - example cable at [C.x], [C.y], [C.z] in area [get_area(C.loc)]") + if (!PN.cables || (PN.cables.len < 10)) if(PN.cables && (PN.cables.len > 1)) var/obj/structure/cable/C = PN.cables[1] - usr << "Powernet with fewer than 10 cables! (number [PN.number]) - example cable at [C.x], [C.y], [C.z] in area [get_area(C.loc)]" \ No newline at end of file + to_chat(usr, "Powernet with fewer than 10 cables! (number [PN.number]) - example cable at [C.x], [C.y], [C.z] in area [get_area(C.loc)]") + diff --git a/code/modules/admin/verbs/custom_event.dm b/code/modules/admin/verbs/custom_event.dm index 56e8fe30217..93a8dd8abac 100644 --- a/code/modules/admin/verbs/custom_event.dm +++ b/code/modules/admin/verbs/custom_event.dm @@ -4,7 +4,8 @@ set name = "Change Custom Event" if(!holder) - src << "Only administrators may use this command." + to_chat(src, "Only administrators may use this command.") + return var/input = input(usr, "Enter the description of the custom event. Be descriptive. To cancel the event, make this blank or hit cancel.", "Custom Event", custom_event_msg) as message|null @@ -19,10 +20,14 @@ custom_event_msg = input - world << "

      Custom Event

      " - world << "

      A custom event is starting. OOC Info:

      " - world << "[html_encode(custom_event_msg)]" - world << "
      " + to_chat(world, "

      Custom Event

      ") + + to_chat(world, "

      A custom event is starting. OOC Info:

      ") + + to_chat(world, "[html_encode(custom_event_msg)]") + + to_chat(world, "
      ") + // normal verb for players to view info /client/verb/cmd_view_custom_event() @@ -30,11 +35,17 @@ set name = "Custom Event Info" if(!custom_event_msg || custom_event_msg == "") - src << "There currently is no known custom event taking place." - src << "Keep in mind: it is possible that an admin has not properly set this." + to_chat(src, "There currently is no known custom event taking place.") + + to_chat(src, "Keep in mind: it is possible that an admin has not properly set this.") + return - src << "

      Custom Event

      " - src << "

      A custom event is taking place. OOC Info:

      " - src << "[html_encode(custom_event_msg)]" - src << "
      " + to_chat(src, "

      Custom Event

      ") + + to_chat(src, "

      A custom event is taking place. OOC Info:

      ") + + to_chat(src, "[html_encode(custom_event_msg)]") + + to_chat(src, "
      ") + diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm index b448099f635..a2663d0ba53 100644 --- a/code/modules/admin/verbs/deadsay.dm +++ b/code/modules/admin/verbs/deadsay.dm @@ -10,11 +10,13 @@ return if(prefs.muted & MUTE_DEADCHAT) - src << "You cannot send DSAY messages (muted)." + to_chat(src, "You cannot send DSAY messages (muted).") + return if(!(prefs.toggles & CHAT_DEAD)) - src << "You have deadchat muted." + to_chat(src, "You have deadchat muted.") + return if (handle_spam_prevention(msg,MUTE_DEADCHAT)) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 9c6f671fba7..f5ff82bc040 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -72,7 +72,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(!procname) return if(targetselected && !hascall(target,procname)) - usr << "Error: callproc(): target has no such call [procname]." + to_chat(usr, "Error: callproc(): target has no such call [procname].") + return var/list/lst = get_callproc_args() @@ -81,7 +82,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(targetselected) if(!target) - usr << "Error: callproc(): owner of proc no longer exists." + to_chat(usr, "Error: callproc(): owner of proc no longer exists.") + return message_admins("[key_name_admin(src)] called [target]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].") log_admin("[key_name(src)] called [target]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].") @@ -92,7 +94,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that log_admin("[key_name(src)] called [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]") returnval = call(procname)(arglist(lst)) // Pass the lst as an argument list to the proc - usr << "[procname] returned: [returnval ? returnval : "null"]" + to_chat(usr, "[procname] returned: [returnval ? returnval : "null"]") + feedback_add_details("admin_verb","APC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/callproc_datum(var/A as null|area|mob|obj|turf) @@ -107,7 +110,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that return if(!hascall(A,procname)) - usr << "Error: callproc_datum(): target has no such call [procname]." + to_chat(usr, "Error: callproc_datum(): target has no such call [procname].") + return var/list/lst = get_callproc_args() @@ -115,14 +119,16 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that return if(!A || !IsValidSrc(A)) - usr << "Error: callproc_datum(): owner of proc no longer exists." + to_chat(usr, "Error: callproc_datum(): owner of proc no longer exists.") + return message_admins("[key_name_admin(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]") log_admin("[key_name(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]") spawn() var/returnval = call(A,procname)(arglist(lst)) // Pass the lst as an argument list to the proc - usr << "[procname] returned: [returnval ? returnval : "null"]" + to_chat(usr, "[procname] returned: [returnval ? returnval : "null"]") + feedback_add_details("admin_verb","DPC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -506,41 +512,59 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that var/list/areas_without_intercom = areas_all - areas_with_intercom var/list/areas_without_camera = areas_all - areas_with_camera - world << "AREAS WITHOUT AN APC:" + to_chat(world, "AREAS WITHOUT AN APC:") + for(var/areatype in areas_without_APC) - world << "* [areatype]" + to_chat(world, "* [areatype]") + + + to_chat(world, "AREAS WITHOUT AN AIR ALARM:") - world << "AREAS WITHOUT AN AIR ALARM:" for(var/areatype in areas_without_air_alarm) - world << "* [areatype]" + to_chat(world, "* [areatype]") + + + to_chat(world, "AREAS WITH TOO MANY APCS:") - world << "AREAS WITH TOO MANY APCS:" for(var/areatype in areas_with_multiple_APCs) - world << "* [areatype]" + to_chat(world, "* [areatype]") + + + to_chat(world, "AREAS WITH TOO MANY AIR ALARMS:") - world << "AREAS WITH TOO MANY AIR ALARMS:" for(var/areatype in areas_with_multiple_air_alarms) - world << "* [areatype]" + to_chat(world, "* [areatype]") + + + to_chat(world, "AREAS WITHOUT A REQUEST CONSOLE:") - world << "AREAS WITHOUT A REQUEST CONSOLE:" for(var/areatype in areas_without_RC) - world << "* [areatype]" + to_chat(world, "* [areatype]") + + + to_chat(world, "AREAS WITHOUT ANY LIGHTS:") - world << "AREAS WITHOUT ANY LIGHTS:" for(var/areatype in areas_without_light) - world << "* [areatype]" + to_chat(world, "* [areatype]") + + + to_chat(world, "AREAS WITHOUT A LIGHT SWITCH:") - world << "AREAS WITHOUT A LIGHT SWITCH:" for(var/areatype in areas_without_LS) - world << "* [areatype]" + to_chat(world, "* [areatype]") + + + to_chat(world, "AREAS WITHOUT ANY INTERCOMS:") - world << "AREAS WITHOUT ANY INTERCOMS:" for(var/areatype in areas_without_intercom) - world << "* [areatype]" + to_chat(world, "* [areatype]") + + + to_chat(world, "AREAS WITHOUT ANY CAMERAS:") - world << "AREAS WITHOUT ANY CAMERAS:" for(var/areatype in areas_without_camera) - world << "* [areatype]" + to_chat(world, "* [areatype]") + /client/proc/cmd_admin_dress(var/mob/living/carbon/human/M in mob_list) set category = "Event" @@ -1166,21 +1190,29 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that switch(input("Which list?") in list("Players","Admins","Mobs","Living Mobs","Dead Mobs","Silicons","Clients","Respawnable Mobs")) if("Players") - usr << jointext(player_list,",") + to_chat(usr, jointext(player_list,",")) + if("Admins") - usr << jointext(admins,",") + to_chat(usr, jointext(admins,",")) + if("Mobs") - usr << jointext(mob_list,",") + to_chat(usr, jointext(mob_list,",")) + if("Living Mobs") - usr << jointext(living_mob_list,",") + to_chat(usr, jointext(living_mob_list,",")) + if("Dead Mobs") - usr << jointext(dead_mob_list,",") + to_chat(usr, jointext(dead_mob_list,",")) + if("Silicons") - usr << jointext(silicon_mob_list,",") + to_chat(usr, jointext(silicon_mob_list,",")) + if("Clients") - usr << jointext(clients,",") + to_chat(usr, jointext(clients,",")) + if("Respawnable Mobs") - usr << jointext(respawnable_list,",") + to_chat(usr, jointext(respawnable_list,",")) + /client/proc/cmd_admin_toggle_block(var/mob/M,var/block) diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm index 6c5db7cd1e6..abef5d0e08a 100644 --- a/code/modules/admin/verbs/diagnostics.dm +++ b/code/modules/admin/verbs/diagnostics.dm @@ -15,9 +15,11 @@ if(T.active_hotspot) burning = 1 - usr << "\blue @[target.x],[target.y]: O:[GM.oxygen] T:[GM.toxins] N:[GM.nitrogen] C:[GM.carbon_dioxide] w [GM.temperature] Kelvin, [GM.return_pressure()] kPa [(burning)?("\red BURNING"):(null)]" + to_chat(usr, "\blue @[target.x],[target.y]: O:[GM.oxygen] T:[GM.toxins] N:[GM.nitrogen] C:[GM.carbon_dioxide] w [GM.temperature] Kelvin, [GM.return_pressure()] kPa [(burning)?("\red BURNING"):(null)]") + for(var/datum/gas/trace_gas in GM.trace_gases) - usr << "[trace_gas.type]: [trace_gas.moles]" + to_chat(usr, "[trace_gas.type]: [trace_gas.moles]") + message_admins("[key_name_admin(usr)] has checked the air status of [T]") log_admin("[key_name(usr)] has checked the air status of [T]") @@ -130,9 +132,11 @@ if(!check_rights(R_DEBUG)) return - usr << "Jobbans active in this round." + to_chat(usr, "Jobbans active in this round.") + for(var/t in jobban_keylist) - usr << "[t]" + to_chat(usr, "[t]") + message_admins("[key_name_admin(usr)] has printed the jobban log") log_admin("[key_name(usr)] has printed the jobban log") @@ -149,10 +153,12 @@ if(!filter) return - usr << "Jobbans active in this round." + to_chat(usr, "Jobbans active in this round.") + for(var/t in jobban_keylist) if(findtext(t, filter)) - usr << "[t]" + to_chat(usr, "[t]") + message_admins("[key_name_admin(usr)] has searched the jobban log for [filter]") log_admin("[key_name(usr)] has searched the jobban log for [filter]") diff --git a/code/modules/admin/verbs/dice.dm b/code/modules/admin/verbs/dice.dm index 62b46fba8ee..e77ef3c65fe 100644 --- a/code/modules/admin/verbs/dice.dm +++ b/code/modules/admin/verbs/dice.dm @@ -12,11 +12,13 @@ var/dice = num2text(sum) + "d" + num2text(side) if(alert("Do you want to inform the world about your game?",,"Yes", "No") == "Yes") - world << "

      The dice have been rolled by Gods!

      " + to_chat(world, "

      The dice have been rolled by Gods!

      ") + var/result = roll(dice) if(alert("Do you want to inform the world about the result?",,"Yes", "No") == "Yes") - world << "

      Gods rolled [dice], result is [result]

      " + to_chat(world, "

      Gods rolled [dice], result is [result]

      ") + message_admins("[key_name_admin(src)] rolled dice [dice], result is [result]", 1) \ No newline at end of file diff --git a/code/modules/admin/verbs/freeze.dm b/code/modules/admin/verbs/freeze.dm index 2d3314bd045..e17e70ce637 100644 --- a/code/modules/admin/verbs/freeze.dm +++ b/code/modules/admin/verbs/freeze.dm @@ -10,7 +10,8 @@ var/global/list/frozen_mob_list = list() set category = "Special Verbs" set name = "Freeze" if(!holder) - src << "Error: Freeze: Only administrators may use this command." + to_chat(src, "Error: Freeze: Only administrators may use this command.") + return if(!istype(M)) return if(!check_rights(R_ADMIN)) return @@ -26,7 +27,8 @@ var/global/list/frozen_mob_list = list() /mob/living/proc/admin_Freeze(var/client/admin) if(istype(admin)) - src << "You have been frozen by [key_name(admin)]" + to_chat(src, "You have been frozen by [key_name(admin)]") + message_admins("[key_name_admin(admin)] froze [key_name_admin(src)]") log_admin("[key_name(admin)] froze [key_name(src)]") @@ -42,7 +44,8 @@ var/global/list/frozen_mob_list = list() /mob/living/proc/admin_unFreeze(var/client/admin) if(istype(admin)) - src << "You have been unfrozen by [key_name(admin)]" + to_chat(src, "You have been unfrozen by [key_name(admin)]") + message_admins("\blue [key_name_admin(admin)] unfroze [key_name_admin(src)]") log_admin("[key_name(admin)] unfroze [key_name(src)]") @@ -85,11 +88,13 @@ var/global/list/frozen_mob_list = list() set category = "Special Verbs" set name = "Freeze Mech" if(!holder) - src << "Only administrators may use this command." + to_chat(src, "Only administrators may use this command.") + return var/obj/mecha/M = O if(!istype(M,/obj/mecha)) - src << "\red This can only be used on Mechs!" + to_chat(src, "\red This can only be used on Mechs!") + return else if(usr) @@ -101,7 +106,8 @@ var/global/list/frozen_mob_list = list() M.overlays += adminomaly if(M.occupant) M.removeVerb(/obj/mecha/verb/eject) - M.occupant << "You have been frozen by [key]" + to_chat(M.occupant, "You have been frozen by [key]") + message_admins("\blue [key_name_admin(usr)] froze [key_name(M.occupant)] in a [M.name]") log_admin("[key_name(usr)] froze [key_name(M.occupant)] in a [M.name]") else @@ -112,7 +118,8 @@ var/global/list/frozen_mob_list = list() M.overlays -= adminomaly if(M.occupant) M.addVerb(/obj/mecha/verb/eject) - M.occupant << "You have been unfrozen by [key]" + to_chat(M.occupant, "You have been unfrozen by [key]") + message_admins("\blue [key_name_admin(usr)] unfroze [key_name(M.occupant)] in a [M.name]") log_admin("[key_name(usr)] unfroze [M.occupant.name]/[M.occupant.ckey] in a [M.name]") else diff --git a/code/modules/admin/verbs/getlogs.dm b/code/modules/admin/verbs/getlogs.dm index cf939c0ae9f..fe1e0bdf416 100644 --- a/code/modules/admin/verbs/getlogs.dm +++ b/code/modules/admin/verbs/getlogs.dm @@ -24,16 +24,19 @@ set category = null if(!src.holder) - src << "Only Admins may use this command." + to_chat(src, "Only Admins may use this command.") + return var/client/target = input(src,"Choose somebody to grant access to the server's runtime logs (permissions expire at the end of each round):","Grant Permissions",null) as null|anything in clients if(!istype(target,/client)) - src << "Error: giveruntimelog(): Client not found." + to_chat(src, "Error: giveruntimelog(): Client not found.") + return target.verbs |= /client/proc/getruntimelog - target << "You have been granted access to runtime logs. Please use them responsibly or risk being banned." + to_chat(target, "You have been granted access to runtime logs. Please use them responsibly or risk being banned.") + return @@ -52,8 +55,10 @@ return message_admins("[key_name_admin(src)] accessed file: [path]") - src << ftp( file(path) ) - src << "Attempting to send file, this may take a fair few minutes if the file is very large." + src << ftp(file(path)) + + to_chat(src, "Attempting to send file, this may take a fair few minutes if the file is very large.") + return @@ -72,8 +77,10 @@ return message_admins("[key_name_admin(src)] accessed file: [path]") - src << ftp( file(path) ) - src << "Attempting to send file, this may take a fair few minutes if the file is very large." + src << ftp(file(path)) + + to_chat(src, "Attempting to send file, this may take a fair few minutes if the file is very large.") + return @@ -87,9 +94,10 @@ var/path = "data/logs/[time2text(world.realtime,"YYYY/MM-Month/DD-Day")].log" if( fexists(path) ) - src << ftp( file(path) ) + src << ftp(file(path)) + else - src << "Error: view_txt_log(): File not found/Invalid path([path])." + to_chat(src, "Error: view_txt_log(): File not found/Invalid path([path]).") return feedback_add_details("admin_verb","VTL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return @@ -102,10 +110,13 @@ var/path = "data/logs/[time2text(world.realtime,"YYYY/MM-Month/DD-Day")] Attack.log" if( fexists(path) ) - src << ftp( file(path) ) + src << ftp(file(path)) + else - src << "Error: view_atk_log(): File not found/Invalid path([path])." + to_chat(src, "Error: view_atk_log(): File not found/Invalid path([path]).") + return - usr << run( file(path) ) + usr << run(file(path)) + feedback_add_details("admin_verb","SSAL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return diff --git a/code/modules/admin/verbs/honksquad.dm b/code/modules/admin/verbs/honksquad.dm index e64cbf66574..a2377a2c3a6 100644 --- a/code/modules/admin/verbs/honksquad.dm +++ b/code/modules/admin/verbs/honksquad.dm @@ -5,13 +5,16 @@ var/global/sent_honksquad = 0 /client/proc/honksquad() if(!ticker) - usr << "The game hasn't started yet!" + to_chat(usr, "The game hasn't started yet!") + return if(world.time < 6000) - usr << "There are [(6000-world.time)/10] seconds remaining before it may be called." + to_chat(usr, "There are [(6000-world.time)/10] seconds remaining before it may be called.") + return if(sent_honksquad == 1) - usr << "Clown Planet has already dispatched a HONKsquad." + to_chat(usr, "Clown Planet has already dispatched a HONKsquad.") + return if(alert("Do you want to send in the HONKsquad? Once enabled, this is irreversible.",,"Yes","No")!="Yes") return @@ -25,7 +28,8 @@ var/global/sent_honksquad = 0 return if(sent_honksquad) - usr << "Looks like someone beat you to it. HONK." + to_chat(usr, "Looks like someone beat you to it. HONK.") + return sent_honksquad = 1 @@ -64,7 +68,8 @@ var/global/sent_honksquad = 0 //So they don't forget their code or mission. new_honksquad.mind.store_memory("Mission: \red [input].") - new_honksquad << "\blue You are a HONKsquad. [!honk_leader_selected?"commando":"LEADER"] in the service of Clown Planet. You are called in cases of exteme low levels of HONK. You are NOT authorized to kill. \nYour current mission is: \red[input]" + to_chat(new_honksquad, "\blue You are a HONKsquad. [!honk_leader_selected?"commando":"LEADER"] in the service of Clown Planet. You are called in cases of exteme low levels of HONK. You are NOT authorized to kill. \nYour current mission is: \red[input]") + honksquad_number-- diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index 0af366ef215..0dac4624f51 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -188,7 +188,8 @@ var/list/admin_verbs_show_debug_verbs = list( count++ atom_list += A - world << "There are [count] objects of type [type_path] on z-level [num_level]." + to_chat(world, "There are [count] objects of type [type_path] on z-level [num_level].") + feedback_add_details("admin_verb","mOBJZ") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/count_objects_all() @@ -209,5 +210,6 @@ var/list/admin_verbs_show_debug_verbs = list( if(istype(A,type_path)) count++ - world << "There are [count] objects of type [type_path] in the game world." + to_chat(world, "There are [count] objects of type [type_path] in the game world.") + feedback_add_details("admin_verb","mOBJ") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/massmodvar.dm b/code/modules/admin/verbs/massmodvar.dm index aa05d810810..701ff9e0ad8 100644 --- a/code/modules/admin/verbs/massmodvar.dm +++ b/code/modules/admin/verbs/massmodvar.dm @@ -30,7 +30,8 @@ for(var/p in forbidden_varedit_object_types) if( istype(O,p) ) - usr << "It is forbidden to edit this object's variables." + to_chat(usr, "It is forbidden to edit this object's variables.") + return var/list/names = list() @@ -55,43 +56,53 @@ if(!check_rights(R_DEBUG)) return if(isnull(var_value)) - usr << "Unable to determine variable type." + to_chat(usr, "Unable to determine variable type.") + else if(isnum(var_value)) - usr << "Variable appears to be NUM." + to_chat(usr, "Variable appears to be NUM.") + default = "num" dir = 1 else if(istext(var_value)) - usr << "Variable appears to be TEXT." + to_chat(usr, "Variable appears to be TEXT.") + default = "text" else if(isloc(var_value)) - usr << "Variable appears to be REFERENCE." + to_chat(usr, "Variable appears to be REFERENCE.") + default = "reference" else if(isicon(var_value)) - usr << "Variable appears to be ICON." + to_chat(usr, "Variable appears to be ICON.") + var_value = "\icon[var_value]" default = "icon" else if(istype(var_value,/atom) || istype(var_value,/datum)) - usr << "Variable appears to be TYPE." + to_chat(usr, "Variable appears to be TYPE.") + default = "type" else if(istype(var_value,/list)) - usr << "Variable appears to be LIST." + to_chat(usr, "Variable appears to be LIST.") + default = "list" else if(istype(var_value,/client)) - usr << "Variable appears to be CLIENT." + to_chat(usr, "Variable appears to be CLIENT.") + default = "cancel" else - usr << "Variable appears to be FILE." + to_chat(usr, "Variable appears to be FILE.") + default = "file" - usr << "Variable contains: [var_value]" + to_chat(usr, "Variable contains: [var_value]") + if(dir) switch(var_value) if(1) @@ -113,7 +124,8 @@ else dir = null if(dir) - usr << "If a direction, direction is: [dir]" + to_chat(usr, "If a direction, direction is: [dir]") + var/class = input("What kind of variable?","Variable Type",default) as null|anything in list("text", "num","type","icon","file","edit referenced object","restore to default") diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm index f4f348bb72a..2e7ced5f038 100644 --- a/code/modules/admin/verbs/modifyvariables.dm +++ b/code/modules/admin/verbs/modifyvariables.dm @@ -18,7 +18,8 @@ var/list/forbidden_varedit_object_types = list( set name = "Edit Ticker Variables" if (ticker == null) - src << "Game hasn't started yet." + to_chat(src, "Game hasn't started yet.") + else src.modify_variables(ticker) feedback_add_details("admin_verb","ETV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -53,7 +54,8 @@ var/list/forbidden_varedit_object_types = list( var/type_text = input("Enter type:", "Type") as null|message var_value = text2path(type_text) if(!var_value) - src << "[type_text] is not a valid path!" + to_chat(src, "[type_text] is not a valid path!") + if("reference") var_value = input("Select reference:","Reference") as null|mob|obj|turf|area in world @@ -106,7 +108,8 @@ var/list/forbidden_varedit_object_types = list( var/type_text = input("Enter type:", "Type") as null|message var_value = text2path(type_text) if(!var_value) - src << "[type_text] is not a valid path!" + to_chat(src, "[type_text] is not a valid path!") + if("reference") var_value = input("Select reference:","Reference") as mob|obj|turf|area in world @@ -135,7 +138,8 @@ var/list/forbidden_varedit_object_types = list( /client/proc/mod_list(var/list/L) if(!check_rights(R_VAREDIT)) return - if(!istype(L,/list)) src << "Not a List." + if(!istype(L,/list)) + to_chat(src, "Not a List.") if(L.len > 1000) var/confirm = alert(src, "The list you're trying to edit is very long, continuing may crash the server.", "Warning", "Continue", "Abort") @@ -149,7 +153,8 @@ var/list/forbidden_varedit_object_types = list( var/a = L[1] if(istext(a) && L[a] != null) assoc = 1 //This is pretty weak test but i can't think of anything else - usr << "List appears to be associative." + to_chat(usr, "List appears to be associative.") + var/list/names = null if(!assoc) @@ -182,12 +187,14 @@ var/list/forbidden_varedit_object_types = list( default = variable_to_type(variable) - usr << "Variable contains: [variable]" + to_chat(usr, "Variable contains: [variable]") + if(default == "num") dir = dir2text(variable) if(dir) - usr << "If a direction, direction is: [dir]" + to_chat(usr, "If a direction, direction is: [dir]") + var/class = "text" var/list/allowed_types = list("text", "num","type", "type from text", "reference","mob reference", "icon","file","list","edit referenced object","restore to default","DELETE FROM LIST") @@ -276,11 +283,13 @@ var/list/forbidden_varedit_object_types = list( for(var/p in forbidden_varedit_object_types) if( istype(O,p) ) - usr << "It is forbidden to edit this object's variables." + to_chat(usr, "It is forbidden to edit this object's variables.") + return if(istype(O, /client) && (param_var_name == "ckey" || param_var_name == "key")) - usr << "You cannot edit ckeys on client objects." + to_chat(usr, "You cannot edit ckeys on client objects.") + return var/class @@ -289,7 +298,8 @@ var/list/forbidden_varedit_object_types = list( if(param_var_name) if(!param_var_name in O.vars) - src << "A variable with this name ([param_var_name]) doesn't exist in this atom ([O])" + to_chat(src, "A variable with this name ([param_var_name]) doesn't exist in this atom ([O])") + return if(param_var_name == "holder" || (param_var_name in locked)) @@ -330,11 +340,13 @@ var/list/forbidden_varedit_object_types = list( else if(default == "icon") var_value = "\icon[var_value]" - usr << "Variable contains: [var_value]" + to_chat(usr, "Variable contains: [var_value]") + if(dir) dir = dir2text(var_value) if(dir) - usr << "If a direction, direction is: [dir]" + to_chat(usr, "If a direction, direction is: [dir]") + var/list/allowed_types = list("text", "num","type","reference","mob reference", "path", "matrix", "icon","file","list","edit referenced object","restore to default") if(src.holder && src.holder.marked_datum) @@ -402,7 +414,8 @@ var/list/forbidden_varedit_object_types = list( var/path_text = input("Enter path:", "Path",O.vars[variable]) as null|text var/var_new = text2path(path_text) if(!var_new && path_text != null) // So aborting doesn't bother the VVer - usr << "[path_text] does not appear to be a valid path." + to_chat(usr, "[path_text] does not appear to be a valid path.") + return O.vars[variable] = var_new @@ -410,7 +423,8 @@ var/list/forbidden_varedit_object_types = list( var/matrix_text = input("Enter a, b, c, d, e, and f, separated by a space.", "Matrix", "1 0 0 0 1 0") as null|text var/var_new = text2matrix(matrix_text) if(!var_new && matrix_text != null) - usr << "[matrix_text] is not a valid matrix string." + to_chat(usr, "[matrix_text] is not a valid matrix string.") + return O.vars[variable] = var_new var_as_text = "matrix([matrix_text])" @@ -449,51 +463,63 @@ var/list/forbidden_varedit_object_types = list( /proc/variable_to_type(var/variable) var/class if(isnull(variable)) - usr << "Unable to determine variable type." + to_chat(usr, "Unable to determine variable type.") + class = null else if(isnum(variable)) - usr << "Variable appears to be NUM." + to_chat(usr, "Variable appears to be NUM.") + class = "num" else if(istext(variable)) - usr << "Variable appears to be TEXT." + to_chat(usr, "Variable appears to be TEXT.") + class = "text" else if(isloc(variable)) - usr << "Variable appears to be REFERENCE." + to_chat(usr, "Variable appears to be REFERENCE.") + class = "reference" else if(isicon(variable)) - usr << "Variable appears to be ICON." + to_chat(usr, "Variable appears to be ICON.") + variable = "\icon[variable]" class = "icon" else if(istype(variable,/matrix)) - usr << "Variable appears to be MATRIX" + to_chat(usr, "Variable appears to be MATRIX") + class = "matrix" else if(istype(variable,/atom) || istype(variable,/datum)) - usr << "Variable appears to be TYPE." + to_chat(usr, "Variable appears to be TYPE.") + class = "type" else if(istype(variable,/list)) - usr << "Variable appears to be LIST." + to_chat(usr, "Variable appears to be LIST.") + class = "list" else if(istype(variable,/client)) - usr << "Variable appears to be CLIENT." + to_chat(usr, "Variable appears to be CLIENT.") + class = "cancel" else if(ispath(variable)) - usr << "Variable appears to be PATH." + to_chat(usr, "Variable appears to be PATH.") + class = "path" else if(isfile(variable)) - usr << "Variable appears to be FILE." + to_chat(usr, "Variable appears to be FILE.") + class = "file" else - usr << "Variable type is UNKNOWN." + to_chat(usr, "Variable type is UNKNOWN.") + class = null return class \ No newline at end of file diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 038c9a27b3f..a5f97673afc 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -377,7 +377,8 @@ client/proc/one_click_antag() //So they don't forget their code or mission. - new_syndicate_commando << "\blue You are an Elite Syndicate. [!syndicate_leader_selected?"commando":"LEADER"] in the service of the Syndicate. \nYour current mission is: \red [input]" + to_chat(new_syndicate_commando, "\blue You are an Elite Syndicate. [!syndicate_leader_selected?"commando":"LEADER"] in the service of the Syndicate. \nYour current mission is: \red [input]") + numagents-- if(numagents >= 6) @@ -482,8 +483,10 @@ client/proc/one_click_antag() break new_vox.key = theghost.key - new_vox << "\blue You are a Vox Primalis, fresh out of the Shoal. Your ship has arrived at the Tau Ceti system hosting the NSV Exodus... or was it the Luna? NSS? Utopia? Nobody is really sure, but everyong is raring to start pillaging! Your current goal is: \red [input]" - new_vox << "\red Don't forget to turn on your nitrogen internals!" + to_chat(new_vox, "\blue You are a Vox Primalis, fresh out of the Shoal. Your ship has arrived at the Tau Ceti system hosting the NSV Exodus... or was it the Luna? NSS? Utopia? Nobody is really sure, but everyong is raring to start pillaging! Your current goal is: \red [input]") + + to_chat(new_vox, "\red Don't forget to turn on your nitrogen internals!") + raiders-- if(raiders > max_raiders) @@ -612,7 +615,8 @@ client/proc/one_click_antag() newMember.key = theghost.key teamOneMembers-- - newMember << "You are a member of the GREEN Thunderdome team! Gear up and help your team destroy the red team!" + to_chat(newMember, "You are a member of the GREEN Thunderdome team! Gear up and help your team destroy the red team!") + if(L.name == "tdome2") if(teamTwoMembers<=0) @@ -634,7 +638,8 @@ client/proc/one_click_antag() newMember.key = theghost.key teamTwoMembers-- - newMember << "You are a member of the RED Thunderdome team! Gear up and help your team destroy the green team!" + to_chat(newMember, "You are a member of the RED Thunderdome team! Gear up and help your team destroy the green team!") + else return 0 return 1 \ No newline at end of file diff --git a/code/modules/admin/verbs/onlyone.dm b/code/modules/admin/verbs/onlyone.dm index 97e7f716a3c..052b00b69e4 100644 --- a/code/modules/admin/verbs/onlyone.dm +++ b/code/modules/admin/verbs/onlyone.dm @@ -21,10 +21,12 @@ hijack_objective.owner = H.mind H.mind.objectives += hijack_objective - H << "You are a Highlander. Kill all other Highlanders. There can be only one." + to_chat(H, "You are a Highlander. Kill all other Highlanders. There can be only one.") + var/obj_count = 1 for(var/datum/objective/OBJ in H.mind.objectives) - H << "Objective #[obj_count]: [OBJ.explanation_text]" + to_chat(H, "Objective #[obj_count]: [OBJ.explanation_text]") + obj_count++ for (var/obj/item/I in H) @@ -55,7 +57,8 @@ message_admins("[key_name_admin(usr)] used THERE CAN BE ONLY ONE! -NO ATTACK LOGS WILL BE SENT TO ADMINS FROM THIS POINT FORTH-", 1) log_admin("[key_name(usr)] used there can be only one.") nologevent = 1 - world << sound('sound/music/THUNDERDOME.ogg') + to_chat(world, sound('sound/music/THUNDERDOME.ogg')) + /client/proc/only_me() if(!ticker) @@ -73,10 +76,12 @@ hijack_objective.owner = H.mind H.mind.objectives += hijack_objective - H << "You are the multiverse summoner. Activate your blade to summon copies of yourself from another universe to fight by your side." + to_chat(H, "You are the multiverse summoner. Activate your blade to summon copies of yourself from another universe to fight by your side.") + var/obj_count = 1 for(var/datum/objective/OBJ in H.mind.objectives) - H << "Objective #[obj_count]: [OBJ.explanation_text]" + to_chat(H, "Objective #[obj_count]: [OBJ.explanation_text]") + obj_count++ var/obj/item/slot_item_ID = H.get_item_by_slot(slot_wear_id) @@ -101,4 +106,5 @@ message_admins("[key_name_admin(usr)] used THERE CAN BE ONLY ME! -NO ATTACK LOGS WILL BE SENT TO ADMINS FROM THIS POINT FORTH-", 1) log_admin("[key_name(usr)] used there can be only me.") nologevent = 1 - world << sound('sound/music/THUNDERDOME.ogg') \ No newline at end of file + to_chat(world, sound('sound/music/THUNDERDOME.ogg')) + diff --git a/code/modules/admin/verbs/onlyoneteam.dm b/code/modules/admin/verbs/onlyoneteam.dm index 016b4c891a0..cdf276d03a6 100644 --- a/code/modules/admin/verbs/onlyoneteam.dm +++ b/code/modules/admin/verbs/onlyoneteam.dm @@ -21,7 +21,8 @@ continue qdel(I) - H << "You are part of the [station_name()] dodgeball tournament. Throw dodgeballs at crewmembers wearing a different color than you. OOC: Use THROW on an EMPTY-HAND to catch thrown dodgeballs." + to_chat(H, "You are part of the [station_name()] dodgeball tournament. Throw dodgeballs at crewmembers wearing a different color than you. OOC: Use THROW on an EMPTY-HAND to catch thrown dodgeballs.") + H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(H), slot_l_ear) H.equip_to_slot_or_del(new /obj/item/weapon/beach_ball/dodgeball(H), slot_r_hand) @@ -75,13 +76,16 @@ if(H.l_hand == src) return var/mob/A = H.LAssailant if((H in team_alpha) && (A in team_alpha)) - A << "He's on your team!" + to_chat(A, "He's on your team!") + return else if((H in team_bravo) && (A in team_bravo)) - A << "He's on your team!" + to_chat(A, "He's on your team!") + return else if(!A in team_alpha && !A in team_bravo) - A << "You're not part of the dodgeball game, sorry!" + to_chat(A, "You're not part of the dodgeball game, sorry!") + return else playsound(src, 'sound/items/dodgeball.ogg', 50, 1) diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index ab132d792ec..442478229f6 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -17,7 +17,8 @@ var/list/sounds_cache = list() message_admins("[key_name_admin(src)] played sound [S]", 1) for(var/mob/M in player_list) if(M.client.prefs.sound & SOUND_MIDI) - M << uploaded_sound + to_chat(M, uploaded_sound) + feedback_add_details("admin_verb","PGS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -86,11 +87,13 @@ var/list/sounds_cache = list() for(var/mob/M in world) if(M.client) if(M.client.midis) - M << 'cubanpetetime.ogg' + to_chat(M, 'cubanpetetime.ogg') + for(var/mob/living/carbon/human/CP in world) if(CP.real_name=="Cuban Pete" && CP.key!="Rosham") - CP << "Your body can't contain the rhumba beat" + to_chat(CP, "Your body can't contain the rhumba beat") + CP.gib() @@ -102,7 +105,8 @@ var/list/sounds_cache = list() for(var/mob/M in world) if(M.client) if(M.client.midis) - M << 'bananaphone.ogg' + to_chat(M, 'bananaphone.ogg') + client/proc/space_asshole() @@ -113,7 +117,8 @@ client/proc/space_asshole() for(var/mob/M in world) if(M.client) if(M.client.midis) - M << 'sound/music/space_asshole.ogg' + to_chat(M, 'sound/music/space_asshole.ogg') + client/proc/honk_theme() @@ -124,4 +129,5 @@ client/proc/honk_theme() for(var/mob/M in world) if(M.client) if(M.client.midis) - M << 'honk_theme.ogg'*/ + to_chat(M, 'honk_theme.ogg')*/ + diff --git a/code/modules/admin/verbs/possess.dm b/code/modules/admin/verbs/possess.dm index e6c5659f63b..208a69df52e 100644 --- a/code/modules/admin/verbs/possess.dm +++ b/code/modules/admin/verbs/possess.dm @@ -4,7 +4,8 @@ if(istype(O,/obj/singularity)) if(config.forbid_singulo_possession) - usr << "It is forbidden to possess singularities." + to_chat(usr, "It is forbidden to possess singularities.") + return var/turf/T = get_turf(O) diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index 8d41f49a918..f70940e9ae8 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -7,7 +7,8 @@ if(usr.client) if(usr.client.prefs.muted & MUTE_PRAY) - usr << "\red You cannot pray (muted)." + to_chat(usr, "\red You cannot pray (muted).") + return if(src.client.handle_spam_prevention(msg,MUTE_PRAY)) return @@ -17,9 +18,11 @@ for(var/client/X in admins) if(check_rights(R_EVENT,0,X.mob)) - X << msg + to_chat(X, msg) + + + to_chat(usr, "Your prayers have been received by the gods.") - usr << "Your prayers have been received by the gods." feedback_add_details("admin_verb","PR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //log_admin("HELP: [key_name(src)]: [msg]") @@ -30,7 +33,8 @@ for(var/client/X in admins) if(R_EVENT & X.holder.rights) - X << msg + to_chat(X, msg) + /proc/Syndicate_announce(var/text , var/mob/Sender) var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN)) @@ -38,7 +42,8 @@ for(var/client/X in admins) if(check_rights(R_EVENT,0,X.mob)) - X << msg + to_chat(X, msg) + /proc/HONK_announce(var/text , var/mob/Sender) var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN)) @@ -46,7 +51,8 @@ for(var/client/X in admins) if(R_EVENT & X.holder.rights) - X << msg + to_chat(X, msg) + /proc/ERT_Announce(var/text , var/mob/Sender) var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN)) @@ -54,15 +60,15 @@ for(var/client/X in admins) if(check_rights(R_EVENT,0,X.mob)) - X << msg - + to_chat(X, msg) + + /proc/Nuke_request(text , mob/Sender) var/nuke_code = get_nuke_code() var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN)) msg = "NUKE CODE REQUEST: [key_name(Sender)] (PP) (VV) (SM) ([admin_jump_link(Sender, "holder")]) (CA) (BSA) (RPLY): [msg]" - + for(var/client/X in admins) if(check_rights(R_EVENT,0,X.mob)) - X << msg - X << "The nuke code is [nuke_code]." - \ No newline at end of file + to_chat(X, msg) + to_chat(X, "The nuke code is [nuke_code].") diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 970ebfee0ef..71afd3eeb0b 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -39,7 +39,8 @@ prisoner.equip_to_slot_or_del(new /obj/item/clothing/under/color/orange(prisoner), slot_w_uniform) prisoner.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(prisoner), slot_shoes) spawn(50) - M << "\red You have been sent to the prison station!" + to_chat(M, "\red You have been sent to the prison station!") + log_admin("[key_name(usr)] sent [key_name(M)] to the prison station.") message_admins("\blue [key_name_admin(usr)] sent [key_name_admin(M)] to the prison station.", 1) feedback_add_details("admin_verb","PRISON") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -61,7 +62,8 @@ if(usr) if (usr.client) if(usr.client.holder) - M << "\bold You hear a voice in your head... \italic [msg]" + to_chat(M, "\bold You hear a voice in your head... \italic [msg]") + log_admin("SubtlePM: [key_name(usr)] -> [key_name(M)] : [msg]") message_admins("\blue \bold SubtleMessage: [key_name_admin(usr)] -> [key_name_admin(M)] : [msg]", 1) @@ -91,12 +93,14 @@ msg += "[key_name_admin(C)]: account is [C.player_age] days old
      " if(missing_ages) - src << "Some accounts did not have proper ages set in their clients. This function requires database to be present" + to_chat(src, "Some accounts did not have proper ages set in their clients. This function requires database to be present") + if(msg != "") src << browse(msg, "window=Player_age_check") else - src << "No matches for that age range found." + to_chat(src, "No matches for that age range found.") + /client/proc/cmd_admin_world_narrate() // Allows administrators to fluff events a little easier -- TLE @@ -110,7 +114,8 @@ if (!msg) return - world << "[msg]" + to_chat(world, "[msg]") + log_admin("GlobalNarrate: [key_name(usr)] : [msg]") message_admins("\blue \bold GlobalNarrate: [key_name_admin(usr)]: [msg]
      ", 1) feedback_add_details("admin_verb","GLN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -133,7 +138,8 @@ if( !msg ) return - M << msg + to_chat(M, msg) + log_admin("DirectNarrate: [key_name(usr)] to ([key_name(M)]): [msg]") message_admins("\blue \bold DirectNarrate: [key_name_admin(usr)] to ([key_name_admin(M)]): [msg]
      ", 1) feedback_add_details("admin_verb","DIRN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -146,7 +152,8 @@ return M.status_flags ^= GODMODE - usr << "\blue Toggled [(M.status_flags & GODMODE) ? "ON" : "OFF"]" + to_chat(usr, "\blue Toggled [(M.status_flags & GODMODE) ? "ON" : "OFF"]") + log_admin("[key_name(usr)] has toggled [key_name(M)]'s nodamage to [(M.status_flags & GODMODE) ? "On" : "Off"]") message_admins("[key_name_admin(usr)] has toggled [key_name_admin(M)]'s nodamage to [(M.status_flags & GODMODE) ? "On" : "Off"]", 1) @@ -161,10 +168,12 @@ proc/cmd_admin_mute(mob/M as mob, mute_type, automute = 0) if(!usr || !usr.client) return if(!check_rights(R_ADMIN|R_MOD)) - usr << "Error: cmd_admin_mute: You don't have permission to do this." + to_chat(usr, "Error: cmd_admin_mute: You don't have permission to do this.") + return if(!M.client) - usr << "Error: cmd_admin_mute: This mob doesn't have a client tied to it." + to_chat(usr, "Error: cmd_admin_mute: This mob doesn't have a client tied to it.") + if(!M.client) return @@ -185,7 +194,8 @@ proc/cmd_admin_mute(mob/M as mob, mute_type, automute = 0) M.client.prefs.muted |= mute_type log_admin("SPAM AUTOMUTE: [muteunmute] [key_name(M)] from [mute_string]") message_admins("SPAM AUTOMUTE: [muteunmute] [key_name_admin(M)] from [mute_string].", 1) - M << "You have been [muteunmute] from [mute_string] by the SPAM AUTOMUTE system. Contact an admin." + to_chat(M, "You have been [muteunmute] from [mute_string] by the SPAM AUTOMUTE system. Contact an admin.") + feedback_add_details("admin_verb","AUTOMUTE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return @@ -198,7 +208,8 @@ proc/cmd_admin_mute(mob/M as mob, mute_type, automute = 0) log_admin("[key_name(usr)] has [muteunmute] [key_name(M)] from [mute_string]") message_admins("[key_name_admin(usr)] has [muteunmute] [key_name_admin(M)] from [mute_string].", 1) - M << "You have been [muteunmute] from [mute_string]." + to_chat(M, "You have been [muteunmute] from [mute_string].") + feedback_add_details("admin_verb","MUTE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_add_random_ai_law() @@ -235,18 +246,23 @@ proc/cmd_admin_mute(mob/M as mob, mute_type, automute = 0) if(g.antagHUD) g.antagHUD = 0 // Disable it on those that have it enabled g.has_enabled_antagHUD = 2 // We'll allow them to respawn - g << "\red The Administrator has disabled AntagHUD " + to_chat(g, "\red The Administrator has disabled AntagHUD ") + config.antag_hud_allowed = 0 - src << "\red AntagHUD usage has been disabled" + to_chat(src, "\red AntagHUD usage has been disabled") + action = "disabled" else for(var/mob/dead/observer/g in get_ghosts()) if(!g.client.holder) // Add the verb back for all non-admin ghosts g.verbs += /mob/dead/observer/verb/toggle_antagHUD - g << "\blue The Administrator has enabled AntagHUD " // Notify all observers they can now use AntagHUD + to_chat(g, "\blue The Administrator has enabled AntagHUD ")// Notify all observers they can now use AntagHUD + + config.antag_hud_allowed = 1 action = "enabled" - src << "\blue AntagHUD usage has been enabled" + to_chat(src, "\blue AntagHUD usage has been enabled") + log_admin("[key_name(usr)] has [action] antagHUD usage for observers") @@ -263,19 +279,24 @@ proc/cmd_admin_mute(mob/M as mob, mute_type, automute = 0) var/action="" if(config.antag_hud_restricted) for(var/mob/dead/observer/g in get_ghosts()) - g << "\blue The administrator has lifted restrictions on joining the round if you use AntagHUD" + to_chat(g, "\blue The administrator has lifted restrictions on joining the round if you use AntagHUD") + action = "lifted restrictions" config.antag_hud_restricted = 0 - src << "\blue AntagHUD restrictions have been lifted" + to_chat(src, "\blue AntagHUD restrictions have been lifted") + else for(var/mob/dead/observer/g in get_ghosts()) - g << "\red The administrator has placed restrictions on joining the round if you use AntagHUD" - g << "\red Your AntagHUD has been disabled, you may choose to re-enabled it but will be under restrictions " + to_chat(g, "\red The administrator has placed restrictions on joining the round if you use AntagHUD") + + to_chat(g, "\red Your AntagHUD has been disabled, you may choose to re-enabled it but will be under restrictions ") + g.antagHUD = 0 g.has_enabled_antagHUD = 0 action = "placed restrictions" config.antag_hud_restricted = 1 - src << "\red AntagHUD restrictions have been enabled" + to_chat(src, "\red AntagHUD restrictions have been enabled") + log_admin("[key_name(usr)] has [action] on joining the round if they use AntagHUD") message_admins("Admin [key_name_admin(usr)] has [action] on joining the round if they use AntagHUD", 1) @@ -304,7 +325,8 @@ Traitors and the like can also be revived with the previous role mostly intact. break if(!G_found)//If a ghost was not found. - usr << "There is no active key like that in the game or the person is not currently a ghost." + to_chat(usr, "There is no active key like that in the game or the person is not currently a ghost.") + return if(G_found.mind && !G_found.mind.active) //mind isn't currently in use by someone/something @@ -328,7 +350,8 @@ Traitors and the like can also be revived with the previous role mostly intact. //Now to give them their mind back. G_found.mind.transfer_to(new_xeno) //be careful when doing stuff like this! I've already checked the mind isn't in use new_xeno.key = G_found.key - new_xeno << "You have been fully respawned. Enjoy the game." + to_chat(new_xeno, "You have been fully respawned. Enjoy the game.") + message_admins("\blue [key_name_admin(usr)] has respawned [new_xeno.key] as a filthy xeno.", 1) return //all done. The ghost is auto-deleted @@ -433,7 +456,8 @@ Traitors and the like can also be revived with the previous role mostly intact. message_admins("\blue [key_name_admin(usr)] has respawned [key_name_admin(G_found)] as [new_character.real_name].", 1) - new_character << "You have been fully respawned. Enjoy the game." + to_chat(new_character, "You have been fully respawned. Enjoy the game.") + feedback_add_details("admin_verb","RSPCH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return new_character @@ -452,7 +476,8 @@ Traitors and the like can also be revived with the previous role mostly intact. if(candidates.len) ckey = input("Pick the player you want to respawn as a xeno.", "Suitable Candidates") as null|anything in candidates else - usr << "Error: create_xeno(): no suitable candidates." + to_chat(usr, "Error: create_xeno(): no suitable candidates.") + if(!istext(ckey)) return 0 var/alien_caste = input(usr, "Please choose which caste to spawn.","Pick a caste",null) as null|anything in list("Queen","Hunter","Sentinel","Drone","Larva") @@ -484,7 +509,8 @@ Traitors and the like can also be revived with the previous role mostly intact. any = 1 //if no ghosts show up, any will just be 0 if(!any) if(notify) - src << "There doesn't appear to be any ghosts for you to select." + to_chat(src, "There doesn't appear to be any ghosts for you to select.") + return for(var/mob/M in mobs) @@ -558,7 +584,8 @@ Traitors and the like can also be revived with the previous role mostly intact. if("Yes") communications_announcement.Announce(input, customname, , , , from); if("No") - world << "\red [from] available at all communications consoles." + to_chat(world, "\red [from] available at all communications consoles.") + for (var/obj/machinery/computer/communications/C in machines) if(! (C.stat & (BROKEN|NOPOWER) ) ) @@ -578,7 +605,8 @@ Traitors and the like can also be revived with the previous role mostly intact. if("Yes") command_announcement.Announce(input, customname); if("No") - world << "\red New Nanotrasen Update available at all communication consoles." + to_chat(world, "\red New Nanotrasen Update available at all communication consoles.") + for (var/obj/machinery/computer/communications/C in machines) if(! (C.stat & (BROKEN|NOPOWER) ) ) @@ -589,7 +617,8 @@ Traitors and the like can also be revived with the previous role mostly intact. C.messagetitle.Add("[command_name()] Update") C.messagetext.Add(P.info) - //world << sound('sound/AI/commandreport.ogg') +// to_chat(world, sound('sound/AI/commandreport.ogg')) + log_admin("[key_name(src)] has created a communications report: [input]") message_admins("[key_name_admin(src)] has created a communications report", 1) feedback_add_details("admin_verb","CCR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -621,7 +650,8 @@ Traitors and the like can also be revived with the previous role mostly intact. if(job_master) for(var/datum/job/job in job_master.occupations) - src << "[job.title]: [job.total_positions]" + to_chat(src, "[job.title]: [job.total_positions]") + feedback_add_details("admin_verb","LFS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_explosion(atom/O as obj|mob|turf in view()) @@ -727,7 +757,8 @@ Traitors and the like can also be revived with the previous role mostly intact. var/list/L = M.get_contents() for(var/t in L) - usr << "[t]" + to_chat(usr, "[t]") + feedback_add_details("admin_verb","CC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/toggle_view_range() @@ -809,9 +840,11 @@ Traitors and the like can also be revived with the previous role mostly intact. if(!check_rights(R_ADMIN)) return - usr << text("\red Attack Log for []", mob) + to_chat(usr, text("\red Attack Log for []", mob)) + for(var/t in M.attack_log) - usr << t + to_chat(usr, t) + feedback_add_details("admin_verb","ATTL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -824,13 +857,15 @@ Traitors and the like can also be revived with the previous role mostly intact. return if (ticker && ticker.mode) - usr << "Nope you can't do this, the game's already started. This only works before rounds!" + to_chat(usr, "Nope you can't do this, the game's already started. This only works before rounds!") + return if(ticker.random_players) ticker.random_players = 0 message_admins("Admin [key_name_admin(usr)] has disabled \"Everyone is Special\" mode.", 1) - usr << "Disabled." + to_chat(usr, "Disabled.") + return @@ -842,9 +877,11 @@ Traitors and the like can also be revived with the previous role mostly intact. message_admins("Admin [key_name_admin(usr)] has forced the players to have random appearances.", 1) if(notifyplayers == "Yes") - world << "\blue Admin [usr.key] has forced the players to have completely random identities!" + to_chat(world, "\blue Admin [usr.key] has forced the players to have completely random identities!") + + + to_chat(usr, "Remember: you can always disable the randomness by using the verb again, assuming the round hasn't started yet.") - usr << "Remember: you can always disable the randomness by using the verb again, assuming the round hasn't started yet." ticker.random_players = 1 feedback_add_details("admin_verb","MER") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -859,11 +896,13 @@ Traitors and the like can also be revived with the previous role mostly intact. if(!config.allow_random_events) config.allow_random_events = 1 - usr << "Random events enabled" + to_chat(usr, "Random events enabled") + message_admins("Admin [key_name_admin(usr)] has enabled random events.", 1) else config.allow_random_events = 0 - usr << "Random events disabled" + to_chat(usr, "Random events disabled") + message_admins("Admin [key_name_admin(usr)] has disabled random events.", 1) feedback_add_details("admin_verb","TRE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -877,12 +916,14 @@ Traitors and the like can also be revived with the previous role mostly intact. if(ticker.mode.ert_disabled) ticker.mode.ert_disabled = 0 - usr << "\blue ERT has been Enabled." + to_chat(usr, "\blue ERT has been Enabled.") + log_admin("Admin [key_name(src)] has enabled ERT calling.") message_admins("Admin [key_name_admin(usr)] has enabled ERT calling.", 1) else ticker.mode.ert_disabled = 1 - usr << "\red ERT has been Disabled." + to_chat(usr, "\red ERT has been Disabled.") + log_admin("Admin [key_name(src)] has disabled ERT calling.") message_admins("Admin [key_name_admin(usr)] has disabled ERT calling.", 1) diff --git a/code/modules/admin/verbs/striketeam.dm b/code/modules/admin/verbs/striketeam.dm index b06df8ddf02..ed201afbc1c 100644 --- a/code/modules/admin/verbs/striketeam.dm +++ b/code/modules/admin/verbs/striketeam.dm @@ -5,10 +5,12 @@ var/global/sent_strike_team = 0 /client/proc/strike_team() if(!ticker) - usr << "The game hasn't started yet!" + to_chat(usr, "The game hasn't started yet!") + return if(sent_strike_team == 1) - usr << "CentComm is already sending a team." + to_chat(usr, "CentComm is already sending a team.") + return if(alert("Do you want to send in the CentComm death squad? Once enabled, this is irreversible.",,"Yes","No")!="Yes") return @@ -22,7 +24,8 @@ var/global/sent_strike_team = 0 return if(sent_strike_team) - usr << "Looks like someone beat you to it." + to_chat(usr, "Looks like someone beat you to it.") + return sent_strike_team = 1 @@ -71,7 +74,8 @@ var/global/sent_strike_team = 0 new_commando.mind.store_memory("Nuke Code: \red [nuke_code].") new_commando.mind.store_memory("Mission: \red [input].") - new_commando << "\blue You are a Special Ops. [!leader_selected?"commando":"LEADER"] in the service of Central Command. Check the table ahead for detailed instructions.\nYour current mission is: \red[input]" + to_chat(new_commando, "\blue You are a Special Ops. [!leader_selected?"commando":"LEADER"] in the service of Central Command. Check the table ahead for detailed instructions.\nYour current mission is: \red[input]") + commando_number-- diff --git a/code/modules/admin/verbs/striketeam_syndicate.dm b/code/modules/admin/verbs/striketeam_syndicate.dm index d609b5f8ac7..fec7441299c 100644 --- a/code/modules/admin/verbs/striketeam_syndicate.dm +++ b/code/modules/admin/verbs/striketeam_syndicate.dm @@ -7,7 +7,8 @@ var/global/sent_syndicate_strike_team = 0 set name = "Spawn Syndicate Strike Team" set desc = "Spawns a squad of commandos in the Syndicate Mothership if you want to run an admin event." if(!src.holder) - src << "Only administrators may use this command." + to_chat(src, "Only administrators may use this command.") + return if(!ticker) alert("The game hasn't started yet!") @@ -27,7 +28,8 @@ var/global/sent_syndicate_strike_team = 0 return if(sent_syndicate_strike_team) - src << "Looks like someone beat you to it." + to_chat(src, "Looks like someone beat you to it.") + return sent_syndicate_strike_team = 1 @@ -78,7 +80,8 @@ var/global/sent_syndicate_strike_team = 0 new_syndicate_commando.mind.store_memory("Nuke Code: \red [nuke_code].") new_syndicate_commando.mind.store_memory("Mission: \red [input].") - new_syndicate_commando << "\blue You are an Elite Syndicate. [!syndicate_leader_selected?"commando":"LEADER"] in the service of the Syndicate. \nYour current mission is: \red[input]" + to_chat(new_syndicate_commando, "\blue You are an Elite Syndicate. [!syndicate_leader_selected?"commando":"LEADER"] in the service of the Syndicate. \nYour current mission is: \red[input]") + syndicate_commando_number-- diff --git a/code/modules/admin/verbs/ticklag.dm b/code/modules/admin/verbs/ticklag.dm index defe8f7d846..aec66031cc4 100644 --- a/code/modules/admin/verbs/ticklag.dm +++ b/code/modules/admin/verbs/ticklag.dm @@ -19,6 +19,7 @@ if("Yes") config.Tickcomp = 1 else config.Tickcomp = 0 else - src << "\red Error: ticklag(): Invalid world.ticklag value. No changes made." + to_chat(src, "\red Error: ticklag(): Invalid world.ticklag value. No changes made.") + diff --git a/code/modules/admin/verbs/tripAI.dm b/code/modules/admin/verbs/tripAI.dm index 35219c4c1c8..358dbb46ce0 100644 --- a/code/modules/admin/verbs/tripAI.dm +++ b/code/modules/admin/verbs/tripAI.dm @@ -3,20 +3,24 @@ set name = "Create AI Triumvirate" if(ticker.current_state > GAME_STATE_PREGAME) - usr << "This option is currently only usable during pregame. This may change at a later date." + to_chat(usr, "This option is currently only usable during pregame. This may change at a later date.") + return if(job_master && ticker) var/datum/job/job = job_master.GetJob("AI") if(!job) - usr << "Unable to locate the AI job" + to_chat(usr, "Unable to locate the AI job") + return if(ticker.triai) ticker.triai = 0 - usr << "Only one AI will be spawned at round start." + to_chat(usr, "Only one AI will be spawned at round start.") + message_admins("\blue [key_name_admin(usr)] has toggled off triple AIs at round start.", 1) else ticker.triai = 1 - usr << "There will be an AI Triumvirate at round start." + to_chat(usr, "There will be an AI Triumvirate at round start.") + message_admins("\blue [key_name_admin(usr)] has toggled on triple AIs at round start.", 1) return diff --git a/code/modules/admin/watchlist.dm b/code/modules/admin/watchlist.dm index e6332dad786..a3368f060ea 100644 --- a/code/modules/admin/watchlist.dm +++ b/code/modules/admin/watchlist.dm @@ -12,13 +12,15 @@ log_game("SQL ERROR obtaining ckey from player table. Error : \[[err]\]\n") return if(!query_watchfind.NextRow()) - usr << "[new_ckey] has not been seen before, you can only add known players." + to_chat(usr, "[new_ckey] has not been seen before, you can only add known players.") + return else target_ckey = new_ckey var/target_sql_ckey = sanitizeSQL(target_ckey) if(check_watchlist(target_sql_ckey)) - usr << "[target_sql_ckey] is already on the watchlist." + to_chat(usr, "[target_sql_ckey] is already on the watchlist.") + return var/reason = input(usr,"Please state the reason","Reason") as message|null if(!reason) diff --git a/code/modules/arcade/arcade_base.dm b/code/modules/arcade/arcade_base.dm index da83338b5f3..8922f7ce787 100644 --- a/code/modules/arcade/arcade_base.dm +++ b/code/modules/arcade/arcade_base.dm @@ -23,16 +23,21 @@ /obj/machinery/arcade/examine(mob/user) ..(user) if(freeplay) - user << "Someone enabled freeplay on this machine!" + to_chat(user, "Someone enabled freeplay on this machine!") + else if(token_price) - user << "\The [src.name] costs [token_price] credits per play." + to_chat(user, "\The [src.name] costs [token_price] credits per play.") + if(!tokens) - user << "\The [src.name] has no available play credits. Better feed the machine!" + to_chat(user, "\The [src.name] has no available play credits. Better feed the machine!") + else if(tokens == 1) - user << "\The [src.name] has only 1 play credit left!" + to_chat(user, "\The [src.name] has only 1 play credit left!") + else - user << "\The [src.name] has [tokens] play credits!" + to_chat(user, "\The [src.name] has [tokens] play credits!") + /obj/machinery/arcade/attack_hand(mob/user as mob) if(..()) @@ -47,7 +52,8 @@ if(stat & BROKEN || panel_open) return if(!tokens && !freeplay) - user << "\The [src.name] doesn't have enough credits to play! Pay first!" + to_chat(user, "\The [src.name] doesn't have enough credits to play! Pay first!") + return if(!in_use && (tokens || freeplay)) in_use = 1 @@ -55,14 +61,16 @@ return if(in_use) if(src != user.machine) - user << "Someone else is already playing this machine, please wait your turn!" + to_chat(user, "Someone else is already playing this machine, please wait your turn!") + return /obj/machinery/arcade/attackby(var/obj/item/O as obj, var/mob/user as mob, params) if(istype(O, /obj/item/weapon/screwdriver) && anchored) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) panel_open = !panel_open - user << "You [panel_open ? "open" : "close"] the maintenance panel." + to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.") + update_icon() return if(!freeplay) @@ -84,7 +92,8 @@ /obj/machinery/arcade/proc/pay_with_cash(var/obj/item/weapon/spacecash/cashmoney, var/mob/user) if(cashmoney.get_total() < token_price) - user << "\icon[cashmoney] That is not enough money." + to_chat(user, "\icon[cashmoney] That is not enough money.") + return 0 visible_message("[usr] inserts a credit chip into [src].") var/left = cashmoney.get_total() - token_price @@ -98,11 +107,13 @@ visible_message("[usr] swipes a card through [src].") var/datum/money_account/customer_account = attempt_account_access_nosec(I.associated_account_number) if (!customer_account) - user <<"Error: Unable to access account. Please contact technical support if problem persists." + to_chat(user, "Error: Unable to access account. Please contact technical support if problem persists.") + return 0 if(customer_account.suspended) - user << "Unable to access account: account suspended." + to_chat(user, "Unable to access account: account suspended.") + return 0 // Have the customer punch in the PIN before checking if there's enough money. Prevents people from figuring out acct is @@ -112,11 +123,13 @@ customer_account = attempt_account_access(I.associated_account_number, attempt_pin, 2) if(!customer_account) - user << "Unable to access account: incorrect credentials." + to_chat(user, "Unable to access account: incorrect credentials.") + return 0 if(token_price > customer_account.money) - user << "Insufficient funds in account." + to_chat(user, "Insufficient funds in account.") + return 0 else // Okay to move the money at this point diff --git a/code/modules/arcade/prize_counter.dm b/code/modules/arcade/prize_counter.dm index 9c3dfe875fe..0b789f02b46 100644 --- a/code/modules/arcade/prize_counter.dm +++ b/code/modules/arcade/prize_counter.dm @@ -38,12 +38,14 @@ tickets += T.amount qdel(T) else - user << "\The [T] seems stuck to your hand!" + to_chat(user, "\The [T] seems stuck to your hand!") + return if(istype(O, /obj/item/weapon/screwdriver) && anchored) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) panel_open = !panel_open - user << "You [panel_open ? "open" : "close"] the maintenance panel." + to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.") + update_icon() return if(panel_open) @@ -179,9 +181,11 @@ td.cost.toomuch { updateUsrDialog() return if(!global_prizes.PlaceOrder(src, itemID)) - usr << "Unable to complete the exchange." + to_chat(usr, "Unable to complete the exchange.") + else - usr << "You've successfully purchased the item." + to_chat(usr, "You've successfully purchased the item.") + interact(usr) return diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm index 485c8756375..a7a688a9d50 100644 --- a/code/modules/assembly/assembly.dm +++ b/code/modules/assembly/assembly.dm @@ -114,7 +114,8 @@ attach_assembly(var/obj/item/device/assembly/A, var/mob/user) holder = new/obj/item/device/assembly_holder(get_turf(src)) if(holder.attach(A,src,user)) - user << "\blue You attach \the [A] to \the [src]!" + to_chat(user, "\blue You attach \the [A] to \the [src]!") + return 1 return 0 @@ -127,9 +128,11 @@ return if(istype(W, /obj/item/weapon/screwdriver)) if(toggle_secure()) - user << "\blue \The [src] is ready!" + to_chat(user, "\blue \The [src] is ready!") + else - user << "\blue \The [src] can now be attached!" + to_chat(user, "\blue \The [src] can now be attached!") + return ..() return @@ -144,9 +147,11 @@ ..(user) if((in_range(src, user) || loc == user)) if(secured) - user << "\The [src] is ready!" + to_chat(user, "\The [src] is ready!") + else - user << "\The [src] can be attached!" + to_chat(user, "\The [src] can be attached!") + attack_self(mob/user as mob) diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm index dbda18e7b71..50f39995fe0 100644 --- a/code/modules/assembly/bomb.dm +++ b/code/modules/assembly/bomb.dm @@ -29,7 +29,8 @@ return if(istype(W, /obj/item/weapon/wrench) && !status) //This is basically bomb assembly code inverted. apparently it works. - user << "You disassemble [src]." + to_chat(user, "You disassemble [src].") + bombassembly.loc = user.loc bombassembly.master = null @@ -46,11 +47,13 @@ status = 1 bombers += "[key_name(user)] welded a single tank bomb. Temperature: [bombtank.air_contents.temperature-T0C]" msg_admin_attack("[key_name_admin(user)] welded a single tank bomb. Temperature: [bombtank.air_contents.temperature-T0C]") - user << "A pressure hole has been bored to [bombtank] valve. \The [bombtank] can now be ignited." + to_chat(user, "A pressure hole has been bored to [bombtank] valve. \The [bombtank] can now be ignited.") + else status = 0 bombers += "[key_name(user)] unwelded a single tank bomb. Temperature: [bombtank.air_contents.temperature-T0C]" - user << "The hole has been closed." + to_chat(user, "The hole has been closed.") + add_fingerprint(user) ..() diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index 1d48afde8a5..bc718f8cbfc 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -70,9 +70,11 @@ ..(user) if ((in_range(src, user) || src.loc == user)) if (src.secured) - user << "\The [src] is ready!" + to_chat(user, "\The [src] is ready!") + else - user << "\The [src] can be attached!" + to_chat(user, "\The [src] can be attached!") + HasProximity(atom/movable/AM as mob|obj) @@ -140,15 +142,18 @@ attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(istype(W, /obj/item/weapon/screwdriver)) if(!a_left || !a_right) - user << "\red BUG:Assembly part missing, please report this!" + to_chat(user, "\red BUG:Assembly part missing, please report this!") + return a_left.toggle_secure() a_right.toggle_secure() secured = !secured if(secured) - user << "\blue \The [src] is ready!" + to_chat(user, "\blue \The [src] is ready!") + else - user << "\blue \The [src] can now be taken apart!" + to_chat(user, "\blue \The [src] can now be taken apart!") + update_icon() return else @@ -160,7 +165,8 @@ src.add_fingerprint(user) if(src.secured) if(!a_left || !a_right) - user << "\red Assembly part missing!" + to_chat(user, "\red Assembly part missing!") + return if(istype(a_left,a_right.type))//If they are the same type it causes issues due to window code switch(alert("Which side would you like to use?",,"Left","Right")) diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index 75c40dcb8b0..8d169b1dac5 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -11,7 +11,8 @@ examine(mob/user) ..(user) if(armed) - user << "It looks like it's armed." + to_chat(user, "It looks like it's armed.") + activate() if(..()) @@ -20,7 +21,8 @@ if(ishuman(usr)) var/mob/living/carbon/human/user = usr if(((user.getBrainLoss() >= 60 || (CLUMSY in user.mutations)) && prob(50))) - user << "Your hand slips, setting off the trigger." + to_chat(user, "Your hand slips, setting off the trigger.") + pulse(0) update_icon() if(usr) @@ -68,7 +70,8 @@ attack_self(mob/living/user as mob) if(!armed) - user << "You arm [src]." + to_chat(user, "You arm [src].") + else if(((user.getBrainLoss() >= 60 || (CLUMSY in user.mutations)) && prob(50))) var/which_hand = "l_hand" @@ -78,7 +81,8 @@ user.visible_message("[user] accidentally sets off [src], breaking their fingers.", \ "You accidentally trigger [src]!") return - user << "You disarm [src]." + to_chat(user, "You disarm [src].") + armed = !armed update_icon() playsound(user.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3) @@ -142,4 +146,5 @@ return layer = TURF_LAYER+0.2 - usr << "You hide [src]." \ No newline at end of file + to_chat(usr, "You hide [src].") + diff --git a/code/modules/assembly/shock_kit.dm b/code/modules/assembly/shock_kit.dm index d34dc9e4c76..9d661d7f2f3 100644 --- a/code/modules/assembly/shock_kit.dm +++ b/code/modules/assembly/shock_kit.dm @@ -31,7 +31,8 @@ return if(istype(W, /obj/item/weapon/screwdriver)) status = !status - user << "[src] is now [status ? "secured" : "unsecured"]!" + to_chat(user, "[src] is now [status ? "secured" : "unsecured"]!") + add_fingerprint(user) return diff --git a/code/modules/atmos_automation/implementation/digital_valves.dm b/code/modules/atmos_automation/implementation/digital_valves.dm index d9121aa3f34..e79d27ab88e 100644 --- a/code/modules/atmos_automation/implementation/digital_valves.dm +++ b/code/modules/atmos_automation/implementation/digital_valves.dm @@ -37,7 +37,8 @@ if(!isnull(V.id_tag) && V.frequency == parent.frequency) valves|=V.id_tag if(valves.len==0) - usr << "Unable to find any digital valves on this frequency." + to_chat(usr, "Unable to find any digital valves on this frequency.") + return valve = input("Select a valve:", "Sensor Data", valve) as null|anything in valves parent.updateUsrDialog() diff --git a/code/modules/atmos_automation/implementation/emitters.dm b/code/modules/atmos_automation/implementation/emitters.dm index 0e0dc2720cf..91f8398acc0 100644 --- a/code/modules/atmos_automation/implementation/emitters.dm +++ b/code/modules/atmos_automation/implementation/emitters.dm @@ -35,7 +35,8 @@ if(!isnull(E.id_tag) && E.frequency == parent.frequency) emitters|=E.id_tag if(emitters.len==0) - usr << "Unable to find any emitters on this frequency." + to_chat(usr, "Unable to find any emitters on this frequency.") + return emitter = input("Select an emitter:", "Emitter", emitter) as null|anything in emitters parent.updateUsrDialog() diff --git a/code/modules/atmos_automation/implementation/vent_pump.dm b/code/modules/atmos_automation/implementation/vent_pump.dm index ff1c2cbdc44..6a6f3ca6d9b 100644 --- a/code/modules/atmos_automation/implementation/vent_pump.dm +++ b/code/modules/atmos_automation/implementation/vent_pump.dm @@ -46,7 +46,8 @@ injector_names |= I.id_tag else for(var/obj/machinery/atmospherics/binary/dp_vent_pump/I in world) - //world << "test" +// to_chat(world, "test") + if(!isnull(I.id_tag) && I.frequency == parent.frequency) injector_names |= I.id_tag diff --git a/code/modules/awaymissions/bluespaceartillery.dm b/code/modules/awaymissions/bluespaceartillery.dm index 39dd9180ea0..3baf9764d6a 100644 --- a/code/modules/awaymissions/bluespaceartillery.dm +++ b/code/modules/awaymissions/bluespaceartillery.dm @@ -11,7 +11,8 @@ light_color = LIGHT_COLOR_LIGHTBLUE /obj/machinery/computer/artillerycontrol/attack_ai(user as mob) - user << "Access denied." + to_chat(user, "Access denied.") + return /obj/machinery/computer/artillerycontrol/attack_hand(user as mob) diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm index cc4ddb95856..cba145b8075 100644 --- a/code/modules/awaymissions/gateway.dm +++ b/code/modules/awaymissions/gateway.dm @@ -97,10 +97,12 @@ obj/machinery/gateway/centerstation/process() if(!awaygate) awaygate = locate(/obj/machinery/gateway/centeraway) in world if(!awaygate) - user << "Error: No destination found." + to_chat(user, "Error: No destination found.") + return if(world.time < wait) - user << "Error: Warpspace triangulation in progress. Estimated time to completion: [round(((wait - world.time) / 10) / 60)] minutes." + to_chat(user, "Error: Warpspace triangulation in progress. Estimated time to completion: [round(((wait - world.time) / 10) / 60)] minutes.") + return for(var/obj/machinery/gateway/G in linked) @@ -149,7 +151,8 @@ obj/machinery/gateway/centerstation/process() /obj/machinery/gateway/centerstation/attackby(obj/item/device/W as obj, mob/user as mob, params) if(istype(W,/obj/item/device/multitool)) - user << "\black The gate is already calibrated, there is no work for you to do here." + to_chat(user, "\black The gate is already calibrated, there is no work for you to do here.") + return /////////////////////////////////////Away//////////////////////// @@ -204,7 +207,8 @@ obj/machinery/gateway/centerstation/process() if(!stationgate) stationgate = locate(/obj/machinery/gateway/centerstation) in world if(!stationgate) - user << "Error: No destination found." + to_chat(user, "Error: No destination found.") + return for(var/obj/machinery/gateway/G in linked) @@ -246,16 +250,19 @@ obj/machinery/gateway/centerstation/process() /obj/machinery/gateway/centeraway/proc/exilecheck(var/mob/living/carbon/M) for(var/obj/item/weapon/implant/exile/E in M)//Checking that there is an exile implant in the contents if(E.imp_in == M)//Checking that it's actually implanted vs just in their pocket - M << "The station gate has detected your exile implant and is blocking your entry." + to_chat(M, "The station gate has detected your exile implant and is blocking your entry.") + return 1 return 0 /obj/machinery/gateway/centeraway/attackby(obj/item/device/W as obj, mob/user as mob, params) if(istype(W,/obj/item/device/multitool)) if(calibrated) - user << "The gate is already calibrated, there is no work for you to do here." + to_chat(user, "The gate is already calibrated, there is no work for you to do here.") + return else - user << "Recalibration successful!: This gate's systems have been fine tuned. Travel to this gate will now be on target." + to_chat(user, "Recalibration successful!: This gate's systems have been fine tuned. Travel to this gate will now be on target.") + calibrated = 1 return diff --git a/code/modules/awaymissions/maploader/writer.dm b/code/modules/awaymissions/maploader/writer.dm index 81c6a396033..212ef92c972 100644 --- a/code/modules/awaymissions/maploader/writer.dm +++ b/code/modules/awaymissions/maploader/writer.dm @@ -36,7 +36,8 @@ dmm_suite{ fdel("[map_name].dmm") } var/saved_map = file("[map_name].dmm") - saved_map << file_text + to_chat(saved_map, file_text) + return saved_map } write_map(var/turf/t1 as turf, var/turf/t2 as turf, var/flags as num){ diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm index 577304c7e38..d4d60b53574 100644 --- a/code/modules/awaymissions/mission_code/wildwest.dm +++ b/code/modules/awaymissions/mission_code/wildwest.dm @@ -55,18 +55,22 @@ usr.set_machine(src) if(chargesa <= 0) - user << "The Wish Granter lies silent." + to_chat(user, "The Wish Granter lies silent.") + return else if(!istype(user, /mob/living/carbon/human)) - user << "You feel a dark stirring inside of the Wish Granter, something you want nothing of. Your instincts are better than any man's." + to_chat(user, "You feel a dark stirring inside of the Wish Granter, something you want nothing of. Your instincts are better than any man's.") + return else if(is_special_character(user)) - user << "Even to a heart as dark as yours, you know nothing good will come of this. Something instinctual makes you pull away." + to_chat(user, "Even to a heart as dark as yours, you know nothing good will come of this. Something instinctual makes you pull away.") + else if (!insistinga) - user << "Your first touch makes the Wish Granter stir, listening to you. Are you really sure you want to do this?" + to_chat(user, "Your first touch makes the Wish Granter stir, listening to you. Are you really sure you want to do this?") + insistinga++ else @@ -75,71 +79,99 @@ var/wish = input("You want...","Wish") as null|anything in list("Power","Wealth","Immortality","To Kill","Peace") switch(wish) if("Power") - user << "Your wish is granted, but at a terrible cost..." - user << "The Wish Granter punishes you for your selfishness, claiming your soul and warping your body to match the darkness in your heart." + to_chat(user, "Your wish is granted, but at a terrible cost...") + + to_chat(user, "The Wish Granter punishes you for your selfishness, claiming your soul and warping your body to match the darkness in your heart.") + user.mutations.Add(LASER) user.mutations.Add(RESIST_COLD) user.mutations.Add(XRAY) if(ishuman(user)) var/mob/living/carbon/human/human = user if(human.species.name != "Shadow") - user << "\red Your flesh rapidly mutates!" - user << "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids." - user << "\red Your body reacts violently to light. \green However, it naturally heals in darkness." - user << "Aside from your new traits, you are mentally unchanged and retain your prior obligations." + to_chat(user, "\red Your flesh rapidly mutates!") + + to_chat(user, "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.") + + to_chat(user, "\red Your body reacts violently to light. \green However, it naturally heals in darkness.") + + to_chat(user, "Aside from your new traits, you are mentally unchanged and retain your prior obligations.") + human.set_species("Shadow") user.regenerate_icons() if("Wealth") - user << "Your wish is granted, but at a terrible cost..." - user << "The Wish Granter punishes you for your selfishness, claiming your soul and warping your body to match the darkness in your heart." + to_chat(user, "Your wish is granted, but at a terrible cost...") + + to_chat(user, "The Wish Granter punishes you for your selfishness, claiming your soul and warping your body to match the darkness in your heart.") + new /obj/structure/closet/syndicate/resources/everything(loc) if(ishuman(user)) var/mob/living/carbon/human/human = user if(human.species.name != "Shadow") - user << "\red Your flesh rapidly mutates!" - user << "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids." - user << "\red Your body reacts violently to light. \green However, it naturally heals in darkness." - user << "Aside from your new traits, you are mentally unchanged and retain your prior obligations." + to_chat(user, "\red Your flesh rapidly mutates!") + + to_chat(user, "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.") + + to_chat(user, "\red Your body reacts violently to light. \green However, it naturally heals in darkness.") + + to_chat(user, "Aside from your new traits, you are mentally unchanged and retain your prior obligations.") + human.set_species("Shadow") user.regenerate_icons() if("Immortality") - user << "Your wish is granted, but at a terrible cost..." - user << "The Wish Granter punishes you for your selfishness, claiming your soul and warping your body to match the darkness in your heart." + to_chat(user, "Your wish is granted, but at a terrible cost...") + + to_chat(user, "The Wish Granter punishes you for your selfishness, claiming your soul and warping your body to match the darkness in your heart.") + user.verbs += /mob/living/carbon/proc/immortality if(ishuman(user)) var/mob/living/carbon/human/human = user if(human.species.name != "Shadow") - user << "\red Your flesh rapidly mutates!" - user << "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids." - user << "\red Your body reacts violently to light. \green However, it naturally heals in darkness." - user << "Aside from your new traits, you are mentally unchanged and retain your prior obligations." + to_chat(user, "\red Your flesh rapidly mutates!") + + to_chat(user, "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.") + + to_chat(user, "\red Your body reacts violently to light. \green However, it naturally heals in darkness.") + + to_chat(user, "Aside from your new traits, you are mentally unchanged and retain your prior obligations.") + human.set_species("Shadow") user.regenerate_icons() if("To Kill") - user << "Your wish is granted, but at a terrible cost..." - user << "The Wish Granter punishes you for your wickedness, claiming your soul and warping your body to match the darkness in your heart." + to_chat(user, "Your wish is granted, but at a terrible cost...") + + to_chat(user, "The Wish Granter punishes you for your wickedness, claiming your soul and warping your body to match the darkness in your heart.") + ticker.mode.traitors += user.mind user.mind.special_role = "traitor" var/datum/objective/hijack/hijack = new hijack.owner = user.mind user.mind.objectives += hijack - user << "Your inhibitions are swept away, the bonds of loyalty broken, you are free to murder as you please!" + to_chat(user, "Your inhibitions are swept away, the bonds of loyalty broken, you are free to murder as you please!") + var/obj_count = 1 for(var/datum/objective/OBJ in user.mind.objectives) - user << "Objective #[obj_count]: [OBJ.explanation_text]" + to_chat(user, "Objective #[obj_count]: [OBJ.explanation_text]") + obj_count++ if(ishuman(user)) var/mob/living/carbon/human/human = user if(human.species.name != "Shadow") - user << "\red Your flesh rapidly mutates!" - user << "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids." - user << "\red Your body reacts violently to light. \green However, it naturally heals in darkness." - user << "Aside from your new traits, you are mentally unchanged and retain your prior obligations." + to_chat(user, "\red Your flesh rapidly mutates!") + + to_chat(user, "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.") + + to_chat(user, "\red Your body reacts violently to light. \green However, it naturally heals in darkness.") + + to_chat(user, "Aside from your new traits, you are mentally unchanged and retain your prior obligations.") + human.set_species("Shadow") user.regenerate_icons() if("Peace") - user << "Whatever alien sentience that the Wish Granter possesses is satisfied with your wish. There is a distant wailing as the last of the Faithless begin to die, then silence." - user << "You feel as if you just narrowly avoided a terrible fate..." + to_chat(user, "Whatever alien sentience that the Wish Granter possesses is satisfied with your wish. There is a distant wailing as the last of the Faithless begin to die, then silence.") + + to_chat(user, "You feel as if you just narrowly avoided a terrible fate...") + for(var/mob/living/simple_animal/hostile/faithless/F in world) F.health = -10 F.stat = 2 @@ -172,7 +204,8 @@ if(istype(M, /mob/living/carbon/human)) for(var/mob/O in viewers(world.view, src.loc)) - O << "[M] triggered the \icon[src] [src]" + to_chat(O, "[M] triggered the \icon[src] [src]") + triggered = 1 call(src,triggerproc)(M) @@ -193,9 +226,11 @@ var/mob/living/carbon/C = usr if(!C.stat) - C << "You're not dead yet!" + to_chat(C, "You're not dead yet!") + return - C << "Death is not your end!" + to_chat(C, "Death is not your end!") + spawn(rand(800,1200)) if(C.stat == DEAD) @@ -212,7 +247,8 @@ C.radiation = 0 C.heal_overall_damage(C.getBruteLoss(), C.getFireLoss()) C.reagents.clear_reagents() - C << "You have regenerated." + to_chat(C, "You have regenerated.") + C.visible_message("[usr] appears to wake from the dead, having healed all wounds.") C.update_canmove() return 1 \ No newline at end of file diff --git a/code/modules/awaymissions/trigger.dm b/code/modules/awaymissions/trigger.dm index 38b086f5869..06b7419a973 100644 --- a/code/modules/awaymissions/trigger.dm +++ b/code/modules/awaymissions/trigger.dm @@ -4,7 +4,8 @@ /obj/effect/step_trigger/message/Trigger(mob/M as mob) if(M.client) - M << "[message]" + to_chat(M, "[message]") + if(once) qdel(src) diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm index a49cfe03ccc..a4bcdf921fc 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/client/asset_cache.dm @@ -92,7 +92,8 @@ You can set verify to TRUE if you want send() to sleep until the client has the if(!unreceived || !unreceived.len) return 0 if (unreceived.len >= ASSET_CACHE_TELL_CLIENT_AMOUNT) - client << "Sending Resources..." + to_chat(client, "Sending Resources...") + for(var/asset in unreceived) if (asset in asset_cache) client << browse_rsc(asset_cache[asset], asset) diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 2670fcd6376..c9296cd84d8 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -28,16 +28,20 @@ return #if defined(TOPIC_DEBUGGING) - world << "[src]'s Topic: [href] destined for [hsrc]." + to_chat(world, "[src]'s Topic: [href] destined for [hsrc].") + #endif if(href_list["nano_err"]) //nano throwing errors if(topic_debugging) - src << "## NanoUI: " + html_decode(href_list["nano_err"]) //NANO DEBUG HOOK + to_chat(src, "## NanoUI: " + html_decode(href_list["nano_err"]))//NANO DEBUG HOOK + + if(href_list["asset_cache_confirm_arrival"]) - //src << "ASSET JOB [href_list["asset_cache_confirm_arrival"]] ARRIVED." +// to_chat(src, "ASSET JOB [href_list["asset_cache_confirm_arrival"]] ARRIVED.") + var/job = text2num(href_list["asset_cache_confirm_arrival"]) completed_asset_jobs += job return @@ -65,10 +69,12 @@ if(href_list["irc_msg"]) if(!holder && received_irc_pm < world.time - 6000) //Worse they can do is spam IRC for 10 minutes - usr << "You are no longer able to use this, it's been more then 10 minutes since an admin on IRC has responded to you" + to_chat(usr, "You are no longer able to use this, it's been more then 10 minutes since an admin on IRC has responded to you") + return if(mute_irc) - usr << "" + to_chat(usr, "") + return cmd_admin_irc_pm() return @@ -77,7 +83,8 @@ //Logs all hrefs if(config && config.log_hrefs && href_logfile) - href_logfile << "[time2text(world.timeofday,"hh:mm")] [src] (usr:[usr]) || [hsrc ? "[hsrc] " : ""][href]
      " + to_chat(href_logfile, "[time2text(world.timeofday,"hh:mm")] [src] (usr:[usr]) || [hsrc ? "[hsrc] " : ""][href]
      ") + switch(href_list["karmashop"]) if("tab") @@ -90,49 +97,56 @@ switch(href_list["KarmaBuy"]) if("1") if(karma <5) - usr << "You do not have enough karma!" + to_chat(usr, "You do not have enough karma!") + return else src.DB_job_unlock("Barber",5) return if("2") if(karma <5) - usr << "You do not have enough karma!" + to_chat(usr, "You do not have enough karma!") + return else src.DB_job_unlock("Brig Physician",5) return if("3") if(karma <30) - usr << "You do not have enough karma!" + to_chat(usr, "You do not have enough karma!") + return else src.DB_job_unlock("Nanotrasen Representative",30) return if("5") if(karma <30) - usr << "You do not have enough karma!" + to_chat(usr, "You do not have enough karma!") + return else src.DB_job_unlock("Blueshield",30) return if("6") if(karma <30) - usr << "You do not have enough karma!" + to_chat(usr, "You do not have enough karma!") + return else src.DB_job_unlock("Mechanic",30) return if("7") if(karma <45) - usr << "You do not have enough karma!" + to_chat(usr, "You do not have enough karma!") + return else src.DB_job_unlock("Magistrate",45) return if("9") if(karma <30) - usr << "You do not have enough karma!" + to_chat(usr, "You do not have enough karma!") + return else src.DB_job_unlock("Security Pod Pilot",30) @@ -142,42 +156,48 @@ switch(href_list["KarmaBuy2"]) if("1") if(karma <15) - usr << "You do not have enough karma!" + to_chat(usr, "You do not have enough karma!") + return else src.DB_species_unlock("Machine",15) return if("2") if(karma <30) - usr << "You do not have enough karma!" + to_chat(usr, "You do not have enough karma!") + return else src.DB_species_unlock("Kidan",30) return if("3") if(karma <30) - usr << "You do not have enough karma!" + to_chat(usr, "You do not have enough karma!") + return else src.DB_species_unlock("Grey",30) return if("4") if(karma <45) - usr << "You do not have enough karma!" + to_chat(usr, "You do not have enough karma!") + return else src.DB_species_unlock("Vox",45) return if("5") if(karma <45) - usr << "You do not have enough karma!" + to_chat(usr, "You do not have enough karma!") + return else src.DB_species_unlock("Slime People",45) return if("6") if(karma <100) - usr << "You do not have enough karma!" + to_chat(usr, "You do not have enough karma!") + return else src.DB_species_unlock("Plasmaman",100) @@ -199,7 +219,7 @@ /client/proc/is_content_unlocked() if(!prefs.unlock_content) - src << "Become a BYOND member to access member-perks and features, as well as support the engine that makes this game possible. Click here to find out more." + to_chat(src, "Become a BYOND member to access member-perks and features, as well as support the engine that makes this game possible. Click here to find out more.") return 0 return 1 @@ -207,11 +227,13 @@ if(config.automute_on && !holder && src.last_message == message) src.last_message_count++ if(src.last_message_count >= SPAM_TRIGGER_AUTOMUTE) - src << "\red You have exceeded the spam filter limit for identical messages. An auto-mute was applied." + to_chat(src, "\red You have exceeded the spam filter limit for identical messages. An auto-mute was applied.") + cmd_admin_mute(src.mob, mute_type, 1) return 1 if(src.last_message_count >= SPAM_TRIGGER_WARNING) - src << "\red You are nearing the spam filter limit for identical messages." + to_chat(src, "\red You are nearing the spam filter limit for identical messages.") + return 0 else last_message = message @@ -221,13 +243,15 @@ //This stops files larger than UPLOAD_LIMIT being sent from client to server via input(), client.Import() etc. /client/AllowUpload(filename, filelength) if(filelength > UPLOAD_LIMIT) - src << "Error: AllowUpload(): File Upload too large. Upload Limit: [UPLOAD_LIMIT/1024]KiB." + to_chat(src, "Error: AllowUpload(): File Upload too large. Upload Limit: [UPLOAD_LIMIT/1024]KiB.") + return 0 /* //Don't need this at the moment. But it's here if it's needed later. //Helps prevent multiple files being uploaded at once. Or right after eachother. var/time_to_wait = fileaccess_timer - world.time if(time_to_wait > 0) - src << "Error: AllowUpload(): Spam prevention. Please wait [round(time_to_wait/10)] seconds." + to_chat(src, "Error: AllowUpload(): Spam prevention. Please wait [round(time_to_wait/10)] seconds.") + return 0 fileaccess_timer = world.time + FTPDELAY */ return 1 @@ -254,7 +278,8 @@ src.preload_rsc = pick(config.resource_urls) else src.preload_rsc = 1 // If config.resource_urls is not set, preload like normal. - src << "\red If the title screen is black, resources are still downloading. Please be patient until the title screen appears." + to_chat(src, "\red If the title screen is black, resources are still downloading. Please be patient until the title screen appears.") + clients += src @@ -277,10 +302,14 @@ . = ..() //calls mob.Login() if(custom_event_msg && custom_event_msg != "") - src << "

      Custom Event

      " - src << "

      A custom event is taking place. OOC Info:

      " - src << "[html_encode(custom_event_msg)]" - src << "
      " + to_chat(src, "

      Custom Event

      ") + + to_chat(src, "

      A custom event is taking place. OOC Info:

      ") + + to_chat(src, "[html_encode(custom_event_msg)]") + + to_chat(src, "
      ") + if( (world.address == address || !address) && !host ) host = key @@ -301,7 +330,8 @@ if (ckey in clientmessages) for (var/message in clientmessages[ckey]) - src << message + to_chat(src, message) + clientmessages.Remove(ckey) @@ -313,7 +343,8 @@ screen += void if(!winexists(src, "asset_cache_browser")) // The client is using a custom skin, tell them. - src << "Unable to access asset cache browser, if you are using a custom skin file, please allow DS to download the updated version, if you are not, then make a bug report. This is not a critical issue but can cause issues with resource downloading, as it is impossible to know when extra resources arrived to you." + to_chat(src, "Unable to access asset cache browser, if you are using a custom skin file, please allow DS to download the updated version, if you are not, then make a bug report. This is not a critical issue but can cause issues with resource downloading, as it is impossible to know when extra resources arrived to you.") + ////////////// @@ -431,4 +462,5 @@ var/message = "[lang.name] : [lang.type]" if(lang.flags & RESTRICTED) message += " (RESTRICTED)" - world << "[message]" + to_chat(world, "[message]") + diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index a64ae9f443c..7692f051621 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -262,7 +262,8 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts //display limbs below var/ind = 0 for(var/name in organ_data) - //world << "[ind] \ [organ_data.len]" +// to_chat(world, "[ind] \ [organ_data.len]") + var/status = organ_data[name] var/organ_name = null switch(name) @@ -673,7 +674,8 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts return if (!isnum(desiredLvl)) - user << "\red UpdateJobPreference - desired level was not a number. Please notify coders!" + to_chat(user, "\red UpdateJobPreference - desired level was not a number. Please notify coders!") + ShowChoices(user) return @@ -1057,7 +1059,8 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if(new_name) real_name = new_name else - user << "Invalid name. Your name should be at least 2 and at most [MAX_NAME_LEN] characters long. It may only contain the characters A-Z, a-z, -, ' and ." + to_chat(user, "Invalid name. Your name should be at least 2 and at most [MAX_NAME_LEN] characters long. It may only contain the characters A-Z, a-z, -, ' and .") + if("age") var/new_age = input(user, "Choose your character's age:\n([AGE_MIN]-[AGE_MAX])", "Character Preference") as num|null @@ -1583,7 +1586,8 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts var/cleaned_r = sql_sanitize_text(r) if(r != cleaned_r) // up to no good message_admins("[user] attempted an href exploit! (This could have possibly lead to a \"Bobby Tables\" exploit, so they're probably up to no good). String: [r] ID: [last_id] IP: [last_ip]") - user << "Stop right there, criminal scum" + to_chat(user, "Stop right there, criminal scum") + else be_special ^= r @@ -1599,9 +1603,11 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if("lobby_music") sound ^= SOUND_LOBBY if(sound & SOUND_LOBBY) - user << sound(ticker.login_music, repeat = 0, wait = 0, volume = 85, channel = 1) + to_chat(user, sound(ticker.login_music, repeat = 0, wait = 0, volume = 85, channel = 1)) + else - user << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) + to_chat(user, sound(null, repeat = 0, wait = 0, volume = 85, channel = 1)) + if("ghost_ears") toggles ^= CHAT_GHOSTEARS diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm index d1c100c37c7..341efffcb69 100644 --- a/code/modules/client/preferences_toggles.dm +++ b/code/modules/client/preferences_toggles.dm @@ -4,7 +4,8 @@ set category = "Preferences" set desc = ".Toggle Between seeing all mob speech, and only speech of nearby mobs" prefs.toggles ^= CHAT_GHOSTEARS - src << "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTEARS) ? "see all speech in the world" : "only see speech from nearby mobs"]." + to_chat(src, "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTEARS) ? "see all speech in the world" : "only see speech from nearby mobs"].") + prefs.save_preferences(src) feedback_add_details("admin_verb","TGE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -13,7 +14,8 @@ set category = "Preferences" set desc = ".Toggle Between seeing all mob emotes, and only emotes of nearby mobs" prefs.toggles ^= CHAT_GHOSTSIGHT - src << "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTSIGHT) ? "see all emotes in the world" : "only see emotes from nearby mobs"]." + to_chat(src, "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTSIGHT) ? "see all emotes in the world" : "only see emotes from nearby mobs"].") + prefs.save_preferences(src) feedback_add_details("admin_verb","TGS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -22,7 +24,8 @@ set category = "Preferences" set desc = ".Toggle between hearing all radio chatter, or only from nearby speakers" prefs.toggles ^= CHAT_GHOSTRADIO - src << "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTRADIO) ? "hear all radio chat in the world" : "only hear from nearby speakers"]." + to_chat(src, "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTRADIO) ? "hear all radio chat in the world" : "only hear from nearby speakers"].") + prefs.save_preferences(src) feedback_add_details("admin_verb","TGR") @@ -33,7 +36,8 @@ if(!holder) return prefs.toggles ^= CHAT_RADIO prefs.save_preferences(src) - usr << "You will [(prefs.toggles & CHAT_RADIO) ? "now" : "no longer"] see radio chatter from radios or speakers" + to_chat(usr, "You will [(prefs.toggles & CHAT_RADIO) ? "now" : "no longer"] see radio chatter from radios or speakers") + feedback_add_details("admin_verb","THR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/toggleadminhelpsound() @@ -43,7 +47,8 @@ if(!holder) return prefs.sound ^= SOUND_ADMINHELP prefs.save_preferences(src) - usr << "You will [(prefs.sound & SOUND_ADMINHELP) ? "now" : "no longer"] hear a sound when adminhelps arrive." + to_chat(usr, "You will [(prefs.sound & SOUND_ADMINHELP) ? "now" : "no longer"] hear a sound when adminhelps arrive.") + feedback_add_details("admin_verb","AHS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/deadchat() // Deadchat toggle is usable by anyone. @@ -54,9 +59,11 @@ prefs.save_preferences(src) if(src.holder) - src << "You will [(prefs.toggles & CHAT_DEAD) ? "now" : "no longer"] see deadchat." + to_chat(src, "You will [(prefs.toggles & CHAT_DEAD) ? "now" : "no longer"] see deadchat.") + else - src << "As a ghost, you will [(prefs.toggles & CHAT_DEAD) ? "now" : "no longer"] see deadchat." + to_chat(src, "As a ghost, you will [(prefs.toggles & CHAT_DEAD) ? "now" : "no longer"] see deadchat.") + feedback_add_details("admin_verb","TDV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -66,7 +73,8 @@ set desc = "Toggles seeing prayers" prefs.toggles ^= CHAT_PRAYER prefs.save_preferences(src) - src << "You will [(prefs.toggles & CHAT_PRAYER) ? "now" : "no longer"] see prayerchat." + to_chat(src, "You will [(prefs.toggles & CHAT_PRAYER) ? "now" : "no longer"] see prayerchat.") + feedback_add_details("admin_verb","TP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/togglescoreboard() @@ -75,7 +83,8 @@ set desc = "Toggles displaying end of round scoreboard" prefs.toggles ^= DISABLE_SCOREBOARD prefs.save_preferences(src) - src << "You will [(prefs.toggles & DISABLE_SCOREBOARD) ? "no longer" : "now"] see the end of round scoreboard." + to_chat(src, "You will [(prefs.toggles & DISABLE_SCOREBOARD) ? "no longer" : "now"] see the end of round scoreboard.") + feedback_add_details("admin_verb","TScoreboard") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/togglekarmareminder() @@ -84,7 +93,8 @@ set desc = "Toggles displaying end of round karma reminder" prefs.toggles ^= DISABLE_KARMA_REMINDER prefs.save_preferences(src) - src << "You will [(prefs.toggles & DISABLE_KARMA_REMINDER) ? "no longer" : "now"] see the end of round karma reminder." + to_chat(src, "You will [(prefs.toggles & DISABLE_KARMA_REMINDER) ? "no longer" : "now"] see the end of round karma reminder.") + feedback_add_details("admin_verb","TKarmabugger") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/toggletitlemusic() @@ -94,13 +104,17 @@ prefs.sound ^= SOUND_LOBBY prefs.save_preferences(src) if(prefs.sound & SOUND_LOBBY) - src << "You will now hear music in the game lobby." + to_chat(src, "You will now hear music in the game lobby.") + if(istype(mob, /mob/new_player)) playtitlemusic() else - src << "You will no longer hear music in the game lobby." + to_chat(src, "You will no longer hear music in the game lobby.") + if(istype(mob, /mob/new_player)) - src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) // stop the jamsz + to_chat(src, sound(null, repeat = 0, wait = 0, volume = 85, channel = 1))// stop the jamsz + + feedback_add_details("admin_verb","TLobby") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/togglemidis() @@ -110,12 +124,16 @@ prefs.sound ^= SOUND_MIDI prefs.save_preferences(src) if(prefs.sound & SOUND_MIDI) - src << "You will now hear any sounds uploaded by admins." + to_chat(src, "You will now hear any sounds uploaded by admins.") + else var/sound/break_sound = sound(null, repeat = 0, wait = 0, channel = 777) break_sound.priority = 250 - src << break_sound //breaks the client's sound output on channel 777 - src << "You will no longer hear sounds uploaded by admins; any currently playing midis have been disabled." + to_chat(src, break_sound)//breaks the client's sound output on channel 777 + + + to_chat(src, "You will no longer hear sounds uploaded by admins; any currently playing midis have been disabled.") + feedback_add_details("admin_verb","TMidi") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/listen_ooc() @@ -124,7 +142,8 @@ set desc = "Toggles seeing OutOfCharacter chat" prefs.toggles ^= CHAT_OOC prefs.save_preferences(src) - src << "You will [(prefs.toggles & CHAT_OOC) ? "now" : "no longer"] see messages on the OOC channel." + to_chat(src, "You will [(prefs.toggles & CHAT_OOC) ? "now" : "no longer"] see messages on the OOC channel.") + feedback_add_details("admin_verb","TOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -134,7 +153,8 @@ set desc = "Toggles seeing Local OutOfCharacter chat" prefs.toggles ^= CHAT_LOOC prefs.save_preferences(src) - src << "You will [(prefs.toggles & CHAT_LOOC) ? "now" : "no longer"] see messages on the LOOC channel." + to_chat(src, "You will [(prefs.toggles & CHAT_LOOC) ? "now" : "no longer"] see messages on the LOOC channel.") + feedback_add_details("admin_verb","TLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -145,10 +165,13 @@ prefs.sound ^= SOUND_AMBIENCE prefs.save_preferences(src) if(prefs.sound & SOUND_AMBIENCE) - src << "You will now hear ambient sounds." + to_chat(src, "You will now hear ambient sounds.") + else - src << "You will no longer hear ambient sounds." - src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 1) + to_chat(src, "You will no longer hear ambient sounds.") + + to_chat(src, sound(null, repeat = 0, wait = 0, volume = 0, channel = 1)) + feedback_add_details("admin_verb","TAmbi") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/Toggle_Buzz() //No more headaches because headphones bump up shipambience.ogg to insanity levels. @@ -158,10 +181,13 @@ prefs.sound ^= SOUND_BUZZ prefs.save_preferences(src) if(prefs.sound & SOUND_BUZZ) - src << "You will now hear ambient white noise." + to_chat(src, "You will now hear ambient white noise.") + else - src << "You will no longer hear ambient white noise." - src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2) + to_chat(src, "You will no longer hear ambient white noise.") + + to_chat(src, sound(null, repeat = 0, wait = 0, volume = 0, channel = 2)) + feedback_add_details("admin_verb","TBuzz") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -172,11 +198,15 @@ prefs.sound ^= SOUND_HEARTBEAT prefs.save_preferences(src) if(prefs.sound & SOUND_HEARTBEAT) - src << "You will now hear heartbeat sounds." + to_chat(src, "You will now hear heartbeat sounds.") + else - src << "You will no longer hear heartbeat sounds." - src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 1) - src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2) + to_chat(src, "You will no longer hear heartbeat sounds.") + + to_chat(src, sound(null, repeat = 0, wait = 0, volume = 0, channel = 1)) + + to_chat(src, sound(null, repeat = 0, wait = 0, volume = 0, channel = 2)) + feedback_add_details("admin_verb","Thb") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! // This needs a toggle because you people are awful and spammed terrible music @@ -187,9 +217,11 @@ prefs.toggles ^= SOUND_INSTRUMENTS prefs.save_preferences(src) if(prefs.toggles & SOUND_INSTRUMENTS) - src << "You will now hear people playing musical instruments." + to_chat(src, "You will now hear people playing musical instruments.") + else - src << "You will no longer hear musical instruments." + to_chat(src, "You will no longer hear musical instruments.") + feedback_add_details("admin_verb","TInstru") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/toggle_media() @@ -199,7 +231,8 @@ prefs.sound ^= SOUND_STREAMING prefs.save_preferences(src) - usr << "You will [(prefs.sound & SOUND_STREAMING) ? "now" : "no longer"] hear streamed media." + to_chat(usr, "You will [(prefs.sound & SOUND_STREAMING) ? "now" : "no longer"] hear streamed media.") + if(!media) return if(prefs.sound & SOUND_STREAMING) media.update_music() diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 1257117237d..a179d56db14 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -51,7 +51,8 @@ wearable = 1 if(!wearable) - M << "\red Your species cannot wear [src]." + to_chat(M, "\red Your species cannot wear [src].") + return 0 return 1 @@ -200,7 +201,8 @@ BLIND // can't see anything species_restricted -= "Tajaran" update_icon() else - user << "[src] have already been clipped!" + to_chat(user, "[src] have already been clipped!") + return else ..() @@ -213,29 +215,36 @@ BLIND // can't see anything if (istype(M, /mob/dead/)) return if (user.stat || user.restrained()) return if(has_sensor >= 2) - user << "The controls are locked." + to_chat(user, "The controls are locked.") + return 0 if(has_sensor <= 0) - user << "This suit does not have any sensors." + to_chat(user, "This suit does not have any sensors.") + return 0 var/list/modes = list("Off", "Binary sensors", "Vitals tracker", "Tracking beacon") var/switchMode = input("Select a sensor mode:", "Suit Sensor Mode", modes[sensor_mode + 1]) in modes if(get_dist(user, src) > 1) - user << "You have moved too far away." + to_chat(user, "You have moved too far away.") + return sensor_mode = modes.Find(switchMode) - 1 if (src.loc == user) switch(sensor_mode) if(0) - user << "You disable your suit's remote sensing equipment." + to_chat(user, "You disable your suit's remote sensing equipment.") + if(1) - user << "Your suit will now report whether you are live or dead." + to_chat(user, "Your suit will now report whether you are live or dead.") + if(2) - user << "Your suit will now report your vital lifesigns." + to_chat(user, "Your suit will now report your vital lifesigns.") + if(3) - user << "Your suit will now report your vital lifesigns as well as your coordinate position." + to_chat(user, "Your suit will now report your vital lifesigns as well as your coordinate position.") + if(istype(user,/mob/living/carbon/human)) var/mob/living/carbon/human/H = user if(H.w_uniform == src) @@ -303,7 +312,8 @@ BLIND // can't see anything Had to use this instead of initial() because initial reverted to the wrong state.*/ gas_transfer_coefficient = initial(gas_transfer_coefficient) permeability_coefficient = initial(permeability_coefficient) - user << "You push \the [src] back into place." + to_chat(user, "You push \the [src] back into place.") + mask_adjusted = 0 slot_flags = initial(slot_flags) if(flags_inv != initial(flags_inv)) @@ -324,7 +334,8 @@ BLIND // can't see anything user.put_in_hands(src) else icon_state += "_up" - user << "You push \the [src] out of the way." + to_chat(user, "You push \the [src] out of the way.") + gas_transfer_coefficient = null permeability_coefficient = null mask_adjusted = 1 @@ -393,7 +404,8 @@ BLIND // can't see anything M.dropped() user.visible_message("[user] crushes the [M] into the bottom of [src], extinguishing it.","You crush the [M] into the bottom of [src], extinguishing it.") else // Match has been previously lit and extinguished. - user << "The [M] has already been extinguished." + to_chat(user, "The [M] has already been extinguished.") + return if(istype(I, /obj/item/weapon/wirecutters)) @@ -411,7 +423,8 @@ BLIND // can't see anything species_restricted -= "Tajaran" update_icon() else - user << "[src] have already had their toes cut open!" + to_chat(user, "[src] have already had their toes cut open!") + return else ..() @@ -463,7 +476,8 @@ BLIND // can't see anything item_state = copytext(item_state, 1, findtext(item_state, "_open")) if(adjust_flavour) flavour = "[copytext(adjust_flavour, 3, lentext(adjust_flavour) + 1)] up" //Trims off the 'un' at the beginning of the word. unzip -> zip, unbutton->button. - user << "You [flavour] \the [src]." + to_chat(user, "You [flavour] \the [src].") + suit_adjusted = 0 //Suit is no longer adjusted. else var/flavour = "open" @@ -471,7 +485,8 @@ BLIND // can't see anything item_state += "_open" if(adjust_flavour) flavour = "[adjust_flavour]" - user << "You [flavour] \the [src]." + to_chat(user, "You [flavour] \the [src].") + suit_adjusted = 1 //Suit's adjusted. else if(user.canUnEquip(src)) //Checks to see if the item can be unequipped. If so, lets shred. Otherwise, struggle and fail. @@ -487,11 +502,14 @@ BLIND // can't see anything qdel(src) //Now that the pockets have been emptied, we can safely destroy the jacket. user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!")) else - user << "You yank and pull at \the [src] with your [pick("excessive", "extreme", "insane", "monstrous", "ridiculous", "unreal", "stupendous")] [pick("power", "strength")], however you are unable to change its state!" //Yep, that's all they get. Avoids having to snowflake in a cooldown. + to_chat(user, "You yank and pull at \the [src] with your [pick("excessive", "extreme", "insane", "monstrous", "ridiculous", "unreal", "stupendous")] [pick("power", "strength")], however you are unable to change its state!")//Yep, that's all they get. Avoids having to snowflake in a cooldown. + + return user.update_inv_wear_suit() else - user << "You attempt to button up the velcro on \the [src], before promptly realising how retarded you are." + to_chat(user, "You attempt to button up the velcro on \the [src], before promptly realising how retarded you are.") + /obj/item/clothing/suit/verb/openjacket(var/mob/user) //The verb you can use to adjust jackets. set name = "Open/Close Jacket" @@ -599,7 +617,8 @@ BLIND // can't see anything return else - user << "You cannot attach more accessories of this type to [src]." + to_chat(user, "You cannot attach more accessories of this type to [src].") + if(accessories.len) for(var/obj/item/clothing/accessory/A in accessories) @@ -642,16 +661,21 @@ BLIND // can't see anything ..(user) switch(src.sensor_mode) if(0) - user << "Its sensors appear to be disabled." + to_chat(user, "Its sensors appear to be disabled.") + if(1) - user << "Its binary life sensors appear to be enabled." + to_chat(user, "Its binary life sensors appear to be enabled.") + if(2) - user << "Its vital tracker appears to be enabled." + to_chat(user, "Its vital tracker appears to be enabled.") + if(3) - user << "Its vital tracker and tracking beacon appear to be enabled." + to_chat(user, "Its vital tracker and tracking beacon appear to be enabled.") + if(accessories.len) for(var/obj/item/clothing/accessory/A in accessories) - user << "\A [A] is attached to it." + to_chat(user, "\A [A] is attached to it.") + /obj/item/clothing/under/verb/rollsuit() @@ -663,12 +687,14 @@ BLIND // can't see anything if(copytext(item_color,-2) != "_d") basecolor = item_color - usr << "DEBUG:[basecolor]" + to_chat(usr, "DEBUG:[basecolor]") + if(basecolor + "_d_s" in icon_states('icons/mob/uniform.dmi')) item_color = item_color == "[basecolor]" ? "[basecolor]_d" : "[basecolor]" usr.update_inv_w_uniform() else - usr << "You cannot roll down the uniform!" + to_chat(usr, "You cannot roll down the uniform!") + /obj/item/clothing/under/proc/remove_accessory(mob/user, obj/item/clothing/accessory/A) if(!(A in accessories)) diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index fc89300fcf0..2a5cb6d554e 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -24,11 +24,13 @@ if(prescription_upgradable) if(istype(O, /obj/item/clothing/glasses/regular)) if(prescription) - H << "You can't possibly imagine how adding more lenses would improve \the [name]." + to_chat(H, "You can't possibly imagine how adding more lenses would improve \the [name].") + return H.unEquip(O) O.loc = src // Store the glasses for later removal - H << "You fit \the [name] with lenses from \the [O]." + to_chat(H, "You fit \the [name] with lenses from \the [O].") + prescription = 1 name = "prescription [name]" return @@ -36,7 +38,8 @@ var/obj/item/clothing/glasses/regular/G = locate() in src if(!G) G = new(get_turf(H)) - H << "You salvage the prescription lenses from \the [name]." + to_chat(H, "You salvage the prescription lenses from \the [name].") + prescription = 0 name = initial(name) H.put_in_hands(G) @@ -264,7 +267,8 @@ playsound(src.loc, 'sound/misc/yeah.ogg', 100, 0) usr.visible_message("YEEEAAAAAHHHHHHHHHHHHH!!") else - usr << "The moment is gone." + to_chat(usr, "The moment is gone.") + /obj/item/clothing/glasses/sunglasses/reagent @@ -324,7 +328,8 @@ src.flags |= GLASSESCOVERSEYES flags_inv |= HIDEEYES icon_state = initial(icon_state) - usr << "You flip the [src] down to protect your eyes." + to_chat(usr, "You flip the [src] down to protect your eyes.") + flash_protect = 2 tint = initial(tint) //better than istype else @@ -332,7 +337,8 @@ src.flags &= ~HEADCOVERSEYES flags_inv &= ~HIDEEYES icon_state = "[initial(icon_state)]up" - usr << "You push the [src] up out of your face." + to_chat(usr, "You push the [src] up out of your face.") + flash_protect = 0 tint = 0 @@ -392,7 +398,8 @@ emp_act(severity) if(istype(src.loc, /mob/living/carbon/human)) var/mob/living/carbon/human/M = src.loc - M << "\red The Optical Thermal Scanner overloads and blinds you!" + to_chat(M, "\red The Optical Thermal Scanner overloads and blinds you!") + if(M.glasses == src) M.eye_blind = 3 M.eye_blurry = 5 diff --git a/code/modules/clothing/gloves/rings.dm b/code/modules/clothing/gloves/rings.dm index 3c7c10b792c..a1a2c04bd5f 100644 --- a/code/modules/clothing/gloves/rings.dm +++ b/code/modules/clothing/gloves/rings.dm @@ -21,21 +21,25 @@ icon_state = initial(icon_state) examine(mob/user) ..(user) - user << "This one is made of [material]." + to_chat(user, "This one is made of [material].") + if(stud) - user << "It is adorned with a single gem." + to_chat(user, "It is adorned with a single gem.") + /obj/item/clothing/gloves/ring/attackby(obj/item/I as obj, mob/user as mob, params) if(istype(I, /obj/item/stack/sheet/mineral/diamond)) var/obj/item/stack/sheet/mineral/diamond/D = I if(stud) - usr << "The [src] already has a gem." + to_chat(usr, "The [src] already has a gem.") + else if(D.amount >= 1) D.use(1) stud = 1 update_icon() - usr << "You socket the diamond into the [src]." + to_chat(usr, "You socket the diamond into the [src].") + // s'pensive /obj/item/clothing/gloves/ring/silver diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index 062ff9e978b..aa5d722d056 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -13,7 +13,9 @@ attack_self(mob/user) if(!isturf(user.loc)) - user << "You cannot turn the light on while in this [user.loc]" //To prevent some lighting anomalities. + to_chat(user, "You cannot turn the light on while in this [user.loc]")//To prevent some lighting anomalities. + + return on = !on icon_state = "hardhat[on]_[item_color]" diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 1e6708994f2..463c2eb2861 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -24,7 +24,8 @@ flags ^= visor_flags flags_inv ^= visor_flags_inv icon_state = "[initial(icon_state)][up ? "up" : ""]" - user << "[up ? alt_toggle_message : toggle_message] \the [src]" + to_chat(user, "[up ? alt_toggle_message : toggle_message] \the [src]") + user.update_inv_head() diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 4c83ec37782..50bb85e5cc4 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -58,7 +58,8 @@ src.flags |= (HEADCOVERSEYES | HEADCOVERSMOUTH) flags_inv |= (HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE) icon_state = initial(icon_state) - usr << "You flip the [src] down to protect your eyes." + to_chat(usr, "You flip the [src] down to protect your eyes.") + flash_protect = 2 tint = 2 else @@ -66,7 +67,8 @@ src.flags &= ~(HEADCOVERSEYES | HEADCOVERSMOUTH) flags_inv &= ~(HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE) icon_state = "[initial(icon_state)]up" - usr << "You push the [src] up out of your face." + to_chat(usr, "You push the [src] up out of your face.") + flash_protect = 0 tint = 0 usr.update_inv_head() //so our mob-overlays update @@ -130,11 +132,13 @@ if(src.icon_state == "ushankadown") src.icon_state = "ushankaup" src.item_state = "ushankaup" - user << "You raise the ear flaps on the ushanka." + to_chat(user, "You raise the ear flaps on the ushanka.") + else src.icon_state = "ushankadown" src.item_state = "ushankadown" - user << "You lower the ear flaps on the ushanka." + to_chat(user, "You lower the ear flaps on the ushanka.") + /* * Pumpkin head diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index 45a4c9f4141..b9c88bcc11e 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -19,10 +19,12 @@ src.flipped = !src.flipped if(src.flipped) icon_state = "[item_color]soft_flipped" - usr << "You flip the hat backwards." + to_chat(usr, "You flip the hat backwards.") + else icon_state = "[item_color]soft" - usr << "You flip the hat back in normal position." + to_chat(usr, "You flip the hat back in normal position.") + usr.update_inv_head() //so our mob-overlays update /obj/item/clothing/head/soft/red diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 62aec510e90..3ccfe44cc39 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -45,7 +45,8 @@ src.flags |= (MASKCOVERSEYES) flags_inv |= (HIDEEYES) icon_state = initial(icon_state) - usr << "You flip the [src] down to protect your eyes." + to_chat(usr, "You flip the [src] down to protect your eyes.") + flash_protect = 2 tint = 2 else @@ -53,7 +54,8 @@ src.flags &= ~(MASKCOVERSEYES) flags_inv &= ~(HIDEEYES) icon_state = "[initial(icon_state)]up" - usr << "You push the [src] up out of your face." + to_chat(usr, "You push the [src] up out of your face.") + flash_protect = 0 tint = 0 usr.update_inv_wear_mask() //so our mob-overlays update @@ -110,7 +112,8 @@ if(src && choice && !M.stat && in_range(M,src)) icon_state = options[choice] - M << "Your Clown Mask has now morphed into [choice], all praise the Honk Mother!" + to_chat(M, "Your Clown Mask has now morphed into [choice], all praise the Honk Mother!") + return 1 /obj/item/clothing/mask/gas/clownwiz @@ -247,19 +250,24 @@ if(istype(W, /obj/item/weapon/screwdriver)) switch(aggressiveness) if(1) - user << "\blue You set the restrictor to the middle position." + to_chat(user, "\blue You set the restrictor to the middle position.") + aggressiveness = 2 if(2) - user << "\blue You set the restrictor to the last position." + to_chat(user, "\blue You set the restrictor to the last position.") + aggressiveness = 3 if(3) - user << "\blue You set the restrictor to the first position." + to_chat(user, "\blue You set the restrictor to the first position.") + aggressiveness = 1 if(4) - user << "\red You adjust the restrictor but nothing happens, probably because its broken." + to_chat(user, "\red You adjust the restrictor but nothing happens, probably because its broken.") + else if(istype(W, /obj/item/weapon/wirecutters)) if(aggressiveness != 4) - user << "\red You broke it!" + to_chat(user, "\red You broke it!") + aggressiveness = 4 else ..() @@ -270,7 +278,8 @@ /obj/item/clothing/mask/gas/sechailer/emag_act(mob/user as mob) if(safety) safety = 0 - user << "You silently fry [src]'s vocal circuit with the cryptographic sequencer." + to_chat(user, "You silently fry [src]'s vocal circuit with the cryptographic sequencer.") + else return diff --git a/code/modules/clothing/masks/voice.dm b/code/modules/clothing/masks/voice.dm index 2defc8402e0..887518ab906 100644 --- a/code/modules/clothing/masks/voice.dm +++ b/code/modules/clothing/masks/voice.dm @@ -15,7 +15,8 @@ set src in usr changer.active = !changer.active - usr << "You [changer.active ? "enable" : "disable"] the voice-changing module in \the [src]." + to_chat(usr, "You [changer.active ? "enable" : "disable"] the voice-changing module in \the [src].") + /obj/item/clothing/mask/gas/voice/verb/Set_Voice(name as text) set category = "Object" @@ -24,7 +25,8 @@ var/voice = sanitize(copytext(name,1,MAX_MESSAGE_LEN)) if(!voice || !length(voice)) return changer.voice = voice - usr << "You are now mimicking [changer.voice]." + to_chat(usr, "You are now mimicking [changer.voice].") + /obj/item/clothing/mask/gas/voice/New() ..() diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index d4572017361..6b6a047fc0b 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -19,7 +19,8 @@ src.slowdown = slowdown_active magpulse = !magpulse icon_state = "[magboot_state][magpulse]" - user << "You [magpulse ? "enable" : "disable"] the mag-pulse traction system." + to_chat(user, "You [magpulse ? "enable" : "disable"] the mag-pulse traction system.") + user.update_inv_shoes() //so our mob-overlays update user.update_gravity(user.mob_has_gravity()) @@ -28,7 +29,8 @@ /obj/item/clothing/shoes/magboots/examine(mob/user) ..(user) - user << "Its mag-pulse traction system appears to be [magpulse ? "enabled" : "disabled"]." + to_chat(user, "Its mag-pulse traction system appears to be [magpulse ? "enabled" : "disabled"].") + /obj/item/clothing/shoes/magboots/advance diff --git a/code/modules/clothing/spacesuits/alien.dm b/code/modules/clothing/spacesuits/alien.dm index d5354f94683..d576902a43e 100644 --- a/code/modules/clothing/spacesuits/alien.dm +++ b/code/modules/clothing/spacesuits/alien.dm @@ -205,22 +205,26 @@ flags &= ~NOSLIP magpulse = 0 flags |= NODROP - user << "You relax your deathgrip on the flooring." + to_chat(user, "You relax your deathgrip on the flooring.") + else //make sure these can only be used when equipped. if(!ishuman(user)) return var/mob/living/carbon/human/H = user if (H.shoes != src) - user << "You will have to put on the [src] before you can do that." + to_chat(user, "You will have to put on the [src] before you can do that.") + return flags |= NOSLIP magpulse = 1 flags &= ~NODROP //kinda hard to take off magclaws when you are gripping them tightly. - user << "You dig your claws deeply into the flooring, bracing yourself." - user << "It would be hard to take off the [src] without relaxing your grip first." + to_chat(user, "You dig your claws deeply into the flooring, bracing yourself.") + + to_chat(user, "It would be hard to take off the [src] without relaxing your grip first.") + //In case they somehow come off while enabled. /obj/item/clothing/shoes/magboots/vox/dropped(mob/user as mob) @@ -234,7 +238,9 @@ /obj/item/clothing/shoes/magboots/vox/examine(mob/user) ..(user) if (magpulse) - user << "It would be hard to take these off without relaxing your grip first." //theoretically this message should only be seen by the wearer when the claws are equipped. + to_chat(user, "It would be hard to take these off without relaxing your grip first.")//theoretically this message should only be seen by the wearer when the claws are equipped. + + /obj/item/clothing/suit/space/eva/vox name = "Vox EVA Suit" diff --git a/code/modules/clothing/spacesuits/breaches.dm b/code/modules/clothing/spacesuits/breaches.dm index 780a763b3bd..cd46fd580d9 100644 --- a/code/modules/clothing/spacesuits/breaches.dm +++ b/code/modules/clothing/spacesuits/breaches.dm @@ -55,7 +55,8 @@ var/global/list/breach_burn_descriptors = list( /obj/item/clothing/suit/space/proc/repair_breaches(var/damtype, var/amount, var/mob/user) if(!can_breach || !breaches || !breaches.len || !damage) - user << "There are no breaches to repair on \the [src]." + to_chat(user, "There are no breaches to repair on \the [src].") + return var/list/valid_breaches = list() @@ -65,7 +66,8 @@ var/global/list/breach_burn_descriptors = list( valid_breaches += B if(!valid_breaches.len) - user << "There are no breaches to repair on \the [src]." + to_chat(user, "There are no breaches to repair on \the [src].") + return var/amount_left = amount @@ -178,11 +180,13 @@ var/global/list/breach_burn_descriptors = list( if(istype(W,/obj/item/stack/sheet/mineral/plastic) || istype(W,/obj/item/stack/sheet/metal)) if(istype(src.loc,/mob/living)) - user << "\red How do you intend to patch a hardsuit while someone is wearing it?" + to_chat(user, "\red How do you intend to patch a hardsuit while someone is wearing it?") + return if(!damage || !burn_damage) - user << "There is no surface damage on \the [src] to repair." + to_chat(user, "There is no surface damage on \the [src] to repair.") + return var/obj/item/stack/sheet/P = W @@ -197,16 +201,19 @@ var/global/list/breach_burn_descriptors = list( else if(istype(W, /obj/item/weapon/weldingtool)) if(istype(src.loc,/mob/living)) - user << "\red How do you intend to patch a hardsuit while someone is wearing it?" + to_chat(user, "\red How do you intend to patch a hardsuit while someone is wearing it?") + return if (!damage || ! brute_damage) - user << "There is no structural damage on \the [src] to repair." + to_chat(user, "There is no structural damage on \the [src] to repair.") + return var/obj/item/weapon/weldingtool/WT = W if(!WT.remove_fuel(5)) - user << "\red You need more welding fuel to repair this suit." + to_chat(user, "\red You need more welding fuel to repair this suit.") + return repair_breaches(BRUTE, 3, user) @@ -218,4 +225,5 @@ var/global/list/breach_burn_descriptors = list( ..(user) if(can_breach && breaches && breaches.len) for(var/datum/breach/B in breaches) - user << "\red It has \a [B.descriptor]." \ No newline at end of file + to_chat(user, "\red It has \a [B.descriptor].") + diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm index f128220b4d6..46bd28dc368 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -61,7 +61,8 @@ switch(severity) if(1) if(user && ishuman(user) && (user.wear_suit == src)) - user << "Elecrtromagnetic pulse detected, shutting down systems to preserve integrity..." + to_chat(user, "Elecrtromagnetic pulse detected, shutting down systems to preserve integrity...") + deactivate() /obj/item/clothing/suit/space/chronos/proc/chronowalk(var/mob/living/carbon/human/user) @@ -131,24 +132,33 @@ var/mob/living/carbon/human/user = src.loc if(user && ishuman(user)) if(user.wear_suit == src) - user << "\nChronosuitMK4 login: root" - user << "Password:\n" - user << "root@ChronosuitMK4# chronowalk4 --start\n" + to_chat(user, "\nChronosuitMK4 login: root") + + to_chat(user, "Password:\n") + + to_chat(user, "root@ChronosuitMK4# chronowalk4 --start\n") + if(user.head && istype(user.head, /obj/item/clothing/head/helmet/space/chronos)) - user << "\[ ok \] Mounting /dev/helmet" + to_chat(user, "\[ ok \] Mounting /dev/helmet") + helmet = user.head helmet.flags |= NODROP helmet.suit = src src.flags |= NODROP - user << "\[ ok \] Starting brainwave scanner" - user << "\[ ok \] Starting ui display driver" - user << "\[ ok \] Initializing chronowalk4-view" + to_chat(user, "\[ ok \] Starting brainwave scanner") + + to_chat(user, "\[ ok \] Starting ui display driver") + + to_chat(user, "\[ ok \] Initializing chronowalk4-view") + new_camera(user) processing_objects.Add(src) activated = 1 else - user << "\[ fail \] Mounting /dev/helmet" - user << "FATAL: Unable to locate /dev/helmet. Aborting..." + to_chat(user, "\[ fail \] Mounting /dev/helmet") + + to_chat(user, "FATAL: Unable to locate /dev/helmet. Aborting...") + cooldown = world.time + cooldowntime activating = 0 return 0 @@ -159,18 +169,25 @@ var/mob/living/carbon/human/user = src.loc if(user && ishuman(user)) if(user.wear_suit == src) - user << "\nroot@ChronosuitMK4# chronowalk4 --stop\n" + to_chat(user, "\nroot@ChronosuitMK4# chronowalk4 --stop\n") + if(camera) - user << "\[ ok \] Sending TERM signal to chronowalk4-view" //yes I know they aren't a different color when shutting down, but they were too similar at a glance + to_chat(user, "\[ ok \] Sending TERM signal to chronowalk4-view")//yes I know they aren't a different color when shutting down, but they were too similar at a glance + + qdel(camera) if(helmet) - user << "\[ ok \] Stopping ui display driver" - user << "\[ ok \] Stopping brainwave scanner" - user << "\[ ok \] Unmounting /dev/helmet" + to_chat(user, "\[ ok \] Stopping ui display driver") + + to_chat(user, "\[ ok \] Stopping brainwave scanner") + + to_chat(user, "\[ ok \] Unmounting /dev/helmet") + helmet.flags &= ~NODROP helmet.suit = null helmet = null - user << "logout" + to_chat(user, "logout") + src.flags &= ~NODROP cooldown = world.time + cooldowntime * 1.5 activated = 0 diff --git a/code/modules/clothing/spacesuits/ert.dm b/code/modules/clothing/spacesuits/ert.dm index 669c10d34c3..cece5f9b414 100644 --- a/code/modules/clothing/spacesuits/ert.dm +++ b/code/modules/clothing/spacesuits/ert.dm @@ -17,11 +17,13 @@ camera.network = list("ERT") cameranet.removeCamera(camera) camera.c_tag = user.name - user << "\blue User scanned as [camera.c_tag]. Camera activated." + to_chat(user, "\blue User scanned as [camera.c_tag]. Camera activated.") + /obj/item/clothing/head/helmet/space/rig/ert/examine(mob/user) if(..(user, 1)) - user << "This helmet has a built-in camera. It's [camera ? "" : "in"]active." + to_chat(user, "This helmet has a built-in camera. It's [camera ? "" : "in"]active.") + /obj/item/clothing/suit/space/rig/ert name = "emergency response team suit" diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index ca4d59fbe6a..0b434a2aab2 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -22,7 +22,8 @@ /obj/item/clothing/suit/space/eva/plasmaman/examine(mob/user) ..(user) - user << "There are [extinguishes_left] extinguisher canisters left in this suit." + to_chat(user, "There are [extinguishes_left] extinguisher canisters left in this suit.") + /obj/item/clothing/suit/space/eva/plasmaman/proc/Extinguish(var/mob/user) var/mob/living/carbon/human/H=user @@ -32,7 +33,8 @@ next_extinguish = world.time + extinguish_cooldown extinguishes_left-- - H << "Your suit automatically extinguishes the fire." + to_chat(H, "Your suit automatically extinguishes the fire.") + H.ExtinguishMob() /obj/item/clothing/head/helmet/space/eva/plasmaman @@ -50,7 +52,9 @@ /obj/item/clothing/head/helmet/space/eva/plasmaman/attack_self(mob/user) if(!isturf(user.loc)) - user << "You cannot turn the light on while in this [user.loc]." //To prevent some lighting anomalities. + to_chat(user, "You cannot turn the light on while in this [user.loc].")//To prevent some lighting anomalities. + + return toggle_light(user) diff --git a/code/modules/clothing/spacesuits/rig.dm b/code/modules/clothing/spacesuits/rig.dm index 92862aa3861..4fd0961910a 100644 --- a/code/modules/clothing/spacesuits/rig.dm +++ b/code/modules/clothing/spacesuits/rig.dm @@ -31,7 +31,9 @@ /obj/item/clothing/head/helmet/space/rig/attack_self(mob/user) if(!isturf(user.loc)) - user << "You cannot turn the light on while in this [user.loc]." //To prevent some lighting anomalities. + to_chat(user, "You cannot turn the light on while in this [user.loc].")//To prevent some lighting anomalities. + + return toggle_light(user) @@ -104,9 +106,11 @@ if(attached_helmet && helmet) if(H.head) - M << "You are unable to deploy your suit's helmet as \the [H.head] is in the way." + to_chat(M, "You are unable to deploy your suit's helmet as \the [H.head] is in the way.") + else - M << "Your suit's helmet deploys with a hiss." + to_chat(M, "Your suit's helmet deploys with a hiss.") + //TODO: Species check, skull damage for forcing an unfitting helmet on? helmet.forceMove(H) H.equip_to_slot(helmet, slot_head) @@ -114,9 +118,11 @@ if(attached_boots && boots) if(H.shoes) - M << "You are unable to deploy your suit's magboots as \the [H.shoes] are in the way." + to_chat(M, "You are unable to deploy your suit's magboots as \the [H.shoes] are in the way.") + else - M << "Your suit's boots deploy with a hiss." + to_chat(M, "Your suit's boots deploy with a hiss.") + boots.forceMove(H) H.equip_to_slot(boots, slot_shoes) boots.flags |= NODROP @@ -151,7 +157,8 @@ return if(!helmet) - usr << "There is no helmet installed." + to_chat(usr, "There is no helmet installed.") + return var/mob/living/carbon/human/H = usr @@ -164,17 +171,20 @@ helmet.flags &= ~NODROP H.unEquip(helmet) helmet.loc = src - H << "You retract your hardsuit helmet." + to_chat(H, "You retract your hardsuit helmet.") + else if(H.head) - H << "You cannot deploy your helmet while wearing another helmet." + to_chat(H, "You cannot deploy your helmet while wearing another helmet.") + return //TODO: Species check, skull damage for forcing an unfitting helmet on? helmet.loc = H helmet.pickup(H) H.equip_to_slot(helmet, slot_head) helmet.flags |= NODROP - H << "You deploy your hardsuit helmet, sealing you off from the world." + to_chat(H, "You deploy your hardsuit helmet, sealing you off from the world.") + H.update_inv_head() /obj/item/clothing/suit/space/rig/attackby(obj/item/W as obj, mob/user as mob, params) @@ -182,33 +192,41 @@ return if(istype(src.loc,/mob/living)) - user << "How do you propose to modify a hardsuit while it is being worn?" + to_chat(user, "How do you propose to modify a hardsuit while it is being worn?") + return if(istype(W,/obj/item/weapon/screwdriver)) if(!helmet) - user << "\The [src] does not have a helmet installed." + to_chat(user, "\The [src] does not have a helmet installed.") + else - user << "You detach \the [helmet] from \the [src]'s helmet mount." + to_chat(user, "You detach \the [helmet] from \the [src]'s helmet mount.") + helmet.loc = get_turf(src) src.helmet = null return if(!boots) - user << "\The [src] does not have any boots installed." + to_chat(user, "\The [src] does not have any boots installed.") + else - user << "You detach \the [boots] from \the [src]'s boot mounts." + to_chat(user, "You detach \the [boots] from \the [src]'s boot mounts.") + boots.loc = get_turf(src) boots = null return else if(istype(W,/obj/item/clothing/head/helmet/space)) if(!attached_helmet) - user << "\The [src] does not have a helmet mount." + to_chat(user, "\The [src] does not have a helmet mount.") + return if(helmet) - user << "\The [src] already has a helmet installed." + to_chat(user, "\The [src] already has a helmet installed.") + else - user << "You attach \the [W] to \the [src]'s helmet mount." + to_chat(user, "You attach \the [W] to \the [src]'s helmet mount.") + user.drop_item() W.loc = src src.helmet = W @@ -216,13 +234,16 @@ else if(istype(W,/obj/item/clothing/shoes/magboots)) if(!attached_boots) - user << "\The [src] does not have boot mounts." + to_chat(user, "\The [src] does not have boot mounts.") + return if(boots) - user << "\The [src] already has magboots installed." + to_chat(user, "\The [src] already has magboots installed.") + else - user << "You attach \the [W] to \the [src]'s boot mounts." + to_chat(user, "You attach \the [W] to \the [src]'s boot mounts.") + user.drop_item() W.loc = src boots = W @@ -304,12 +325,15 @@ /obj/item/clothing/head/helmet/space/rig/syndi/attack_self(mob/user) if(!isturf(user.loc)) - user << "You cannot toggle your helmet while in this [user.loc]." //To prevent some lighting anomalities. + to_chat(user, "You cannot toggle your helmet while in this [user.loc].")//To prevent some lighting anomalities. + + return on = !on if(on) - user << "You switch your helmet to travel mode. It will allow you to stand in zero pressure environments, at the cost of speed and armor." + to_chat(user, "You switch your helmet to travel mode. It will allow you to stand in zero pressure environments, at the cost of speed and armor.") + name = "blood-red hardsuit helmet" desc = "A dual-mode advanced helmet designed for work in special operations. It is in travel mode. Property of Gorlex Marauders." flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | THICKMATERIAL | NODROP @@ -317,7 +341,8 @@ cold_protection = HEAD set_light(brightness_on) else - user << "You switch your helmet to combat mode. You will take damage in zero pressure environments, but you are more suited for a fight." + to_chat(user, "You switch your helmet to combat mode. You will take damage in zero pressure environments, but you are more suited for a fight.") + name = "blood-red hardsuit helmet (combat)" desc = "A dual-mode advanced helmet designed for work in special operations. It is in combat mode. Property of Gorlex Marauders." flags = BLOCKHAIR | THICKMATERIAL | NODROP @@ -348,7 +373,8 @@ /obj/item/clothing/suit/space/rig/syndi/attack_self(mob/user) on = !on if(on) - user << "You switch your hardsuit to travel mode. It will allow you to stand in zero pressure environments, at the cost of speed and armor." + to_chat(user, "You switch your hardsuit to travel mode. It will allow you to stand in zero pressure environments, at the cost of speed and armor.") + name = "blood-red hardsuit" desc = "A dual-mode advanced hardsuit designed for work in special operations. It is in travel mode. Property of Gorlex Marauders." slowdown = 1 @@ -356,7 +382,8 @@ flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS else - user << "You switch your hardsuit to combat mode. You will take damage in zero pressure environments, but you are more suited for a fight." + to_chat(user, "You switch your hardsuit to combat mode. You will take damage in zero pressure environments, but you are more suited for a fight.") + name = "blood-red hardsuit (combat)" desc = "A dual-mode advanced hardsuit designed for work in special operations. It is in combat mode. Property of Gorlex Marauders." slowdown = 0 diff --git a/code/modules/clothing/spacesuits/rig/modules/combat.dm b/code/modules/clothing/spacesuits/rig/modules/combat.dm index 5dc87417901..b555fdd2050 100644 --- a/code/modules/clothing/spacesuits/rig/modules/combat.dm +++ b/code/modules/clothing/spacesuits/rig/modules/combat.dm @@ -51,10 +51,12 @@ return 0 if(accepted_item.charges >= 5) - user << "Another grenade of that type will not fit into the module." + to_chat(user, "Another grenade of that type will not fit into the module.") + return 0 - user << "You slot \the [input_device] into the suit module." + to_chat(user, "You slot \the [input_device] into the suit module.") + user.unEquip(input_device) qdel(input_device) accepted_item.charges++ @@ -71,7 +73,8 @@ var/mob/living/carbon/human/H = holder.wearer if(!charge_selected) - H << "You have not selected a grenade type." + to_chat(H, "You have not selected a grenade type.") + return 0 var/datum/rig_charge/charge = charges[charge_selected] @@ -80,7 +83,8 @@ return 0 if(charge.charges <= 0) - H << "Insufficient grenades!" + to_chat(H, "Insufficient grenades!") + return 0 charge.charges-- @@ -186,7 +190,8 @@ var/mob/living/M = holder.wearer if(M.l_hand && M.r_hand) - M << "Your hands are full." + to_chat(M, "Your hands are full.") + deactivate() return @@ -238,11 +243,13 @@ firing.throw_at(target,fire_force,fire_distance) else if(H.l_hand && H.r_hand) - H << "Your hands are full." + to_chat(H, "Your hands are full.") + else var/obj/item/new_weapon = new fabrication_type() new_weapon.forceMove(H) - H << "You quickly fabricate \a [new_weapon]." + to_chat(H, "You quickly fabricate \a [new_weapon].") + H.put_in_hands(new_weapon) return 1 diff --git a/code/modules/clothing/spacesuits/rig/modules/computer.dm b/code/modules/clothing/spacesuits/rig/modules/computer.dm index 44bb65e9e10..6059173f090 100644 --- a/code/modules/clothing/spacesuits/rig/modules/computer.dm +++ b/code/modules/clothing/spacesuits/rig/modules/computer.dm @@ -15,12 +15,14 @@ set src in usr if(!usr.loc || !usr.loc.loc || !istype(usr.loc.loc, /obj/item/rig_module)) - usr << "You are not loaded into a hardsuit." + to_chat(usr, "You are not loaded into a hardsuit.") + return var/obj/item/rig_module/module = usr.loc.loc if(!module.holder) - usr << "Your module is not installed in a hardsuit." + to_chat(usr, "Your module is not installed in a hardsuit.") + return module.holder.ui_interact(usr, nano_state = contained_state) @@ -160,9 +162,11 @@ if(istype(ai_card, /obj/item/device/aicard)) if(integrated_ai && !integrated_ai.stat) if(user) - user << "You cannot eject your currently stored AI. Purge it manually." + to_chat(user, "You cannot eject your currently stored AI. Purge it manually.") + return 0 - user << "You purge the remaining scraps of data from your previous AI, freeing it for use." + to_chat(user, "You purge the remaining scraps of data from your previous AI, freeing it for use.") + if(integrated_ai) integrated_ai.ghostize() qdel(integrated_ai) @@ -209,8 +213,10 @@ user.unEquip(ai) ai.forceMove(src) ai_card = ai - ai_mob << "You have been transferred to \the [holder]'s [src]." - user << "You load [ai_mob] into \the [holder]'s [src]." + to_chat(ai_mob, "You have been transferred to \the [holder]'s [src].") + + to_chat(user, "You load [ai_mob] into \the [holder]'s [src].") + integrated_ai = ai_mob @@ -218,9 +224,11 @@ integrated_ai = null eject_ai() else - user << "There is no active AI within \the [ai]." + to_chat(user, "There is no active AI within \the [ai].") + else - user << "There is no active AI within \the [ai]." + to_chat(user, "There is no active AI within \the [ai].") + update_verb_holder() /obj/item/rig_module/datajack @@ -257,16 +265,20 @@ /obj/item/rig_module/datajack/accepts_item(var/obj/item/input_device, var/mob/living/user) if(istype(input_device,/obj/item/weapon/disk/tech_disk)) - user << "You slot the disk into [src]." + to_chat(user, "You slot the disk into [src].") + var/obj/item/weapon/disk/tech_disk/disk = input_device if(disk.stored) if(load_data(disk.stored)) - user << "Download successful; disk erased." + to_chat(user, "Download successful; disk erased.") + disk.stored = null else - user << "The disk is corrupt. It is useless to you." + to_chat(user, "The disk is corrupt. It is useless to you.") + else - user << "The disk is blank. It is useless to you." + to_chat(user, "The disk is blank. It is useless to you.") + return 1 // I fucking hate R&D code. This typecheck spam would be totally unnecessary in a sane setup. @@ -283,13 +295,16 @@ incoming_files = input_machine.files if(!incoming_files || !incoming_files.known_tech || !incoming_files.known_tech.len) - user << "Memory failure. There is nothing accessible stored on this terminal." + to_chat(user, "Memory failure. There is nothing accessible stored on this terminal.") + else // Maybe consider a way to drop all your data into a target repo in the future. if(load_data(incoming_files.known_tech)) - user << "Download successful; local and remote repositories synchronized." + to_chat(user, "Download successful; local and remote repositories synchronized.") + else - user << "Scan complete. There is nothing useful stored on this terminal." + to_chat(user, "Scan complete. There is nothing useful stored on this terminal.") + return 1 return 0 @@ -369,7 +384,8 @@ if(interfaced_with) if(holder && holder.wearer) - holder.wearer << "Your power sink retracts as the module deactivates." + to_chat(holder.wearer, "Your power sink retracts as the module deactivates.") + drain_complete() interfaced_with = null total_power_drained = 0 @@ -401,7 +417,8 @@ if(target.drain_power(1) <= 0) return 0 - H << "You begin draining power from [target]!" + to_chat(H, "You begin draining power from [target]!") + interfaced_with = target drain_loc = interfaced_with.loc @@ -433,17 +450,20 @@ playsound(H.loc, 'sound/effects/sparks2.ogg', 50, 1) if(!holder.cell) - H << "Your power sink flashes an error; there is no cell in your rig." + to_chat(H, "Your power sink flashes an error; there is no cell in your rig.") + drain_complete(H) return if(!interfaced_with || !interfaced_with.Adjacent(H) || !(interfaced_with.loc == drain_loc)) - H << "Your power sink retracts into its casing." + to_chat(H, "Your power sink retracts into its casing.") + drain_complete(H) return if(holder.cell.fully_charged()) - H << "Your power sink flashes an amber light; your rig cell is full." + to_chat(H, "Your power sink flashes an amber light; your rig cell is full.") + drain_complete(H) return @@ -451,7 +471,8 @@ var/to_drain = min(40000, ((holder.cell.maxcharge - holder.cell.charge) / CELLRATE)) var/target_drained = interfaced_with.drain_power(0,0,to_drain) if(target_drained <= 0) - H << "Your power sink flashes a red light; there is no power left in [interfaced_with]." + to_chat(H, "Your power sink flashes a red light; there is no power left in [interfaced_with].") + drain_complete(H) return @@ -463,9 +484,11 @@ /obj/item/rig_module/power_sink/proc/drain_complete(var/mob/living/M) if(!interfaced_with) - if(M) M << "Total power drained: [round(total_power_drained/1000)]kJ." + to_chat(if(M) M, "Total power drained: [round(total_power_drained/1000)]kJ.") + else - if(M) M << "Total power drained from [interfaced_with]: [round(total_power_drained/1000)]kJ." + to_chat(if(M) M, "Total power drained from [interfaced_with]: [round(total_power_drained/1000)]kJ.") + interfaced_with.drain_power(0,1,0) // Damage the victim. drain_loc = null diff --git a/code/modules/clothing/spacesuits/rig/modules/modules.dm b/code/modules/clothing/spacesuits/rig/modules/modules.dm index 6e19fab742c..ae790b74f6b 100644 --- a/code/modules/clothing/spacesuits/rig/modules/modules.dm +++ b/code/modules/clothing/spacesuits/rig/modules/modules.dm @@ -57,28 +57,34 @@ ..() switch(damage) if(0) - usr << "It is undamaged." + to_chat(usr, "It is undamaged.") + if(1) - usr << "It is badly damaged." + to_chat(usr, "It is badly damaged.") + if(2) - usr << "It is almost completely destroyed." + to_chat(usr, "It is almost completely destroyed.") + /obj/item/rig_module/attackby(obj/item/W as obj, mob/user as mob) if(istype(W,/obj/item/stack/nanopaste)) if(damage == 0) - user << "There is no damage to mend." + to_chat(user, "There is no damage to mend.") + return - user << "You start mending the damaged portions of \the [src]..." + to_chat(user, "You start mending the damaged portions of \the [src]...") + if(!do_after(user,30, target = src) || !W || !src) return var/obj/item/stack/nanopaste/paste = W damage = 0 - user << "You mend the damage to [src] with [W]." + to_chat(user, "You mend the damage to [src] with [W].") + paste.use(1) return @@ -86,23 +92,28 @@ switch(damage) if(0) - user << "There is no damage to mend." + to_chat(user, "There is no damage to mend.") + return if(2) - user << "There is no damage that you are capable of mending with such crude tools." + to_chat(user, "There is no damage that you are capable of mending with such crude tools.") + return var/obj/item/stack/cable_coil/cable = W if(!cable.amount >= 5) - user << "You need five units of cable to repair \the [src]." + to_chat(user, "You need five units of cable to repair \the [src].") + return - user << "You start mending the damaged portions of \the [src]..." + to_chat(user, "You start mending the damaged portions of \the [src]...") + if(!do_after(user, 30, target = src) || !W || !src) return damage = 1 - user << "You mend some of damage to [src] with [W], but you will need more advanced tools to fix it completely." + to_chat(user, "You mend some of damage to [src] with [W], but you will need more advanced tools to fix it completely.") + cable.use(5) return ..() @@ -142,27 +153,33 @@ /obj/item/rig_module/proc/engage() if(damage >= 2) - usr << "The [interface_name] is damaged beyond use!" + to_chat(usr, "The [interface_name] is damaged beyond use!") + return 0 if(world.time < next_use) - usr << "You cannot use the [interface_name] again so soon." + to_chat(usr, "You cannot use the [interface_name] again so soon.") + return 0 if(!holder || (!(holder.flags & NODROP))) - usr << "The suit is not initialized." + to_chat(usr, "The suit is not initialized.") + return 0 if(usr.lying || usr.stat || usr.stunned || usr.paralysis || usr.weakened) - usr << "You cannot use the suit in this state." + to_chat(usr, "You cannot use the suit in this state.") + return 0 if(holder.wearer && holder.wearer.lying) - usr << "The suit cannot function while the wearer is prone." + to_chat(usr, "The suit cannot function while the wearer is prone.") + return 0 if(holder.security_check_enabled && !holder.check_suit_access(usr)) - usr << "Access denied." + to_chat(usr, "Access denied.") + return 0 if(!holder.check_power_cost(usr, use_power_cost, 0, src, (istype(usr,/mob/living/silicon ? 1 : 0) ) ) ) diff --git a/code/modules/clothing/spacesuits/rig/modules/ninja.dm b/code/modules/clothing/spacesuits/rig/modules/ninja.dm index 138978d2c06..5db07ba037c 100644 --- a/code/modules/clothing/spacesuits/rig/modules/ninja.dm +++ b/code/modules/clothing/spacesuits/rig/modules/ninja.dm @@ -37,7 +37,8 @@ var/mob/living/carbon/human/H = holder.wearer - H << "You are now invisible to normal detection." + to_chat(H, "You are now invisible to normal detection.") + H.invisibility = INVISIBILITY_LEVEL_TWO anim(get_turf(H), H, 'icons/effects/effects.dmi', "electricity",null,20,null) @@ -51,7 +52,8 @@ var/mob/living/carbon/human/H = holder.wearer - H << "You are now visible." + to_chat(H, "You are now visible.") + H.invisibility = 0 anim(get_turf(H), H,'icons/mob/mob.dmi',,"uncloak",,H.dir) @@ -102,7 +104,8 @@ var/mob/living/carbon/human/H = holder.wearer if(!istype(H.loc, /turf)) - H << "You cannot teleport out of your current location." + to_chat(H, "You cannot teleport out of your current location.") + return 0 var/turf/T @@ -112,11 +115,13 @@ T = get_teleport_loc(get_turf(H), H, rand(5, 9)) /*if(!T || T.density) - H << "You cannot teleport into solid walls." + to_chat(H, "You cannot teleport into solid walls.") + return 0*///Who the fuck cares? Ninjas in walls are cool. if(T.z in config.admin_levels) - H << "You cannot use your teleporter on this Z-level." + to_chat(H, "You cannot use your teleporter on this Z-level.") + return 0 phase_out(H,get_turf(H)) diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm index 26159df516f..7d68a18986a 100644 --- a/code/modules/clothing/spacesuits/rig/modules/utility.dm +++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm @@ -164,7 +164,8 @@ return 0 if(!input_item.reagents || !input_item.reagents.total_volume) - user << "\The [input_item] is empty." + to_chat(user, "\The [input_item] is empty.") + return 0 // Magical chemical filtration system, do not question it. @@ -186,9 +187,11 @@ break if(total_transferred) - user << "You transfer [total_transferred] units into the suit reservoir." + to_chat(user, "You transfer [total_transferred] units into the suit reservoir.") + else - user << "None of the reagents seem suitable." + to_chat(user, "None of the reagents seem suitable.") + return 1 /obj/item/rig_module/chem_dispenser/engage(atom/target) @@ -199,7 +202,8 @@ var/mob/living/carbon/human/H = holder.wearer if(!charge_selected) - H << "You have not selected a chemical type." + to_chat(H, "You have not selected a chemical type.") + return 0 var/datum/rig_charge/charge = charges[charge_selected] @@ -209,7 +213,8 @@ var/chems_to_use = 10 if(charge.charges <= 0) - H << "Insufficient chems!" + to_chat(H, "Insufficient chems!") + return 0 else if(charge.charges < chems_to_use) chems_to_use = charge.charges @@ -224,8 +229,10 @@ target_mob = H if(target_mob != H) - H << "You inject [target_mob] with [chems_to_use] unit\s of [charge.display_name]." - target_mob << "You feel a rushing in your veins as [chems_to_use] unit\s of [charge.display_name] [chems_to_use == 1 ? "is" : "are"] injected." + to_chat(H, "You inject [target_mob] with [chems_to_use] unit\s of [charge.display_name].") + + to_chat(target_mob, "You feel a rushing in your veins as [chems_to_use] unit\s of [charge.display_name] [chems_to_use == 1 ? "is" : "are"] injected.") + target_mob.reagents.add_reagent(charge.display_name, chems_to_use) charge.charges -= chems_to_use @@ -299,17 +306,20 @@ if("Enable") active = 1 voice_holder.active = 1 - usr << "You enable the speech synthesiser." + to_chat(usr, "You enable the speech synthesiser.") + if("Disable") active = 0 voice_holder.active = 0 - usr << "You disable the speech synthesiser." + to_chat(usr, "You disable the speech synthesiser.") + if("Set Name") var/raw_choice = sanitize(input(usr, "Please enter a new name.") as text|null, MAX_NAME_LEN) if(!raw_choice) return 0 voice_holder.voice = raw_choice - usr << "You are now mimicking [voice_holder.voice]." + to_chat(usr, "You are now mimicking [voice_holder.voice].") + return 1 /obj/item/rig_module/maneuvering_jets @@ -435,10 +445,12 @@ if(!target) if(device == iastamp) device = deniedstamp - holder.wearer << "Switched to denied stamp." + to_chat(holder.wearer, "Switched to denied stamp.") + else if(device == deniedstamp) device = iastamp - holder.wearer << "Switched to internal affairs stamp." + to_chat(holder.wearer, "Switched to internal affairs stamp.") + return 1 /obj/item/rig_module/welding_tank @@ -472,9 +484,11 @@ if(istype(W)) fill_welder(W) else - holder.wearer << "Your welding tank is out of fuel!" + to_chat(holder.wearer, "Your welding tank is out of fuel!") + else - holder.wearer << "You need to have a welding tool in one of your hands to dispense fuel." + to_chat(holder.wearer, "You need to have a welding tool in one of your hands to dispense fuel.") + /obj/item/rig_module/welding_tank/proc/fill_welder(var/obj/item/weapon/weldingtool/W) if(!istype(W)) @@ -483,10 +497,12 @@ if(reagents) if(get_fuel() >= W.max_fuel) reagents.trans_to(W, W.max_fuel) - holder.wearer << "Your [holder] dispenses some of the contents of the welding fuel tank into \the [W]." + to_chat(holder.wearer, "Your [holder] dispenses some of the contents of the welding fuel tank into \the [W].") + else reagents.trans_to(W, W.max_fuel) - holder.wearer << "You hear a faint dripping as your hardsuit welding tank completely empties." + to_chat(holder.wearer, "You hear a faint dripping as your hardsuit welding tank completely empties.") + W.update_icon() /obj/item/rig_module/welding_tank/proc/get_fuel() diff --git a/code/modules/clothing/spacesuits/rig/modules/vision.dm b/code/modules/clothing/spacesuits/rig/modules/vision.dm index aa106eda02a..f4db1864ffc 100644 --- a/code/modules/clothing/spacesuits/rig/modules/vision.dm +++ b/code/modules/clothing/spacesuits/rig/modules/vision.dm @@ -160,7 +160,8 @@ // Don't cycle if this engage() is being called by activate(). if(starting_up) - holder.wearer << "You activate your visual sensors." + to_chat(holder.wearer, "You activate your visual sensors.") + return 1 if(vision_modes.len > 1) @@ -169,9 +170,11 @@ vision_index = 1 vision = vision_modes[vision_index] - holder.wearer << "You cycle your sensors to [vision.mode] mode." + to_chat(holder.wearer, "You cycle your sensors to [vision.mode] mode.") + else - holder.wearer << "Your sensors only have one mode." + to_chat(holder.wearer, "Your sensors only have one mode.") + return 1 /obj/item/rig_module/vision/New() diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index 114ad9d7b35..d44baeab2d4 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -82,17 +82,22 @@ var/datum/effect/system/spark_spread/spark_system /obj/item/weapon/rig/examine() - usr << "This is \icon[src][src.name]." - usr << "[src.desc]" + to_chat(usr, "This is \icon[src][src.name].") + + to_chat(usr, "[src.desc]") + if(wearer) for(var/obj/item/piece in list(helmet,gloves,chest,boots)) if(!piece || piece.loc != wearer) continue - usr << "\icon[piece] \The [piece] [piece.gender == PLURAL ? "are" : "is"] deployed." + to_chat(usr, "\icon[piece] \The [piece] [piece.gender == PLURAL ? "are" : "is"] deployed.") + if(src.loc == usr) - usr << "The maintenance panel is [open ? "open" : "closed"]." - usr << "Hardsuit systems are [offline ? "offline" : "online"]." + to_chat(usr, "The maintenance panel is [open ? "open" : "closed"].") + + to_chat(usr, "Hardsuit systems are [offline ? "offline" : "online"].") + /obj/item/weapon/rig/New() ..() @@ -214,7 +219,9 @@ if(!instant) M.visible_message("[M]'s suit emits a quiet hum as it begins to adjust its seals.","With a quiet hum, the suit begins running checks and adjusting components.") if(seal_delay && !do_after(user, seal_delay, target = M)) - if(user) user << "You must remain still while the suit is adjusting the components." + if(user) + to_chat(user, "You must remain still while the suit is adjusting the components.") + failed_to_seal = 1 if(!M) @@ -231,7 +238,9 @@ continue if(!istype(M) || !istype(piece) || !istype(compare_piece) || !msg_type) - if(M) M << "You must remain still while the suit is adjusting the components." + if(M) + to_chat(M, "You must remain still while the suit is adjusting the components.") + failed_to_seal = 1 break @@ -243,16 +252,20 @@ piece.icon_state = "[initial(icon_state)][!seal_target ? "_sealed" : ""]" switch(msg_type) if("boots") - M << "\The [piece] [!seal_target ? "seal around your feet" : "relax their grip on your legs"]." + to_chat(M, "\The [piece] [!seal_target ? "seal around your feet" : "relax their grip on your legs"].") + M.update_inv_shoes() if("gloves") - M << "\The [piece] [!seal_target ? "tighten around your fingers and wrists" : "become loose around your fingers"]." + to_chat(M, "\The [piece] [!seal_target ? "tighten around your fingers and wrists" : "become loose around your fingers"].") + M.update_inv_gloves() if("chest") - M << "\The [piece] [!seal_target ? "cinches tight again your chest" : "releases your chest"]." + to_chat(M, "\The [piece] [!seal_target ? "cinches tight again your chest" : "releases your chest"].") + M.update_inv_wear_suit() if("helmet") - M << "\The [piece] hisses [!seal_target ? "closed" : "open"]." + to_chat(M, "\The [piece] hisses [!seal_target ? "closed" : "open"].") + M.update_inv_head() if(helmet) helmet.update_light(wearer) @@ -289,7 +302,8 @@ flags &= ~NODROP else flags |= NODROP - M << "Your entire suit [!(flags & NODROP) ? "loosens as the components relax" : "tightens around you as the components lock into place"]." + to_chat(M, "Your entire suit [!(flags & NODROP) ? "loosens as the components relax" : "tightens around you as the components lock into place"].") + if(!(flags & NODROP)) for(var/obj/item/rig_module/module in installed_modules) @@ -326,13 +340,17 @@ if(istype(wearer)) if(flags & NODROP) if (offline_slowdown < 3) - wearer << "Your suit beeps stridently, and suddenly goes dead." + to_chat(wearer, "Your suit beeps stridently, and suddenly goes dead.") + else - wearer << "Your suit beeps stridently, and suddenly you're wearing a leaden mass of metal and plastic composites instead of a powered suit." + to_chat(wearer, "Your suit beeps stridently, and suddenly you're wearing a leaden mass of metal and plastic composites instead of a powered suit.") + if(offline_vision_restriction == 1) - wearer << "The suit optics flicker and die, leaving you with restricted vision." + to_chat(wearer, "The suit optics flicker and die, leaving you with restricted vision.") + else if(offline_vision_restriction == 2) - wearer << "The suit optics drop out completely, drowning you in darkness." + to_chat(wearer, "The suit optics drop out completely, drowning you in darkness.") + if(!offline) offline = 1 if(istype(wearer) && wearer.wearing_rig) @@ -387,7 +405,8 @@ fail_msg = "Not enough stored power." if(fail_msg) - user << "[fail_msg]" + to_chat(user, "[fail_msg]") + return 0 // This is largely for cancelling stealth and whatever. @@ -513,11 +532,13 @@ if(user.back != src) return 0 else if(!src.allowed(user)) - user << "Unauthorized user. Access denied." + to_chat(user, "Unauthorized user. Access denied.") + return 0 else if(!ai_override_enabled) - user << "Synthetic access disabled. Please consult hardware provider." + to_chat(user, "Synthetic access disabled. Please consult hardware provider.") + return 0 return 1 @@ -566,7 +587,8 @@ for(var/obj/item/rig_module/module in installed_modules) for(var/mob/living/silicon/ai/ai in module.contents) if(ai && ai.client && !ai.stat) - ai << "[message]" + to_chat(ai, "[message]") + /obj/item/weapon/rig/equipped(mob/living/carbon/human/M) ..() @@ -632,7 +654,8 @@ holder = use_obj.loc if(istype(holder)) if(use_obj && check_slot == use_obj) - H << "Your [use_obj.name] [use_obj.gender == PLURAL ? "retract" : "retracts"] swiftly." + to_chat(H, "Your [use_obj.name] [use_obj.gender == PLURAL ? "retract" : "retracts"] swiftly.") + use_obj.flags &= ~NODROP holder.unEquip(use_obj, 1) use_obj.forceMove(src) @@ -640,7 +663,8 @@ else if (deploy_mode != ONLY_RETRACT) if(check_slot) if(check_slot != use_obj) - H << "You are unable to deploy \the [piece] as \the [check_slot] [check_slot.gender == PLURAL ? "are" : "is"] in the way." + to_chat(H, "You are unable to deploy \the [piece] as \the [check_slot] [check_slot.gender == PLURAL ? "are" : "is"] in the way.") + return else use_obj.forceMove(H) @@ -648,7 +672,8 @@ if(!H.equip_to_slot_if_possible(use_obj, equip_to, 0, 1)) use_obj.forceMove(src) else - H << "Your [use_obj.name] [use_obj.gender == PLURAL ? "deploy" : "deploys"] swiftly." + to_chat(H, "Your [use_obj.name] [use_obj.gender == PLURAL ? "deploy" : "deploys"] swiftly.") + use_obj.flags |= NODROP if(piece == "helmet" && helmet) @@ -764,17 +789,21 @@ if(wearer) if(dam_module.damage >= 2) - wearer << "The [source] has disabled your [dam_module.interface_name]!" + to_chat(wearer, "The [source] has disabled your [dam_module.interface_name]!") + else - wearer << "The [source] has damaged your [dam_module.interface_name]!" + to_chat(wearer, "The [source] has damaged your [dam_module.interface_name]!") + dam_module.deactivate() /obj/item/weapon/rig/proc/malfunction_check(var/mob/living/carbon/human/user) if(malfunction_delay) if(offline) - user << "The suit is completely unresponsive." + to_chat(user, "The suit is completely unresponsive.") + else - user << "ERROR: Hardware fault. Rebooting interface..." + to_chat(user, "ERROR: Hardware fault. Rebooting interface...") + return 1 return 0 @@ -798,17 +827,24 @@ return 0 var/obj/item/rig_module/ai_container/module = user.loc.loc if(!istype(module) || module.damage >= 2) - user << "Your host module is unable to interface with the suit." + to_chat(user, "Your host module is unable to interface with the suit.") + return 0 if(offline || !cell || !cell.charge || locked_down) - if(user) user << "Your host rig is unpowered and unresponsive." + if(user) + to_chat(user, "Your host rig is unpowered and unresponsive.") + return 0 if(!wearer || wearer.back != src) - if(user) user << "Your host rig is not being worn." + if(user) + to_chat(user, "Your host rig is not being worn.") + return 0 if(!wearer.stat && !control_overridden && !ai_override_enabled) - if(user) user << "You are locked out of the suit servo controller." + if(user) + to_chat(user, "You are locked out of the suit servo controller.") + return 0 return 1 @@ -816,7 +852,8 @@ if(!ai_can_move_suit(user, check_user_module = 1)) return wearer.lay_down() - user << "\The [wearer] is now [wearer.resting ? "resting" : "getting up"]." + to_chat(user, "\The [wearer] is now [wearer.resting ? "resting" : "getting up"].") + /obj/item/weapon/rig/proc/forced_move(var/direction, var/mob/user) @@ -856,13 +893,15 @@ for(var/mob/M in range(wearer, 1)) if(M.pulling == wearer) if(!M.restrained() && M.stat == 0 && M.canmove && wearer.Adjacent(M)) - user << "Your host is restrained! They can't move!" + to_chat(user, "Your host is restrained! They can't move!") + return 0 else M.stop_pulling() if(wearer.pinned.len) - src << "Your host is pinned to a wall by [wearer.pinned[1]]!" + to_chat(src, "Your host is pinned to a wall by [wearer.pinned[1]]!") + return 0 // AIs are a bit slower than regular and ignore move intent. diff --git a/code/modules/clothing/spacesuits/rig/rig_attackby.dm b/code/modules/clothing/spacesuits/rig/rig_attackby.dm index d00d4b87abf..26912b6c005 100644 --- a/code/modules/clothing/spacesuits/rig/rig_attackby.dm +++ b/code/modules/clothing/spacesuits/rig/rig_attackby.dm @@ -14,30 +14,36 @@ if(W.GetID()) if(subverted) locked = 0 - user << "It looks like the locking system has been shorted out." + to_chat(user, "It looks like the locking system has been shorted out.") + return if((!req_access || !req_access.len) && (!req_one_access || !req_one_access.len)) locked = 0 - user << "\The [src] doesn't seem to have a locking mechanism." + to_chat(user, "\The [src] doesn't seem to have a locking mechanism.") + return if(security_check_enabled && !src.allowed(user)) - user << "Access denied." + to_chat(user, "Access denied.") + return locked = !locked - user << "You [locked ? "lock" : "unlock"] \the [src] access panel." + to_chat(user, "You [locked ? "lock" : "unlock"] \the [src] access panel.") + return else if(istype(W,/obj/item/weapon/crowbar)) if(!open && locked) - user << "The access panel is locked shut." + to_chat(user, "The access panel is locked shut.") + return open = !open - user << "You [open ? "open" : "close"] the access panel." + to_chat(user, "You [open ? "open" : "close"] the access panel.") + return if(open) @@ -47,19 +53,22 @@ if(open) wires.Interact(user) else - user << "You can't reach the wiring." + to_chat(user, "You can't reach the wiring.") + return // Air tank. if(istype(W,/obj/item/weapon/tank)) //Todo, some kind of check for suits without integrated air supplies. if(air_supply) - user << "\The [src] already has a tank installed." + to_chat(user, "\The [src] already has a tank installed.") + return user.unEquip(W) air_supply = W W.forceMove(src) - user << "You slot [W] into [src] and tighten the connecting valve." + to_chat(user, "You slot [W] into [src] and tighten the connecting valve.") + return // Check if this is a hardsuit upgrade or a modification. @@ -68,23 +77,27 @@ if(istype(src.loc,/mob/living/carbon/human)) var/mob/living/carbon/human/H = src.loc if(H.back == src) - user << "You can't install a hardsuit module while the suit is being worn." + to_chat(user, "You can't install a hardsuit module while the suit is being worn.") + return 1 if(!installed_modules) installed_modules = list() if(installed_modules.len) for(var/obj/item/rig_module/installed_mod in installed_modules) if(!installed_mod.redundant && istype(installed_mod,W)) - user << "The hardsuit already has a module of that class installed." + to_chat(user, "The hardsuit already has a module of that class installed.") + return 1 var/obj/item/rig_module/mod = W - user << "You begin installing \the [mod] into \the [src]." + to_chat(user, "You begin installing \the [mod] into \the [src].") + if(!do_after(user,40, target = src)) return if(!user || !W) return - user << "You install \the [mod] into \the [src]." + to_chat(user, "You install \the [mod] into \the [src].") + user.unEquip(mod) installed_modules |= mod mod.forceMove(src) @@ -94,7 +107,8 @@ else if(!cell && istype(W,/obj/item/weapon/stock_parts/cell)) - user << "You jack \the [W] into \the [src]'s battery mount." + to_chat(user, "You jack \the [W] into \the [src]'s battery mount.") + user.unEquip(W) W.forceMove(src) src.cell = W @@ -103,14 +117,16 @@ else if(istype(W,/obj/item/weapon/wrench)) if(!air_supply) - user << "There is not tank to remove." + to_chat(user, "There is not tank to remove.") + return if(user.r_hand && user.l_hand) air_supply.forceMove(get_turf(user)) else user.put_in_hands(air_supply) - user << "You detach and remove \the [air_supply]." + to_chat(user, "You detach and remove \the [air_supply].") + air_supply = null return @@ -127,7 +143,8 @@ if(istype(src.loc,/mob/living/carbon/human) && to_remove != "cell") var/mob/living/carbon/human/H = src.loc if(H.back == src) - user << "You can't remove an installed device while the hardsuit is being worn." + to_chat(user, "You can't remove an installed device while the hardsuit is being worn.") + return switch(to_remove) @@ -135,7 +152,8 @@ if("cell") if(cell) - user << "You detatch \the [cell] from \the [src]'s battery mount." + to_chat(user, "You detatch \the [cell] from \the [src]'s battery mount.") + for(var/obj/item/rig_module/module in installed_modules) module.deactivate() if(user.r_hand && user.l_hand) @@ -144,7 +162,8 @@ cell.forceMove(user.put_in_hands(cell)) cell = null else - user << "There is nothing loaded in that mount." + to_chat(user, "There is nothing loaded in that mount.") + if("system module") @@ -155,7 +174,8 @@ possible_removals[module.name] = module if(!possible_removals.len) - user << "There are no installed modules to remove." + to_chat(user, "There are no installed modules to remove.") + return var/removal_choice = input("Which module would you like to remove?") as null|anything in possible_removals @@ -163,7 +183,8 @@ return var/obj/item/rig_module/removed = possible_removals[removal_choice] - user << "You detatch \the [removed] from \the [src]." + to_chat(user, "You detatch \the [removed] from \the [src].") + removed.forceMove(get_turf(src)) removed.removed() installed_modules -= removed @@ -192,5 +213,6 @@ req_one_access.Cut() locked = 0 subverted = 1 - user << "You short out the access protocol for the suit." + to_chat(user, "You short out the access protocol for the suit.") + return 1 diff --git a/code/modules/clothing/spacesuits/rig/rig_pieces.dm b/code/modules/clothing/spacesuits/rig/rig_pieces.dm index ba3501c8c9e..41f58657611 100644 --- a/code/modules/clothing/spacesuits/rig/rig_pieces.dm +++ b/code/modules/clothing/spacesuits/rig/rig_pieces.dm @@ -22,7 +22,9 @@ /obj/item/clothing/head/helmet/space/new_rig/attack_self(mob/user) if(!isturf(user.loc)) - user << "You cannot turn the light on while in this [user.loc]." //To prevent some lighting anomalities. + to_chat(user, "You cannot turn the light on while in this [user.loc].")//To prevent some lighting anomalities. + + return toggle_light(user) diff --git a/code/modules/clothing/spacesuits/rig/rig_verbs.dm b/code/modules/clothing/spacesuits/rig/rig_verbs.dm index 6f1711b7b90..acd84334bac 100644 --- a/code/modules/clothing/spacesuits/rig/rig_verbs.dm +++ b/code/modules/clothing/spacesuits/rig/rig_verbs.dm @@ -17,21 +17,24 @@ set src = usr.contents if(!istype(wearer) || !wearer.back == src) - usr << "The hardsuit is not being worn." + to_chat(usr, "The hardsuit is not being worn.") + return if(!check_power_cost(usr)) return if(!(flags & NODROP)) - usr << "The suit is not active." + to_chat(usr, "The suit is not active.") + return if(!check_suit_access(usr)) return if(!visor) - usr << "The hardsuit does not have a configurable visor." + to_chat(usr, "The hardsuit does not have a configurable visor.") + return var/mob/M = usr @@ -51,7 +54,8 @@ set src = usr.contents if(!istype(wearer) || !wearer.back == src) - usr << "The hardsuit is not being worn." + to_chat(usr, "The hardsuit is not being worn.") + return if(!check_suit_access(usr)) @@ -87,7 +91,8 @@ set src = usr.contents if(!istype(wearer) || !wearer.back == src) - usr << "The hardsuit is not being worn." + to_chat(usr, "The hardsuit is not being worn.") + return if(!check_suit_access(usr)) @@ -107,7 +112,8 @@ set src = usr.contents if(!istype(wearer) || !wearer.back == src) - usr << "The hardsuit is not being worn." + to_chat(usr, "The hardsuit is not being worn.") + return if(!check_suit_access(usr)) @@ -127,7 +133,8 @@ set src = usr.contents if(!istype(wearer) || !wearer.back == src) - usr << "The hardsuit is not being worn." + to_chat(usr, "The hardsuit is not being worn.") + return if(!check_suit_access(usr)) @@ -150,7 +157,8 @@ set src = usr.contents if(!istype(wearer) || !wearer.back == src) - usr << "The hardsuit is not being worn." + to_chat(usr, "The hardsuit is not being worn.") + return if(!check_suit_access(usr)) @@ -176,11 +184,13 @@ return if(!(flags & NODROP)) - usr << "The suit is not active." + to_chat(usr, "The suit is not active.") + return if(!visor) - usr << "The hardsuit does not have a configurable visor." + to_chat(usr, "The hardsuit does not have a configurable visor.") + return var/mob/M = usr @@ -191,7 +201,8 @@ visor.activate() if(!visor.active) - usr << "The visor is suffering a hardware fault and cannot be configured." + to_chat(usr, "The visor is suffering a hardware fault and cannot be configured.") + return visor.engage() @@ -207,15 +218,18 @@ return if(!(flags & NODROP)) - usr << "The suit is not active." + to_chat(usr, "The suit is not active.") + return if(!istype(wearer) || !wearer.back == src) - usr << "The hardsuit is not being worn." + to_chat(usr, "The hardsuit is not being worn.") + return if(!speech) - usr << "The hardsuit does not have a speech synthesiser." + to_chat(usr, "The hardsuit does not have a speech synthesiser.") + return var/mob/M = usr @@ -238,11 +252,13 @@ return if(!(flags & NODROP)) - usr << "The suit is not active." + to_chat(usr, "The suit is not active.") + return if(!istype(wearer) || !wearer.back == src) - usr << "The hardsuit is not being worn." + to_chat(usr, "The hardsuit is not being worn.") + return var/mob/M = usr @@ -258,11 +274,13 @@ if(!istype(module)) selected_module = null - usr << "Primary system is now: deselected." + to_chat(usr, "Primary system is now: deselected.") + return selected_module = module - usr << "Primary system is now: [selected_module.interface_name]." + to_chat(usr, "Primary system is now: [selected_module.interface_name].") + /obj/item/weapon/rig/verb/toggle_module() @@ -278,11 +296,13 @@ return if(!(flags & NODROP)) - usr << "The suit is not active." + to_chat(usr, "The suit is not active.") + return if(!istype(wearer) || !wearer.back == src) - usr << "The hardsuit is not being worn." + to_chat(usr, "The hardsuit is not being worn.") + return var/mob/M = usr @@ -300,10 +320,12 @@ return if(module.active) - usr << "You attempt to deactivate \the [module.interface_name]." + to_chat(usr, "You attempt to deactivate \the [module.interface_name].") + module.deactivate() else - usr << "You attempt to activate \the [module.interface_name]." + to_chat(usr, "You attempt to activate \the [module.interface_name].") + module.activate() /obj/item/weapon/rig/verb/engage_module() @@ -317,11 +339,13 @@ return if(!(flags & NODROP)) - usr << "The suit is not active." + to_chat(usr, "The suit is not active.") + return if(!istype(wearer) || !wearer.back == src) - usr << "The hardsuit is not being worn." + to_chat(usr, "The hardsuit is not being worn.") + return if(!check_power_cost(usr, 0, 0, 0, 0)) @@ -341,5 +365,6 @@ if(!istype(module)) return - usr << "You attempt to engage the [module.interface_name]." + to_chat(usr, "You attempt to engage the [module.interface_name].") + module.engage() \ No newline at end of file diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 8776cb6ace9..7abf3efdf1b 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -174,11 +174,13 @@ /obj/item/clothing/suit/armor/reactive/attack_self(mob/user as mob) src.active = !( src.active ) if (src.active) - user << "\blue The reactive armor is now active." + to_chat(user, "\blue The reactive armor is now active.") + src.icon_state = "reactive" src.item_state = "reactive" else - user << "\blue The reactive armor is now inactive." + to_chat(user, "\blue The reactive armor is now inactive.") + src.icon_state = "reactiveoff" src.item_state = "reactiveoff" src.add_fingerprint(user) diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 5cf32d35a12..a926b54499e 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -553,10 +553,12 @@ /obj/item/clothing/suit/advanced_protective_suit/ui_action_click() if(on) on = 0 - usr << "You turn the suit's special processes off." + to_chat(usr, "You turn the suit's special processes off.") + else on = 1 - usr << "You turn the suit's special processes on." + to_chat(usr, "You turn the suit's special processes on.") + processing_objects.Add(src) diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index 8328726487b..3d12a9ff290 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -23,7 +23,8 @@ loc = has_suit has_suit.overlays += inv_overlay - user << "You attach [src] to [has_suit]." + to_chat(user, "You attach [src] to [has_suit].") + src.add_fingerprint(user) /obj/item/clothing/accessory/proc/on_removed(mob/user as mob) @@ -38,7 +39,8 @@ // This code lets you put accessories on other people by attacking their sprite with the accessory if(istype(H)) if(H.wear_suit && H.wear_suit.flags_inv & HIDEJUMPSUIT) - user << "[H]'s body is covered, and you cannot attach \the [src]." + to_chat(user, "[H]'s body is covered, and you cannot attach \the [src].") + return 1 var/obj/item/clothing/under/U = H.w_uniform if(istype(U)) @@ -47,7 +49,8 @@ user.visible_message("[user] puts a [src.name] on [H]'s [U.name]!", "You finish putting a [src.name] on [H]'s [U.name].") U.attackby(src, user) else - user << "[H] is not wearing anything to attach \the [src] to." + to_chat(user, "[H] is not wearing anything to attach \the [src] to.") + return 1 return ..() @@ -203,7 +206,8 @@ /obj/item/clothing/accessory/holobadge/attack_self(mob/user as mob) if(!stored_name) - user << "Waving around a badge before swiping an ID would be pretty pointless." + to_chat(user, "Waving around a badge before swiping an ID would be pretty pointless.") + return if(isliving(user)) user.visible_message("\red [user] displays their NanoTrasen Internal Security Legal Authorization Badge.\nIt reads: [stored_name], NT Security.","\red You display your NanoTrasen Internal Security Legal Authorization Badge.\nIt reads: [stored_name], NT Security.") @@ -220,22 +224,26 @@ id_card = pda.id if(access_security in id_card.access || emagged) - user << "You imprint your ID details onto the badge." + to_chat(user, "You imprint your ID details onto the badge.") + stored_name = id_card.registered_name name = "holobadge ([stored_name])" desc = "This glowing blue badge marks [stored_name] as THE LAW." else - user << "[src] rejects your insufficient access rights." + to_chat(user, "[src] rejects your insufficient access rights.") + return ..() /obj/item/clothing/accessory/holobadge/emag_act(user as mob) if (emagged) - user << "\red [src] is already cracked." + to_chat(user, "\red [src] is already cracked.") + return else emagged = 1 - user << "\red You swipe the card and crack the holobadge security checks." + to_chat(user, "\red You swipe the card and crack the holobadge security checks.") + return /obj/item/clothing/accessory/holobadge/attack(mob/living/carbon/human/M, mob/living/user) @@ -376,11 +384,13 @@ if(!istype(W)) return ..() if(access_id) - user << "There is already \a [access_id] clipped onto \the [src]" + to_chat(user, "There is already \a [access_id] clipped onto \the [src]") + user.drop_item() W.forceMove(src) access_id = W - user << "\The [W] clips onto \the [src] snugly." + to_chat(user, "\The [W] clips onto \the [src] snugly.") + /obj/item/clothing/accessory/petcollar/GetAccess() return access_id ? access_id.GetAccess() : ..() @@ -388,7 +398,8 @@ /obj/item/clothing/accessory/petcollar/examine(mob/user) ..() if(access_id) - user << "There is \icon[access_id] \a [access_id] clipped onto it." + to_chat(user, "There is \icon[access_id] \a [access_id] clipped onto it.") + /obj/item/clothing/accessory/petcollar/equipped(mob/living/simple_animal/user) if(istype(user)) diff --git a/code/modules/clothing/under/accessories/holster.dm b/code/modules/clothing/under/accessories/holster.dm index cc9e37cecd7..44fdc31ed57 100644 --- a/code/modules/clothing/under/accessories/holster.dm +++ b/code/modules/clothing/under/accessories/holster.dm @@ -27,16 +27,19 @@ /obj/item/clothing/accessory/holster/proc/holster(obj/item/I, mob/user as mob) if(holstered) - user << "There is already a [holstered] holstered here!" + to_chat(user, "There is already a [holstered] holstered here!") + return if (!istype(I, /obj/item/weapon/gun)) - user << "Only guns can be holstered!" + to_chat(user, "Only guns can be holstered!") + return var/obj/item/weapon/gun/W = I if (!can_holster(W)) - user << "This [W] won't fit in the [src]!" + to_chat(user, "This [W] won't fit in the [src]!") + return holstered = W @@ -50,7 +53,8 @@ return if(istype(user.get_active_hand(),/obj) && istype(user.get_inactive_hand(),/obj)) - user << "You need an empty hand to draw the [holstered]!" + to_chat(user, "You need an empty hand to draw the [holstered]!") + else if(user.a_intent == I_HARM) usr.visible_message("\red [user] draws the [holstered], ready to shoot!", \ @@ -81,9 +85,11 @@ /obj/item/clothing/accessory/holster/examine(mob/user) ..(user) if (holstered) - user << "A [holstered] is holstered here." + to_chat(user, "A [holstered] is holstered here.") + else - user << "It is empty." + to_chat(user, "It is empty.") + /obj/item/clothing/accessory/holster/on_attached(obj/item/clothing/under/S, mob/user as mob) ..() @@ -110,11 +116,13 @@ H = locate() in S.accessories if (!H) - usr << "Something is very wrong." + to_chat(usr, "Something is very wrong.") + if(!H.holstered) if(!istype(usr.get_active_hand(), /obj/item/weapon/gun)) - usr << "You need your gun equiped to holster it." + to_chat(usr, "You need your gun equiped to holster it.") + return var/obj/item/weapon/gun/W = usr.get_active_hand() H.holster(W, usr) diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm index bd69d9776d6..aa5ebdb78f5 100644 --- a/code/modules/clothing/under/accessories/storage.dm +++ b/code/modules/clothing/under/accessories/storage.dm @@ -62,7 +62,8 @@ if (has_suit) //if we are part of a suit hold.open(user) else - user << "You empty [src]." + to_chat(user, "You empty [src].") + var/turf/T = get_turf(src) hold.hide_from(usr) for(var/obj/item/I in hold.contents) diff --git a/code/modules/clothing/under/chameleon.dm b/code/modules/clothing/under/chameleon.dm index 978ed6374a4..70b6ef113f9 100644 --- a/code/modules/clothing/under/chameleon.dm +++ b/code/modules/clothing/under/chameleon.dm @@ -23,14 +23,17 @@ attackby(obj/item/clothing/under/U as obj, mob/user as mob, params) ..() if(istype(U, /obj/item/clothing/under/chameleon)) - user << "\red Nothing happens." + to_chat(user, "\red Nothing happens.") + return if(istype(U, /obj/item/clothing/under)) if(src.clothing_choices.Find(U)) - user << "\red Pattern is already recognised by the suit." + to_chat(user, "\red Pattern is already recognised by the suit.") + return src.clothing_choices += U - user << "\red Pattern absorbed by the suit." + to_chat(user, "\red Pattern absorbed by the suit.") + emp_act(severity) @@ -52,7 +55,8 @@ set src in usr if(icon_state == "psyche") - usr << "\red Your suit is malfunctioning" + to_chat(usr, "\red Your suit is malfunctioning") + return var/obj/item/clothing/under/A diff --git a/code/modules/computer3/bios.dm b/code/modules/computer3/bios.dm index 17ed0c4789f..8c05ad5338a 100644 --- a/code/modules/computer3/bios.dm +++ b/code/modules/computer3/bios.dm @@ -24,22 +24,26 @@ if(istype(user,/mob/living/silicon)) if(!program.ai_allowed) - user << "\blue You are forbidden from accessing this program." + to_chat(user, "\blue You are forbidden from accessing this program.") + return 0 else if(program.human_controls) if(!ishuman(user)) - user << "\red Your body can't work the controls!" + to_chat(user, "\red Your body can't work the controls!") + return 0 if(user.restrained()) - user << "\red You need a free hand!" + to_chat(user, "\red You need a free hand!") + return 0 if(!in_range(src,user)) // telekinesis check if(ishuman(user) && istype(user.get_active_hand(),/obj/item/tk_grab)) if(program.human_controls) - user << "\red It's too complicated to work at a distance!" + to_chat(user, "\red It's too complicated to work at a distance!") + return 0 add_fingerprint(user) user.set_machine(src) @@ -115,7 +119,8 @@ switch(errorcode) if(PROG_CRASH) if(usr) - usr << "\red The program crashed!" + to_chat(usr, "\red The program crashed!") + usr << browse(null,"\ref[src]") Reset() @@ -148,7 +153,8 @@ else if(usr) - usr << "\red The program crashed!" + to_chat(usr, "\red The program crashed!") + usr << browse(null,"\ref[src]") testing("computer/Crash() - unknown error code [errorcode]") Reset() diff --git a/code/modules/computer3/buildandrepair.dm b/code/modules/computer3/buildandrepair.dm index 8c8a31bf9bc..158d057451d 100644 --- a/code/modules/computer3/buildandrepair.dm +++ b/code/modules/computer3/buildandrepair.dm @@ -82,46 +82,54 @@ if(istype(P, /obj/item/weapon/wrench)) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 20, target = src)) - user << "\blue You wrench the frame into place." + to_chat(user, "\blue You wrench the frame into place.") + src.anchored = 1 src.state = 1 if(istype(P, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = P if(!WT.remove_fuel(0, user)) - user << "The welding tool must be on to complete this task." + to_chat(user, "The welding tool must be on to complete this task.") + return playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) if(do_after(user, 20, target = src)) if(!src || !WT.isOn()) return - user << "\blue You deconstruct the frame." + to_chat(user, "\blue You deconstruct the frame.") + new /obj/item/stack/sheet/metal( src.loc, 5 ) qdel(src) if(1) if(istype(P, /obj/item/weapon/wrench)) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 20, target = src)) - user << "\blue You unfasten the frame." + to_chat(user, "\blue You unfasten the frame.") + src.anchored = 0 src.state = 0 if(istype(P, /obj/item/weapon/circuitboard) && !circuit) var/obj/item/weapon/circuitboard/B = P if(B.board_type == "computer") playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - user << "\blue You place the circuit board inside the frame." + to_chat(user, "\blue You place the circuit board inside the frame.") + src.icon_state = "1" src.circuit = P user.drop_item() P.loc = src else - user << "\red This frame does not accept circuit boards of this type!" + to_chat(user, "\red This frame does not accept circuit boards of this type!") + if(istype(P, /obj/item/weapon/screwdriver) && circuit) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "\blue You screw the circuit board into place." + to_chat(user, "\blue You screw the circuit board into place.") + src.state = 2 src.icon_state = "2" if(istype(P, /obj/item/weapon/crowbar) && circuit) playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) - user << "\blue You remove the circuit board." + to_chat(user, "\blue You remove the circuit board.") + src.state = 1 src.icon_state = "0" circuit.loc = src.loc @@ -129,7 +137,8 @@ if(2) if(istype(P, /obj/item/weapon/screwdriver) && circuit) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "\blue You unfasten the circuit board." + to_chat(user, "\blue You unfasten the circuit board.") + src.state = 1 src.icon_state = "1" @@ -138,10 +147,12 @@ playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) if(do_after(10, target = src)) battery.loc = loc - user << "\blue You remove [battery]." + to_chat(user, "\blue You remove [battery].") + battery = null else - user << "\red There's no battery to remove!" + to_chat(user, "\red There's no battery to remove!") + if(istype(P, /obj/item/weapon/stock_parts/cell)) if(!battery) @@ -149,9 +160,11 @@ if(do_after(5, target = src)) battery = P P.loc = src - user << "\blue You insert [battery]." + to_chat(user, "\blue You insert [battery].") + else - user << "\red There's already \an [battery] in [src]!" + to_chat(user, "\red There's already \an [battery] in [src]!") + if(istype(P, /obj/item/stack/cable_coil)) @@ -161,16 +174,19 @@ if(P) P:amount -= 5 if(!P:amount) qdel(P) - user << "\blue You add cables to the frame." + to_chat(user, "\blue You add cables to the frame.") + src.state = 3 src.icon_state = "3" if(3) if(istype(P, /obj/item/weapon/wirecutters)) if(components.len) - user << "There are parts in the way!" + to_chat(user, "There are parts in the way!") + return playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) - user << "\blue You remove the cables." + to_chat(user, "\blue You remove the cables.") + src.state = 2 src.icon_state = "2" var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( src.loc ) @@ -185,19 +201,22 @@ if(do_after(user, 20, target = src)) if(P) P:use(2) - user << "\blue You put in the glass panel." + to_chat(user, "\blue You put in the glass panel.") + src.state = 4 src.icon_state = "4" if(4) if(istype(P, /obj/item/weapon/crowbar)) playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) - user << "\blue You remove the glass panel." + to_chat(user, "\blue You remove the glass panel.") + src.state = 3 src.icon_state = "3" new /obj/item/stack/sheet/glass( src.loc, 2 ) if(istype(P, /obj/item/weapon/screwdriver)) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "\blue You connect the monitor." + to_chat(user, "\blue You connect the monitor.") + var/obj/machinery/computer3/B = new src.circuit.build_path ( src.loc, built=1 ) /*if(circuit.powernet) B:powernet = circuit.powernet if(circuit.id) B:id = circuit.id @@ -220,7 +239,8 @@ */ /obj/structure/computer3frame/proc/remove_peripheral(var/obj/item/I = null) if(!components || !components.len) - usr << "\red There are no components in [src] to take out!" + to_chat(usr, "\red There are no components in [src] to take out!") + return 0 if(!I) I = input(usr, "Remove which component?","Remove component", null) as null|obj in components @@ -259,44 +279,51 @@ else warning("Erronous component in computerframe/remove_peripheral: [I]") I.loc = loc - usr << "\blue You remove [I]" + to_chat(usr, "\blue You remove [I]") + return 1 return 0 /obj/structure/computer3frame/proc/insert_peripheral(var/obj/item/I) if(components.len >= max_components) - usr << "There isn't room in [src] for another component!" + to_chat(usr, "There isn't room in [src] for another component!") + return 0 switch(I.type) if(/obj/item/part/computer/storage/hdd) if(hdd) - usr << "There is already \an [hdd] in [src]!" + to_chat(usr, "There is already \an [hdd] in [src]!") + return 0 hdd = I components += hdd hdd.loc = src if(/obj/item/part/computer/storage/removable) if(floppy) - usr << "There is already \an [floppy] in [src]!" + to_chat(usr, "There is already \an [floppy] in [src]!") + return 0 floppy = I components += floppy floppy.loc = src if(/obj/item/part/computer/networking/radio) if(radio) - usr << "There is already \an [radio] in [src]!" + to_chat(usr, "There is already \an [radio] in [src]!") + return 0 radio = I components += radio radio.loc = src if(/obj/item/part/computer/networking/cameras) if(camnet) - usr << "There is already \an [camnet] in [src]!" + to_chat(usr, "There is already \an [camnet] in [src]!") + return 0 camnet = I components += camnet camnet.loc = src if(/obj/item/part/computer/networking) if(net) - usr << "There is already \an [net] in [src]!" + to_chat(usr, "There is already \an [net] in [src]!") + diff --git a/code/modules/computer3/component.dm b/code/modules/computer3/component.dm index 442ccce8193..4e0e0ac6807 100644 --- a/code/modules/computer3/component.dm +++ b/code/modules/computer3/component.dm @@ -77,11 +77,13 @@ emag_act(user as mob) if(!writer) - usr << "You insert \the card, and the computer grinds, sparks, and beeps. After a moment, the card ejects itself." + to_chat(usr, "You insert \the card, and the computer grinds, sparks, and beeps. After a moment, the card ejects itself.") + computer.emagged = 1 return 1 else - usr << "You are unable to insert \the card, as the reader slot is occupied" + to_chat(usr, "You are unable to insert \the card, as the reader slot is occupied") + return 0 attackby(var/obj/item/I as obj, var/mob/user as mob, params) @@ -98,30 +100,39 @@ return 0 // This shouldn't happen, just in case.. if(slot == 2 && !dualslot) - usr << "This device has only one card slot" + to_chat(usr, "This device has only one card slot") + return 0 var/mob/living/L = usr switch(slot) if(1) if(equip_to_reader(card, L)) - usr << "You insert the card into reader slot" + to_chat(usr, "You insert the card into reader slot") + else - usr << "There is already something in the reader slot." + to_chat(usr, "There is already something in the reader slot.") + if(2) if(equip_to_writer(card, L)) - usr << "You insert the card into writer slot" + to_chat(usr, "You insert the card into writer slot") + else - usr << "There is already something in the reader slot." + to_chat(usr, "There is already something in the reader slot.") + if(3) if(equip_to_reader(card, L)) - usr << "You insert the card into reader slot" + to_chat(usr, "You insert the card into reader slot") + else if (equip_to_writer(card, L) && dualslot) - usr << "You insert the card into writer slot" + to_chat(usr, "You insert the card into writer slot") + else if (dualslot) - usr << "There is already something in both slots." + to_chat(usr, "There is already something in both slots.") + else - usr << "There is already something in the reader slot." + to_chat(usr, "There is already something in the reader slot.") + // Usage of insert() preferred, as it also tells result to the user. proc/equip_to_reader(var/obj/item/weapon/card/card, var/mob/living/L) @@ -147,35 +158,47 @@ switch(slot) if(1) if (remove_reader(L)) - L << "You remove the card from reader slot" + to_chat(L, "You remove the card from reader slot") + else - L << "There is no card in the reader slot" + to_chat(L, "There is no card in the reader slot") + if(2) if (remove_writer(L)) - L << "You remove the card from writer slot" + to_chat(L, "You remove the card from writer slot") + else - L << "There is no card in the writer slot" + to_chat(L, "There is no card in the writer slot") + if(3) if (remove_reader(L)) if (remove_writer(L)) - L << "You remove cards from both slots" + to_chat(L, "You remove cards from both slots") + else - L << "You remove the card from reader slot" + to_chat(L, "You remove the card from reader slot") + else if(remove_writer(L)) - L << "You remove the card from writer slot" + to_chat(L, "You remove the card from writer slot") + else - L << "There are no cards in both slots" + to_chat(L, "There are no cards in both slots") + if(4) if (!remove_reader(L)) if (remove_writer(L)) - L << "You remove the card from writer slot" + to_chat(L, "You remove the card from writer slot") + else if (!dualslot) - L << "There is no card in the reader slot" + to_chat(L, "There is no card in the reader slot") + else - L << "There are no cards in both slots" + to_chat(L, "There are no cards in both slots") + else - L << "You remove the card from reader slot" + to_chat(L, "You remove the card from reader slot") + proc/remove_reader(var/mob/living/L) @@ -239,7 +262,8 @@ if(slot == 1) // 1: writer if(writer != null) - usr << "There's already a card in that slot!" + to_chat(usr, "There's already a card in that slot!") + return 0 var/mob/living/L = usr L.drop_item() @@ -248,7 +272,8 @@ return 1 else if(slot == 2) // 2: reader if(reader != null) - usr << "There's already a card in that slot!" + to_chat(usr, "There's already a card in that slot!") + return 0 var/mob/living/L = usr L.drop_item() @@ -257,7 +282,8 @@ return 1 else // 0: auto if(reader && writer) - usr << "Both slots are full!" + to_chat(usr, "Both slots are full!") + return 0 var/mob/living/L = usr L.drop_item() diff --git a/code/modules/computer3/computer.dm b/code/modules/computer3/computer.dm index 3e4d8116fac..9f286241560 100644 --- a/code/modules/computer3/computer.dm +++ b/code/modules/computer3/computer.dm @@ -77,11 +77,13 @@ set src in view(1) if(usr.stat || usr.restrained() || usr.lying || !istype(usr, /mob/living)) - usr << "\red You can't do that." + to_chat(usr, "\red You can't do that.") + return if(!Adjacent(usr)) - usr << "You can't reach it." + to_chat(usr, "You can't reach it.") + return Reset() @@ -365,7 +367,8 @@ os.attack_hand(user) return - user << "\The [src] won't boot!" + to_chat(user, "\The [src] won't boot!") + attack_ai(var/mob/user as mob) // copypasta because server racks lose attack_hand() if(stat) @@ -390,7 +393,8 @@ os.attack_hand(user) return - user << "\The [src] won't boot!" + to_chat(user, "\The [src] won't boot!") + interact() if(stat) diff --git a/code/modules/computer3/computers/atmos_alert.dm b/code/modules/computer3/computers/atmos_alert.dm index 6596b76d7c7..3b48d0fb2c6 100644 --- a/code/modules/computer3/computers/atmos_alert.dm +++ b/code/modules/computer3/computers/atmos_alert.dm @@ -97,14 +97,16 @@ var/removing_zone = href_list["priority_clear"] for(var/zone in priority_alarms) if(ckey(zone) == removing_zone) - usr << "\green Priority Alert for area [zone] cleared." + to_chat(usr, "\green Priority Alert for area [zone] cleared.") + priority_alarms -= zone if("minor_clear" in href_list) var/removing_zone = href_list["minor_clear"] for(var/zone in minor_alarms) if(ckey(zone) == removing_zone) - usr << "\green Minor Alert for area [zone] cleared." + to_chat(usr, "\green Minor Alert for area [zone] cleared.") + minor_alarms -= zone computer.updateUsrDialog() diff --git a/code/modules/computer3/computers/camera.dm b/code/modules/computer3/computers/camera.dm index 6dce48393db..6500fe6f405 100644 --- a/code/modules/computer3/computers/camera.dm +++ b/code/modules/computer3/computers/camera.dm @@ -316,7 +316,8 @@ if(key) interact() else - usr << "The screen turns to static." + to_chat(usr, "The screen turns to static.") + return // Atlantis: Required for camnetkeys to work. diff --git a/code/modules/computer3/computers/cloning.dm b/code/modules/computer3/computers/cloning.dm index 49ed2a04b84..61d1f25ab83 100644 --- a/code/modules/computer3/computers/cloning.dm +++ b/code/modules/computer3/computers/cloning.dm @@ -79,14 +79,16 @@ proc/RecordsList() var/dat = "

      Current records

      " - dat += topic_link(src,"menu=1","<< Back") + "

      " + to_chat(dat += topic_link(src,"menu=1",", Back") + "

      ") + for(var/datum/data/record/R in records) dat += "

      [R.fields["name"]]

      Scan ID [R.fields["id"]] " + topic_link(src,"view_rec=\ref[R]","View Record") return dat proc/ShowRecord() var/dat = "

      Selected Record

      " - dat += topic_link(src,"menu=2","<< Back") + "

      " + to_chat(dat += topic_link(src,"menu=2",", Back") + "

      ") + if (!active_record) dat += "Record not found." diff --git a/code/modules/computer3/computers/communications.dm b/code/modules/computer3/computers/communications.dm index 727496b7653..ec4482ee28f 100644 --- a/code/modules/computer3/computers/communications.dm +++ b/code/modules/computer3/computers/communications.dm @@ -60,7 +60,8 @@ if(!interactable() || !computer.radio || ..(href,href_list) ) return if (!(computer.z in config.station_levels)) - usr << "\red Unable to establish a connection: \black You're too far away from the station!" + to_chat(usr, "\red Unable to establish a connection: \black You're too far away from the station!") + return if("main" in href_list) @@ -103,15 +104,18 @@ feedback_inc("alert_comms_blue",1) tmp_alertlevel = 0 else: - usr << "You are not authorized to do this." + to_chat(usr, "You are not authorized to do this.") + tmp_alertlevel = 0 state = STATE_DEFAULT else - usr << "You need to swipe your ID." + to_chat(usr, "You need to swipe your ID.") + if("announce" in href_list) if(authenticated==2) if(message_cooldown) - usr << "Please allow at least one minute to pass between announcements" + to_chat(usr, "Please allow at least one minute to pass between announcements") + return var/input = input(usr, "Please write a message to announce to the station crew.", "Priority Announcement") if(!input || !interactable()) @@ -192,13 +196,15 @@ return if(authenticated==2) if(centcomm_message_cooldown) - usr << "Arrays recycling. Please stand by." + to_chat(usr, "Arrays recycling. Please stand by.") + return var/input = stripped_input(usr, "Please choose a message to transmit to Centcomm via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "To abort, send an empty message.", "") if(!input || !interactable()) return Centcomm_announce(input, usr) - usr << "Message transmitted." + to_chat(usr, "Message transmitted.") + log_say("[key_name(usr)] has made a Centcomm announcement: [input]") centcomm_message_cooldown = 1 spawn(600)//10 minute cooldown @@ -209,20 +215,23 @@ if("MessageSyndicate" in href_list) if((authenticated==2) && (computer.emagged)) if(centcomm_message_cooldown) - usr << "Arrays recycling. Please stand by." + to_chat(usr, "Arrays recycling. Please stand by.") + return var/input = stripped_input(usr, "Please choose a message to transmit to \[ABNORMAL ROUTING CORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "To abort, send an empty message.", "") if(!input || !interactable()) return Syndicate_announce(input, usr) - usr << "Message transmitted." + to_chat(usr, "Message transmitted.") + log_say("[key_name(usr)] has made a Syndicate announcement: [input]") centcomm_message_cooldown = 1 spawn(600)//10 minute cooldown centcomm_message_cooldown = 0 if("RestoreBackup" in href_list) - usr << "Backup routing data restored!" + to_chat(usr, "Backup routing data restored!") + computer.emagged = 0 computer.updateDialog() diff --git a/code/modules/computer3/computers/law.dm b/code/modules/computer3/computers/law.dm index 1520f889ee5..099c9453ced 100644 --- a/code/modules/computer3/computers/law.dm +++ b/code/modules/computer3/computers/law.dm @@ -17,15 +17,18 @@ opened = !opened if(opened) - usr << "\blue The access panel is now open." + to_chat(usr, "\blue The access panel is now open.") + else - usr << "\blue The access panel is now closed." + to_chat(usr, "\blue The access panel is now closed.") + return attackby(obj/item/weapon/aiModule/module as obj, mob/user as mob, params) if (user.z > 6) - user << "\red Unable to establish a connection: \black You're too far away from the station!" + to_chat(user, "\red Unable to establish a connection: \black You're too far away from the station!") + return if(istype(module, /obj/item/weapon/aiModule)) module.install(src) @@ -35,18 +38,22 @@ attack_hand(var/mob/user as mob) if(src.stat & NOPOWER) - usr << "The upload computer has no power!" + to_chat(usr, "The upload computer has no power!") + return if(src.stat & BROKEN) - usr << "The upload computer is broken!" + to_chat(usr, "The upload computer is broken!") + return src.current = select_active_ai(user) if (!src.current) - usr << "No active AIs detected." + to_chat(usr, "No active AIs detected.") + else - usr << "[src.current.name] selected for law changes." + to_chat(usr, "[src.current.name] selected for law changes.") + return @@ -67,16 +74,20 @@ attack_hand(var/mob/user as mob) if(src.stat & NOPOWER) - usr << "The upload computer has no power!" + to_chat(usr, "The upload computer has no power!") + return if(src.stat & BROKEN) - usr << "The upload computer is broken!" + to_chat(usr, "The upload computer is broken!") + return src.current = freeborg() if (!src.current) - usr << "No free cyborgs detected." + to_chat(usr, "No free cyborgs detected.") + else - usr << "[src.current.name] selected for law changes." + to_chat(usr, "[src.current.name] selected for law changes.") + return diff --git a/code/modules/computer3/computers/medical.dm b/code/modules/computer3/computers/medical.dm index 1be7c672827..2094eee9856 100644 --- a/code/modules/computer3/computers/medical.dm +++ b/code/modules/computer3/computers/medical.dm @@ -50,7 +50,8 @@ if(!interactable()) return if (computer.z > 6) - usr << "\red Unable to establish a connection: \black You're too far away from the station!" + to_chat(usr, "\red Unable to establish a connection: \black You're too far away from the station!") + return var/dat diff --git a/code/modules/computer3/computers/message.dm b/code/modules/computer3/computers/message.dm index 27e47684d9c..427c2283808 100644 --- a/code/modules/computer3/computers/message.dm +++ b/code/modules/computer3/computers/message.dm @@ -220,10 +220,12 @@ proc/BruteForce(mob/usr as mob) if(isnull(linkedServer)) - usr << "Could not complete brute-force: Linked Server Disconnected!" + to_chat(usr, "Could not complete brute-force: Linked Server Disconnected!") + else var/currentKey = src.linkedServer.decryptkey - usr << "Brute-force completed! The key is '[currentKey]'." + to_chat(usr, "Brute-force completed! The key is '[currentKey]'.") + src.hacking = 0 src.active_state = normal_icon src.screen = 0 // Return the screen back to normal @@ -414,7 +416,9 @@ O.show_message(text("\icon[customrecepient] *[customrecepient.ttone]*")) if( customrecepient.loc && ishuman(customrecepient.loc) ) var/mob/living/carbon/human/H = customrecepient.loc - H << "\icon[customrecepient] Message from [customsender] ([customjob]), \"[custommessage]\" (Reply)" + to_chat(H, "\icon[customrecepient] Message from [customsender] ([customjob]), \"[custommessage]\" (Reply)" + + log_pda("[usr] (PDA: [customsender]) sent \"[custommessage]\" to [customrecepient.owner]") customrecepient.overlays.Cut() customrecepient.overlays += image('icons/obj/pda.dmi', "pda-r") @@ -428,7 +432,9 @@ O.show_message(text("\icon[customrecepient] *[customrecepient.ttone]*")) if( customrecepient.loc && ishuman(customrecepient.loc) ) var/mob/living/carbon/human/H = customrecepient.loc - H << "\icon[customrecepient] Message from [PDARec.owner] ([customjob]), \"[custommessage]\" (Reply)" + to_chat(H, "\icon[customrecepient] Message from [PDARec.owner] ([customjob]), \"[custommessage]\" (Reply)" + + log_pda("[usr] (PDA: [PDARec.owner]) sent \"[custommessage]\" to [customrecepient.owner]") customrecepient.overlays.Cut() customrecepient.overlays += image('icons/obj/pda.dmi', "pda-r") @@ -443,7 +449,8 @@ if(auth) src.screen = 4 - //usr << href_list["select"] +// to_chat(usr, href_list["select"]) + if ("back" in href_list) src.screen = 0 diff --git a/code/modules/computer3/computers/prisoner.dm b/code/modules/computer3/computers/prisoner.dm index f9a4c6f45d5..85c6f0c9562 100644 --- a/code/modules/computer3/computers/prisoner.dm +++ b/code/modules/computer3/computers/prisoner.dm @@ -94,7 +94,8 @@ if( istype(I) && I.imp_in) var/mob/living/carbon/R = I.imp_in log_say("PrisonComputer3 message: [key_name(usr)]->[key_name(R)] : [warning]") - R << "\green You hear a voice in your head saying: '[warning]'" + to_chat(R, "\green You hear a voice in your head saying: '[warning]'") + interact() return diff --git a/code/modules/computer3/computers/prisonshuttle.dm b/code/modules/computer3/computers/prisonshuttle.dm index e45f32337e2..aedcaaeb07b 100644 --- a/code/modules/computer3/computers/prisonshuttle.dm +++ b/code/modules/computer3/computers/prisonshuttle.dm @@ -46,29 +46,34 @@ var/prison_shuttle_timeleft = 0 A.anchored = 1 if (src.stat & BROKEN) - user << "\blue The broken glass falls out." + to_chat(user, "\blue The broken glass falls out.") + new /obj/item/trash/shard( src.loc ) A.state = 3 A.icon_state = "3" else - user << "\blue You disconnect the monitor." + to_chat(user, "\blue You disconnect the monitor.") + A.state = 4 A.icon_state = "4" del(src) else if(istype(I,/obj/item/card/emag) && (!hacked)) hacked = 1 - user << "\blue You disable the lock." + to_chat(user, "\blue You disable the lock.") + else return src.attack_hand(user) attack_hand(var/mob/user as mob) if(!src.allowed(user) && (!hacked)) - user << "\red Access Denied." + to_chat(user, "\red Access Denied.") + return if(prison_break) - user << "\red Unable to locate shuttle." + to_chat(user, "\red Unable to locate shuttle.") + return if(..()) return @@ -100,11 +105,13 @@ var/prison_shuttle_timeleft = 0 if (href_list["sendtodock"]) if (!prison_can_move()) - usr << "\red The prison shuttle is unable to leave." + to_chat(usr, "\red The prison shuttle is unable to leave.") + return if(!prison_shuttle_at_station|| prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison) return post_signal("prison") - usr << "\blue The prison shuttle has been called and will arrive in [(PRISON_MOVETIME/10)] seconds." + to_chat(usr, "\blue The prison shuttle has been called and will arrive in [(PRISON_MOVETIME/10)] seconds.") + src.temp += "Shuttle sent.

      OK" src.updateUsrDialog() prison_shuttle_moving_to_prison = 1 @@ -114,11 +121,13 @@ var/prison_shuttle_timeleft = 0 else if (href_list["sendtostation"]) if (!prison_can_move()) - usr << "\red The prison shuttle is unable to leave." + to_chat(usr, "\red The prison shuttle is unable to leave.") + return if(prison_shuttle_at_station || prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison) return post_signal("prison") - usr << "\blue The prison shuttle has been called and will arrive in [(PRISON_MOVETIME/10)] seconds." + to_chat(usr, "\blue The prison shuttle has been called and will arrive in [(PRISON_MOVETIME/10)] seconds.") + src.temp += "Shuttle sent.

      OK" src.updateUsrDialog() prison_shuttle_moving_to_station = 1 @@ -186,7 +195,8 @@ var/prison_shuttle_timeleft = 0 if (prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison) return if (!prison_can_move()) - usr << "\red The prison shuttle is unable to leave." + to_chat(usr, "\red The prison shuttle is unable to leave.") + return var/area/start_location = locate(/area/shuttle/prison/prison) @@ -215,7 +225,8 @@ var/prison_shuttle_timeleft = 0 if (prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison) return if (!prison_can_move()) - usr << "\red The prison shuttle is unable to leave." + to_chat(usr, "\red The prison shuttle is unable to leave.") + return var/area/start_location = locate(/area/shuttle/prison/station) diff --git a/code/modules/computer3/computers/robot.dm b/code/modules/computer3/computers/robot.dm index 98eea82f9c2..3e404ff1200 100644 --- a/code/modules/computer3/computers/robot.dm +++ b/code/modules/computer3/computers/robot.dm @@ -125,7 +125,8 @@ src.temp = null else - usr << "\red Access Denied." + to_chat(usr, "\red Access Denied.") + if ("stop" in href_list) src.temp = {" @@ -159,7 +160,8 @@ if(choice == "Confirm") if(R && istype(R)) if(R.mind && R.mind.special_role && R.emagged) - R << "Extreme danger. Termination codes detected. Scrambling security codes and automatic AI unlink triggered." + to_chat(R, "Extreme danger. Termination codes detected. Scrambling security codes and automatic AI unlink triggered.") + R.ResetSecurityCodes() else @@ -167,7 +169,8 @@ log_game("\blue [key_name_admin(usr)] detonated [R.name]!") R.self_destruct() else - usr << "\red Access Denied." + to_chat(usr, "\red Access Denied.") + if ("stopbot" in href_list) if(computer.allowed(usr)) @@ -182,14 +185,17 @@ if (R.lockcharge) // R.cell.charge = R.lockcharge R.lockcharge = !R.lockcharge - R << "Your lockdown has been lifted!" + to_chat(R, "Your lockdown has been lifted!") + else R.lockcharge = !R.lockcharge // R.cell.charge = 0 - R << "You have been locked down!" + to_chat(R, "You have been locked down!") + else - usr << "\red Access Denied." + to_chat(usr, "\red Access Denied.") + if ("magbot" in href_list) if(computer.allowed(usr)) diff --git a/code/modules/computer3/computers/scanconsole.dm b/code/modules/computer3/computers/scanconsole.dm index 46968ea8639..a312f49a423 100644 --- a/code/modules/computer3/computers/scanconsole.dm +++ b/code/modules/computer3/computers/scanconsole.dm @@ -358,7 +358,8 @@ proc/ui_menu() if(!viable) return "No viable occupant detected." - var/dat = topic_link(src,"mode=0","<< Main Menu") + "
      " + to_chat(var/dat = topic_link(src,"mode=0",", Main Menu") + "
      ") + dat += "

      Modify Unique Identifier

      " dat += "
      Unique Identifier:
      [getblockstring(ui=1)]

      " @@ -372,7 +373,8 @@ proc/se_menu() if(!viable) return "No viable occupant detected." - var/dat = topic_link(src,"mode=0","<< Main Menu") + "
      " + to_chat(var/dat = topic_link(src,"mode=0",", Main Menu") + "
      ") + dat += "

      Modify Structural Enzymes

      " dat += "
      Structural Enzymes: [getblockstring(ui=0)]

      " dat += "Selected Block: " + block_plus_minus("seblock",se_block,1,MAX_SEBLOCK) + "

      " @@ -382,7 +384,8 @@ return dat proc/emitter_menu() - var/dat = topic_link(src,"mode=0","<< Main Menu") + "
      " + to_chat(var/dat = topic_link(src,"mode=0",", Main Menu") + "
      ") + dat += "

      Radiation Emitter Settings

      " if (viable) dat += topic_link(src,"pulse","Pulse Radiation") @@ -741,7 +744,8 @@ human_occupant.reagents.add_reagent("inaprovaline", REJUVENATORS_INJECT) else human_occupant.reagents.add_reagent("inaprovaline", round(REJUVENATORS_MAX - human_occupant.reagents.get_reagent_amount("inaprovaline"))) - //usr << text("Occupant now has [] units of rejuvenation in his/her bloodstream.", human_occupant.reagents.get_reagent_amount("inaprovaline")) +// to_chat(usr, text("Occupant now has [] units of rejuvenation in his/her bloodstream.", human_occupant.reagents.get_reagent_amount("inaprovaline"))) + //////////////////////////////////////////////////////// if (href_list["strucmenuplus"]) diff --git a/code/modules/computer3/computers/security.dm b/code/modules/computer3/computers/security.dm index 3c6560d6aa9..047ff3c4359 100644 --- a/code/modules/computer3/computers/security.dm +++ b/code/modules/computer3/computers/security.dm @@ -58,7 +58,8 @@ return if (computer.z > 6) - usr << "\red Unable to establish a connection: \black You're too far away from the station!" + to_chat(usr, "\red Unable to establish a connection: \black You're too far away from the station!") + return var/dat diff --git a/code/modules/computer3/computers/shuttle.dm b/code/modules/computer3/computers/shuttle.dm index 37c5291bada..9fbaa113bab 100644 --- a/code/modules/computer3/computers/shuttle.dm +++ b/code/modules/computer3/computers/shuttle.dm @@ -19,16 +19,19 @@ var/obj/item/device/pda/pda = W W = pda.id if (!W:access) //no access - user << "The access level of [W:registered_name]\'s card is not high enough. " + to_chat(user, "The access level of [W:registered_name]\'s card is not high enough. ") + return var/list/cardaccess = W:access if(!istype(cardaccess, /list) || !cardaccess.len) //no access - user << "The access level of [W:registered_name]\'s card is not high enough. " + to_chat(user, "The access level of [W:registered_name]\'s card is not high enough. ") + return if(!(access_heads in W:access)) //doesn't have this access - user << "The access level of [W:registered_name]\'s card is not high enough. " + to_chat(user, "The access level of [W:registered_name]\'s card is not high enough. ") + return 0 var/choice = alert(user, text("Would you like to (un)authorize a shortened launch time? [] authorization\s are still needed. Use abort to cancel all authorizations.", src.auth_need - src.authorized.len), "Shuttle Launch", "Authorize", "Repeal", "Abort") @@ -41,11 +44,13 @@ if (src.auth_need - src.authorized.len > 0) message_admins("[key_name_admin(user)] has authorized early shuttle launch") log_game("[user.ckey] has authorized early shuttle launch") - world << text("\blue Alert: [] authorizations needed until shuttle is launched early", src.auth_need - src.authorized.len) + to_chat(world, text("\blue Alert: [] authorizations needed until shuttle is launched early", src.auth_need - src.authorized.len)) + else message_admins("[key_name_admin(user)] has launched the shuttle") log_game("[user.ckey] has launched the shuttle early") - world << "\blue Alert: Shuttle launch time shortened to 10 seconds!" + to_chat(world, "\blue Alert: Shuttle launch time shortened to 10 seconds!") + emergency_shuttle.online = 1 emergency_shuttle.settimeleft(10) //src.authorized = null @@ -54,10 +59,12 @@ if("Repeal") src.authorized -= W:registered_name - world << text("\blue Alert: [] authorizations needed until shuttle is launched early", src.auth_need - src.authorized.len) + to_chat(world, text("\blue Alert: [] authorizations needed until shuttle is launched early", src.auth_need - src.authorized.len)) + if("Abort") - world << "\blue All authorizations to shorting time for shuttle launch have been revoked!" + to_chat(world, "\blue All authorizations to shorting time for shuttle launch have been revoked!") + src.authorized.len = 0 src.authorized = list( ) return @@ -69,7 +76,8 @@ if(!emagged && emergency_shuttle.location == 1) switch(choice) if("Launch") - world << "\blue Alert: Shuttle launch time shortened to 10 seconds!" + to_chat(world, "\blue Alert: Shuttle launch time shortened to 10 seconds!") + emergency_shuttle.settimeleft( 10 ) emagged = 1 if("Cancel") diff --git a/code/modules/computer3/computers/specops_shuttle.dm b/code/modules/computer3/computers/specops_shuttle.dm index 409246b9c8a..c863150f38f 100644 --- a/code/modules/computer3/computers/specops_shuttle.dm +++ b/code/modules/computer3/computers/specops_shuttle.dm @@ -58,7 +58,8 @@ var/specops_shuttle_timeleft = 0 if (specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return if (!specops_can_move()) - usr << "\red The Special Operations shuttle is unable to leave." + to_chat(usr, "\red The Special Operations shuttle is unable to leave.") + return //Begin Marauder launchpad. @@ -153,7 +154,8 @@ var/specops_shuttle_timeleft = 0 for(var/turf/T in get_area_turfs(end_location) ) var/mob/M = locate(/mob) in T - M << "\red You have arrived to [station_name]. Commence operation!" + to_chat(M, "\red You have arrived to [station_name]. Commence operation!") + /proc/specops_can_move() if(specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return 0 @@ -170,17 +172,20 @@ var/specops_shuttle_timeleft = 0 /obj/machinery/computer3/specops_shuttle/attackby(I as obj, user as mob, params) if(istype(I,/obj/item/card/emag)) - user << "\blue The electronic systems in this console are far too advanced for your primitive hacking peripherals." + to_chat(user, "\blue The electronic systems in this console are far too advanced for your primitive hacking peripherals.") + else return attack_hand(user) /obj/machinery/computer3/specops_shuttle/attack_hand(var/mob/user as mob) if(!allowed(user)) - user << "\red Access Denied." + to_chat(user, "\red Access Denied.") + return if (sent_strike_team == 0) - usr << "\red The strike team has not yet deployed." + to_chat(usr, "\red The strike team has not yet deployed.") + return if(..()) @@ -214,17 +219,20 @@ var/specops_shuttle_timeleft = 0 if (href_list["sendtodock"]) if(!specops_shuttle_at_station|| specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return - usr << "\blue Central Command will not allow the Special Operations shuttle to return." + to_chat(usr, "\blue Central Command will not allow the Special Operations shuttle to return.") + return else if (href_list["sendtostation"]) if(specops_shuttle_at_station || specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return if (!specops_can_move()) - usr << "\red The Special Operations shuttle is unable to leave." + to_chat(usr, "\red The Special Operations shuttle is unable to leave.") + return - usr << "\blue The Special Operations shuttle will arrive on [station_name] in [(SPECOPS_MOVETIME/10)] seconds." + to_chat(usr, "\blue The Special Operations shuttle will arrive on [station_name] in [(SPECOPS_MOVETIME/10)] seconds.") + temp += "Shuttle departing.

      OK" updateUsrDialog() diff --git a/code/modules/computer3/computers/syndicate_shuttle.dm b/code/modules/computer3/computers/syndicate_shuttle.dm index 1b4d35456c7..855ae3c02a2 100644 --- a/code/modules/computer3/computers/syndicate_shuttle.dm +++ b/code/modules/computer3/computers/syndicate_shuttle.dm @@ -47,7 +47,8 @@ /obj/machinery/computer3/syndicate_station/attack_hand(mob/user as mob) if(!allowed(user)) - user << "\red Access Denied" + to_chat(user, "\red Access Denied") + return user.set_machine(src) diff --git a/code/modules/computer3/computers/syndicate_specops_shuttle.dm b/code/modules/computer3/computers/syndicate_specops_shuttle.dm index 2e9b4bc1842..c97785300fa 100644 --- a/code/modules/computer3/computers/syndicate_specops_shuttle.dm +++ b/code/modules/computer3/computers/syndicate_specops_shuttle.dm @@ -58,7 +58,8 @@ var/syndicate_elite_shuttle_timeleft = 0 if (syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership) return if (!syndicate_elite_can_move()) - usr << "\red The Syndicate Elite shuttle is unable to leave." + to_chat(usr, "\red The Syndicate Elite shuttle is unable to leave.") + return sleep(600) @@ -166,7 +167,8 @@ var/syndicate_elite_shuttle_timeleft = 0 for(var/turf/T in get_area_turfs(end_location) ) var/mob/M = locate(/mob) in T - M << "\red You have arrived to [station_name]. Commence operation!" + to_chat(M, "\red You have arrived to [station_name]. Commence operation!") + /proc/syndicate_elite_can_move() if(syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership) return 0 @@ -183,17 +185,20 @@ var/syndicate_elite_shuttle_timeleft = 0 /obj/machinery/computer3/syndicate_elite_shuttle/attackby(I as obj, user as mob, params) if(istype(I,/obj/item/card/emag)) - user << "\blue The electronic systems in this console are far too advanced for your primitive hacking peripherals." + to_chat(user, "\blue The electronic systems in this console are far too advanced for your primitive hacking peripherals.") + else return attack_hand(user) /obj/machinery/computer3/syndicate_elite_shuttle/attack_hand(var/mob/user as mob) if(!allowed(user)) - user << "\red Access Denied." + to_chat(user, "\red Access Denied.") + return // if (sent_syndicate_strike_team == 0) -// usr << "\red The strike team has not yet deployed." +// to_chat(usr, "\red The strike team has not yet deployed.") + // return if(..()) @@ -226,17 +231,20 @@ var/syndicate_elite_shuttle_timeleft = 0 if (href_list["sendtodock"]) if(!syndicate_elite_shuttle_at_station|| syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership) return - usr << "\blue The Syndicate will not allow the Elite Squad shuttle to return." + to_chat(usr, "\blue The Syndicate will not allow the Elite Squad shuttle to return.") + return else if (href_list["sendtostation"]) if(syndicate_elite_shuttle_at_station || syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership) return if (!specops_can_move()) - usr << "\red The Syndicate Elite shuttle is unable to leave." + to_chat(usr, "\red The Syndicate Elite shuttle is unable to leave.") + return - usr << "\blue The Syndicate Elite shuttle will arrive on [station_name] in [(SYNDICATE_ELITE_MOVETIME/10)] seconds." + to_chat(usr, "\blue The Syndicate Elite shuttle will arrive on [station_name] in [(SYNDICATE_ELITE_MOVETIME/10)] seconds.") + temp = "Shuttle departing.

      OK" updateUsrDialog() diff --git a/code/modules/computer3/laptop.dm b/code/modules/computer3/laptop.dm index 037b505d779..5d5ba843b0b 100644 --- a/code/modules/computer3/laptop.dm +++ b/code/modules/computer3/laptop.dm @@ -35,22 +35,26 @@ set src in view(1) if(usr.stat || usr.restrained() || usr.lying || !istype(usr, /mob/living)) - usr << "\red You can't do that." + to_chat(usr, "\red You can't do that.") + return if(!Adjacent(usr)) - usr << "You can't reach it." + to_chat(usr, "You can't reach it.") + return if(!istype(loc,/turf)) - usr << "[src] is too bulky! You'll have to set it down." + to_chat(usr, "[src] is too bulky! You'll have to set it down.") + return if(!stored_computer) if(contents.len) for(var/obj/O in contents) O.forceMove(loc) - usr << "\The [src] crumbles to pieces." + to_chat(usr, "\The [src] crumbles to pieces.") + spawn(5) qdel(src) return @@ -61,13 +65,15 @@ stored_computer.stat &= ~MAINT stored_computer.update_icon() loc = null - usr << "You open \the [src]." + to_chat(usr, "You open \the [src].") + spawn(5) stored_computer.manipulating = 0 qdel(src) else - usr << "\red You are already opening the computer!" + to_chat(usr, "\red You are already opening the computer!") + AltClick() @@ -95,7 +101,8 @@ var/obj/item/part/computer/cardslot/C = locate() in src.contents if(!C) - usr << "There is no card port on the laptop." + to_chat(usr, "There is no card port on the laptop.") + return var/obj/item/weapon/card/id/card @@ -104,10 +111,12 @@ else if(C.writer) card = C.writer else - usr << "There is nothing to remove from the laptop card port." + to_chat(usr, "There is nothing to remove from the laptop card port.") + return - usr << "You remove [card] from the laptop." + to_chat(usr, "You remove [card] from the laptop.") + C.remove(card) @@ -135,11 +144,13 @@ set src in view(1) if(usr.stat || usr.restrained() || usr.lying || !istype(usr, /mob/living)) - usr << "\red You can't do that." + to_chat(usr, "\red You can't do that.") + return if(!Adjacent(usr)) - usr << "You can't reach it." + to_chat(usr, "You can't reach it.") + return if(istype(loc,/obj/item/device/laptop)) @@ -150,7 +161,8 @@ return if(stat&BROKEN) - usr << "\The [src] is broken! You can't quite get it closed." + to_chat(usr, "\The [src] is broken! You can't quite get it closed.") + return if(!portable) @@ -161,7 +173,8 @@ portable.forceMove(loc) forceMove(portable) stat |= MAINT - usr << "You close \the [src]." + to_chat(usr, "You close \the [src].") + auto_use_power() if(stat&MAINT) diff --git a/code/modules/computer3/lapvend.dm b/code/modules/computer3/lapvend.dm index 7e4a0f1769e..4bce2cf7ca4 100644 --- a/code/modules/computer3/lapvend.dm +++ b/code/modules/computer3/lapvend.dm @@ -56,7 +56,8 @@ usr.drop_item() L.loc = src vendmode = 3 - usr << "You slot your [L.name] into \The [src.name]" + to_chat(usr, "You slot your [L.name] into \The [src.name]") + else ..() @@ -262,11 +263,14 @@ network = 0 power = 0 else - usr << "\icon[src]You don't have that much money!" + to_chat(usr, "\icon[src]You don't have that much money!") + else - usr << "\icon[src]Unable to access account. Check security settings and try again." + to_chat(usr, "\icon[src]Unable to access account. Check security settings and try again.") + else - usr << "\icon[src]Unable to access vendor account. Please record the machine ID and call CentComm Support." + to_chat(usr, "\icon[src]Unable to access vendor account. Please record the machine ID and call CentComm Support.") + /obj/machinery/lapvend/proc/total() var/total = 0 @@ -405,6 +409,8 @@ power = 0 else - usr << "\icon[src]Unable to access account. Check security settings and try again." + to_chat(usr, "\icon[src]Unable to access account. Check security settings and try again.") + else - usr << "\icon[src]Unable to access vendor account. Please record the machine ID and call CentComm Support." \ No newline at end of file + to_chat(usr, "\icon[src]Unable to access vendor account. Please record the machine ID and call CentComm Support.") + diff --git a/code/modules/computer3/storage.dm b/code/modules/computer3/storage.dm index 3fe8279fad7..e8a5b4aac8b 100644 --- a/code/modules/computer3/storage.dm +++ b/code/modules/computer3/storage.dm @@ -116,16 +116,19 @@ attackby(obj/O as obj, mob/user as mob, params) if(inserted && istype(O,/obj/item/weapon/pen)) - usr << "You use [O] to carefully pry [inserted] out of [src]." + to_chat(usr, "You use [O] to carefully pry [inserted] out of [src].") + eject_disk(forced = 1) return if(istype(O,/obj/item/weapon/disk/file)) if(inserted) - usr << "There's already a disk in [src]!" + to_chat(usr, "There's already a disk in [src]!") + return - usr << "You insert [O] into [src]." + to_chat(usr, "You insert [O] into [src].") + usr.drop_item() O.loc = src inserted = O diff --git a/code/modules/computer3/upload/programs.dm b/code/modules/computer3/upload/programs.dm index bcf45159b69..5e86666c8b2 100644 --- a/code/modules/computer3/upload/programs.dm +++ b/code/modules/computer3/upload/programs.dm @@ -8,6 +8,7 @@ if(!interactable() || istype(usr,/mob/living/silicon)) return 0 if(!computer.net) - usr << "An indecipherable set of code flicks across the screen. Nothing else happens." + to_chat(usr, "An indecipherable set of code flicks across the screen. Nothing else happens.") + return var/list/results = computer.net.get_machines \ No newline at end of file diff --git a/code/modules/crafting/guncrafting.dm b/code/modules/crafting/guncrafting.dm index 095dfcbe360..6223a663755 100644 --- a/code/modules/crafting/guncrafting.dm +++ b/code/modules/crafting/guncrafting.dm @@ -20,7 +20,8 @@ /obj/item/weaponcrafting/receiver/attackby(obj/item/W as obj, mob/user as mob, params) if(istype(W,/obj/item/pipe)) - user << "You attach the shotgun barrel to the receiver. The pins seem loose." + to_chat(user, "You attach the shotgun barrel to the receiver. The pins seem loose.") + var/obj/item/weaponcrafting/ishotgunconstruction/I = new /obj/item/weaponcrafting/ishotgunconstruction user.unEquip(src) user.put_in_hands(I) @@ -42,7 +43,8 @@ var/obj/item/weaponcrafting/ishotgunconstruction2/C = new /obj/item/weaponcrafting/ishotgunconstruction2 user.unEquip(src) user.put_in_hands(C) - user << "You screw the pins into place, securing the pipe to the receiver." + to_chat(user, "You screw the pins into place, securing the pipe to the receiver.") + qdel(src) /obj/item/weaponcrafting/ishotgunconstruction2 @@ -53,7 +55,8 @@ /obj/item/weaponcrafting/ishotgunconstruction2/attackby(obj/item/W as obj, mob/user as mob, params) if(istype(W,/obj/item/weaponcrafting/stock)) - user << "You attach the stock to the receiver-barrel assembly." + to_chat(user, "You attach the stock to the receiver-barrel assembly.") + var/obj/item/weaponcrafting/ishotgunconstruction3/I = new /obj/item/weaponcrafting/ishotgunconstruction3 user.unEquip(src) user.put_in_hands(I) @@ -75,9 +78,11 @@ var/obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised/W = new /obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised user.unEquip(src) user.put_in_hands(W) - user << "You tie the wrapping paper around the stock and the barrel to secure it." + to_chat(user, "You tie the wrapping paper around the stock and the barrel to secure it.") + qdel(src) else - user << "You need at least five feet of wrapping paper to secure the stock." + to_chat(user, "You need at least five feet of wrapping paper to secure the stock.") + return diff --git a/code/modules/crafting/table.dm b/code/modules/crafting/table.dm index b43c4cb89ce..8fdaaffaba0 100644 --- a/code/modules/crafting/table.dm +++ b/code/modules/crafting/table.dm @@ -203,15 +203,18 @@ return if(href_list["make"]) if(!check_table_space()) - usr << "The table is too crowded." + to_chat(usr, "The table is too crowded.") + return var/datum/table_recipe/TR = locate(href_list["make"]) busy = 1 interact(usr) if(construct_item(usr, TR)) - usr << "[TR.name] constructed." + to_chat(usr, "[TR.name] constructed.") + else - usr << "Construction failed." + to_chat(usr, "Construction failed.") + busy = 0 interact(usr) diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index b3cf1793f4f..79817543530 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -28,29 +28,35 @@ /obj/item/device/fluff/tattoo_gun/attack(mob/living/carbon/M as mob, mob/user as mob) if(user.a_intent == "harm") user.visible_message("[user] stabs [M] with the [src]!", "You stab [M] with the [src]!") - M << "[user] stabs you with the [src]!
      You feel a tiny prick!" + to_chat(M, "[user] stabs you with the [src]!
      You feel a tiny prick!") + return if(used) - user << "The [src] is out of ink." + to_chat(user, "The [src] is out of ink.") + return if(!istype(M, /mob/living/carbon/human)) - user << "You don't think tattooing [M] is the best idea." + to_chat(user, "You don't think tattooing [M] is the best idea.") + return var/mob/living/carbon/human/target = M if(istype(target.species, /datum/species/machine)) - user << "[target] has no skin, how do you expect to tattoo them?" + to_chat(user, "[target] has no skin, how do you expect to tattoo them?") + return if(target.m_style != "None") - user << "[target] already has body markings, any more would look silly!" + to_chat(user, "[target] already has body markings, any more would look silly!") + return if(target == user) - user << "You use the [src] to apply a [tattoo_name] to yourself!" + to_chat(user, "You use the [src] to apply a [tattoo_name] to yourself!") + else user.visible_message("[user] begins to apply a [tattoo_name] [target] with the [src].", "You begin to tattoo [target] with the [src]!") @@ -127,7 +133,8 @@ C.regenerate_icons() C.name = "Detective Sax" C.visible_message("[C] suddenly winks into existence at [user]'s feet!") - user << "[src] crumbles to dust in your hands!" + to_chat(user, "[src] crumbles to dust in your hands!") + qdel(src) /obj/item/weapon/storage/toolbox/fluff/lunchbox //godoforeos: Jason Conrad @@ -227,15 +234,19 @@ switch(icon_state) if("Kluysfluff1") src.icon_state = "Kluysfluff2" - usr << "The fibre unfolds into a jacket." + to_chat(usr, "The fibre unfolds into a jacket.") + if("Kluysfluff2") src.icon_state = "Kluysfluff3" - usr << "The fibre unfolds into a coat." + to_chat(usr, "The fibre unfolds into a coat.") + if("Kluysfluff3") src.icon_state = "Kluysfluff1" - usr << "The fibre gets sucked back into its holder." + to_chat(usr, "The fibre gets sucked back into its holder.") + else - usr << "You attempt to hit the button but can't." + to_chat(usr, "You attempt to hit the button but can't.") + return usr.update_inv_wear_suit() @@ -284,10 +295,12 @@ if(src.icon_state == "jane_sid_suit_down") src.item_color = "jane_sid_suit" - usr << "You zip up \the [src]." + to_chat(usr, "You zip up \the [src].") + else src.item_color = "jane_sid_suit_down" - usr << "You unzip and roll down \the [src]." + to_chat(usr, "You unzip and roll down \the [src].") + src.icon_state = "[item_color]" src.item_state = "[item_color]" @@ -370,12 +383,14 @@ if(adjusted) icon_state = initial(icon_state) item_state = initial(item_state) - usr << "You untransform \the [src]." + to_chat(usr, "You untransform \the [src].") + adjusted = 0 else icon_state += "_open" item_state += "_open" - usr << "You transform \the [src]." + to_chat(usr, "You transform \the [src].") + adjusted = 1 usr.update_inv_head() diff --git a/code/modules/customitems/item_spawning.dm b/code/modules/customitems/item_spawning.dm index 909abc1bbdc..9dc4dc7f6ff 100644 --- a/code/modules/customitems/item_spawning.dm +++ b/code/modules/customitems/item_spawning.dm @@ -45,13 +45,15 @@ if(S.contents.len < S.storage_slots) Item.loc = M.back ok = 1 - M << "Your [Item.name] has been added to your [M.back.name]." + to_chat(M, "Your [Item.name] has been added to your [M.back.name].") + if(ok == 0) for(var/obj/item/weapon/storage/S in M.contents) // Try to place it in any item that can store stuff, on the mob. if (S.contents.len < S.storage_slots) Item.loc = S ok = 1 - M << "Your [Item.name] has been added to your [S.name]." + to_chat(M, "Your [Item.name] has been added to your [S.name].") + break if(description) Item.desc = description diff --git a/code/modules/detective_work/evidence.dm b/code/modules/detective_work/evidence.dm index e2cf4ba6931..ec2c7d12eaa 100644 --- a/code/modules/detective_work/evidence.dm +++ b/code/modules/detective_work/evidence.dm @@ -22,15 +22,18 @@ return if(istype(I, /obj/item/weapon/evidencebag)) - user << "You find putting an evidence bag in another evidence bag to be slightly absurd." + to_chat(user, "You find putting an evidence bag in another evidence bag to be slightly absurd.") + return 1 //now this is podracing if(I.w_class > 3) - user << "[I] won't fit in [src]." + to_chat(user, "[I] won't fit in [src].") + return if(contents.len) - user << "[src] already has something inside it." + to_chat(user, "[src] already has something inside it.") + return if(!isturf(I.loc)) //If it isn't on the floor. Do some checks to see if it's in our hands or a box. Otherwise give up. @@ -77,7 +80,8 @@ desc = "An empty evidence bag." else - user << "[src] is empty." + to_chat(user, "[src] is empty.") + icon_state = "evidenceobj" return diff --git a/code/modules/detective_work/scanner.dm b/code/modules/detective_work/scanner.dm index 370c224ce52..75bed197992 100644 --- a/code/modules/detective_work/scanner.dm +++ b/code/modules/detective_work/scanner.dm @@ -17,7 +17,8 @@ /obj/item/device/detective_scanner/attack_self(var/mob/user) if(log.len && !scanning) scanning = 1 - user << "Printing report, please wait..." + to_chat(user, "Printing report, please wait...") + playsound(loc, "sound/goonstation/machines/printer_thermal.ogg", 50, 1) spawn(100) @@ -32,13 +33,15 @@ if(ismob(loc)) var/mob/M = loc M.put_in_hands(P) - M << "Report printed. Log cleared." + to_chat(M, "Report printed. Log cleared.") + // Clear the logs log = list() scanning = 0 else - user << "The scanner has no logs or is in use." + to_chat(user, "The scanner has no logs or is in use.") + /obj/item/device/detective_scanner/attack(mob/living/M as mob, mob/user as mob) return @@ -59,7 +62,8 @@ scanning = 1 user.visible_message("\The [user] points the [src.name] at \the [A] and performs a forensic scan.") - user << "You scan \the [A]. The scanner is now analysing the results..." + to_chat(user, "You scan \the [A]. The scanner is now analysing the results...") + // GATHER INFORMATION @@ -152,10 +156,12 @@ if(!found_something) add_log("# No forensic traces found #", 0) // Don't display this to the holder user if(holder) - holder << "Unable to locate any fingerprints, materials, fibers, or blood on \the [target_name]!" + to_chat(holder, "Unable to locate any fingerprints, materials, fibers, or blood on \the [target_name]!") + else if(holder) - holder << "You finish scanning \the [target_name]." + to_chat(holder, "You finish scanning \the [target_name].") + add_log("---------------------------------------------------------", 0) scanning = 0 @@ -165,7 +171,8 @@ if(scanning) if(broadcast && ismob(loc)) var/mob/M = loc - M << msg + to_chat(M, msg) + log += "  [msg]" else CRASH("[src] \ref[src] is adding a log when it was never put in scanning mode!") diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm index 2f359cd2a39..f3d7a2805bc 100644 --- a/code/modules/economy/ATM.dm +++ b/code/modules/economy/ATM.dm @@ -112,7 +112,8 @@ log transactions T.time = worldtime2text() authenticated_account.transaction_log.Add(T) - user << "You insert [C] into [src]." + to_chat(user, "You insert [C] into [src].") + src.attack_hand(user) qdel(I) else @@ -120,7 +121,8 @@ log transactions /obj/machinery/atm/attack_hand(mob/user as mob) if(istype(user, /mob/living/silicon)) - user << "\red Artificial unit recognized. Artificial units do not currently receive monetary compensation, as per Nanotrasen regulation #1005." + to_chat(user, "\red Artificial unit recognized. Artificial units do not currently receive monetary compensation, as per Nanotrasen regulation #1005.") + return if(get_dist(src,user) <= 1) //check to see if the user has low security enabled @@ -225,7 +227,8 @@ log transactions var/target_account_number = text2num(href_list["target_acc_number"]) var/transfer_purpose = href_list["purpose"] if(linked_db.charge_to_account(target_account_number, authenticated_account.owner_name, transfer_purpose, machine_id, transfer_amount)) - usr << "\icon[src]Funds transfer successful." + to_chat(usr, "\icon[src]Funds transfer successful.") + authenticated_account.money -= transfer_amount //create an entry in the account transaction log @@ -238,10 +241,12 @@ log transactions T.amount = "([transfer_amount])" authenticated_account.transaction_log.Add(T) else - usr << "\icon[src]Funds transfer failed." + to_chat(usr, "\icon[src]Funds transfer failed.") + else - usr << "\icon[src]You don't have enough funds to do that!" + to_chat(usr, "\icon[src]You don't have enough funds to do that!") + if("view_screen") view_screen = text2num(href_list["view_screen"]) if("change_security_level") @@ -275,11 +280,13 @@ log transactions T.time = worldtime2text() failed_account.transaction_log.Add(T) else - usr << "\red \icon[src] Incorrect pin/account combination entered, [max_pin_attempts - number_incorrect_tries] attempts remaining." + to_chat(usr, "\red \icon[src] Incorrect pin/account combination entered, [max_pin_attempts - number_incorrect_tries] attempts remaining.") + previous_account_number = tried_account_num playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 1) else - usr << "\red \icon[src] incorrect pin/account combination entered." + to_chat(usr, "\red \icon[src] incorrect pin/account combination entered.") + number_incorrect_tries = 0 else playsound(src, 'sound/machines/twobeep.ogg', 50, 1) @@ -295,7 +302,8 @@ log transactions T.time = worldtime2text() authenticated_account.transaction_log.Add(T) - usr << "\blue \icon[src] Access granted. Welcome user '[authenticated_account.owner_name].'" + to_chat(usr, "\blue \icon[src] Access granted. Welcome user '[authenticated_account.owner_name].'") + previous_account_number = tried_account_num if("withdrawal") @@ -308,7 +316,8 @@ log transactions //remove the money if(amount > 10000) // prevent crashes - usr << "\blue The ATM's screen flashes, 'Maximum single withdrawl limit reached, defaulting to 10,000.'" + to_chat(usr, "\blue The ATM's screen flashes, 'Maximum single withdrawl limit reached, defaulting to 10,000.'") + amount = 10000 authenticated_account.money -= amount withdraw_arbitrary_sum(amount) @@ -323,11 +332,13 @@ log transactions T.time = worldtime2text() authenticated_account.transaction_log.Add(T) else - usr << "\icon[src]You don't have enough funds to do that!" + to_chat(usr, "\icon[src]You don't have enough funds to do that!") + if("balance_statement") if(authenticated_account) if(world.timeofday < lastprint + PRINT_DELAY) - usr << "The [src.name] flashes an error on its display." + to_chat(usr, "The [src.name] flashes an error on its display.") + return lastprint = world.timeofday playsound(loc, "sound/goonstation/machines/printer_thermal.ogg", 50, 1) @@ -391,7 +402,8 @@ log transactions if(I) authenticated_account = attempt_account_access(I.associated_account_number) if(authenticated_account) - human_user << "\blue \icon[src] Access granted. Welcome user '[authenticated_account.owner_name].'" + to_chat(human_user, "\blue \icon[src] Access granted. Welcome user '[authenticated_account.owner_name].'") + //create a transaction log entry var/datum/transaction/T = new() diff --git a/code/modules/economy/EFTPOS.dm b/code/modules/economy/EFTPOS.dm index 729ae67acce..f67aba1e6e2 100644 --- a/code/modules/economy/EFTPOS.dm +++ b/code/modules/economy/EFTPOS.dm @@ -111,9 +111,11 @@ var/obj/item/weapon/card/I = O scan_card(I) else - usr << "\icon[src]Unable to connect to linked account." + to_chat(usr, "\icon[src]Unable to connect to linked account.") + else - usr << "\icon[src]Unable to connect to accounts database." + to_chat(usr, "\icon[src]Unable to connect to accounts database.") + else ..() @@ -130,7 +132,8 @@ alert("That is not a valid code!") print_reference() else - usr << "\icon[src]Incorrect code entered." + to_chat(usr, "\icon[src]Incorrect code entered.") + if("change_id") var/attempt_code = text2num(input("Re-enter the current EFTPOS access code", "Confirm EFTPOS code")) if(attempt_code == access_code) @@ -139,7 +142,8 @@ eftpos_name = name + " EFTPOS scanner" print_reference() else - usr << "\icon[src]Incorrect code entered." + to_chat(usr, "\icon[src]Incorrect code entered.") + if("link_account") if(!linked_db) reconnect_database() @@ -148,7 +152,8 @@ var/attempt_pin = input("Enter pin code", "Account pin") as num linked_account = attempt_account_access(attempt_account_num, attempt_pin, 1) else - usr << "\icon[src]Unable to connect to accounts database." + to_chat(usr, "\icon[src]Unable to connect to accounts database.") + if("trans_purpose") var/purpose = input("Enter reason for EFTPOS transaction", "Transaction purpose") as text|null if(purpose) @@ -168,7 +173,8 @@ else if(linked_account) transaction_locked = 1 else - usr << "\icon[src] No account connected to send transactions to." + to_chat(usr, "\icon[src] No account connected to send transactions to.") + if("scan_card") //attempt to connect to a new db, and if that doesn't work then fail if(!linked_db) @@ -178,7 +184,8 @@ if (istype(I, /obj/item/weapon/card)) scan_card(I) else - usr << "\icon[src]Unable to link accounts." + to_chat(usr, "\icon[src]Unable to link accounts.") + if("reset") //reset the access code - requires HoP/captain access var/obj/item/I = usr.get_active_hand() @@ -186,10 +193,12 @@ var/obj/item/weapon/card/id/C = I if(access_cent_commander in C.access || access_hop in C.access || access_captain in C.access) access_code = 0 - usr << "\icon[src]Access code reset to 0." + to_chat(usr, "\icon[src]Access code reset to 0.") + else if (istype(I, /obj/item/weapon/card/emag)) access_code = 0 - usr << "\icon[src]Access code reset to 0." + to_chat(usr, "\icon[src]Access code reset to 0.") + src.attack_self(usr) @@ -233,11 +242,14 @@ T.time = worldtime2text() linked_account.transaction_log.Add(T) else - usr << "\icon[src]You don't have that much money!" + to_chat(usr, "\icon[src]You don't have that much money!") + else - usr << "\icon[src]Unable to access account. Check security settings and try again." + to_chat(usr, "\icon[src]Unable to access account. Check security settings and try again.") + else - usr << "\icon[src]EFTPOS is not connected to an account." + to_chat(usr, "\icon[src]EFTPOS is not connected to an account.") + else ..() diff --git a/code/modules/economy/POS.dm b/code/modules/economy/POS.dm index c1e1f83f27b..e16a475d468 100644 --- a/code/modules/economy/POS.dm +++ b/code/modules/economy/POS.dm @@ -403,7 +403,8 @@ var/const/POS_HEADER = {" src.attack_hand(usr) return if(usr != logged_in) - usr << "\red [logged_in.name] is already logged in. You cannot use this machine until they log out." + to_chat(usr, "\red [logged_in.name] is already logged in. You cannot use this machine until they log out.") + return if("act" in href_list) switch(href_list["act"]) @@ -431,7 +432,8 @@ var/const/POS_HEADER = {" for(var/list/line in splittext(href_list["csv"],"\n")) var/list/cells = splittext(line,",") if(cells.len<2) - usr << "\red The CSV must have at least two columns: Product Name, followed by Price (as a number)." + to_chat(usr, "\red The CSV must have at least two columns: Product Name, followed by Price (as a number).") + src.attack_hand(usr) return var/line_item/LI = new @@ -445,7 +447,8 @@ var/const/POS_HEADER = {" if("Save Settings") var/datum/money_account/new_linked_account = get_money_account(text2num(href_list["payableto"]),z) if(!new_linked_account) - usr << "\red Unable to link new account." + to_chat(usr, "\red Unable to link new account.") + else linked_account = new_linked_account screen=POS_SCREEN_SETTINGS diff --git a/code/modules/economy/utils.dm b/code/modules/economy/utils.dm index a23308b9219..c2148deb9b5 100644 --- a/code/modules/economy/utils.dm +++ b/code/modules/economy/utils.dm @@ -48,7 +48,8 @@ /datum/money_account/proc/charge(var/transaction_amount,var/datum/money_account/dest,var/transaction_purpose, var/terminal_name="", var/terminal_id=0, var/dest_name = "UNKNOWN") if(suspended) - usr << "Unable to access source account: account suspended." + to_chat(usr, "Unable to access source account: account suspended.") + return 0 if(transaction_amount <= money) @@ -88,5 +89,6 @@ transaction_log.Add(T) return 1 else - usr << "Insufficient funds in account." + to_chat(usr, "Insufficient funds in account.") + return 0 \ No newline at end of file diff --git a/code/modules/events/communications_blackout.dm b/code/modules/events/communications_blackout.dm index 3ec9b6d2e46..9a77a6d08ff 100644 --- a/code/modules/events/communications_blackout.dm +++ b/code/modules/events/communications_blackout.dm @@ -7,9 +7,12 @@ "#4nd%;f4y6,>?%-BZZZZZZZT") for(var/mob/living/silicon/ai/A in player_list) //AIs are always aware of communication blackouts. - A << "
      " - A << "[alert]" - A << "
      " + to_chat(A, "
      ") + + to_chat(A, "[alert]") + + to_chat(A, "
      ") + if(prob(30)) //most of the time, we don't want an announcement, so as to allow AIs to fake blackouts. command_announcement.Announce(alert) @@ -23,8 +26,11 @@ command_announcement.Announce("Ionospheric anomalies detected. Temporary telecommunication failure imminent. Please contact you-BZZT", new_sound = 'sound/misc/interference.ogg') else // AIs will always know if there's a comm blackout, rogue AIs could then lie about comm blackouts in the future while they shutdown comms for(var/mob/living/silicon/ai/A in player_list) - A << "
      " - A << "Ionospheric anomalies detected. Temporary telecommunication failure imminent. Please contact you-BZZT" - A << "
      " + to_chat(A, "
      ") + + to_chat(A, "Ionospheric anomalies detected. Temporary telecommunication failure imminent. Please contact you-BZZT") + + to_chat(A, "
      ") + for(var/obj/machinery/telecomms/T in telecomms_list) T.emp_act(1) diff --git a/code/modules/events/event_manager.dm b/code/modules/events/event_manager.dm index 7ddb6470282..06a40d81fdb 100644 --- a/code/modules/events/event_manager.dm +++ b/code/modules/events/event_manager.dm @@ -73,7 +73,8 @@ if(!report_at_round_end) return - world << "


      Random Events This Round:" + to_chat(world, "


      Random Events This Round:") + for(var/datum/event/E in active_events|finished_events) var/datum/event_meta/EM = E.event_meta if(EM.name == "Nothing") @@ -87,7 +88,8 @@ else message += "and ran to completion." - world << message + to_chat(world, message) + /datum/event_manager/proc/GetInteractWindow() var/html = "Refresh" diff --git a/code/modules/events/holidays/Holidays.dm b/code/modules/events/holidays/Holidays.dm index 38ea6d63ac6..363cd7017e0 100644 --- a/code/modules/events/holidays/Holidays.dm +++ b/code/modules/events/holidays/Holidays.dm @@ -140,8 +140,10 @@ var/global/Holiday = null //Run at the start of a round /proc/Holiday_Game_Start() if(Holiday) - world << "and..." - world << "

      Happy [Holiday] Everybody!

      " + to_chat(world, "and...") + + to_chat(world, "

      Happy [Holiday] Everybody!

      ") + switch(Holiday) //special holidays if("Easter") //do easter stuff diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm index 980319a1979..6a6d2c91469 100644 --- a/code/modules/events/ion_storm.dm +++ b/code/modules/events/ion_storm.dm @@ -27,9 +27,12 @@ var/message = generate_ion_law(ionMessage) if(message) M.add_ion_law(message) - M << "
      " - M << "[message] ...LAWS UPDATED" - M << "
      " + to_chat(M, "
      ") + + to_chat(M, "[message] ...LAWS UPDATED") + + to_chat(M, "
      ") + if(botEmagChance) for(var/mob/living/simple_animal/bot/bot in machines) diff --git a/code/modules/events/prison_break.dm b/code/modules/events/prison_break.dm index b1a6c522081..77f2717831a 100644 --- a/code/modules/events/prison_break.dm +++ b/code/modules/events/prison_break.dm @@ -50,7 +50,8 @@ for(var/obj/machinery/message_server/MS in world) MS.send_rc_message("Engineering", my_department, rc_message, "", "", 2) for(var/mob/living/silicon/ai/A in player_list) - A << "Malicious program detected in the [english_list(areaName)] lighting and airlock control systems by [my_department]." + to_chat(A, "Malicious program detected in the [english_list(areaName)] lighting and airlock control systems by [my_department].") + else log_to_dd("ERROR: Could not initate grey-tide. Unable to find suitable containment area.") diff --git a/code/modules/events/undead.dm b/code/modules/events/undead.dm index c6aa04ba00f..b2a0f166735 100644 --- a/code/modules/events/undead.dm +++ b/code/modules/events/undead.dm @@ -37,4 +37,5 @@ /datum/event/undead/announce() for(var/mob/living/M in player_list) - M << "You feel [pick("a chill","a deathly chill","the undead","dirty", "creeped out","afraid","fear")]!" + to_chat(M, "You feel [pick("a chill","a deathly chill","the undead","dirty", "creeped out","afraid","fear")]!") + diff --git a/code/modules/fish/fish_items.dm b/code/modules/fish/fish_items.dm index 612c991b938..65db943ae6e 100644 --- a/code/modules/fish/fish_items.dm +++ b/code/modules/fish/fish_items.dm @@ -39,7 +39,8 @@ var/global/list/fish_items_list = list("goldfish" = /obj/item/weapon/fish/goldfi throw_range = 7 suicide_act(mob/user) //"A tiny net is a death sentence: it's a net and it's tiny!" https://www.youtube.com/watch?v=FCI9Y4VGCVw - viewers(user) << "[user] places the [src.name] on top of \his head, \his fingers tangled in the netting! It looks like \he's trying to commit suicide." + to_chat(viewers(user), "[user] places the [src.name] on top of \his head, \his fingers tangled in the netting! It looks like \he's trying to commit suicide.") + return(OXYLOSS) /obj/item/weapon/fishfood @@ -65,7 +66,8 @@ var/global/list/fish_items_list = list("goldfish" = /obj/item/weapon/fish/goldfi attack_verb = list("scrubbed", "brushed", "scraped") suicide_act(mob/user) - viewers(user) << "[user] is vigorously scrubbing \himself raw with the [src.name]! It looks like \he's trying to commit suicide." + to_chat(viewers(user), "[user] is vigorously scrubbing \himself raw with the [src.name]! It looks like \he's trying to commit suicide.") + return(BRUTELOSS|FIRELOSS) ////////////////////////////////////////////// @@ -133,7 +135,8 @@ var/global/list/fish_items_list = list("goldfish" = /obj/item/weapon/fish/goldfi /obj/item/weapon/fish/shark/attackby(var/obj/item/O, var/mob/user as mob) if(istype(O, /obj/item/weapon/wirecutters)) - user << "You rip out the teeth of \the [src.name]!" + to_chat(user, "You rip out the teeth of \the [src.name]!") + new /obj/item/weapon/fish/toothless_shark(get_turf(src)) new /obj/item/weapon/shard/shark_teeth(get_turf(src)) qdel(src) @@ -166,7 +169,8 @@ var/global/list/fish_items_list = list("goldfish" = /obj/item/weapon/fish/goldfi /obj/item/weapon/fish/catfish/attackby(var/obj/item/O, var/mob/user as mob) if(is_sharp(O)) - user << "You carefully clean and gut \the [src.name]." + to_chat(user, "You carefully clean and gut \the [src.name].") + new /obj/item/weapon/reagent_containers/food/snacks/catfishmeat(get_turf(src)) new /obj/item/weapon/reagent_containers/food/snacks/catfishmeat(get_turf(src)) qdel(src) @@ -185,7 +189,8 @@ var/global/list/fish_items_list = list("goldfish" = /obj/item/weapon/fish/goldfi /obj/item/weapon/fish/salmon/attackby(var/obj/item/O, var/mob/user as mob) if(is_sharp(O)) - user << "You carefully clean and gut \the [src.name]." + to_chat(user, "You carefully clean and gut \the [src.name].") + new /obj/item/weapon/reagent_containers/food/snacks/salmonmeat(get_turf(src)) new /obj/item/weapon/reagent_containers/food/snacks/salmonmeat(get_turf(src)) qdel(src) @@ -201,7 +206,8 @@ var/global/list/fish_items_list = list("goldfish" = /obj/item/weapon/fish/goldfi /obj/item/weapon/fish/babycarp/attackby(var/obj/item/O, var/mob/user as mob) if(is_sharp(O)) - user << "You carefully clean and gut \the [src.name]." + to_chat(user, "You carefully clean and gut \the [src.name].") + new /obj/item/weapon/reagent_containers/food/snacks/carpmeat(get_turf(src)) //just one fillet; this is a baby, afterall. qdel(src) return diff --git a/code/modules/fish/fishtank.dm b/code/modules/fish/fishtank.dm index ba02098e30e..754d6d80fc6 100644 --- a/code/modules/fish/fishtank.dm +++ b/code/modules/fish/fishtank.dm @@ -310,7 +310,8 @@ src.visible_message("A new [type] has hatched in \the [src]!") //Null type fish are dud eggs, give a message to inform the player else - usr << "The eggs disolve in the water. They were duds!" + to_chat(usr, "The eggs disolve in the water. They were duds!") + /obj/machinery/fishtank/proc/select_egg_type() var/fish = pick(fish_list) //Select a fish from the fish in the tank @@ -340,7 +341,8 @@ /obj/machinery/fishtank/proc/harvest_fish(var/mob/user) if(!fish_count) //Can't catch non-existant fish! - usr << "There are no fish in \the [src] to catch!" + to_chat(usr, "There are no fish in \the [src] to catch!") + return var/caught_fish @@ -496,7 +498,8 @@ //Finally, report the full examine_message constructed from the above reports - user << "[examine_message]" + to_chat(user, "[examine_message]") + return examine_message ////////////////////////////// @@ -523,7 +526,8 @@ kill_fish() //Kill a random fish M.health = M.maxHealth //Eating fish heals the predator else - usr << "There are no fish in [src]!" + to_chat(usr, "There are no fish in [src]!") + else attack_generic(M, M.harm_intent_damage) else if(istype(M, /mob/living/simple_animal/hostile/bear)) @@ -541,7 +545,8 @@ kill_fish() //Kill a random fish M.health = M.maxHealth //Eating fish heals the predator else - usr << "There are no fish in [src]!" + to_chat(usr, "There are no fish in [src]!") + else attack_generic(M, M.harm_intent_damage) else @@ -606,14 +611,17 @@ if(user.a_intent == I_HELP) if(W.isOn()) if(cur_health < max_health) - usr << "You repair some of the cracks on \the [src]." + to_chat(usr, "You repair some of the cracks on \the [src].") + cur_health += 20 check_health() else - usr << "There is no damage to fix!" + to_chat(usr, "There is no damage to fix!") + else if(cur_health < max_health) - usr << "[W.name] must on to repair this damage." + to_chat(usr, "[W.name] must on to repair this damage.") + else user.changeNext_move(CLICK_CD_MELEE) hit(W.force) @@ -622,7 +630,8 @@ if(O.is_open_container()) if(istype(O, /obj/item/weapon/reagent_containers/glass)) if(lid_switch) - usr << "Open the lid on \the [src] first!" + to_chat(usr, "Open the lid on \the [src] first!") + return var/obj/item/weapon/reagent_containers/glass/C = O //Containers with any reagents will get dumped in @@ -640,7 +649,8 @@ C.reagents.clear_reagents() else if(water_level == water_capacity) - usr << "[src] is already full!" + to_chat(usr, "[src] is already full!") + return else message = "The filtration process purifies the water, raising the water level." @@ -656,7 +666,8 @@ //Empty containers will scoop out water, filling the container as much as possible from the water_level else if(water_level == 0) - usr << "[src] is empty!" + to_chat(usr, "[src] is empty!") + else if(water_level >= C.volume) //Enough to fill the container completely C.reagents.add_reagent("fishwater", C.volume) @@ -671,23 +682,27 @@ //Wrenches can deconstruct empty tanks, but not tanks with any water. Kills any fish left inside and destroys any unharvested eggs in the process if(istype(O, /obj/item/weapon/wrench)) if(water_level == 0) - usr << "Now disassembling [src]." + to_chat(usr, "Now disassembling [src].") + playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user,50, target = src)) destroy(1) else - usr << "[src] must be empty before you disassemble it!" + to_chat(usr, "[src] must be empty before you disassemble it!") + return //Fish eggs else if(istype(O, /obj/item/fish_eggs)) var/obj/item/fish_eggs/egg = O //Don't add eggs if there is no water (they kinda need that to live) if(water_level == 0) - usr << "[src] has no water; [egg.name] won't hatch without water!" + to_chat(usr, "[src] has no water; [egg.name] won't hatch without water!") + else //Don't add eggs if the tank already has the max number of fish if(fish_count >= max_fish) - usr << "[src] can't hold any more fish." + to_chat(usr, "[src] can't hold any more fish.") + else add_fish(egg.fish_type) qdel(egg) @@ -703,9 +718,11 @@ user.visible_message("[user.name] feeds the fish in \the [src]. The fish look excited!", "You feed the fish in \the [src]. They look excited!") food_level += 10 else - usr << "[src] already has plenty of food in it. You decide to not add more." + to_chat(usr, "[src] already has plenty of food in it. You decide to not add more.") + else - usr << "[src] doesn't have any water in it. You should fill it with water first." + to_chat(usr, "[src] doesn't have any water in it. You should fill it with water first.") + check_food_level() return //Fish egg scoop @@ -723,7 +740,8 @@ //Tank brush if(istype(O, /obj/item/weapon/tank_brush)) if(filth_level == 0) - usr << "[src] is already spotless!" + to_chat(usr, "[src] is already spotless!") + else filth_level = 0 user.visible_message("[user.name] scrubs the inside of \the [src], cleaning the filth.", "You scrub the inside of \the [src], cleaning the filth.") diff --git a/code/modules/flufftext/Dreaming.dm b/code/modules/flufftext/Dreaming.dm index a6c8ee86e5b..1a04faede2a 100644 --- a/code/modules/flufftext/Dreaming.dm +++ b/code/modules/flufftext/Dreaming.dm @@ -20,7 +20,8 @@ mob/living/carbon/proc/dream() for(var/i = rand(1,4),i > 0, i--) var/dream_image = pick(dreams) dreams -= dream_image - src << "... [dream_image] ..." + to_chat(src, "... [dream_image] ...") + sleep(rand(40,70)) if(paralysis <= 0) dreaming = 0 diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index d07474786ab..2c57b030ede 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -243,11 +243,13 @@ Gunshots/explosions/opening doors/less rare audio (done) sleep(10) if(!xeno) return var/xeno_name = xeno.name - target << "[xeno_name] begins climbing into the ventilation system..." + to_chat(target, "[xeno_name] begins climbing into the ventilation system...") + sleep(10) if(!xeno) return qdel(xeno) - target << "[xeno_name] scrambles into the ventilation ducts!" + to_chat(target, "[xeno_name] scrambles into the ventilation ducts!") + qdel(src) /obj/effect/hallucination/singularity_scare @@ -295,29 +297,41 @@ Gunshots/explosions/opening doors/less rare audio (done) switch(rand(1,5)) if(1) //Laser fight for(var/i=0,i[my_target] flails around wildly.
      ", \ "[my_target] has attacked [src]!") @@ -433,7 +448,8 @@ Gunshots/explosions/opening doors/less rare audio (done) step_away(src,my_target,2) if(prob(30)) for(var/mob/O in oviewers(world.view , my_target)) - O << "[my_target] stumbles around." + to_chat(O, "[my_target] stumbles around.") + /obj/effect/fake_attacker/New(loc,var/mob/living/carbon/T) ..() @@ -459,7 +475,8 @@ Gunshots/explosions/opening doors/less rare audio (done) else if(src.dir == WEST) qdel(src.currentimage) src.currentimage = new /image(left,src) - my_target << currentimage + to_chat(my_target, currentimage) + /obj/effect/fake_attacker/proc/attack_loop() @@ -476,7 +493,8 @@ Gunshots/explosions/opening doors/less rare audio (done) if(prob(15)) src.do_attack_animation(my_target) if(weapon_name) - my_target << sound(pick('sound/weapons/genhit1.ogg', 'sound/weapons/genhit2.ogg', 'sound/weapons/genhit3.ogg')) + to_chat(my_target, sound(pick('sound/weapons/genhit1.ogg', 'sound/weapons/genhit2.ogg', 'sound/weapons/genhit3.ogg'))) + my_target.show_message("[src.name] has attacked [my_target] with [weapon_name]!", 1) my_target.staminaloss += 30 if(prob(20)) @@ -485,7 +503,8 @@ Gunshots/explosions/opening doors/less rare audio (done) if(!locate(/obj/effect/overlay) in my_target.loc) fake_blood(my_target) else - my_target << sound(pick('sound/weapons/punch1.ogg','sound/weapons/punch2.ogg','sound/weapons/punch3.ogg','sound/weapons/punch4.ogg')) + to_chat(my_target, sound(pick('sound/weapons/punch1.ogg','sound/weapons/punch2.ogg','sound/weapons/punch3.ogg','sound/weapons/punch4.ogg'))) + my_target.show_message("[src.name] has punched [my_target]!", 1) my_target.staminaloss += 30 if(prob(33)) @@ -503,7 +522,8 @@ Gunshots/explosions/opening doors/less rare audio (done) var/obj/effect/overlay/O = new/obj/effect/overlay(target.loc) O.name = "blood" var/image/I = image('icons/effects/blood.dmi',O,"floor[rand(1,7)]",O.dir,1) - target << I + to_chat(target, I) + spawn(300) qdel(O) return @@ -565,13 +585,15 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite person = H people += H if(person) //Basic talk - target << target.hear_say(pick(speak_messages),language = pick(person.languages),speaker = person) + to_chat(target, target.hear_say(pick(speak_messages),language = pick(person.languages),speaker = person)) + else // Radio talk var/list/humans = list() for(var/mob/living/carbon/human/H in living_mob_list) humans += H person = pick(humans) - target << target.hear_radio(pick(radio_messages),language = pick(person.languages),speaker = person, part_a = "\[[get_frequency_name(PUB_FREQ)]\] ", part_b = " ") + to_chat(target, target.hear_radio(pick(radio_messages),language = pick(person.languages),speaker = person, part_a = "\[[get_frequency_name(PUB_FREQ)]\] ", part_b = " ")) + qdel(src) /obj/effect/hallucination/message @@ -588,7 +610,8 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite "You feel faint.", \ "You hear a strange, alien voice in your head...[pick("Hiss","Ssss")]", \ "You can see...everything!") - target << chosen + to_chat(target, chosen) + qdel(src) /mob/living/carbon/proc/hallucinate(var/hal_type) // Todo -> proc / defines @@ -615,29 +638,51 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite new /obj/effect/hallucination/message(src.loc,src) if("sounds") //Strange audio - //src << "Strange Audio" +// to_chat(src, "Strange Audio") + switch(rand(1,18)) - if(1) src << 'sound/machines/airlock.ogg' + if(1) + to_chat(src, 'sound/machines/airlock.ogg') + if(2) - if(prob(50))src << 'sound/effects/Explosion1.ogg' - else src << 'sound/effects/Explosion2.ogg' - if(3) src << 'sound/effects/explosionfar.ogg' - if(4) src << 'sound/effects/Glassbr1.ogg' - if(5) src << 'sound/effects/Glassbr2.ogg' - if(6) src << 'sound/effects/Glassbr3.ogg' - if(7) src << 'sound/machines/twobeep.ogg' - if(8) src << 'sound/machines/windowdoor.ogg' + if(prob(50)) + to_chat(src, 'sound/effects/Explosion1.ogg') + else + to_chat(src, 'sound/effects/Explosion2.ogg') + + if(3) + to_chat(src, 'sound/effects/explosionfar.ogg') + + if(4) + to_chat(src, 'sound/effects/Glassbr1.ogg') + + if(5) + to_chat(src, 'sound/effects/Glassbr2.ogg') + + if(6) + to_chat(src, 'sound/effects/Glassbr3.ogg') + + if(7) + to_chat(src, 'sound/machines/twobeep.ogg') + + if(8) + to_chat(src, 'sound/machines/windowdoor.ogg') + if(9) //To make it more realistic, I added two gunshots (enough to kill) - src << 'sound/weapons/Gunshot.ogg' + to_chat(src, 'sound/weapons/Gunshot.ogg') spawn(rand(10,30)) - src << 'sound/weapons/Gunshot.ogg' - if(10) src << 'sound/weapons/smash.ogg' + to_chat(src, 'sound/weapons/Gunshot.ogg') + + if(10) + to_chat(src, 'sound/weapons/smash.ogg') + if(11) //Same as above, but with tasers. - src << 'sound/weapons/Taser.ogg' + to_chat(src, 'sound/weapons/Taser.ogg') spawn(rand(10,30)) - src << 'sound/weapons/Taser.ogg' + to_chat(src, 'sound/weapons/Taser.ogg') + //Rare audio if(12) //These sounds are (mostly) taken from Hidden: Source @@ -646,30 +691,39 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite 'sound/hallucinations/growl3.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg', 'sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg',\ 'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\ 'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg') - src << pick(creepyasssounds) + to_chat(src, pick(creepyasssounds)) + if(13) - src << "You feel a tiny prick!" + to_chat(src, "You feel a tiny prick!") + if(14) - src << "

      Priority Announcement

      " - src << "

      The Emergency Shuttle has docked with the station. You have 3 minutes to board the Emergency Shuttle.

      " - src << sound('sound/AI/shuttledock.ogg') + to_chat(src, "

      Priority Announcement

      ") + to_chat(src, "

      The Emergency Shuttle has docked with the station. You have 3 minutes to board the Emergency Shuttle.

      ") + to_chat(src, sound('sound/AI/shuttledock.ogg')) + if(15) - src << 'sound/items/Welder.ogg' + to_chat(src, 'sound/items/Welder.ogg') + if(16) - src << 'sound/items/Screwdriver.ogg' + to_chat(src, 'sound/items/Screwdriver.ogg') + if(17) - src << 'sound/weapons/saberon.ogg' + to_chat(src, 'sound/weapons/saberon.ogg') + if(18) - src << 'sound/weapons/saberoff.ogg' + to_chat(src, 'sound/weapons/saberoff.ogg') + if("hudscrew") //Screwy HUD - //src << "Screwy HUD" +// to_chat(src, "Screwy HUD") + hal_screwyhud = pick(1,2,3,3,4,4) spawn(rand(100,250)) hal_screwyhud = 0 if("items") //Strange items - //src << "Traitor Items" +// to_chat(src, "Traitor Items") + if(!halitem) halitem = new var/list/slots_free = list(ui_lhand,ui_rhand) @@ -715,7 +769,8 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite qdel(halitem) if("dangerflash") //Flashes of danger - //src << "Danger Flash" +// to_chat(src, "Danger Flash") + if(!halimage) var/list/possible_points = list() for(var/turf/simulated/floor/F in view(src,world.view)) @@ -725,13 +780,16 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite switch(rand(1,3)) if(1) - //src << "Space" +// to_chat(src, "Space") + halimage = image('icons/turf/space.dmi',target,"[rand(1,25)]",TURF_LAYER) if(2) - //src << "Fire" +// to_chat(src, "Fire") + halimage = image('icons/effects/fire.dmi',target,"1",TURF_LAYER) if(3) - //src << "C4" +// to_chat(src, "C4") + halimage = image('icons/obj/assemblies.dmi',target,"plastic-explosive2",OBJ_LAYER+0.01) diff --git a/code/modules/food/cooker.dm b/code/modules/food/cooker.dm index 76f67e47fb8..05722cd2085 100644 --- a/code/modules/food/cooker.dm +++ b/code/modules/food/cooker.dm @@ -35,11 +35,13 @@ // check if you can put it in the machine /obj/machinery/cooker/proc/checkValid(obj/item/check, mob/user) if(on) - user << "[src] is still active!" + to_chat(user, "[src] is still active!") + return 0 if(istype(check, /obj/item/weapon/reagent_containers/food/snacks)) return 1 - user << "You can only process food!" + to_chat(user, "You can only process food!") + return 0 /obj/machinery/cooker/proc/setIcon(obj/item/copyme, obj/item/copyto) @@ -61,7 +63,8 @@ /obj/machinery/cooker/proc/burn(mob/user, obj/item/weapon/reagent_containers/props) var/obj/item/weapon/reagent_containers/food/snacks/badrecipe/burnt = new(get_turf(src)) setRegents(props, burnt) - user << "You smell burning coming from the [src]!" + to_chat(user, "You smell burning coming from the [src]!") + var/datum/effect/system/bad_smoke_spread/smoke = new /datum/effect/system/bad_smoke_spread() // burning things makes smoke! smoke.set_up(5, 0, src) smoke.start() @@ -80,7 +83,8 @@ /obj/machinery/cooker/proc/putIn(obj/item/tocook, mob/chef) icon_state = onicon - chef << "You put [tocook] into [src]." + to_chat(chef, "You put [tocook] into [src].") + on = 1 chef.drop_item() tocook.loc = src @@ -98,7 +102,8 @@ if(!burns) if(istype(I, /obj/item/weapon/reagent_containers/food/snacks)) if(checkCooked(I)) - user << "That is already [thiscooktype], it would do nothing!" + to_chat(user, "That is already [thiscooktype], it would do nothing!") + return putIn(I, user) sleep(cooktime) diff --git a/code/modules/food/customizables.dm b/code/modules/food/customizables.dm index ccab1b11afc..1631456beec 100644 --- a/code/modules/food/customizables.dm +++ b/code/modules/food/customizables.dm @@ -324,12 +324,15 @@ /obj/item/weapon/reagent_containers/food/snacks/customizable/attackby(obj/item/I, mob/user, params) if(src.contents.len > sandwich_limit) - user << "If you put anything else in or on [src] it's going to make a mess." + to_chat(user, "If you put anything else in or on [src] it's going to make a mess.") + return if(!istype(I, /obj/item/weapon/reagent_containers/food/snacks)) - user << "\The [I] isn't exactly something that you would want to eat." + to_chat(user, "\The [I] isn't exactly something that you would want to eat.") + return - user << "You add [I] to [src]." + to_chat(user, "You add [I] to [src].") + if(istype(I, /obj/item/weapon/reagent_containers/)) var/obj/item/weapon/reagent_containers/F = I F.reagents.trans_to(src, F.reagents.total_volume) @@ -386,7 +389,8 @@ ..(user) var/whatsinside = pick(ingredients) - user << " You think you can see [whatsinside] in there." + to_chat(user, " You think you can see [whatsinside] in there.") + /* /obj/item/weapon/reagent_containers/food/snacks/customizable/attack(mob/M as mob, mob/user as mob, def_zone) //SNOOOOOOOWFLAAAAAAAAAAAAAAAAAKES @@ -402,7 +406,8 @@ H = M if(H && shard && M == user) //This needs a check for feeding the food to other people, but that could be abusable. - H << "\red You lacerate your mouth on a [shard.name] in the sandwich!" + to_chat(H, "\red You lacerate your mouth on a [shard.name] in the sandwich!") + H.adjustBruteLoss(5) //TODO: Target head if human. ..() */ diff --git a/code/modules/food/icecream_vat.dm b/code/modules/food/icecream_vat.dm index eae35e2df0e..44303927248 100644 --- a/code/modules/food/icecream_vat.dm +++ b/code/modules/food/icecream_vat.dm @@ -32,14 +32,17 @@ /obj/machinery/icemachine/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weapon/reagent_containers/glass)) if(beaker) - user << "A container is already inside [src]." + to_chat(user, "A container is already inside [src].") + return if(!user.drop_item()) - user << "\The [I] is stuck to you!" + to_chat(user, "\The [I] is stuck to you!") + return beaker = I I.forceMove(src) - user << "You add [I] to [src]" + to_chat(user, "You add [I] to [src]") + updateUsrDialog() return if(istype(I, /obj/item/weapon/reagent_containers/food/snacks/icecream)) @@ -51,7 +54,8 @@ I.name += " with sprinkles" I.desc += ". This also has sprinkles." else - user << "This [I] already has sprinkles." + to_chat(user, "This [I] already has sprinkles.") + /obj/machinery/icemachine/proc/validexchange(reag) @@ -59,7 +63,8 @@ return 1 else if(reagents.total_volume < 500) - usr << "[src] vibrates for a moment, apparently accepting the unknown liquid." + to_chat(usr, "[src] vibrates for a moment, apparently accepting the unknown liquid.") + playsound(loc, 'sound/machines/twobeep.ogg', 10, 1) return 1 diff --git a/code/modules/food/oven.dm b/code/modules/food/oven.dm index 3ed9cb3888f..616065f0abc 100644 --- a/code/modules/food/oven.dm +++ b/code/modules/food/oven.dm @@ -17,7 +17,8 @@ /obj/machinery/cooking/attackby(obj/item/I, mob/user, params) if(on) - user << "The machine is already running." + to_chat(user, "The machine is already running.") + return else var/obj/item/F = I @@ -26,7 +27,8 @@ if(!C) return else - user << "You put [F] into [src] for cooking." + to_chat(user, "You put [F] into [src] for cooking.") + user.drop_item() F.loc = src on = TRUE diff --git a/code/modules/garbage_collection/garbage_collector.dm b/code/modules/garbage_collection/garbage_collector.dm index f6675365f8d..f7ea60a7db7 100644 --- a/code/modules/garbage_collection/garbage_collector.dm +++ b/code/modules/garbage_collection/garbage_collector.dm @@ -142,7 +142,8 @@ var/global/datum/controller/process/garbage_collector/garbageCollector #endif garbageCollector.addTrash(D) else - // world << "WARNING GC DID NOT GET A RETURN VALUE FOR [D], [D.type]!" +// to_chat(world, "WARNING GC DID NOT GET A RETURN VALUE FOR [D], [D.type]!") + garbageCollector.addTrash(D) diff --git a/code/modules/garbage_collection/gc_testing.dm b/code/modules/garbage_collection/gc_testing.dm index f571a00c791..2d2a3801759 100644 --- a/code/modules/garbage_collection/gc_testing.dm +++ b/code/modules/garbage_collection/gc_testing.dm @@ -9,7 +9,8 @@ return garbageCollector.del_everything = !garbageCollector.del_everything - // world << "GC: qdel turned [garbageCollector.del_everything ? "off" : "on"]." +// to_chat(world, "GC: qdel turned [garbageCollector.del_everything ? "off" : "on"].") + log_admin("[key_name(usr)] turned qdel [garbageCollector.del_everything ? "off" : "on"].") message_admins("\blue [key_name_admin(usr)] turned qdel [garbageCollector.del_everything ? "off" : "on"].", 1) @@ -44,12 +45,15 @@ return if(!gc_hard_del_types || !gc_hard_del_types.len) - usr << "No hard del()'d types found." + to_chat(usr, "No hard del()'d types found.") + return - usr << "Types hard del()'d by the GC:" + to_chat(usr, "Types hard del()'d by the GC:") + for(var/A in gc_hard_del_types) - usr << "[A]" + to_chat(usr, "[A]") + // Profiling stuff var/global/del_profiling = 0 @@ -169,7 +173,7 @@ var/global/list/ghdels_profiled = list() if(usr && usr.client) usr.client.running_find_references = null running_find_references = null - + /client/verb/purge_all_destroyed_objects() set category = "Debug" if(garbageCollector) @@ -190,4 +194,3 @@ var/global/list/ghdels_profiled = list() if(!running_find_references) find_references(remove_from_queue = FALSE) #endif - \ No newline at end of file diff --git a/code/modules/holiday/holiday.dm b/code/modules/holiday/holiday.dm index 43d7cf2a464..5f13c6d9aa6 100644 --- a/code/modules/holiday/holiday.dm +++ b/code/modules/holiday/holiday.dm @@ -317,7 +317,8 @@ begin_day += 31 begin_month-- //begins in march, ends in april -// world << "Easter calculates to be on [begin_day] of [begin_month] ([days_early] early) to [end_day] of [end_month] ([days_extra] extra) for 20[yy]" +// to_chat(world, "Easter calculates to be on [begin_day] of [begin_month] ([days_early] early) to [end_day] of [end_month] ([days_extra] extra) for 20[yy]") + return ..() diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 8aa79cd6484..94e5ea0c8f5 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -28,7 +28,8 @@ if(!plant_controller) sleep(250) // ugly hack, should mean roundstart plants are fine. if(!plant_controller) - world << "Plant controller does not exist and [src] requires it. Aborting." + to_chat(world, "Plant controller does not exist and [src] requires it. Aborting.") + qdel(src) return @@ -83,7 +84,8 @@ if(!plant_controller) sleep(250) // ugly hack, should mean roundstart plants are fine. if(!plant_controller) - world << "Plant controller does not exist and [src] requires it. Aborting." + to_chat(world, "Plant controller does not exist and [src] requires it. Aborting.") + qdel(src) return @@ -182,7 +184,8 @@ return M.stop_pulling() - M << "You slipped on the [name]!" + to_chat(M, "You slipped on the [name]!") + playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) M.Stun(8) M.Weaken(5) @@ -202,7 +205,8 @@ var/obj/item/stack/cable_coil/C = W if(C.use(5)) //TODO: generalize this. - user << "You add some cable to the [src.name] and slide it inside the battery casing." + to_chat(user, "You add some cable to the [src.name] and slide it inside the battery casing.") + var/obj/item/weapon/stock_parts/cell/potato/pocell = new /obj/item/weapon/stock_parts/cell/potato(get_turf(user)) if(src.loc == user && !(user.l_hand && user.r_hand) && istype(user,/mob/living/carbon/human)) user.put_in_hands(pocell) @@ -219,21 +223,24 @@ qdel(src) return else if(seed.kitchen_tag == "potato") - user << "You slice \the [src] into sticks." + to_chat(user, "You slice \the [src] into sticks.") + reagents_per_slice = reagents.total_volume slice = new /obj/item/weapon/reagent_containers/food/snacks/rawsticks(get_turf(src)) reagents.trans_to(slice, reagents_per_slice) qdel(src) return else if(seed.kitchen_tag == "carrot") - user << "You slice \the [src] into sticks." + to_chat(user, "You slice \the [src] into sticks.") + reagents_per_slice = reagents.total_volume slice = new /obj/item/weapon/reagent_containers/food/snacks/carrotfries(get_turf(src)) reagents.trans_to(slice, reagents_per_slice) qdel(src) return else if(seed.kitchen_tag == "watermelon") - user << "You slice \the [src] into large slices." + to_chat(user, "You slice \the [src] into large slices.") + reagents_per_slice = reagents.total_volume/5 for(var/i=0,i<5,i++) slice = new /obj/item/weapon/reagent_containers/food/snacks/watermelonslice(get_turf(src)) @@ -241,7 +248,8 @@ qdel(src) return else if(seed.kitchen_tag == "soybeans") - user << "You roughly chop up \the [src]." + to_chat(user, "You roughly chop up \the [src].") + reagents_per_slice = reagents.total_volume slice = new /obj/item/weapon/reagent_containers/food/snacks/soydope(get_turf(src)) reagents.trans_to(slice, reagents_per_slice) @@ -259,7 +267,8 @@ if(G.amount>=G.max_amount) continue G.attackby(NG, user) - user << "You add the newly-formed wood to the stack. It now contains [NG.amount] planks." + to_chat(user, "You add the newly-formed wood to the stack. It now contains [NG.amount] planks.") + qdel(src) return else if(istype(W, /obj/item/weapon/rollingpaper)) @@ -283,10 +292,12 @@ src.reagents.trans_to(J, J.chem_volume) qdel(W) user.put_in_active_hand(J) - user << "\blue You roll the [src] into a rolling paper." + to_chat(user, "\blue You roll the [src] into a rolling paper.") + qdel(src) else - user << "\red You can't roll a smokable from the [src]." + to_chat(user, "\red You can't roll a smokable from the [src].") + ..() @@ -347,12 +358,14 @@ return if(reagents && reagents.total_volume <= 0) //used-up fruit will be destroyed if(user) - user << "\The [src] has dried out and crumbles to dust." + to_chat(user, "\The [src] has dried out and crumbles to dust.") + //user.drop_from_inventory(src) qdel(src) else if(prob(35)) //fruit that still has reagents has a chance of breaking each time it stings on hit if(user) - user << "\The [src] has fallen to bits." + to_chat(user, "\The [src] has fallen to bits.") + //user.drop_from_inventory(src) qdel(src) @@ -378,7 +391,8 @@ return if(user.a_intent == I_DISARM && seed.get_trait(TRAIT_SPREAD) > 0) //Using disarm so we can tell if you want to plant or convert non-final plants - user << "You plant the [src.name]." + to_chat(user, "You plant the [src.name].") + new /obj/machinery/portable_atmospherics/hydroponics/soil/invisible(get_turf(user),src.seed) new /obj/effect/plant(get_turf(user), src.seed) qdel(src) @@ -390,13 +404,15 @@ if("comfrey") var/obj/item/stack/medical/bruise_pack/comfrey/poultice = new /obj/item/stack/medical/bruise_pack/comfrey(user.loc) poultice.heal_brute = potency - user << "You mash the leaves into a poultice." + to_chat(user, "You mash the leaves into a poultice.") + qdel(src) return if("aloe") var/obj/item/stack/medical/ointment/aloe/poultice = new /obj/item/stack/medical/ointment/aloe(user.loc) poultice.heal_burn = potency - user << "You mash the petals into a poultice." + to_chat(user, "You mash the petals into a poultice.") + qdel(src) return if("grass") @@ -410,7 +426,8 @@ if(NG.amount>=NG.max_amount) continue NG.attackby(G, user) - user << "You add the newly-formed grass to the stack. It now contains [G.amount] tiles." + to_chat(user, "You add the newly-formed grass to the stack. It now contains [G.amount] tiles.") + qdel(src) return if("sunflower") @@ -424,7 +441,8 @@ if(prob(10)) user.say("PRAISE THE SUN!") else - user << "PRAISE THE SUN!" + to_chat(user, "PRAISE THE SUN!") + user.unEquip(src) user.put_in_hands(NF) qdel(src) @@ -432,7 +450,8 @@ if("nettle") var/obj/item/weapon/grown/nettle/nettle = new /obj/item/weapon/grown/nettle(user.loc) nettle.force = round((5 + potency / 5), 1) - user << "You straighten up the plant." + to_chat(user, "You straighten up the plant.") + user.unEquip(src) user.put_in_hands(nettle) qdel(src) @@ -440,41 +459,52 @@ if("deathnettle") var/obj/item/weapon/grown/nettle/death/DN = new /obj/item/weapon/grown/nettle/death(user.loc) DN.force = round((5 + potency / 2.5), 1) - user << "You straighten up the plant." + to_chat(user, "You straighten up the plant.") + user.unEquip(src) user.put_in_hands(DN) qdel(src) return if("cashpod") - user << "You crack open the cash pod..." + to_chat(user, "You crack open the cash pod...") + var/value = round(seed.get_trait(TRAIT_POTENCY)) user.unEquip(src) switch(value) if(0) - user << "It's empty! What a waste..." + to_chat(user, "It's empty! What a waste...") + if(1 to 10) - user << "It has a space dollar inside. Woo." + to_chat(user, "It has a space dollar inside. Woo.") + new /obj/item/weapon/spacecash(get_turf(user)) if(11 to 20) - user << "It has 10 space dollars inside!" + to_chat(user, "It has 10 space dollars inside!") + new /obj/item/weapon/spacecash/c10(get_turf(user)) if(21 to 30) - user << "It has 20 space dollars inside! Cool!" + to_chat(user, "It has 20 space dollars inside! Cool!") + new /obj/item/weapon/spacecash/c20(get_turf(user)) if(31 to 40) - user << "It has 50 space dollars inside! Nice!" + to_chat(user, "It has 50 space dollars inside! Nice!") + new /obj/item/weapon/spacecash/c50(get_turf(user)) if(41 to 50) - user << "It has 100 space dollars inside! Sweet!" + to_chat(user, "It has 100 space dollars inside! Sweet!") + new /obj/item/weapon/spacecash/c100(get_turf(user)) if(51 to 60) - user << "It has 200 space dollars inside! Awesome!" + to_chat(user, "It has 200 space dollars inside! Awesome!") + new /obj/item/weapon/spacecash/c200(get_turf(user)) if(61 to 80) - user << "It has 500 space dollars inside! CHA-CHING!" + to_chat(user, "It has 500 space dollars inside! CHA-CHING!") + new /obj/item/weapon/spacecash/c500(get_turf(user)) else - user << "It has 1000 space dollars inside! JACKPOT!" + to_chat(user, "It has 1000 space dollars inside! JACKPOT!") + new /obj/item/weapon/spacecash/c1000(get_turf(user)) qdel(src) return @@ -507,5 +537,6 @@ O.update_icon() //update power meters and such batteries_recharged = 1 if(batteries_recharged) - usr << "Battery has recovered." + to_chat(usr, "Battery has recovered.") + ..() \ No newline at end of file diff --git a/code/modules/hydroponics/grown_inedible.dm b/code/modules/hydroponics/grown_inedible.dm index c806bf0b8c1..3592e5091d5 100644 --- a/code/modules/hydroponics/grown_inedible.dm +++ b/code/modules/hydroponics/grown_inedible.dm @@ -65,7 +65,8 @@ user.UpdateDamageIcon() else C.take_organ_damage(0,force) - C << "The nettle burns your bare hand!" + to_chat(C, "The nettle burns your bare hand!") + return 1 /obj/item/weapon/grown/nettle/afterattack(atom/A as mob|obj, mob/user,proximity) @@ -73,7 +74,8 @@ if(force > 0) force -= rand(1, (force / 3) + 1) // When you whack someone with it, leaves fall off else - usr << "All the leaves have fallen off the nettle from violent whacking." + to_chat(usr, "All the leaves have fallen off the nettle from violent whacking.") + usr.unEquip(src) qdel(src) @@ -90,11 +92,13 @@ if(..()) if(prob(50)) user.Paralyse(5) - user << "You are stunned by the Deathnettle when you try picking it up!" + to_chat(user, "You are stunned by the Deathnettle when you try picking it up!") + /obj/item/weapon/grown/nettle/death/afterattack(mob/living/carbon/M, mob/user) if(istype(M, /mob/living)) - M << "You are stunned by the powerful acid of the Deathnettle!" + to_chat(M, "You are stunned by the powerful acid of the Deathnettle!") + add_logs(M, user, "attacked", src) M.eye_blurry += force/7 @@ -118,7 +122,8 @@ /obj/item/weapon/corncob/attackby(obj/item/weapon/W as obj, mob/user as mob) ..() if(istype(W, /obj/item/weapon/circular_saw) || istype(W, /obj/item/weapon/hatchet) || istype(W, /obj/item/weapon/kitchen/knife)) - user << "You use [W] to fashion a pipe out of the corn cob!" + to_chat(user, "You use [W] to fashion a pipe out of the corn cob!") + new /obj/item/clothing/mask/cigarette/pipe/cobpipe (user.loc) qdel(src) return @@ -149,8 +154,10 @@ throw_range = 20 /obj/item/weapon/grown/sunflower/attack(mob/M as mob, mob/user as mob) - M << " [user] smacks you with a [name]!FLOWER POWER" - user << " Your [name]'s FLOWER POWER strikes [M]" + to_chat(M, " [user] smacks you with a [name]!FLOWER POWER") + + to_chat(user, " Your [name]'s FLOWER POWER strikes [M]") + // Novaflower @@ -167,13 +174,17 @@ throw_range = 20 /obj/item/weapon/grown/novaflower/attack(mob/living/carbon/M as mob, mob/user as mob) - M << "[user] smacks you with a [name]!FLOWER POWER" - user << " Your [name]'s FLOWER POWER strikes [M]" + to_chat(M, "[user] smacks you with a [name]!FLOWER POWER") + + to_chat(user, " Your [name]'s FLOWER POWER strikes [M]") + if(istype(M, /mob/living)) - M << "You are heated by the warmth of the of the [name]!" + to_chat(M, "You are heated by the warmth of the of the [name]!") + M.bodytemperature += potency/2 * TEMPERATURE_DAMAGE_COEFFICIENT /obj/item/weapon/grown/novaflower/pickup(mob/living/carbon/human/user as mob) if(!user.gloves) - user << "The [name] burns your bare hand!" + to_chat(user, "The [name] burns your bare hand!") + user.adjustFireLoss(rand(1,5)) diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index 896eb886060..46945d792f6 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -120,15 +120,19 @@ if(get_trait(TRAIT_CARNIVOROUS)) if(get_trait(TRAIT_CARNIVOROUS) == 2) if(affecting) - target << "\The [fruit]'s thorns pierce your [affecting.name] greedily!" + to_chat(target, "\The [fruit]'s thorns pierce your [affecting.name] greedily!") + else - target << "\The [fruit]'s thorns pierce your flesh greedily!" + to_chat(target, "\The [fruit]'s thorns pierce your flesh greedily!") + damage = get_trait(TRAIT_POTENCY)/2 else if(affecting) - target << "\The [fruit]'s thorns dig deeply into your [affecting.name]!" + to_chat(target, "\The [fruit]'s thorns dig deeply into your [affecting.name]!") + else - target << "\The [fruit]'s thorns dig deeply into your flesh!" + to_chat(target, "\The [fruit]'s thorns dig deeply into your flesh!") + damage = get_trait(TRAIT_POTENCY)/5 else return @@ -187,7 +191,8 @@ if(!protection_needed) //properly protected, good job! return - target << "You are stung by \the [fruit]!" + to_chat(target, "You are stung by \the [fruit]!") + for(var/rid in chems) var/injecting = min(5,max(1,get_trait(TRAIT_POTENCY)/5)) target.reagents.add_reagent(rid,injecting) @@ -713,9 +718,13 @@ return if(!force_amount && get_trait(TRAIT_YIELD) == 0 && !harvest_sample) - if(istype(user)) user << "You fail to harvest anything useful." + if(istype(user)) + to_chat(user, "You fail to harvest anything useful.") + else - if(istype(user)) user << "You [harvest_sample ? "take a sample" : "harvest"] from the [display_name]." + if(istype(user)) + to_chat(user, "You [harvest_sample ? "take a sample" : "harvest"] from the [display_name].") + //This may be a new line. Update the global if it is. if(name == "new line" || !(name in plant_controller.seeds)) diff --git a/code/modules/hydroponics/seed_controller.dm b/code/modules/hydroponics/seed_controller.dm index 7e373bfd2a6..211a738f57d 100644 --- a/code/modules/hydroponics/seed_controller.dm +++ b/code/modules/hydroponics/seed_controller.dm @@ -13,11 +13,13 @@ if(!holder) return if(!plant_controller || !plant_controller.gene_tag_list) - usr << "Gene tags not set." + to_chat(usr, "Gene tags not set.") + return for(var/gene_tag in plant_controller.gene_tag_list) - usr << "[gene_tag]" + to_chat(usr, "[gene_tag]") + var/global/datum/controller/plants/plant_controller // Set in New(). @@ -144,7 +146,9 @@ var/global/datum/controller/plants/plant_controller // Set in New(). /client/proc/list_plant_sprites() if(!plant_controller || !plant_controller.plant_sprites || !plant_controller.plant_sprites.len) - world << "Cannot list plant sprites, plant controller or plant sprites list may not be initialized." + to_chat(world, "Cannot list plant sprites, plant controller or plant sprites list may not be initialized.") + for(var/base in plant_controller.plant_sprites) - world << "[base] : [plant_controller.plant_sprites[base]] growth states" \ No newline at end of file + to_chat(world, "[base] : [plant_controller.plant_sprites[base]] growth states") + diff --git a/code/modules/hydroponics/seed_machines.dm b/code/modules/hydroponics/seed_machines.dm index 3f01f903763..0fafc331621 100644 --- a/code/modules/hydroponics/seed_machines.dm +++ b/code/modules/hydroponics/seed_machines.dm @@ -17,7 +17,8 @@ if(genes.len) var/choice = alert(user, "Are you sure you want to wipe the disk?", "Xenobotany Data", "No", "Yes") if(src && user && genes && choice && choice == "Yes" && user.Adjacent(get_turf(src))) - user << "You wipe the disk data." + to_chat(user, "You wipe the disk data.") + name = initial(name) desc = initial(name) genes = list() @@ -82,21 +83,25 @@ /obj/machinery/botany/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W,/obj/item/seeds)) if(seed) - user << "There is already a seed loaded." + to_chat(user, "There is already a seed loaded.") + return var/obj/item/seeds/S =W if(S.seed && S.seed.get_trait(TRAIT_IMMUTABLE) > 0) - user << "That seed is not compatible with our genetics technology." + to_chat(user, "That seed is not compatible with our genetics technology.") + else user.drop_item(W) W.loc = src seed = W - user << "You load [W] into [src]." + to_chat(user, "You load [W] into [src].") + return if(istype(W,/obj/item/weapon/screwdriver)) open = !open - user << "You [open ? "open" : "close"] the maintenance panel." + to_chat(user, "You [open ? "open" : "close"] the maintenance panel.") + return if(open) @@ -106,24 +111,28 @@ if(istype(W,/obj/item/weapon/disk/botany)) if(loaded_disk) - user << "There is already a data disk loaded." + to_chat(user, "There is already a data disk loaded.") + return else var/obj/item/weapon/disk/botany/B = W if(B.genes && B.genes.len) if(!disk_needs_genes) - user << "That disk already has gene data loaded." + to_chat(user, "That disk already has gene data loaded.") + return else if(disk_needs_genes) - user << "That disk does not have any gene data loaded." + to_chat(user, "That disk does not have any gene data loaded.") + return user.drop_item(W) W.loc = src loaded_disk = W - user << "You load [W] into [src]." + to_chat(user, "You load [W] into [src].") + return ..() diff --git a/code/modules/hydroponics/seed_packets.dm b/code/modules/hydroponics/seed_packets.dm index 568af7a89ec..728a67e34e2 100644 --- a/code/modules/hydroponics/seed_packets.dm +++ b/code/modules/hydroponics/seed_packets.dm @@ -62,7 +62,8 @@ var/global/list/plant_seed_sprites = list() /obj/item/seeds/examine(mob/user) ..(user) if(seed && !seed.roundstart) - user << "It's tagged as variety #[seed.uid]." + to_chat(user, "It's tagged as variety #[seed.uid].") + /obj/item/seeds/cutting name = "cuttings" diff --git a/code/modules/hydroponics/seed_storage.dm b/code/modules/hydroponics/seed_storage.dm index ad8cc8fa281..4032d9b0ff4 100644 --- a/code/modules/hydroponics/seed_storage.dm +++ b/code/modules/hydroponics/seed_storage.dm @@ -215,12 +215,14 @@ if (loaded) user.visible_message("[user] puts the seeds from \the [O.name] into \the [src].", "You put the seeds from \the [O.name] into \the [src].") else - user << "There are no seeds in \the [O.name]." + to_chat(user, "There are no seeds in \the [O.name].") + return else if(istype(O, /obj/item/weapon/wrench)) playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) anchored = !anchored - user << "You [anchored ? "wrench" : "unwrench"] \the [src]." + to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src].") + /obj/machinery/seed_storage/proc/add(var/obj/item/seeds/O as obj) if (istype(O.loc, /mob)) diff --git a/code/modules/hydroponics/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm index c169711ef83..cdbf594abdb 100644 --- a/code/modules/hydroponics/spreading/spreading.dm +++ b/code/modules/hydroponics/spreading/spreading.dm @@ -92,7 +92,8 @@ if(!plant_controller) sleep(250) // ugly hack, should mean roundstart plants are fine. if(!plant_controller) - world << "Plant controller does not exist and [src] requires it. Aborting." + to_chat(world, "Plant controller does not exist and [src] requires it. Aborting.") + qdel(src) return @@ -243,7 +244,8 @@ if(istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/weapon/scalpel)) if(!seed) - user << "There is nothing to take a sample from." + to_chat(user, "There is nothing to take a sample from.") + return seed.harvest(user,0,1) health -= (rand(3,5)*10) diff --git a/code/modules/hydroponics/spreading/spreading_response.dm b/code/modules/hydroponics/spreading/spreading_response.dm index fbdc534c4e4..ec264a71115 100644 --- a/code/modules/hydroponics/spreading/spreading_response.dm +++ b/code/modules/hydroponics/spreading/spreading_response.dm @@ -52,6 +52,7 @@ //entangling people if(victim.loc == src.loc) - victim << "Tendrils [pick("wind", "tangle", "tighten")] around you!" + to_chat(victim, "Tendrils [pick("wind", "tangle", "tighten")] around you!") + can_buckle = 1 buckle_mob(victim) \ No newline at end of file diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index 4eda71ebfd1..58ba48a6aaa 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -163,7 +163,9 @@ return if(closed_system) - if(user) user << "You can't harvest from the plant while the lid is shut." + if(user) + to_chat(user, "You can't harvest from the plant while the lid is shut.") + return if(user) @@ -196,7 +198,8 @@ if(!user || !dead) return if(closed_system) - user << "You can't remove the dead plant while the lid is shut." + to_chat(user, "You can't remove the dead plant while the lid is shut.") + return seed = null @@ -208,7 +211,8 @@ yield_mod = 0 mutation_mod = 0 - user << "You remove the dead plant." + to_chat(user, "You remove the dead plant.") + check_health() return @@ -336,11 +340,13 @@ set src in view(1) if(labelled) - usr << "You remove the label." + to_chat(usr, "You remove the label.") + labelled = null update_icon() else - usr << "There is no label to remove." + to_chat(usr, "There is no label to remove.") + return /obj/machinery/portable_atmospherics/hydroponics/verb/setlight() @@ -351,7 +357,8 @@ var/new_light = input("Specify a light level.") as null|anything in list(0,1,2,3,4,5,6,7,8,9,10) if(new_light) tray_light = new_light - usr << "You set the tray to a light level of [tray_light] lumens." + to_chat(usr, "You set the tray to a light level of [tray_light] lumens.") + /obj/machinery/portable_atmospherics/hydroponics/proc/check_level_sanity() //Make sure various values are sane. @@ -398,7 +405,8 @@ if(istype(O, /obj/item/weapon/crowbar)) if(anchored==2) - user << "Unscrew the hoses first!" + to_chat(user, "Unscrew the hoses first!") + return default_deconstruction_crowbar(O, 1) @@ -410,11 +418,13 @@ var/obj/item/weapon/reagent_containers/glass/C = O //Check if container is empty if(!C.reagents.total_volume) - user << "\red [C] is empty." + to_chat(user, "\red [C] is empty.") + return //Container not empty, transfer contents to tray var/trans = C.reagents.trans_to(src, C.amount_per_transfer_from_this) - user << "\blue You transfer [trans] units of the solution to [src]." + to_chat(user, "\blue You transfer [trans] units of the solution to [src].") + check_level_sanity() process_reagents() @@ -427,7 +437,8 @@ toxins += P.toxicity pestlevel -= P.pest_kill_str weedlevel -= P.weed_kill_str - user << "You spray [src] with [O]." + to_chat(user, "You spray [src] with [O].") + playsound(loc, 'sound/effects/spray3.ogg', 50, 1, -6) qdel(O) @@ -440,7 +451,8 @@ user.drop_item(O) toxins += W.toxicity weedlevel -= W.weed_kill_str - user << "You spray [src] with [O]." + to_chat(user, "You spray [src] with [O].") + playsound(loc, 'sound/effects/spray3.ogg', 50, 1, -6) qdel(O) @@ -453,7 +465,8 @@ //Check if there is a plant in the tray if(seed) if(!S.reagents.total_volume) - user << "\red [S] is empty." + to_chat(user, "\red [S] is empty.") + return //Container not empty, transfer contents to tray S.reagents.trans_to(src, S.amount_per_transfer_from_this) @@ -462,20 +475,23 @@ check_level_sanity() update_icon() else - user << "There's nothing in [src] to spray!" + to_chat(user, "There's nothing in [src] to spray!") + else if(istype(O, /obj/item/weapon/screwdriver) && unwrenchable) //THIS NEED TO BE DONE DIFFERENTLY, SOMEONE REFACTOR THE TRAY CODE ALREADY if(anchored) if(anchored == 2) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) anchored = 1 - user << "You unscrew the [src]'s hoses." + to_chat(user, "You unscrew the [src]'s hoses.") + panel_open = 0 else if(anchored == 1) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) anchored = 2 - user << "You screw in the [src]'s hoses." + to_chat(user, "You screw in the [src]'s hoses.") + panel_open = 1 for(var/obj/machinery/portable_atmospherics/hydroponics/h in range(1,src)) @@ -485,15 +501,18 @@ if(istype(O, /obj/item/weapon/wirecutters) || istype(O, /obj/item/weapon/scalpel)) if(!seed) - user << "There is nothing to take a sample from in \the [src]." + to_chat(user, "There is nothing to take a sample from in \the [src].") + return if(sampled) - user << "You have already sampled from this plant." + to_chat(user, "You have already sampled from this plant.") + return if(dead) - user << "The plant is dead." + to_chat(user, "The plant is dead.") + return // Create a sample. @@ -518,14 +537,17 @@ if(seed) return ..() else - user << "There's no plant to inject." + to_chat(user, "There's no plant to inject.") + return 1 else if(seed) //Leaving this in in case we want to extract from plants later. - user << "You can't get any extract out of this plant." + to_chat(user, "You can't get any extract out of this plant.") + else - user << "There's nothing to draw something from." + to_chat(user, "There's nothing to draw something from.") + return 1 else if (istype(O, /obj/item/seeds)) @@ -536,11 +558,13 @@ user.drop_item(O) if(!S.seed) - user << "The packet seems to be empty. You throw it away." + to_chat(user, "The packet seems to be empty. You throw it away.") + qdel(O) return - user << "You plant the [S.seed.seed_name] [S.seed.seed_noun]." + to_chat(user, "You plant the [S.seed.seed_name] [S.seed.seed_noun].") + seed = S.seed //Grab the seed datum. dead = 0 age = 1 @@ -554,7 +578,8 @@ check_health() else - user << "\The [src] already has seeds in it!" + to_chat(user, "\The [src] already has seeds in it!") + else if (istype(O, /obj/item/weapon/minihoe)) // The minihoe @@ -563,7 +588,8 @@ weedlevel = 0 update_icon() else - user << "This plot is completely devoid of weeds. It doesn't need uprooting." + to_chat(user, "This plot is completely devoid of weeds. It doesn't need uprooting.") + else if (istype(O, /obj/item/weapon/storage/bag/plants)) @@ -583,12 +609,14 @@ playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) anchored = !anchored - user << "You [anchored ? "wrench" : "unwrench"] \the [src]." + to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src].") + else if(istype(O, /obj/item/apiary)) if(seed) - user << "[src] is already occupied!" + to_chat(user, "[src] is already occupied!") + else user.drop_item() qdel(O) @@ -600,7 +628,8 @@ qdel(src) else if ((istype(O, /obj/item/weapon/tank) && !( src.destroyed ))) if (src.holding) - user << "\blue There is alreadu a tank loaded into the [src]." + to_chat(user, "\blue There is alreadu a tank loaded into the [src].") + return var/obj/item/weapon/tank/T = O user.drop_item() @@ -635,26 +664,34 @@ ..(user) if(!seed) - user << "[src] is empty." + to_chat(user, "[src] is empty.") + return - user << "[seed.display_name] are growing here.
      " + to_chat(user, "[seed.display_name] are growing here.
      ") + if(!Adjacent(user)) return - user << "Water: [round(waterlevel,0.1)]/[maxwater]" - user << "Nutrient: [round(nutrilevel,0.1)]/[maxnutri]" + to_chat(user, "Water: [round(waterlevel,0.1)]/[maxwater]") + + to_chat(user, "Nutrient: [round(nutrilevel,0.1)]/[maxnutri]") + if(weedlevel >= 5) - user << "\The [src] is infested with weeds!" + to_chat(user, "\The [src] is infested with weeds!") + if(pestlevel >= 5) - user << "\The [src] is infested with tiny worms!" + to_chat(user, "\The [src] is infested with tiny worms!") + if(dead) - user << "The plant is dead." + to_chat(user, "The plant is dead.") + else if(health <= (seed.get_trait(TRAIT_ENDURANCE)/ 2)) - user << "The plant looks unhealthy." + to_chat(user, "The plant looks unhealthy.") + if(mechanical) var/turf/T = loc @@ -682,7 +719,8 @@ light_available = 5 light_string = "a light level of [light_available] lumens" - user << "The tray's sensor suite is reporting [light_string] and a temperature of [environment.temperature]K." + to_chat(user, "The tray's sensor suite is reporting [light_string] and a temperature of [environment.temperature]K.") + /obj/machinery/portable_atmospherics/hydroponics/verb/close_lid_verb() set name = "Toggle Tray Lid" @@ -695,7 +733,8 @@ return closed_system = !closed_system - user << "You [closed_system ? "close" : "open"] the tray's lid." + to_chat(user, "You [closed_system ? "close" : "open"] the tray's lid.") + update_icon() /obj/machinery/portable_atmospherics/hydroponics/verb/eject_tank_verb() @@ -709,9 +748,11 @@ return if(!holding) - usr << "\red There is no tank loaded into [src] to eject." + to_chat(usr, "\red There is no tank loaded into [src] to eject.") + if(istype(holding, /obj/item/weapon/tank)) - usr << "\blue You eject [holding.name] from [src]." + to_chat(usr, "\blue You eject [holding.name] from [src].") + holding.loc = loc holding = null \ No newline at end of file diff --git a/code/modules/hydroponics/trays/tray_apiary.dm b/code/modules/hydroponics/trays/tray_apiary.dm index f21ac2765df..836952ed88d 100644 --- a/code/modules/hydroponics/trays/tray_apiary.dm +++ b/code/modules/hydroponics/trays/tray_apiary.dm @@ -35,10 +35,12 @@ else if(istype(Proj ,/obj/item/projectile/energy/florayield)) if(!yieldmod) yieldmod += 1 - //world << "Yield increased by 1, from 0, to a total of [myseed.yield]" +// to_chat(world, "Yield increased by 1, from 0, to a total of [myseed.yield]") + else if (prob(1/(yieldmod * yieldmod) *100))//This formula gives you diminishing returns based on yield. 100% with 1 yield, decreasing to 25%, 11%, 6, 4, 2... yieldmod += 1 - //world << "Yield increased by 1, to a total of [myseed.yield]" +// to_chat(world, "Yield increased by 1, to a total of [myseed.yield]") + else ..() return @@ -46,56 +48,69 @@ /obj/machinery/apiary/attackby(var/obj/item/O as obj, var/mob/user as mob) if(istype(O, /obj/item/queen_bee)) if(health > 0) - user << "\red There is already a queen in there." + to_chat(user, "\red There is already a queen in there.") + else health = 10 nutrilevel += 10 user.drop_item() qdel(O) - user << "\blue You carefully insert the queen into [src], she gets busy making a hive." + to_chat(user, "\blue You carefully insert the queen into [src], she gets busy making a hive.") + bees_in_hive = 0 else if(istype(O, /obj/item/beezeez)) beezeez += 100 nutrilevel += 10 user.drop_item() if(health > 0) - user << "\blue You insert [O] into [src]. A relaxed humming appears to pick up." + to_chat(user, "\blue You insert [O] into [src]. A relaxed humming appears to pick up.") + else - user << "\blue You insert [O] into [src]. Now it just needs some bees." + to_chat(user, "\blue You insert [O] into [src]. Now it just needs some bees.") + qdel(O) else if(istype(O, /obj/item/weapon/minihoe)) if(health > 0) - user << "\red You begin to dislodge the apiary from the tray, the bees don't like that." + to_chat(user, "\red You begin to dislodge the apiary from the tray, the bees don't like that.") + angry_swarm(user) else - user << "\blue You begin to dislodge the dead apiary from the tray." + to_chat(user, "\blue You begin to dislodge the dead apiary from the tray.") + if(do_after(user, 50, target = src)) new hydrotray_type(src.loc) new /obj/item/apiary(src.loc) - user << "\red You dislodge the apiary from the tray." + to_chat(user, "\red You dislodge the apiary from the tray.") + qdel(src) else if(istype(O, /obj/item/weapon/bee_net)) var/obj/item/weapon/bee_net/N = O if(N.caught_bees > 0) - user << "\blue You empty the bees into the apiary." + to_chat(user, "\blue You empty the bees into the apiary.") + bees_in_hive += N.caught_bees N.caught_bees = 0 else - user << "\blue There are no more bees in the net." + to_chat(user, "\blue There are no more bees in the net.") + else if(istype(O, /obj/item/weapon/reagent_containers/glass)) var/obj/item/weapon/reagent_containers/glass/G = O if(harvestable_honey > 0) if(health > 0) - user << "\red You begin to harvest the honey. The bees don't seem to like it." + to_chat(user, "\red You begin to harvest the honey. The bees don't seem to like it.") + angry_swarm(user) else - user << "\blue You begin to harvest the honey." + to_chat(user, "\blue You begin to harvest the honey.") + if(do_after(user,50, target = src)) G.reagents.add_reagent("honey",harvestable_honey) harvestable_honey = 0 - user << "\blue You successfully harvest the honey." + to_chat(user, "\blue You successfully harvest the honey.") + else - user << "\blue There is no honey left to harvest." + to_chat(user, "\blue There is no honey left to harvest.") + else angry_swarm(user) ..() @@ -236,5 +251,6 @@ if(toxic > 0) H.reagents.add_reagent("toxin", toxic) - usr << "\blue You harvest the honeycomb from the hive. There is a wild buzzing!" + to_chat(usr, "\blue You harvest the honeycomb from the hive. There is a wild buzzing!") + angry_swarm(usr) diff --git a/code/modules/hydroponics/trays/tray_tools.dm b/code/modules/hydroponics/trays/tray_tools.dm index a25eaec652b..bb4bde2da23 100644 --- a/code/modules/hydroponics/trays/tray_tools.dm +++ b/code/modules/hydroponics/trays/tray_tools.dm @@ -29,7 +29,8 @@ /obj/item/device/analyzer/plant_analyzer/proc/print_report(var/mob/living/user) if(!last_data) - user << "There is no scan data to print." + to_chat(user, "There is no scan data to print.") + return playsound(loc, "sound/goonstation/machines/printer_thermal.ogg", 50, 1) var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(get_turf(src)) @@ -99,7 +100,8 @@ grown_reagents = H.reagents if(!grown_seed) - user << "[src] can tell you nothing about \the [target]." + to_chat(user, "[src] can tell you nothing about \the [target].") + return form_title = "[grown_seed.seed_name] (#[grown_seed.uid])" @@ -344,7 +346,8 @@ /obj/item/weapon/scythe/tele/attack_self(mob/user as mob) extend = !extend if(extend) - user << "With a flick of the wrist, you extend the scythe. It's reaping time!" + to_chat(user, "With a flick of the wrist, you extend the scythe. It's reaping time!") + icon_state = "tscythe1" item_state = "scythe0" slot_flags &= ~SLOT_BELT @@ -355,7 +358,8 @@ //Extend sound (blade unsheath) playsound(src.loc, 'sound/weapons/blade_unsheath.ogg', 50, 1) //Sound credit to Qat of Freesound.org else - user << "You collapse the scythe, folding it for easy storage." + to_chat(user, "You collapse the scythe, folding it for easy storage.") + icon_state = "tscythe0" item_state = "tscythe0" //no sprite in other words slot_flags |= SLOT_BELT diff --git a/code/modules/hydroponics/trays/tray_update_icons.dm b/code/modules/hydroponics/trays/tray_update_icons.dm index ceab49c8e2f..746c0eba6f2 100644 --- a/code/modules/hydroponics/trays/tray_update_icons.dm +++ b/code/modules/hydroponics/trays/tray_update_icons.dm @@ -30,7 +30,8 @@ if(!seed.growth_stages) seed.update_growth_stages() if(!seed.growth_stages) - world << "Seed type [seed.get_trait(TRAIT_PLANT_ICON)] cannot find a growth stage value." + to_chat(world, "Seed type [seed.get_trait(TRAIT_PLANT_ICON)] cannot find a growth stage value.") + return var/overlay_stage = 1 if(age >= seed.get_trait(TRAIT_MATURATION)) diff --git a/code/modules/karma/karma.dm b/code/modules/karma/karma.dm index c3c0ca4eef1..f3ac43660bc 100644 --- a/code/modules/karma/karma.dm +++ b/code/modules/karma/karma.dm @@ -54,11 +54,13 @@ var/list/karma_spenders = list() set category = "Special Verbs" if(!ticker || !player_list.len) - usr << "\red You can't award karma until the game has started." + to_chat(usr, "\red You can't award karma until the game has started.") + return if(ticker.current_state == GAME_STATE_PREGAME) - usr << "\red You can't award karma until the game has started." + to_chat(usr, "\red You can't award karma until the game has started.") + return var/list/karma_list = list("Cancel") @@ -68,7 +70,8 @@ var/list/karma_spenders = list() karma_list += M if(!karma_list.len || karma_list.len == 1) - usr << "\red There's no-one to spend your karma on." + to_chat(usr, "\red There's no-one to spend your karma on.") + return var/pickedmob = input("Who would you like to award Karma to?", "Award Karma", "Cancel") as null|mob in karma_list @@ -77,7 +80,8 @@ var/list/karma_spenders = list() return if(!istype(pickedmob, /mob)) - usr << "\red That's not a mob." + to_chat(usr, "\red That's not a mob.") + return spend_karma(pickedmob) @@ -88,37 +92,46 @@ var/list/karma_spenders = list() set category = "Special Verbs" if(!M) - usr << "Please right click a mob to award karma directly, or use the 'Award Karma' verb to select a player from the player listing." + to_chat(usr, "Please right click a mob to award karma directly, or use the 'Award Karma' verb to select a player from the player listing.") + return if(!istype(M, /mob)) - usr << "\red That's not a mob." + to_chat(usr, "\red That's not a mob.") + return if(!M.client) - usr << "\red That mob has no client connected at the moment." + to_chat(usr, "\red That mob has no client connected at the moment.") + return if(src.client.karma_spent) - usr << "\red You've already spent your karma for the round." + to_chat(usr, "\red You've already spent your karma for the round.") + return for(var/a in karma_spenders) if(a == src.key) - usr << "\red You've already spent your karma for the round." + to_chat(usr, "\red You've already spent your karma for the round.") + return if(M.key == src.key) - usr << "\red You can't spend karma on yourself!" + to_chat(usr, "\red You can't spend karma on yourself!") + return if(M.client.address == src.client.address) message_admins("\red Illegal karma spending detected from [src.key] to [M.key]. Using the same IP!") log_game("\red Illegal karma spending detected from [src.key] to [M.key]. Using the same IP!") - usr << "\red The karma system is not available to multi-accounters." + to_chat(usr, "\red The karma system is not available to multi-accounters.") + var/choice = input("Give [M.name] good karma?", "Karma") in list("Good", "Cancel") if(!choice || choice == "Cancel") return if(choice == "Good" && !(src.client.karma_spent)) if(src.client.karma_spent) - usr << "\red You've already spent your karma for the round." + to_chat(usr, "\red You've already spent your karma for the round.") + return M.client.karma += 1 - usr << "[choice] karma spent on [M.name]." + to_chat(usr, "[choice] karma spent on [M.name].") + src.client.karma_spent = 1 karma_spenders.Add(src.key) if(M.client.karma <= -2 || M.client.karma >= 2) @@ -140,13 +153,15 @@ var/list/karma_spenders = list() set desc = "Reports how much karma you have accrued." var/currentkarma=verify_karma() - usr << {"
      You have [currentkarma] available."} + to_chat(usr, {"
      You have [currentkarma] available."}) + return /client/proc/verify_karma() var/currentkarma=0 if(!dbcon.IsConnected()) - usr << "\red Unable to connect to karma database. Please try again later.
      " + to_chat(usr, "\red Unable to connect to karma database. Please try again later.
      ") + return else var/DBQuery/query = dbcon.NewQuery("SELECT karma, karmaspent FROM [format_table_name("karmatotals")] WHERE byondkey='[src.key]'") @@ -159,10 +174,12 @@ var/list/karma_spenders = list() karmaspent = query.item[2] currentkarma = (text2num(totalkarma) - text2num(karmaspent)) /* if(totalkarma) - usr << {"
      You have [currentkarma] available.
      + to_chat(usr, {"
      You have [currentkarma] available.
      ) + You've gained [totalkarma] total karma in your time here.
      "} else - usr << "Your total karma is: 0
      "*/ + to_chat(usr, "Your total karma is: 0
      ")*/ + return currentkarma /client/verb/karmashop() @@ -265,7 +282,8 @@ You've gained [totalkarma] total karma in your time here.
      "} message_admins("SQL ERROR during whitelist logging (adding new key). Error: \[[err]\]\n") return else - usr << "You have unlocked [job]." + to_chat(usr, "You have unlocked [job].") + message_admins("[key_name(usr)] has unlocked [job].") karmacharge(cost) @@ -281,11 +299,13 @@ You've gained [totalkarma] total karma in your time here.
      "} message_admins("SQL ERROR during whitelist logging (updating existing entry). Error : \[[err]\]\n") return else - usr << "You have unlocked [job]." + to_chat(usr, "You have unlocked [job].") + message_admins("[key_name(usr)] has unlocked [job].") karmacharge(cost) else - usr << "You already have this job unlocked!" + to_chat(usr, "You already have this job unlocked!") + return /client/proc/DB_species_unlock(var/species,var/cost) @@ -305,7 +325,8 @@ You've gained [totalkarma] total karma in your time here.
      "} message_admins("SQL ERROR during whitelist logging (adding new key). Error : \[[err]\]\n") return else - usr << "You have unlocked [species]." + to_chat(usr, "You have unlocked [species].") + message_admins("[key_name(usr)] has unlocked [species].") karmacharge(cost) @@ -321,11 +342,13 @@ You've gained [totalkarma] total karma in your time here.
      "} message_admins("SQL ERROR during whitelist logging (updating existing entry). Error: \[[err]\]\n") return else - usr << "You have unlocked [species]." + to_chat(usr, "You have unlocked [species].") + message_admins("[key_name(usr)] has unlocked [species].") karmacharge(cost) else - usr << "You already have this species unlocked!" + to_chat(usr, "You already have this species unlocked!") + return /client/proc/karmacharge(var/cost,var/refund = 0) @@ -345,7 +368,8 @@ You've gained [totalkarma] total karma in your time here.
      "} message_admins("SQL ERROR during karmaspent updating (updating existing entry). Error: \[[err]\]\n") return else - usr << "You have been [refund ? "refunded" : "charged"] [cost] karma." + to_chat(usr, "You have been [refund ? "refunded" : "charged"] [cost] karma.") + message_admins("[key_name(usr)] has been [refund ? "refunded" : "charged"] [cost] karma.") return @@ -371,7 +395,8 @@ You've gained [totalkarma] total karma in your time here.
      "} else if(name == "Nanotrasen Recruiter") cost = 10 else - usr << "\red That job is not refundable." + to_chat(usr, "\red That job is not refundable.") + return var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("whitelist")] WHERE ckey='[usr.key]'") @@ -392,7 +417,8 @@ You've gained [totalkarma] total karma in your time here.
      "} else if(type == "species") typelist = splittext(dbspecies,",") else - usr << "\red Type [type] is not a valid column." + to_chat(usr, "\red Type [type] is not a valid column.") + if(name in typelist) typelist -= name @@ -404,14 +430,17 @@ You've gained [totalkarma] total karma in your time here.
      "} message_admins("SQL ERROR during whitelist logging (updating existing entry). Error: \[[err]\]\n") return else - usr << "You have been refunded [cost] karma for [type] [name]." + to_chat(usr, "You have been refunded [cost] karma for [type] [name].") + message_admins("[key_name(usr)] has been refunded [cost] karma for [type] [name].") karmacharge(text2num(cost),1) else - usr << "\red You have not bought [name]." + to_chat(usr, "\red You have not bought [name].") + else - usr << "\red Your ckey ([dbckey]) was not found." + to_chat(usr, "\red Your ckey ([dbckey]) was not found.") + /client/proc/checkpurchased(var/name = null) // If the first parameter is null, return a full list of purchases var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("whitelist")] WHERE ckey='[usr.key]'") diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index 962470c4cf1..64384fb7dcb 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -32,7 +32,8 @@ O.loc = src update_icon() else if(istype(O, /obj/item/weapon/wrench)) - user << "\blue Now disassembling bookcase" + to_chat(user, "\blue Now disassembling bookcase") + playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user,50, target = src)) new /obj/item/stack/sheet/wood(get_turf(src)) @@ -160,19 +161,22 @@ /obj/item/weapon/book/attack_self(var/mob/user as mob) if(carved) if(store) - user << "[store] falls out of [title]!" + to_chat(user, "[store] falls out of [title]!") + store.loc = get_turf(src.loc) store = null return else - user << "The pages of [title] have been cut out!" + to_chat(user, "The pages of [title] have been cut out!") + return if(src.dat) user << browse("Penned by [author].
      " + "[dat]", "window=book") user.visible_message("[user] opens a book titled \"[src.title]\" and begins reading intently.") onclose(user, "book") else - user << "This book is completely blank!" + to_chat(user, "This book is completely blank!") + /obj/item/weapon/book/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(carved) @@ -181,24 +185,29 @@ user.drop_item() W.loc = src store = W - user << "You put [W] in [title]." + to_chat(user, "You put [W] in [title].") + return else - user << "[W] won't fit in [title]." + to_chat(user, "[W] won't fit in [title].") + return else - user << "There's already something in [title]!" + to_chat(user, "There's already something in [title]!") + return if(istype(W, /obj/item/weapon/pen)) if(unique) - user << "These pages don't seem to take the ink well. Looks like you can't modify it." + to_chat(user, "These pages don't seem to take the ink well. Looks like you can't modify it.") + return var/choice = input("What would you like to change?") in list("Title", "Contents", "Author", "Cancel") switch(choice) if("Title") var/newtitle = reject_bad_text(stripped_input(usr, "Write a new title:")) if(!newtitle) - usr << "The title is invalid." + to_chat(usr, "The title is invalid.") + return else src.name = newtitle @@ -206,14 +215,16 @@ if("Contents") var/content = strip_html(input(usr, "Write your book's contents (HTML NOT allowed):"),8192) as message|null if(!content) - usr << "The content is invalid." + to_chat(usr, "The content is invalid.") + return else src.dat += content if("Author") var/newauthor = stripped_input(usr, "Write the author's name:") if(!newauthor) - usr << "The name is invalid." + to_chat(usr, "The name is invalid.") + return else src.author = newauthor @@ -222,37 +233,46 @@ else if(istype(W, /obj/item/weapon/barcodescanner)) var/obj/item/weapon/barcodescanner/scanner = W if(!scanner.computer) - user << "[W]'s screen flashes: 'No associated computer found!'" + to_chat(user, "[W]'s screen flashes: 'No associated computer found!'") + else switch(scanner.mode) if(0) scanner.book = src - user << "[W]'s screen flashes: 'Book stored in buffer.'" + to_chat(user, "[W]'s screen flashes: 'Book stored in buffer.'") + if(1) scanner.book = src scanner.computer.buffer_book = src.name - user << "[W]'s screen flashes: 'Book stored in buffer. Book title stored in associated computer buffer.'" + to_chat(user, "[W]'s screen flashes: 'Book stored in buffer. Book title stored in associated computer buffer.'") + if(2) scanner.book = src for(var/datum/borrowbook/b in scanner.computer.checkouts) if(b.bookname == src.name) scanner.computer.checkouts.Remove(b) - user << "[W]'s screen flashes: 'Book stored in buffer. Book has been checked in.'" + to_chat(user, "[W]'s screen flashes: 'Book stored in buffer. Book has been checked in.'") + return - user << "[W]'s screen flashes: 'Book stored in buffer. No active check-out record found for current title.'" + to_chat(user, "[W]'s screen flashes: 'Book stored in buffer. No active check-out record found for current title.'") + if(3) scanner.book = src for(var/obj/item/weapon/book in scanner.computer.inventory) if(book == src) - user << "[W]'s screen flashes: 'Book stored in buffer. Title already present in inventory, aborting to avoid duplicate entry.'" + to_chat(user, "[W]'s screen flashes: 'Book stored in buffer. Title already present in inventory, aborting to avoid duplicate entry.'") + return scanner.computer.inventory.Add(src) - user << "[W]'s screen flashes: 'Book stored in buffer. Title added to general inventory.'" + to_chat(user, "[W]'s screen flashes: 'Book stored in buffer. Title added to general inventory.'") + else if(istype(W, /obj/item/weapon/kitchen/knife) || istype(W, /obj/item/weapon/wirecutters)) if(carved) return - user << "You begin to carve out [title]." + to_chat(user, "You begin to carve out [title].") + if(do_after(user, 30, target = src)) - user << "You carve out the pages from [title]! You didn't want to read it anyway." + to_chat(user, "You carve out the pages from [title]! You didn't want to read it anyway.") + carved = 1 return else @@ -277,7 +297,8 @@ mode += 1 if(mode > 3) mode = 0 - user << "[src] Status Display:" + to_chat(user, "[src] Status Display:") + var/modedesc switch(mode) if(0) @@ -290,9 +311,13 @@ modedesc = "Scan book to local buffer, attempt to add book to general inventory." else modedesc = "ERROR" - user << " - Mode [mode] : [modedesc]" + to_chat(user, " - Mode [mode] : [modedesc]") + if(src.computer) - user << "Computer has been associated with this unit." + to_chat(user, "Computer has been associated with this unit.") + else - user << "No associated computer found. Only local scans will function properly." - user << "\n" \ No newline at end of file + to_chat(user, "No associated computer found. Only local scans will function properly.") + + to_chat(user, "\n") + diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index 3f93963a796..c65c82445e0 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -147,7 +147,8 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f dat += "7. Access the Forbidden Lore Vault
      " if(src.arcanecheckout) new /obj/item/weapon/tome(src.loc) - user << "Your sanity barely endures the seconds spent in the vault's browsing window. The only thing to remind you of this when you stop browsing is a dusty old tome sitting on the desk. You don't really remember printing it." + to_chat(user, "Your sanity barely endures the seconds spent in the vault's browsing window. The only thing to remind you of this when you stop browsing is a dusty old tome sitting on the desk. You don't really remember printing it.") + user.visible_message("[user] stares at the blank screen for a few moments, his expression frozen in fear. When he finally awakens from it, he looks a lot older.", 2) src.arcanecheckout = 0 if(1) @@ -244,7 +245,8 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f if(istype(W, /obj/item/weapon/barcodescanner)) var/obj/item/weapon/barcodescanner/scanner = W scanner.computer = src - user << "[scanner]'s associated machine has been set to [src]." + to_chat(user, "[scanner]'s associated machine has been set to [src].") + for (var/mob/V in hearers(src)) V.show_message("[src] lets out a low, short blip.", 2) else @@ -481,7 +483,8 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f set desc = "Permamently deletes a book from the database." set category = "Admin" if(!src.holder) - src << "Only administrators may use this command." + to_chat(src, "Only administrators may use this command.") + return var/isbn = input("ISBN number?", "Delete Book") as num | null diff --git a/code/modules/media/broadcast/receivers/radio.dm b/code/modules/media/broadcast/receivers/radio.dm index 095550197e3..1d155f186bf 100644 --- a/code/modules/media/broadcast/receivers/radio.dm +++ b/code/modules/media/broadcast/receivers/radio.dm @@ -14,7 +14,8 @@ /obj/machinery/media/receiver/boombox/attack_hand(var/mob/user) if(stat & (NOPOWER|BROKEN)) - usr << "\red You don't see anything to mess with." + to_chat(usr, "\red You don't see anything to mess with.") + return user.set_machine(src) interact(user) @@ -59,7 +60,8 @@ media_frequency = newfreq connect_frequency() else - usr << "\red Invalid FM frequency. (90.0, 200.0)" + to_chat(usr, "\red Invalid FM frequency. (90.0, 200.0)") + updateDialog() diff --git a/code/modules/media/broadcast/transmitters/broadcast.dm b/code/modules/media/broadcast/transmitters/broadcast.dm index 55bb10eaf7d..c732e5bce96 100644 --- a/code/modules/media/broadcast/transmitters/broadcast.dm +++ b/code/modules/media/broadcast/transmitters/broadcast.dm @@ -135,7 +135,8 @@ media_frequency = newfreq connect_frequency() else - usr << "\red Invalid FM frequency. (90.0, 200.0)" + to_chat(usr, "\red Invalid FM frequency. (90.0, 200.0)") + /obj/machinery/media/transmitter/broadcast/process() if(stat & (NOPOWER|BROKEN)) @@ -160,23 +161,27 @@ var/datum/gas_mixture/removed = env.remove(transfer_moles) - //world << "got [transfer_moles] moles at [removed.temperature]" +// to_chat(world, "got [transfer_moles] moles at [removed.temperature]") + if(removed) var/heat_capacity = removed.heat_capacity() - //world << "heating ([heat_capacity])" +// to_chat(world, "heating ([heat_capacity])") + if(heat_capacity) // Added check to avoid divide by zero (oshi-) runtime errors -- TLE if(removed.temperature < MAX_TEMP + T0C) removed.temperature = min(removed.temperature + heating_power/heat_capacity, 1000) // Added min() check to try and avoid wacky superheating issues in low gas scenarios -- TLE else removed.temperature = max(removed.temperature - heating_power/heat_capacity, TCMB) - //world << "now at [removed.temperature]" +// to_chat(world, "now at [removed.temperature]") + env.merge(removed) - //world << "turf now at [env.temperature]" +// to_chat(world, "turf now at [env.temperature]") + /* // Checks heat from the environment and applies any integrity damage var/datum/gas_mixture/environment = loc.return_air() diff --git a/code/modules/media/jukebox.dm b/code/modules/media/jukebox.dm index a6b27dcd1e7..6337dccdb34 100644 --- a/code/modules/media/jukebox.dm +++ b/code/modules/media/jukebox.dm @@ -115,7 +115,8 @@ var/global/loopModeNames=list( /obj/machinery/media/jukebox/attack_hand(var/mob/user) if(stat & NOPOWER) - usr << "\red You don't see anything to mess with." + to_chat(usr, "\red You don't see anything to mess with.") + return if(stat & BROKEN && playlist!=null) user.visible_message("\red [user.name] smacks the side of \the [src.name].","\red You hammer the side of \the [src.name].") @@ -180,7 +181,8 @@ var/global/loopModeNames=list( /obj/machinery/media/jukebox/Topic(href, href_list) ..() if(emagged) - usr << "\red You touch the bluescreened menu. Nothing happens. You feel dumber." + to_chat(usr, "\red You touch the bluescreened menu. Nothing happens. You feel dumber.") + return if (href_list["power"]) @@ -190,7 +192,8 @@ var/global/loopModeNames=list( if (href_list["playlist"]) if(!check_reload()) - usr << "\red You must wait 60 seconds between playlist reloads." + to_chat(usr, "\red You must wait 60 seconds between playlist reloads.") + return playlist_id=href_list["playlist"] last_reload=world.time diff --git a/code/modules/media/mediamanager.dm b/code/modules/media/mediamanager.dm index 3753f358500..8aa525ac896 100644 --- a/code/modules/media/mediamanager.dm +++ b/code/modules/media/mediamanager.dm @@ -81,7 +81,8 @@ if(vlc.attachEvent) { #ifdef DEBUG_MEDIAPLAYER -#define MP_DEBUG(x) owner << x +to_chat(#define MP_DEBUG(x) owner, x) + #warning Please comment out #define DEBUG_MEDIAPLAYER before committing. #else #define MP_DEBUG(x) @@ -137,7 +138,8 @@ if(vlc.attachEvent) { if(M && M.playing) targetURL = M.media_url targetStartTime = M.media_start_time - //owner << "Found audio source: [M.media_url] @ [(world.time - start_time) / 10]s." +// to_chat(owner, "Found audio source: [M.media_url] @ [(world.time - start_time) / 10]s.") + //else // testing("M is not playing or null.") @@ -155,7 +157,8 @@ if(vlc.attachEvent) { set desc = "Set jukebox volume" if(!media || !istype(media)) - usr << "You have no media datum to change, if you're not in the lobby tell an admin." + to_chat(usr, "You have no media datum to change, if you're not in the lobby tell an admin.") + return var/value = input("Choose your Jukebox volume.", "Jukebox volume", media.get_volume()) value = round(max(0, min(100, value))) diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm index 7b7f6eded45..bd5f8b338d0 100644 --- a/code/modules/mining/abandonedcrates.dm +++ b/code/modules/mining/abandonedcrates.dm @@ -64,29 +64,35 @@ /obj/structure/closet/crate/secure/loot/togglelock(mob/user as mob) if(locked) - user << "The crate is locked with a Deca-code lock." + to_chat(user, "The crate is locked with a Deca-code lock.") + var/input = input(usr, "Enter digit from [min] to [max].", "Deca-Code Lock", "") as num if(in_range(src, user)) input = Clamp(input, 0, 10) if (input == code) - user << "The crate unlocks!" + to_chat(user, "The crate unlocks!") + locked = 0 overlays.Cut() overlays += greenlight else if (input == null || input > max || input < min) - user << "You leave the crate alone." + to_chat(user, "You leave the crate alone.") + else - user << "A red light flashes." + to_chat(user, "A red light flashes.") + lastattempt = input attempts-- if (attempts == 0) - user << "The crate's anti-tamper system activates!" + to_chat(user, "The crate's anti-tamper system activates!") + var/turf/T = get_turf(src.loc) explosion(T, -1, -1, 1, 1) qdel(src) return else - user << "You attempt to interact with the device using a hand gesture, but it appears this crate is from before the DECANECT came out." + to_chat(user, "You attempt to interact with the device using a hand gesture, but it appears this crate is from before the DECANECT came out.") + return else return ..() @@ -94,21 +100,28 @@ /obj/structure/closet/crate/secure/loot/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(locked) if (istype(W, /obj/item/weapon/card/emag)) - user << "The crate unlocks!" + to_chat(user, "The crate unlocks!") + locked = 0 if (istype(W, /obj/item/device/multitool)) - user << "DECA-CODE LOCK REPORT:" + to_chat(user, "DECA-CODE LOCK REPORT:") + if (attempts == 1) - user << "* Anti-Tamper Bomb will activate on next failed access attempt." + to_chat(user, "* Anti-Tamper Bomb will activate on next failed access attempt.") + else - user << "* Anti-Tamper Bomb will activate after [src.attempts] failed access attempts." + to_chat(user, "* Anti-Tamper Bomb will activate after [src.attempts] failed access attempts.") + if (lastattempt == null) - user << " has been made to open the crate thus far." + to_chat(user, " has been made to open the crate thus far.") + return // hot and cold if (code > lastattempt) - user << "* Last access attempt lower than expected code." + to_chat(user, "* Last access attempt lower than expected code.") + else - user << "* Last access attempt higher than expected code." + to_chat(user, "* Last access attempt higher than expected code.") + else ..() else ..() diff --git a/code/modules/mining/coins.dm b/code/modules/mining/coins.dm index e40e9ff77ed..70fd5738c2d 100644 --- a/code/modules/mining/coins.dm +++ b/code/modules/mining/coins.dm @@ -102,15 +102,18 @@ if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/CC = W if(string_attached) - user << "There already is a string attached to this coin." + to_chat(user, "There already is a string attached to this coin.") + return if (CC.use(1)) overlays += image('icons/obj/items.dmi',"coin_string_overlay") string_attached = 1 - user << "You attach a string to the coin." + to_chat(user, "You attach a string to the coin.") + else - user << "You need one length of cable to attach a string to the coin." + to_chat(user, "You need one length of cable to attach a string to the coin.") + return else if(istype(W,/obj/item/weapon/wirecutters)) @@ -123,7 +126,8 @@ CC.update_icon() overlays = list() string_attached = null - user << "You detach the string from the coin." + to_chat(user, "You detach the string from the coin.") + else if(istype(W,/obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W if(WT.welding && WT.remove_fuel(0, user)) @@ -134,7 +138,8 @@ "uranium" = /obj/item/clothing/gloves/ring/uranium) var/typekey = typelist[cmineral] if(ispath(typekey)) - user << "\blue You make [src] into a ring." + to_chat(user, "\blue You make [src] into a ring.") + new typekey(get_turf(loc)) qdel(src) else ..() diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index 383285a20f4..a4e4c6e9eb7 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -209,7 +209,8 @@ inserted_id.mining_points += points points = 0 else - usr << "Required access not found." + to_chat(usr, "Required access not found.") + else if(href_list["choice"] == "insert") var/obj/item/weapon/card/id/I = usr.get_active_hand() if(istype(I)) @@ -217,7 +218,9 @@ return I.loc = src inserted_id = I - else usr << "No valid ID." + else + to_chat(usr, "No valid ID.") + if(href_list["release"]) if(check_access(inserted_id) || allowed(usr)) //Check the ID inside, otherwise check the user. if(!(text2path(href_list["release"]) in stack_list)) return @@ -231,7 +234,8 @@ if(inp.amount < 1) stack_list -= text2path(href_list["release"]) else - usr << "Required access not found." + to_chat(usr, "Required access not found.") + if(href_list["plasteel"]) if(check_access(inserted_id) || allowed(usr)) if(!(/obj/item/stack/sheet/metal in stack_list)) return @@ -247,7 +251,8 @@ plasmastack.amount -= plasteelout.amount unload_mineral(plasteelout) else - usr << "Required access not found." + to_chat(usr, "Required access not found.") + if(href_list["plasglass"]) if(check_access(inserted_id) || allowed(usr)) if(!(/obj/item/stack/sheet/glass in stack_list)) return @@ -263,7 +268,8 @@ plasmastack.amount -= plasglassout.amount unload_mineral(plasglassout) else - usr << "Required access not found." + to_chat(usr, "Required access not found.") + updateUsrDialog() return @@ -414,7 +420,9 @@ return I.loc = src inserted_id = I - else usr << "No valid ID." + else + to_chat(usr, "No valid ID.") + if(href_list["purchase"]) if(istype(inserted_id)) var/datum/data/mining_equipment/prize = locate(href_list["purchase"]) @@ -495,15 +503,18 @@ if(points) var/obj/item/weapon/card/id/C = I C.mining_points += points - user << "You transfer [points] points to [C]." + to_chat(user, "You transfer [points] points to [C].") + points = 0 else - user << "There's no points left on [src]." + to_chat(user, "There's no points left on [src].") + ..() /obj/item/weapon/card/mining_point_card/examine(mob/user) ..(user) - user << "There's [points] points on the card." + to_chat(user, "There's [points] points on the card.") + /**********************Jaunter**********************/ @@ -522,7 +533,8 @@ /obj/item/device/wormhole_jaunter/attack_self(mob/user as mob) var/turf/device_turf = get_turf(user) if(!device_turf||device_turf.z==2||device_turf.z>=7) - user << "You're having difficulties getting the [src.name] to work." + to_chat(user, "You're having difficulties getting the [src.name] to work.") + return else user.visible_message("[user.name] activates the [src.name]!") @@ -532,7 +544,8 @@ if(T.z == ZLEVEL_STATION) L += B if(!L.len) - user << "The [src.name] failed to create a wormhole." + to_chat(user, "The [src.name] failed to create a wormhole.") + return var/chosen_beacon = pick(L) var/obj/effect/portal/wormhole/jaunt_tunnel/J = new /obj/effect/portal/wormhole/jaunt_tunnel(get_turf(src), chosen_beacon) @@ -603,10 +616,12 @@ /obj/item/weapon/resonator/attack_self(mob/user as mob) if(burst_time == 50) burst_time = 30 - user << "You set the resonator's fields to detonate after 3 seconds." + to_chat(user, "You set the resonator's fields to detonate after 3 seconds.") + else burst_time = 50 - user << "You set the resonator's fields to detonate after 5 seconds." + to_chat(user, "You set the resonator's fields to detonate after 5 seconds.") + /obj/item/weapon/resonator/afterattack(atom/target, mob/user, proximity_flag) if(proximity_flag) @@ -643,11 +658,13 @@ if(creator) for(var/mob/living/L in src.loc) add_logs(L, creator, "used a resonator field on", object="resonator") - L << "The [src.name] ruptured with you in it!" + to_chat(L, "The [src.name] ruptured with you in it!") + L.adjustBruteLoss(resonance_damage) else for(var/mob/living/L in src.loc) - L << "The [src.name] ruptured with you in it!" + to_chat(L, "The [src.name] ruptured with you in it!") + L.adjustBruteLoss(resonance_damage) qdel(src) @@ -723,16 +740,20 @@ var/obj/item/weapon/weldingtool/W = I if(W.welding && !stat) if(stance != HOSTILE_STANCE_IDLE) - user << "[src] is moving around too much to repair!" + to_chat(user, "[src] is moving around too much to repair!") + return if(maxHealth == health) - user << "[src] is at full integrity." + to_chat(user, "[src] is at full integrity.") + else health += 10 - user << "You repair some of the armor on [src]." + to_chat(user, "You repair some of the armor on [src].") + return if(istype(I, /obj/item/device/mining_scanner) || istype(I, /obj/item/device/t_scanner/adv_mining_scanner)) - user << "You instruct [src] to drop any collected ore." + to_chat(user, "You instruct [src] to drop any collected ore.") + DropOre() return ..() @@ -754,10 +775,12 @@ switch(search_objects) if(0) SetCollectBehavior() - M << "[src] has been set to search and store loose ore." + to_chat(M, "[src] has been set to search and store loose ore.") + if(2) SetOffenseBehavior() - M << "[src] has been set to attack hostile wildlife." + to_chat(M, "[src] has been set to attack hostile wildlife.") + return ..() @@ -864,10 +887,12 @@ icon_state = "lazarus_empty" return else - user << "[src] is only effective on the dead." + to_chat(user, "[src] is only effective on the dead.") + return else - user << "[src] is only effective on lesser beings." + to_chat(user, "[src] is only effective on lesser beings.") + return /obj/item/weapon/lazarus_injector/emag_act() @@ -881,9 +906,11 @@ /obj/item/weapon/lazarus_injector/examine(mob/user) ..(user) if(!loaded) - user << "[src] is empty." + to_chat(user, "[src] is empty.") + if(malfunctioning) - user << "The display on [src] seems to be flickering." + to_chat(user, "The display on [src] seems to be flickering.") + /**********************Mining Scanner**********************/ @@ -989,8 +1016,10 @@ /obj/item/weapon/hivelordstabilizer/afterattack(obj/item/organ/internal/M, mob/user) var/obj/item/organ/internal/hivelord_core/C = M if(!istype(C, /obj/item/organ/internal/hivelord_core)) - user << "The stabilizer only works on hivelord cores." + to_chat(user, "The stabilizer only works on hivelord cores.") + return ..() C.preserved = 1 - user << "You inject the hivelord core with the stabilizer. It will no longer go inert." + to_chat(user, "You inject the hivelord core with the stabilizer. It will no longer go inert.") + qdel(src) \ No newline at end of file diff --git a/code/modules/mining/laborcamp/laborshuttle.dm b/code/modules/mining/laborcamp/laborshuttle.dm index 07233a2f6fd..03782a96f7f 100644 --- a/code/modules/mining/laborcamp/laborshuttle.dm +++ b/code/modules/mining/laborcamp/laborshuttle.dm @@ -18,10 +18,12 @@ if(href_list["move"]) var/obj/docking_port/mobile/M = shuttle_master.getShuttle("laborcamp") if(!M) - usr << "Cannot locate shuttle!" + to_chat(usr, "Cannot locate shuttle!") + return 0 var/obj/docking_port/stationary/S = M.get_docked() if(S && S.name == "laborcamp_away") - usr << "Shuttle is already at the outpost!" + to_chat(usr, "Shuttle is already at the outpost!") + return 0 ..() \ No newline at end of file diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm index b5a14e9caa5..ab1759d844f 100644 --- a/code/modules/mining/laborcamp/laborstacker.dm +++ b/code/modules/mining/laborcamp/laborstacker.dm @@ -72,7 +72,8 @@ /obj/machinery/mineral/labor_claim_console/proc/emag(mob/user as mob) if(!emagged) emagged = 1 - user << "PZZTTPFFFT" + to_chat(user, "PZZTTPFFFT") + @@ -88,30 +89,38 @@ if(href_list["choice"] == "claim") inserted_id.points += machine.points machine.points = 0 - src << "Points transferred." + to_chat(src, "Points transferred.") + else if(href_list["choice"] == "insert") var/obj/item/weapon/card/id/prisoner/I = usr.get_active_hand() if(istype(I)) usr.drop_item() I.loc = src inserted_id = I - else usr << "Invalid ID." + else + to_chat(usr, "Invalid ID.") + if(check_auth()) //Sanity check against hef spoofs if(href_list["choice"] == "station") if(!alone_in_area(get_area(src), usr)) - usr << "Prisoners are only allowed to be released while alone." + to_chat(usr, "Prisoners are only allowed to be released while alone.") + else switch(shuttle_master.moveShuttle("laborcamp","laborcamp_home")) if(1) - usr << "Shuttle not found" + to_chat(usr, "Shuttle not found") + if(2) - usr << "Shuttle already at station" + to_chat(usr, "Shuttle already at station") + if(3) - usr << "No permission to dock could be granted." + to_chat(usr, "No permission to dock could be granted.") + else var/message = "[inserted_id.registered_name] has returned to the station. Minerals and Prisoner ID card ready for retrieval." announcer.autosay(message, "Labor Camp Controller", "Security") - usr << "Shuttle received message and will be sent shortly." + to_chat(usr, "Shuttle received message and will be sent shortly.") + if(href_list["choice"] == "release") if(alone_in_area(get_area(loc), usr)) @@ -120,9 +129,11 @@ if(release_door && release_door.density) release_door.open() else - usr << "Prisoners can only be released while docked with the station." + to_chat(usr, "Prisoners can only be released while docked with the station.") + else - usr << "Prisoners are only allowed to be released while alone." + to_chat(usr, "Prisoners are only allowed to be released while alone.") + src.updateUsrDialog() return @@ -168,11 +179,16 @@ if(istype(I, /obj/item/weapon/card/id)) if(istype(I, /obj/item/weapon/card/id/prisoner)) var/obj/item/weapon/card/id/prisoner/prisoner_id = I - user << "ID: [prisoner_id.registered_name]" - user << "Points Collected:[prisoner_id.points]" - user << "Point Quota: [prisoner_id.goal]" - user << "Collect points by bringing smelted minerals to the Labor Shuttle stacking machine. Reach your quota to earn your release." + to_chat(user, "ID: [prisoner_id.registered_name]") + + to_chat(user, "Points Collected:[prisoner_id.points]") + + to_chat(user, "Point Quota: [prisoner_id.goal]") + + to_chat(user, "Collect points by bringing smelted minerals to the Labor Shuttle stacking machine. Reach your quota to earn your release.") + else - user << "Error: Invalid ID" + to_chat(user, "Error: Invalid ID") + return ..() diff --git a/code/modules/mining/manufacturing.dm b/code/modules/mining/manufacturing.dm index d74386828df..5d66474b5fb 100644 --- a/code/modules/mining/manufacturing.dm +++ b/code/modules/mining/manufacturing.dm @@ -177,7 +177,8 @@ usr.machine = src if (href_list["download"]) - if(!src.dl_list) usr << "\red This unit is not capable of downloading any additional schematics." + to_chat(if(!src.dl_list) usr, "\red This unit is not capable of downloading any additional schematics.") + else var/amtdl = 0 //var/dontload = 0 @@ -191,8 +192,10 @@ src.download += new S.type(src) amtdl++ else dontload = 0*/ - if (amtdl) usr << "\blue [amtdl] new schematics downloaded from Robotics Research Database." - else usr << "\red No new schematics currently available in Robotics Research Database." + to_chat(if (amtdl) usr, "\blue [amtdl] new schematics downloaded from Robotics Research Database.") + + to_chat(else usr, "\red No new schematics currently available in Robotics Research Database.") + if (href_list["delete"]) var/operation = text2num(href_list["delete"]) @@ -201,15 +204,19 @@ for(var/datum/manufacture/D in src.diskload) src.diskload-= D amtgone++ - if (amtgone) usr << "\blue Cleared [amtgone] schematics from database." - else usr << "\red No disk-loaded schematics detected in database." + to_chat(if (amtgone) usr, "\blue Cleared [amtgone] schematics from database.") + + to_chat(else usr, "\red No disk-loaded schematics detected in database.") + if(operation == 2) // Clear Download Schematics var/amtgone = 0 for(var/datum/manufacture/D in src.download) src.download-= D amtgone++ - if (amtgone) usr << "\blue Cleared [amtgone] schematics from database." - else usr << "\red No downloaded schematics detected in database." + to_chat(if (amtgone) usr, "\blue Cleared [amtgone] schematics from database.") + + to_chat(else usr, "\red No downloaded schematics detected in database.") + if (href_list["eject"]) var/operation = text2num(href_list["eject"]) @@ -228,7 +235,8 @@ if(10) ejecting = /obj/item/weapon/ore/hydrogen if(11) ejecting = /obj/item/weapon/ore/fabric else - usr << "\red Error. Unknown ore type." + to_chat(usr, "\red Error. Unknown ore type.") + return sleep(3) ejectamt = input(usr,"How many units do you want to eject?","Eject Materials") as num @@ -249,7 +257,8 @@ if (istype(O,I.cost2)) A2++ if (istype(O,I.cost3)) A3++ if (A1 < I.amount1 || A2 < I.amount2 || A3 < I.amount3) - usr << "\red Insufficient materials to manufacture that item." + to_chat(usr, "\red Insufficient materials to manufacture that item.") + return // Consume Mats var/C1 = I.amount1 @@ -337,7 +346,8 @@ if(istype(W,/obj/item/clothing/suit/space/)) new /obj/item/weapon/ore/fabric(src) load = 2 else if(istype(W, /obj/item/weapon/disk/data/schematic)) - if (!src.acceptdisk) user << "\red This unit is unable to accept disks." + to_chat(if (!src.acceptdisk) user, "\red This unit is unable to accept disks.") + else var/amtload = 0 var/dontload = 0 @@ -354,19 +364,24 @@ src.diskload += new WS.type(src) amtload++ else dontload = 0 - if (amtload) user << "\blue [amtload] new schematics downloaded from disk." - else user << "\red No new schematics available on disk." + to_chat(if (amtload) user, "\blue [amtload] new schematics downloaded from disk.") + + to_chat(else user, "\red No new schematics available on disk.") + else if (istype(W, /obj/item/weapon/storage/bag/ore)) for(var/mob/V in viewers(user, null)) V.show_message(text("\blue [] uses the []'s automatic ore loader on []!", user, src, W), 1) var/amtload = 0 for (var/obj/item/weapon/ore/M in W.contents) M.loc = src amtload++ - if (amtload) user << "\blue [amtload] pieces of ore loaded from [W]!" - else user << "\red No ore loaded!" + to_chat(if (amtload) user, "\blue [amtload] pieces of ore loaded from [W]!") + + to_chat(else user, "\red No ore loaded!") + else if(istype(W, /obj/item/weapon/card/emag)) src.hacked = 1 - user << "\blue You remove the [src]'s product locks!" + to_chat(user, "\blue You remove the [src]'s product locks!") + else ..() if (load == 1) @@ -391,8 +406,10 @@ for (var/obj/item/weapon/ore/M in O.contents) M.loc = src amtload++ - if (amtload) user << "\blue [amtload] pieces of ore loaded from [O]!" - else user << "\red No ore loaded!" + to_chat(if (amtload) user, "\blue [amtload] pieces of ore loaded from [O]!") + + to_chat(else user, "\red No ore loaded!") + else if (istype(O, /obj/item/weapon/ore/)) for(var/mob/V in viewers(user, null)) V.show_message(text("\blue [] begins quickly stuffing ore into []!", user, src), 1) var/staystill = user.loc @@ -400,7 +417,8 @@ M.loc = src sleep(3) if (user.loc != staystill) break - user << "\blue You finish stuffing ore into [src]!" + to_chat(user, "\blue You finish stuffing ore into [src]!") + /*else if (istype(O, /obj/item/weapon/plant/wheat/metal)) for(var/mob/V in viewers(user, null)) V.show_message(text("\blue [] begins quickly stuffing [O] into []!", user, src), 1) var/staystill = user.loc @@ -409,7 +427,8 @@ del M sleep(3) if (user.loc != staystill) break - user << "\blue You finish stuffing [O] into [src]!"*/ + to_chat(user, "\blue You finish stuffing [O] into [src]!"*/) + else ..() src.updateUsrDialog() diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index f9b4228e792..d3fdb6fb3b0 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -219,17 +219,20 @@ /obj/item/device/mobcapsule/proc/capture(var/mob/target, var/mob/U as mob) var/mob/living/simple_animal/T = target if(captured) - U << "Capture failed!: The capsule already has a mob registered to it!" + to_chat(U, "Capture failed!: The capsule already has a mob registered to it!") + else if(istype(T) && "neutral" in T.faction) T.forceMove(src) T.name = "[U.name]'s [initial(T.name)]" T.cancel_camera() name = "Lazarus Capsule: [initial(T.name)]" - U << "You placed a [T.name] inside the Lazarus Capsule!" + to_chat(U, "You placed a [T.name] inside the Lazarus Capsule!") + captured = T else - U << "You can't capture that mob!" + to_chat(U, "You can't capture that mob!") + /obj/item/device/mobcapsule/throw_impact(atom/A, mob/user) ..() diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index fe31649e6d3..9ed15e58cef 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -361,7 +361,8 @@ var/global/list/rockTurfEdgeCache /turf/simulated/mineral/attackby(var/obj/item/weapon/pickaxe/P as obj, mob/user as mob, params) if (!user.IsAdvancedToolUser()) - usr << "You don't have the dexterity to do this!" + to_chat(usr, "You don't have the dexterity to do this!") + return if (istype(P, /obj/item/weapon/pickaxe)) @@ -372,12 +373,14 @@ var/global/list/rockTurfEdgeCache if(last_act+P.digspeed > world.time)//prevents message spam return last_act = world.time - user << "You start picking..." + to_chat(user, "You start picking...") + P.playDigSound() if(do_after(user, P.digspeed, target = src)) if(istype(src, /turf/simulated/mineral)) //sanity check against turf being deleted during digspeed delay - user << "You finish cutting into the rock." + to_chat(user, "You finish cutting into the rock.") + P.update_icon() gets_drilled(user) feedback_add_details("pick_used_mining","[P.name]") @@ -407,10 +410,12 @@ var/global/list/rockTurfEdgeCache ..() /turf/simulated/mineral/attack_alien(var/mob/living/carbon/alien/M) - M << "You start digging into the rock..." + to_chat(M, "You start digging into the rock...") + playsound(src, 'sound/effects/break_stone.ogg', 50, 1) if(do_after(M, 40, target = src)) - M << "You tunnel into the rock." + to_chat(M, "You tunnel into the rock.") + gets_drilled() /turf/simulated/mineral/Bumped(AM as mob|obj) @@ -475,14 +480,17 @@ var/global/list/rockTurfEdgeCache return if (dug) - user << "This area has already been dug!" + to_chat(user, "This area has already been dug!") + return - user << "You start digging..." + to_chat(user, "You start digging...") + sleep(20) if ((user.loc == T && user.get_active_hand() == W)) - user << "You dig a hole." + to_chat(user, "You dig a hole.") + gets_dug() return @@ -493,14 +501,17 @@ var/global/list/rockTurfEdgeCache return if (dug) - user << "This area has already been dug!" + to_chat(user, "This area has already been dug!") + return - user << "You start digging..." + to_chat(user, "You start digging...") + sleep(P.digspeed) if ((user.loc == T && user.get_active_hand() == W)) - user << "You dig a hole." + to_chat(user, "You dig a hole.") + gets_dug() return diff --git a/code/modules/mining/mint.dm b/code/modules/mining/mint.dm index 51d28af42dd..e07b4641300 100644 --- a/code/modules/mining/mint.dm +++ b/code/modules/mining/mint.dm @@ -124,7 +124,8 @@ usr.set_machine(src) src.add_fingerprint(usr) if(processing==1) - usr << "The machine is processing." + to_chat(usr, "The machine is processing.") + return if(href_list["choose"]) chosen = href_list["choose"] diff --git a/code/modules/mining/money_bag.dm b/code/modules/mining/money_bag.dm index 079a75341d6..5f7e34f4463 100644 --- a/code/modules/mining/money_bag.dm +++ b/code/modules/mining/money_bag.dm @@ -67,13 +67,15 @@ var/obj/item/weapon/coin/C = W if(!user.drop_item()) return - user << "You add the [C.name] into the bag." + to_chat(user, "You add the [C.name] into the bag.") + contents += C if (istype(W, /obj/item/weapon/moneybag)) var/obj/item/weapon/moneybag/C = W for (var/obj/O in C.contents) contents += O; - user << "You empty the [C.name] into the bag." + to_chat(user, "You empty the [C.name] into the bag.") + return /obj/item/weapon/moneybag/Topic(href, href_list) diff --git a/code/modules/mining/ore.dm b/code/modules/mining/ore.dm index 056432c1892..f6bd12a4c2e 100644 --- a/code/modules/mining/ore.dm +++ b/code/modules/mining/ore.dm @@ -13,7 +13,8 @@ new refined_type(get_turf(src.loc)) qdel(src) else if(W.isOn()) - user << "Not enough fuel to smelt [src]." + to_chat(user, "Not enough fuel to smelt [src].") + ..() /obj/item/weapon/ore/Crossed(AM as mob|obj) @@ -64,7 +65,8 @@ materials = list(MAT_GLASS=MINERAL_MATERIAL_AMOUNT) /obj/item/weapon/ore/glass/attack_self(mob/living/user as mob) - user << "You use the sand to make sandstone." + to_chat(user, "You use the sand to make sandstone.") + var/sandAmt = 1 for(var/obj/item/weapon/ore/glass/G in user.loc) // The sand on the floor sandAmt += 1 @@ -94,7 +96,8 @@ if(istype(I, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/W = I if(W.welding) - user << "You can't hit a high enough temperature to smelt [src] properly!" + to_chat(user, "You can't hit a high enough temperature to smelt [src] properly!") + else ..() diff --git a/code/modules/mining/satchel_ore_boxdm.dm b/code/modules/mining/satchel_ore_boxdm.dm index 166c05e10c6..4a30f138982 100644 --- a/code/modules/mining/satchel_ore_boxdm.dm +++ b/code/modules/mining/satchel_ore_boxdm.dm @@ -19,7 +19,8 @@ S.hide_from(usr) for(var/obj/item/weapon/ore/O in S.contents) S.remove_from_storage(O, src) //This will move the item to this item's contents - user << "You empty the satchel into the box." + to_chat(user, "You empty the satchel into the box.") + return /obj/structure/ore_box/attack_hand(mob/user as mob) @@ -91,7 +92,8 @@ for (var/obj/item/weapon/ore/O in contents) contents -= O O.loc = src.loc - usr << "You empty the box." + to_chat(usr, "You empty the box.") + src.updateUsrDialog() return @@ -106,25 +108,29 @@ obj/structure/ore_box/ex_act(severity, target) set src in view(1) if(!istype(usr, /mob/living/carbon/human)) //Only living, intelligent creatures with hands can empty ore boxes. - usr << "You are physically incapable of emptying the ore box." + to_chat(usr, "You are physically incapable of emptying the ore box.") + return if( usr.stat || usr.restrained() ) return if(!Adjacent(usr)) //You can only empty the box if you can physically reach it - usr << "You cannot reach the ore box." + to_chat(usr, "You cannot reach the ore box.") + return add_fingerprint(usr) if(contents.len < 1) - usr << "The ore box is empty." + to_chat(usr, "The ore box is empty.") + return for (var/obj/item/weapon/ore/O in contents) contents -= O O.loc = src.loc - usr << "You empty the ore box." + to_chat(usr, "You empty the ore box.") + return diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 46a40f6a1bf..161bb8666c7 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -201,9 +201,11 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp show_stat_station_time() if(ticker) if(ticker.mode) - //world << "DEBUG: ticker not null" +// to_chat(world, "DEBUG: ticker not null") + if(ticker.mode.name == "AI malfunction") - //world << "DEBUG: malf mode ticker test" +// to_chat(world, "DEBUG: malf mode ticker test") + if(ticker.mode:malf_mode_declared) stat(null, "Time left: [max(ticker.mode:AI_win_timeleft/(ticker.mode:apcs/3), 0)]") show_stat_emergency_shuttle_eta() @@ -213,13 +215,16 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set name = "Re-enter Corpse" if(!client) return if(!can_reenter_corpse) - src << "You've given up your right to respawn!" + to_chat(src, "You've given up your right to respawn!") + return if(!(mind && mind.current && can_reenter_corpse)) - src << "You have no body." + to_chat(src, "You have no body.") + return if(mind.current.key && copytext(mind.current.key,1,2)!="@") //makes sure we don't accidentally kick any clients - usr << "Another consciousness is in your body...It is resisting you." + to_chat(usr, "Another consciousness is in your body...It is resisting you.") + return if(mind.current.ajourn && mind.current.stat != DEAD) //check if the corpse is astral-journeying (it's client ghosted using a cultist rune). var/turf/T = get_turf(mind.current) @@ -230,7 +235,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp found_astral_rune = 1 break if(!found_astral_rune) - usr << "The astral cord that ties your body and your spirit has been severed. You are likely to wander the realm beyond until your body is finally dead and thus reunited with you." + to_chat(usr, "The astral cord that ties your body and your spirit has been severed. You are likely to wander the realm beyond until your body is finally dead and thus reunited with you.") + return mind.current.ajourn=0 @@ -247,10 +253,13 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/dead/observer/proc/notify_cloning(var/message, var/sound, var/atom/source) if(message) - src << "[message]" - src << "(Click to re-enter)" + to_chat(src, "[message]") + + to_chat(src, "(Click to re-enter)") + if(sound) - src << sound(sound) + to_chat(src, sound(sound)) + /mob/dead/observer/proc/show_me_the_hud(hud_index) var/datum/atom_hud/H = huds[hud_index] @@ -270,16 +279,20 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp switch(data_hud_seen) //give new huds if(0) show_me_the_hud(DATA_HUD_SECURITY_BASIC) - src << "Security HUD set." + to_chat(src, "Security HUD set.") + if(DATA_HUD_SECURITY_BASIC) show_me_the_hud(DATA_HUD_MEDICAL_ADVANCED) - src << "Medical HUD set." + to_chat(src, "Medical HUD set.") + if(DATA_HUD_MEDICAL_ADVANCED) show_me_the_hud(DATA_HUD_DIAGNOSTIC) - src << "Diagnostic HUD set." + to_chat(src, "Diagnostic HUD set.") + if(DATA_HUD_DIAGNOSTIC) data_hud_seen = 0 - src << "HUDs disabled." + to_chat(src, "HUDs disabled.") + /mob/dead/observer/verb/toggle_antagHUD() @@ -287,13 +300,15 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set name = "Toggle AntagHUD" set desc = "Toggles AntagHUD allowing you to see who is the antagonist" if(!config.antag_hud_allowed && !client.holder) - src << "\red Admins have disabled this for this round." + to_chat(src, "\red Admins have disabled this for this round.") + return if(!client) return var/mob/dead/observer/M = src if(jobban_isbanned(M, "AntagHUD")) - src << "\red You have been banned from using this feature" + to_chat(src, "\red You have been banned from using this feature") + return if(config.antag_hud_restricted && !M.has_enabled_antagHUD && !check_rights(R_ADMIN|R_MOD,0)) var/response = alert(src, "If you turn this on, you will not be able to take any part in the round.","Are you sure you want to turn this feature on?","Yes","No") @@ -313,10 +328,12 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp else H.remove_hud_from(usr) if(!M.antagHUD) - usr << "AntagHud Toggled ON" + to_chat(usr, "AntagHud Toggled ON") + M.antagHUD = 1 else - usr << "AntagHud Toggled OFF" + to_chat(usr, "AntagHud Toggled OFF") + M.antagHUD = 0 /mob/dead/observer/proc/dead_tele(A in ghostteleportlocs) @@ -325,7 +342,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set desc= "Teleport to a location" if(!isobserver(usr)) - usr << "Not when you're not dead!" + to_chat(usr, "Not when you're not dead!") + return usr.verbs -= /mob/dead/observer/proc/dead_tele @@ -340,7 +358,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp L += T if(!L || !L.len) - usr << "No area available." + to_chat(usr, "No area available.") + usr.forceMove(pick(L)) following = null @@ -363,7 +382,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(following && following == target) return following = target - src << "Now following [target]" + to_chat(src, "Now following [target]") + if(ismob(target)) forceMove(get_turf(target)) var/mob/M = target @@ -418,7 +438,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp forceMove(T) following = null else - src << "This mob is not located in the game world." + to_chat(src, "This mob is not located in the game world.") + /* Now a spell. See spells.dm @@ -438,11 +459,13 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/dead/observer/memory() set hidden = 1 - src << "\red You are dead! You have no mind to store memory!" + to_chat(src, "\red You are dead! You have no mind to store memory!") + /mob/dead/observer/add_memory() set hidden = 1 - src << "\red You are dead! You have no mind to store memory!" + to_chat(src, "\red You are dead! You have no mind to store memory!") + /mob/dead/observer/verb/analyze_air() set name = "Analyze Air" @@ -459,11 +482,14 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/pressure = environment.return_pressure() var/total_moles = environment.total_moles() - src << "\blue Results:" + to_chat(src, "\blue Results:") + if(abs(pressure - ONE_ATMOSPHERE) < 10) - src << "\blue Pressure: [round(pressure,0.1)] kPa" + to_chat(src, "\blue Pressure: [round(pressure,0.1)] kPa") + else - src << "\red Pressure: [round(pressure,0.1)] kPa" + to_chat(src, "\red Pressure: [round(pressure,0.1)] kPa") + if(total_moles) var/o2_concentration = environment.oxygen/total_moles var/n2_concentration = environment.nitrogen/total_moles @@ -472,28 +498,38 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/unknown_concentration = 1-(o2_concentration+n2_concentration+co2_concentration+plasma_concentration) if(abs(n2_concentration - N2STANDARD) < 20) - src << "\blue Nitrogen: [round(n2_concentration*100)]% ([round(environment.nitrogen,0.01)] moles)" + to_chat(src, "\blue Nitrogen: [round(n2_concentration*100)]% ([round(environment.nitrogen,0.01)] moles)") + else - src << "\red Nitrogen: [round(n2_concentration*100)]% ([round(environment.nitrogen,0.01)] moles)" + to_chat(src, "\red Nitrogen: [round(n2_concentration*100)]% ([round(environment.nitrogen,0.01)] moles)") + if(abs(o2_concentration - O2STANDARD) < 2) - src << "\blue Oxygen: [round(o2_concentration*100)]% ([round(environment.oxygen,0.01)] moles)" + to_chat(src, "\blue Oxygen: [round(o2_concentration*100)]% ([round(environment.oxygen,0.01)] moles)") + else - src << "\red Oxygen: [round(o2_concentration*100)]% ([round(environment.oxygen,0.01)] moles)" + to_chat(src, "\red Oxygen: [round(o2_concentration*100)]% ([round(environment.oxygen,0.01)] moles)") + if(co2_concentration > 0.01) - src << "\red CO2: [round(co2_concentration*100)]% ([round(environment.carbon_dioxide,0.01)] moles)" + to_chat(src, "\red CO2: [round(co2_concentration*100)]% ([round(environment.carbon_dioxide,0.01)] moles)") + else - src << "\blue CO2: [round(co2_concentration*100)]% ([round(environment.carbon_dioxide,0.01)] moles)" + to_chat(src, "\blue CO2: [round(co2_concentration*100)]% ([round(environment.carbon_dioxide,0.01)] moles)") + if(plasma_concentration > 0.01) - src << "\red Plasma: [round(plasma_concentration*100)]% ([round(environment.toxins,0.01)] moles)" + to_chat(src, "\red Plasma: [round(plasma_concentration*100)]% ([round(environment.toxins,0.01)] moles)") + if(unknown_concentration > 0.01) - src << "\red Unknown: [round(unknown_concentration*100)]% ([round(unknown_concentration*total_moles,0.01)] moles)" + to_chat(src, "\red Unknown: [round(unknown_concentration*100)]% ([round(unknown_concentration*total_moles,0.01)] moles)") + + + to_chat(src, "\blue Temperature: [round(environment.temperature-T0C,0.1)]°C") + + to_chat(src, "\blue Heat Capacity: [round(environment.heat_capacity(),0.1)]") - src << "\blue Temperature: [round(environment.temperature-T0C,0.1)]°C" - src << "\blue Heat Capacity: [round(environment.heat_capacity(),0.1)]" /mob/dead/observer/verb/view_manifest() set name = "View Crew Manifest" @@ -550,7 +586,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if (href_list["jump"]) var/mob/target = locate(href_list["jump"]) var/mob/A = usr; - A << "Teleporting to [target]..." + to_chat(A, "Teleporting to [target]...") + //var/mob/living/silicon/ai/A = locate(href_list["track2"]) in mob_list if(target && target != usr) spawn(0) @@ -573,9 +610,11 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp src.anonsay = !src.anonsay if(anonsay) - src << "Your key won't be shown when you speak in dead chat." + to_chat(src, "Your key won't be shown when you speak in dead chat.") + else - src << "Your key will be publicly visible again." + to_chat(src, "Your key will be publicly visible again.") + /mob/dead/observer/verb/toggle_ghostsee() set name = "Toggle Ghost Vision" @@ -583,7 +622,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set category = "Ghost" ghostvision = !(ghostvision) updateghostsight() - usr << "You [(ghostvision?"now":"no longer")] have ghost vision." + to_chat(usr, "You [(ghostvision?"now":"no longer")] have ghost vision.") + /mob/dead/observer/verb/toggle_darkness() set name = "Toggle Darkness" diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm index 34a0d44d631..1a2998fbaac 100644 --- a/code/modules/mob/dead/observer/say.dm +++ b/code/modules/mob/dead/observer/say.dm @@ -8,7 +8,8 @@ if (src.client) if(src.client.prefs.muted & MUTE_DEADCHAT) - src << "\red You cannot talk in deadchat (muted)." + to_chat(src, "\red You cannot talk in deadchat (muted).") + return if (src.client.handle_spam_prevention(message,MUTE_DEADCHAT)) @@ -30,7 +31,8 @@ if(src.client) if(src.client.prefs.muted & MUTE_DEADCHAT) - src << "\red You cannot emote in deadchat (muted)." + to_chat(src, "\red You cannot emote in deadchat (muted).") + return if(src.client.handle_spam_prevention(message, MUTE_DEADCHAT)) diff --git a/code/modules/mob/dead/observer/spells.dm b/code/modules/mob/dead/observer/spells.dm index ef51c787e5a..ae504a90fd3 100644 --- a/code/modules/mob/dead/observer/spells.dm +++ b/code/modules/mob/dead/observer/spells.dm @@ -32,7 +32,8 @@ var/global/list/boo_phrases=list( if(ishuman(A)) var/mob/living/carbon/human/H = A if(H && H.client) - H << "[pick(boo_phrases)]" + to_chat(H, "[pick(boo_phrases)]") + // Flicker unblessed lights in range if(istype(A,/obj/machinery/light)) diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm index 77b1dfa8dcb..cc74d5e6ffd 100644 --- a/code/modules/mob/emote.dm +++ b/code/modules/mob/emote.dm @@ -17,7 +17,8 @@ /mob/proc/custom_emote(var/m_type=1,var/message = null) if(stat || !use_me && usr == src) - usr << "You are unable to emote." + to_chat(usr, "You are unable to emote.") + return var/muzzled = istype(src.wear_mask, /obj/item/clothing/mask/muzzle) @@ -85,16 +86,19 @@ /mob/proc/emote_dead(var/message) if(client.prefs.muted & MUTE_DEADCHAT) - src << "\red You cannot send deadchat emotes (muted)." + to_chat(src, "\red You cannot send deadchat emotes (muted).") + return if(!(client.prefs.toggles & CHAT_DEAD)) - src << "\red You have deadchat muted." + to_chat(src, "\red You have deadchat muted.") + return if(!src.client.holder) if(!config.dsay_allowed) - src << "\red Deadchat is globally muted" + to_chat(src, "\red Deadchat is globally muted") + return @@ -118,7 +122,8 @@ continue if(check_rights(R_ADMIN|R_MOD, 0, M) && (M.client.prefs.toggles & CHAT_DEAD)) // Show the emote to admins/mods - M << message + to_chat(M, message) + else if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_DEAD)) // Show the emote to regular ghosts with deadchat toggled on M.show_message(message, 2) diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index c177b94a118..c222c73b33c 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -65,14 +65,18 @@ if(sdisabilities & DEAF || ear_deaf) if(!language || !(language.flags & INNATE)) // INNATE is the flag for audible-emote-language, so we don't want to show an "x talks but you cannot hear them" message if it's set if(speaker == src) - src << "You cannot hear yourself speak!" + to_chat(src, "You cannot hear yourself speak!") + else - src << "[speaker_name][alt_name] talks but you cannot hear them." + to_chat(src, "[speaker_name][alt_name] talks but you cannot hear them.") + else if(language) - src << "[speaker_name][alt_name] [track][language.format_message(message, verb)]" + to_chat(src, "[speaker_name][alt_name] [track][language.format_message(message, verb)]") + else - src << "[speaker_name][alt_name] [track][verb], \"[message]\"" + to_chat(src, "[speaker_name][alt_name] [track][verb], \"[message]\"") + if (speech_sound && (get_dist(speaker, src) <= world.view && src.z == speaker.z)) var/turf/source = speaker? get_turf(speaker) : get_turf(src) src.playsound_local(source, speech_sound, sound_vol, 1) @@ -177,11 +181,14 @@ formatted = "[verb], \"[message]\"" if(sdisabilities & DEAF || ear_deaf) if(prob(20)) - src << "You feel your headset vibrate but can hear nothing from it!" + to_chat(src, "You feel your headset vibrate but can hear nothing from it!") + else if(track) - src << "[part_a][track][part_b][formatted]
      " + to_chat(src, "[part_a][track][part_b][formatted]
      ") + else - src << "[part_a][speaker_name][part_b][formatted]
      " + to_chat(src, "[part_a][speaker_name][part_b][formatted]") + /mob/proc/hear_signlang(var/message, var/verb = "gestures", var/datum/language/language, var/mob/speaker = null) if(!client) @@ -215,4 +222,5 @@ else heard = "...You almost hear someone talking..." - src << heard + to_chat(src, heard) + diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm index 71e4235f2e6..71d8e9ac211 100644 --- a/code/modules/mob/holder.dm +++ b/code/modules/mob/holder.dm @@ -47,10 +47,13 @@ if(istype(M)) M.unEquip(src) - M << "[src] wriggles out of your grip!" - src << "You wriggle out of [M]'s grip!" + to_chat(M, "[src] wriggles out of your grip!") + + to_chat(src, "You wriggle out of [M]'s grip!") + else if(istype(src.loc,/obj/item)) - src << "You struggle free of [src.loc]." + to_chat(src, "You struggle free of [src.loc].") + src.forceMove(get_turf(src)) if(istype(M)) @@ -74,8 +77,10 @@ if(desc) H.desc = desc H.attack_hand(grabber) - grabber << "You scoop up \the [src]." - src << "\The [grabber] scoops you up." + to_chat(grabber, "You scoop up \the [src].") + + to_chat(src, "\The [grabber] scoops you up.") + grabber.status_flags |= PASSEMOTES return H diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index 265c7697de2..c35403c43a7 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -104,11 +104,13 @@ for(var/mob/player in player_list) if(istype(player,/mob/dead) && follow) var/msg_dead = "[name], [speaker_mask] ([ghost_follow_link(speaker, ghost=player)]) [format_message(message, get_spoken_verb(message))]" - player << msg_dead + to_chat(player, msg_dead) + continue else if(istype(player,/mob/dead) || ((src in player.languages) && check_special_condition(player))) - player << msg + to_chat(player, msg) + /datum/language/proc/check_special_condition(var/mob/other) return 1 diff --git a/code/modules/mob/living/autohiss.dm b/code/modules/mob/living/autohiss.dm index 4b9bfd96f49..17d8a061073 100644 --- a/code/modules/mob/living/autohiss.dm +++ b/code/modules/mob/living/autohiss.dm @@ -25,14 +25,18 @@ autohiss_mode = (autohiss_mode + 1) % AUTOHISS_NUM switch(autohiss_mode) if(AUTOHISS_OFF) - src << "Auto-hiss is now OFF." + to_chat(src, "Auto-hiss is now OFF.") + if(AUTOHISS_BASIC) - src << "Auto-hiss is now BASIC." + to_chat(src, "Auto-hiss is now BASIC.") + if(AUTOHISS_FULL) - src << "Auto-hiss is now FULL." + to_chat(src, "Auto-hiss is now FULL.") + else autohiss_mode = AUTOHISS_OFF - src << "Auto-hiss is now OFF." + to_chat(src, "Auto-hiss is now OFF.") + /datum/species var/list/autohiss_basic_map = null diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index dd173382124..21d006ee886 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -84,7 +84,8 @@ var/loc_temp = get_temperature(environment) - //world << "Loc temp: [loc_temp] - Body temp: [bodytemperature] - Fireloss: [getFireLoss()] - Fire protection: [heat_protection] - Location: [loc] - src: [src]" +// to_chat(world, "Loc temp: [loc_temp] - Body temp: [bodytemperature] - Fireloss: [getFireLoss()] - Fire protection: [heat_protection] - Location: [loc] - src: [src]") + // Aliens are now weak to fire. diff --git a/code/modules/mob/living/carbon/alien/alien_defenses.dm b/code/modules/mob/living/carbon/alien/alien_defenses.dm index 7ae01f43cfe..225d4a8046b 100644 --- a/code/modules/mob/living/carbon/alien/alien_defenses.dm +++ b/code/modules/mob/living/carbon/alien/alien_defenses.dm @@ -7,11 +7,13 @@ In all, this is a lot like the monkey code. /N */ /mob/living/carbon/alien/attack_alien(mob/living/carbon/alien/M as mob) if (!ticker) - M << "You cannot attack people before the game has started." + to_chat(M, "You cannot attack people before the game has started.") + return if (istype(loc, /turf) && istype(loc.loc, /area/start)) - M << "No attacking people at spawn, you jackass." + to_chat(M, "No attacking people at spawn, you jackass.") + return switch(M.a_intent) @@ -38,7 +40,8 @@ In all, this is a lot like the monkey code. /N add_logs(src, M, "attacked", admin=0) updatehealth() else - M << "[name] is too injured for that." + to_chat(M, "[name] is too injured for that.") + return diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index 17680b80f56..a72e93b3db4 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -8,13 +8,16 @@ Doesn't work on other aliens/AI.*/ /mob/living/carbon/proc/powerc(X, Y)//Y is optional, checks for weed planting. X can be null. if(stat) - src << "You must be conscious to do this." + to_chat(src, "You must be conscious to do this.") + return 0 else if(X && getPlasma() < X) - src << "Not enough plasma stored." + to_chat(src, "Not enough plasma stored.") + return 0 else if(Y && (!isturf(src.loc) || istype(src.loc, /turf/space))) - src << "You can't place that here!" + to_chat(src, "You can't place that here!") + return 0 else return 1 @@ -24,7 +27,8 @@ Doesn't work on other aliens/AI.*/ set category = "Alien" if(locate(/obj/structure/alien/weeds/node) in get_turf(src)) - src << "There's already a weed node here." + to_chat(src, "There's already a weed node here.") + return if(powerc(50,1)) @@ -44,8 +48,10 @@ Doesn't work on other aliens/AI.*/ var/msg = sanitize(input("Message:", "Alien Whisper") as text|null) if(msg) log_say("Alien Whisper: [key_name(src)]->[key_name(M)]: [msg]") - M << "You hear a strange, alien voice in your head...[msg]" - src << "You said: [msg] to [M]" + to_chat(M, "You hear a strange, alien voice in your head...[msg]") + + to_chat(src, "You said: [msg] to [M]") + for(var/mob/dead/observer/G in player_list) G.show_message("Alien message from [src] ([ghost_follow_link(src, ghost=G)]) to [M] ([ghost_follow_link(M, ghost=G)]): [msg]") return @@ -63,10 +69,13 @@ Doesn't work on other aliens/AI.*/ if (get_dist(src,M) <= 1) M.adjustPlasma(amount) adjustPlasma(-amount) - M << "[src] has transfered [amount] plasma to you." - src << {"You have trasferred [amount] plasma to [M]"} + to_chat(M, "[src] has transfered [amount] plasma to you.") + + to_chat(src, {"You have trasferred [amount] plasma to [M]"}) + else - src << "You need to be closer." + to_chat(src, "You need to be closer.") + return @@ -81,18 +90,21 @@ Doesn't work on other aliens/AI.*/ if(isobj(O)) var/obj/I = O if(I.unacidable) //So the aliens don't destroy energy fields/singularies/other aliens/etc with their acid. - src << "You cannot dissolve this object." + to_chat(src, "You cannot dissolve this object.") + return // TURF CHECK else if(istype(O, /turf/simulated)) var/turf/T = O // R WALL if(istype(T, /turf/simulated/wall/r_wall)) - src << "You cannot dissolve this object." + to_chat(src, "You cannot dissolve this object.") + return // R FLOOR if(istype(T, /turf/simulated/floor/engine)) - src << "You cannot dissolve this object." + to_chat(src, "You cannot dissolve this object.") + return else// Not a type we can acid. return @@ -101,7 +113,8 @@ Doesn't work on other aliens/AI.*/ new /obj/effect/acid(get_turf(O), O) visible_message("[src] vomits globs of vile stuff all over [O]. It begins to sizzle and melt under the bubbling mess of acid!") else - src << "Target is too far away." + to_chat(src, "Target is too far away.") + return /mob/living/carbon/alien/humanoid/proc/neurotoxin() // ok diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm index 19cad5aa5fc..c93eb944df6 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm @@ -34,11 +34,13 @@ no_queen = 0 if(src.has_brain_worms()) - src << "We cannot perform this ability at the present time!" + to_chat(src, "We cannot perform this ability at the present time!") + return if(no_queen) adjustPlasma(-500) - src << "You begin to evolve!" + to_chat(src, "You begin to evolve!") + for(var/mob/O in viewers(src, null)) O.show_message(text("[src] begins to twist and contort!"), 1) var/mob/living/carbon/alien/humanoid/queen/new_xeno = new(loc) @@ -46,5 +48,6 @@ new_xeno.mind.name = new_xeno.name qdel(src) else - src << "We already have an alive queen." + to_chat(src, "We already have an alive queen.") + return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm index 9a667ab79fc..91411978d51 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm @@ -50,7 +50,8 @@ leap_on_click = !leap_on_click leap_icon.icon_state = "leap_[leap_on_click ? "on":"off"]" if(message) - src << "You will now [leap_on_click ? "leap at":"slash at"] enemies!" + to_chat(src, "You will now [leap_on_click ? "leap at":"slash at"] enemies!") + else return @@ -65,14 +66,16 @@ /mob/living/carbon/alien/humanoid/hunter/proc/leap_at(var/atom/A) if(pounce_cooldown) - src << "You are too fatigued to pounce right now!" + to_chat(src, "You are too fatigued to pounce right now!") + return if(leaping) //Leap while you leap, so you can leap while you leap return if(!has_gravity(src) || !has_gravity(A)) - src << "It is unsafe to leap without gravity!" + to_chat(src, "It is unsafe to leap without gravity!") + //It's also extremely buggy visually, so it's balance+bugfix return if(lying) diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm index 342c8a530d3..f5ddc992a0e 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm @@ -76,7 +76,8 @@ if(powerc(250)) adjustToxLoss(-250) - src << "\green You begin to evolve!" + to_chat(src, "\green You begin to evolve!") + for(var/mob/O in viewers(src, null)) O.show_message(text("[src] begins to twist and contort!"), 1) var/mob/living/carbon/alien/humanoid/sentinel/praetorian/new_xeno = new(loc) diff --git a/code/modules/mob/living/carbon/alien/humanoid/emote.dm b/code/modules/mob/living/carbon/alien/humanoid/emote.dm index a80a0d5892c..a5a09b9a378 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/emote.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/emote.dm @@ -105,7 +105,8 @@ message = "\The [src] does a flip!" src.SpinAnimation(5,1) if("help") - src << "burp, flip, deathgasp, choke, collapse, dance, drool, gasp, shiver, gnarl, jump, moan, nod, roar, roll, scratch,\nscretch, shake, sign-#, sit, sulk, sway, tail, twitch, whimper" + to_chat(src, "burp, flip, deathgasp, choke, collapse, dance, drool, gasp, shiver, gnarl, jump, moan, nod, roar, roll, scratch,\nscretch, shake, sign-#, sit, sulk, sway, tail, twitch, whimper") + if(!stat) if (act == "roar") diff --git a/code/modules/mob/living/carbon/alien/humanoid/empress.dm b/code/modules/mob/living/carbon/alien/humanoid/empress.dm index 11cf3c0c4d6..aafb05c6640 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/empress.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/empress.dm @@ -82,7 +82,8 @@ set category = "Alien" if(locate(/obj/structure/alien/egg) in get_turf(src)) - src << "There's already an egg here." + to_chat(src, "There's already an egg here.") + return if(powerc(250,1))//Can't plant eggs on spess tiles. That's silly. diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index b399bb21731..736d5a1da09 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -113,7 +113,8 @@ /mob/living/carbon/alien/humanoid/attack_slime(mob/living/carbon/slime/M as mob) if (!ticker) - M << "You cannot attack people before the game has started." + to_chat(M, "You cannot attack people before the game has started.") + return if(M.Victim) return // can't attack while eating! @@ -184,11 +185,13 @@ /mob/living/carbon/alien/humanoid/attack_hand(mob/living/carbon/human/M as mob) if (!ticker) - M << "You cannot attack people before the game has started." + to_chat(M, "You cannot attack people before the game has started.") + return if (istype(loc, /turf) && istype(loc.loc, /area/start)) - M << "No attacking people at spawn, you jackass." + to_chat(M, "No attacking people at spawn, you jackass.") + return if(..()) //to allow surgery to return properly. @@ -252,11 +255,13 @@ In all, this is a lot like the monkey code. /N /mob/living/carbon/alien/humanoid/attack_alien(mob/living/carbon/alien/humanoid/M as mob) if (!ticker) - M << "You cannot attack people before the game has started." + to_chat(M, "You cannot attack people before the game has started.") + return if (istype(loc, /turf) && istype(loc.loc, /area/start)) - M << "No attacking people at spawn, you jackass." + to_chat(M, "No attacking people at spawn, you jackass.") + return ..() @@ -282,7 +287,8 @@ In all, this is a lot like the monkey code. /N adjustBruteLoss(damage) updatehealth() else - M << "[name] is too injured for that." + to_chat(M, "[name] is too injured for that.") + return @@ -304,7 +310,8 @@ In all, this is a lot like the monkey code. /N adjustBruteLoss(damage) updatehealth() else - L << "[name] is too injured for that." + to_chat(L, "[name] is too injured for that.") + return diff --git a/code/modules/mob/living/carbon/alien/humanoid/life.dm b/code/modules/mob/living/carbon/alien/humanoid/life.dm index 2c79a007fa8..6ccce6f2f66 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/life.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/life.dm @@ -17,7 +17,8 @@ /mob/living/carbon/alien/humanoid/handle_disabilities() if (disabilities & EPILEPSY) if ((prob(1) && paralysis < 10)) - src << "You have a seizure!" + to_chat(src, "You have a seizure!") + Paralyse(10) if (disabilities & COUGHING) if ((prob(5) && paralysis <= 1)) diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm index 188d485d83f..634bbf95117 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm @@ -63,7 +63,8 @@ set desc = "Lay an egg to produce huggers to impregnate prey with." set category = "Alien" if(locate(/obj/structure/alien/egg) in get_turf(src)) - src << "There's already an egg here." + to_chat(src, "There's already an egg here.") + return if(powerc(75,1))//Can't plant eggs on spess tiles. That's silly. @@ -111,7 +112,8 @@ if(no_queen) adjustToxLoss(-1000) - src << "You begin to evolve!" + to_chat(src, "You begin to evolve!") + for(var/mob/O in viewers(src, null)) O.show_message(text("[src] begins to twist and contort!"), 1) var/mob/living/carbon/alien/humanoid/empress/new_xeno = new(loc) @@ -122,7 +124,8 @@ new_xeno.mind.name = new_xeno.name qdel(src) else - src << "We already have an alive empress." + to_chat(src, "We already have an alive empress.") + return */ \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/larva/emote.dm b/code/modules/mob/living/carbon/alien/larva/emote.dm index 88437be1392..c956e0b2489 100644 --- a/code/modules/mob/living/carbon/alien/larva/emote.dm +++ b/code/modules/mob/living/carbon/alien/larva/emote.dm @@ -15,7 +15,8 @@ return if (src.client) if (client.prefs.muted & MUTE_IC) - src << "\red You cannot send IC messages (muted)." + to_chat(src, "\red You cannot send IC messages (muted).") + return if (src.client.handle_spam_prevention(message,MUTE_IC)) return @@ -110,9 +111,11 @@ message = text("[] collapses!", src) m_type = 2 if("help") - src << "burp, choke, collapse, dance, drool, gasp, shiver, gnarl, jump, moan, nod, roll, scratch,\nscretch, shake, sign-#, sulk, sway, tail, twitch, whimper" + to_chat(src, "burp, choke, collapse, dance, drool, gasp, shiver, gnarl, jump, moan, nod, roll, scratch,\nscretch, shake, sign-#, sulk, sway, tail, twitch, whimper") + else - src << text("Invalid Emote: []", act) + to_chat(src, text("Invalid Emote: []", act)) + if ((message && src.stat == 0)) log_emote("[name]/[key] : [message]") if (m_type & 1) diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index 195e965dadf..f12989c83e0 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -38,7 +38,8 @@ 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." + to_chat(src, "\red You fail to push [tmob]'s fat ass out of the way.") + now_pushing = 0 return if(!(tmob.status_flags & CANPUSH)) @@ -124,7 +125,8 @@ /mob/living/carbon/alien/larva/attack_slime(mob/living/carbon/slime/M as mob) if (!ticker) - M << "You cannot attack people before the game has started." + to_chat(M, "You cannot attack people before the game has started.") + return if(M.Victim) @@ -149,11 +151,13 @@ /mob/living/carbon/alien/larva/attack_hand(mob/living/carbon/human/M as mob) if (!ticker) - M << "You cannot attack people before the game has started." + to_chat(M, "You cannot attack people before the game has started.") + return if (istype(loc, /turf) && istype(loc.loc, /area/start)) - M << "No attacking people at spawn, you jackass." + to_chat(M, "No attacking people at spawn, you jackass.") + return ..() @@ -195,11 +199,13 @@ /mob/living/carbon/alien/larva/attack_alien(mob/living/carbon/alien/humanoid/M as mob) if (!ticker) - M << "You cannot attack people before the game has started." + to_chat(M, "You cannot attack people before the game has started.") + return if (istype(loc, /turf) && istype(loc.loc, /area/start)) - M << "No attacking people at spawn, you jackass." + to_chat(M, "No attacking people at spawn, you jackass.") + return ..() @@ -224,7 +230,8 @@ adjustBruteLoss(damage) updatehealth() else - M << "[name] is too injured for that." + to_chat(M, "[name] is too injured for that.") + return /mob/living/carbon/alien/larva/restrained() diff --git a/code/modules/mob/living/carbon/alien/larva/powers.dm b/code/modules/mob/living/carbon/alien/larva/powers.dm index a8cb230f9e7..a30f8ff9b2d 100644 --- a/code/modules/mob/living/carbon/alien/larva/powers.dm +++ b/code/modules/mob/living/carbon/alien/larva/powers.dm @@ -9,16 +9,20 @@ if (layer != TURF_LAYER+0.2) layer = TURF_LAYER+0.2 - src << text("You are now hiding.") + to_chat(src, text("You are now hiding.")) + for(var/mob/O in oviewers(src, null)) if ((O.client && !( O.blinded ))) - O << text("[] scurries to the ground!", src) + to_chat(O, text("[] scurries to the ground!", src)) + else layer = MOB_LAYER - src << text("\green You have stopped hiding.") + to_chat(src, text("\green 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) + to_chat(O, text("[] slowly peaks up from the ground...", src)) + /mob/living/carbon/alien/larva/verb/evolve() set name = "Evolve" @@ -29,15 +33,21 @@ return if(handcuffed || legcuffed) - src << "\red You cannot evolve when you are cuffed." + to_chat(src, "\red You cannot evolve when you are cuffed.") + if(amount_grown >= max_grown) //TODO ~Carn //green is impossible to read, so i made these blue and changed the formatting slightly - src << "\blue You are growing into a beautiful alien! It is time to choose a caste." - src << "\blue There are three to choose from:" - src << "Hunters \blue are strong and agile, able to hunt away from the hive and rapidly move through ventilation shafts. Hunters generate plasma slowly and have low reserves." - src << "Sentinels \blue are tasked with protecting the hive and are deadly up close and at a range. They are not as physically imposing nor fast as the hunters." - src << "Drones \blue are the working class, offering the largest plasma storage and generation. They are the only caste which may evolve again, turning into the dreaded alien queen." + to_chat(src, "\blue You are growing into a beautiful alien! It is time to choose a caste.") + + to_chat(src, "\blue There are three to choose from:") + + to_chat(src, "Hunters \blue are strong and agile, able to hunt away from the hive and rapidly move through ventilation shafts. Hunters generate plasma slowly and have low reserves.") + + to_chat(src, "Sentinels \blue are tasked with protecting the hive and are deadly up close and at a range. They are not as physically imposing nor fast as the hunters.") + + to_chat(src, "Drones \blue are the working class, offering the largest plasma storage and generation. They are the only caste which may evolve again, turning into the dreaded alien queen.") + var/alien_caste = alert(src, "Please choose which alien caste you shall belong to.",,"Hunter","Sentinel","Drone") var/mob/living/carbon/alien/humanoid/new_xeno @@ -56,5 +66,6 @@ qdel(src) return else - src << "You are not fully grown." + to_chat(src, "You are not fully grown.") + return diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index a3662187f8b..a49f7c0a6ea 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -33,7 +33,8 @@ /mob/living/carbon/alien/handle_breath_temperature(datum/gas_mixture/breath) if(breath.temperature > (T0C + 66) && !(RESIST_COLD in mutations)) if(prob(20)) - src << "You feel a searing heat in your lungs!" + to_chat(src, "You feel a searing heat in your lungs!") + fire_alert = max(fire_alert, 1) else fire_alert = 0 diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm index f07cf2cf3e6..860e5aed290 100644 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm @@ -11,9 +11,11 @@ /obj/item/organ/internal/body_egg/alien_embryo/on_find(mob/living/finder) ..() if(stage < 4) - finder << "It's small and weak, barely the size of a fetus." + to_chat(finder, "It's small and weak, barely the size of a fetus.") + else - finder << "It's grown quite large, and writhes slightly as you look at it." + to_chat(finder, "It's grown quite large, and writhes slightly as you look at it.") + if(prob(10)) AttemptGrow(0) @@ -30,24 +32,29 @@ if(prob(2)) owner.emote("cough") if(prob(2)) - owner << "Your throat feels sore." + to_chat(owner, "Your throat feels sore.") + if(prob(2)) - owner << "Mucous runs down the back of your throat." + to_chat(owner, "Mucous runs down the back of your throat.") + if(4) if(prob(2)) owner.emote("sneeze") if(prob(2)) owner.emote("cough") if(prob(4)) - owner << "Your muscles ache." + to_chat(owner, "Your muscles ache.") + if(prob(20)) owner.take_organ_damage(1) if(prob(4)) - owner << "Your stomach hurts." + to_chat(owner, "Your stomach hurts.") + if(prob(20)) owner.adjustToxLoss(1) if(5) - owner << "You feel something tearing its way out of your stomach..." + to_chat(owner, "You feel something tearing its way out of your stomach...") + owner.adjustToxLoss(10) /obj/item/organ/internal/body_egg/alien_embryo/egg_process() @@ -98,7 +105,9 @@ new_xeno.mind.name = new_xeno.name new_xeno.mind.assigned_role = "MODE" new_xeno.mind.special_role = "Alien" - new_xeno << sound('sound/voice/hiss5.ogg',0,0,0,100) //To get the player's attention + to_chat(new_xeno, sound('sound/voice/hiss5.ogg',0,0,0,100))//To get the player's attention + + if(gib_on_success) owner.gib() else diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index 6f958533515..fd04034f152 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -49,11 +49,14 @@ var/const/MAX_ACTIVE_TIME = 400 return switch(stat) if(DEAD,UNCONSCIOUS) - user << "[src] is not moving." + to_chat(user, "[src] is not moving.") + if(CONSCIOUS) - user << "[src] seems to be active!" + to_chat(user, "[src] seems to be active!") + if (sterile) - user << "It looks like the proboscis has been removed." + to_chat(user, "It looks like the proboscis has been removed.") + /obj/item/clothing/mask/facehugger/attackby(obj/item/O,mob/m, params) if(O.force) diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index 7aa4cd44554..106acb44814 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -19,15 +19,18 @@ /obj/item/device/mmi/attackby(var/obj/item/O as obj, var/mob/user as mob, params) if(istype(O, /obj/item/organ/internal/brain/crystal )) - user << " This brain is too malformed to be able to use with the [src]." + to_chat(user, " This brain is too malformed to be able to use with the [src].") + return if(istype(O,/obj/item/organ/internal/brain) && !brainmob) //Time to stick a brain in it --NEO var/obj/item/organ/internal/brain/B = O if(!B.brainmob) - user << "You aren't sure where this brain came from, but you're pretty sure it's a useless brain." + to_chat(user, "You aren't sure where this brain came from, but you're pretty sure it's a useless brain.") + return if(held_brain) - user << "Somehow, this MMI still has a brain in it. Report this to the bug tracker." + to_chat(user, "Somehow, this MMI still has a brain in it. Report this to the bug tracker.") + log_to_dd("[user] tried to stick a [O] into [src] in [get_area(src)], but the held brain variable wasn't cleared") return for(var/mob/V in viewers(src, null)) @@ -67,9 +70,11 @@ /obj/item/device/mmi/attack_self(mob/user as mob) if(!brainmob) - user << "You upend the MMI, but there's nothing in it." + to_chat(user, "You upend the MMI, but there's nothing in it.") + else - user << "You unlock and upend the MMI, spilling the brain onto the floor." + to_chat(user, "You unlock and upend the MMI, spilling the brain onto the floor.") + dropbrain(get_turf(user)) icon = 'icons/obj/assemblies.dmi' icon_state = "mmi_empty" @@ -101,7 +106,8 @@ /obj/item/device/mmi/proc/dropbrain(var/turf/dropspot) if(isnull(held_brain)) log_to_dd("[src] at [loc] attempted to drop brain without a contained brain in [get_area(src)].") - brainmob << "Your MMI did not contain a brain! We'll make a new one for you, but you'd best report this to the bugtracker!" + to_chat(brainmob, "Your MMI did not contain a brain! We'll make a new one for you, but you'd best report this to the bugtracker!") + held_brain = new(dropspot) // Let's not ruin someone's round because of something dumb -- Crazylemon held_brain.dna = brainmob.dna.Clone() held_brain.name = "\the [brainmob.name]'s [initial(held_brain.name)]" @@ -137,10 +143,12 @@ set popup_menu = 0 if(brainmob.stat) - brainmob << "Can't do that while incapacitated or dead." + to_chat(brainmob, "Can't do that while incapacitated or dead.") + radio.listening = radio.listening==1 ? 0 : 1 - brainmob << "Radio is [radio.listening==1 ? "now" : "no longer"] receiving broadcast." + to_chat(brainmob, "Radio is [radio.listening==1 ? "now" : "no longer"] receiving broadcast.") + /obj/item/device/mmi/emp_act(severity) if(!brainmob) diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm index 64964636d16..1dda87d0c46 100644 --- a/code/modules/mob/living/carbon/brain/brain_item.dm +++ b/code/modules/mob/living/carbon/brain/brain_item.dm @@ -48,15 +48,18 @@ if(H.mind) H.mind.transfer_to(brainmob) - brainmob << "You feel slightly disoriented. That's normal when you're just a [initial(src.name)]." + to_chat(brainmob, "You feel slightly disoriented. That's normal when you're just a [initial(src.name)].") + callHook("debrain", list(brainmob)) /obj/item/organ/internal/brain/examine(mob/user) // -- TLE ..(user) if(brainmob && brainmob.client)//if thar be a brain inside... the brain. - user << "You can feel the small spark of life still left in this one." + to_chat(user, "You can feel the small spark of life still left in this one.") + else - user << "This one seems particularly lifeless. Perhaps it will regain some of its luster later.." + to_chat(user, "This one seems particularly lifeless. Perhaps it will regain some of its luster later..") + /obj/item/organ/internal/brain/remove(var/mob/living/user,special = 0) diff --git a/code/modules/mob/living/carbon/brain/emote.dm b/code/modules/mob/living/carbon/brain/emote.dm index 0441eb00ac4..108ae12029b 100644 --- a/code/modules/mob/living/carbon/brain/emote.dm +++ b/code/modules/mob/living/carbon/brain/emote.dm @@ -14,15 +14,18 @@ switch(act) if ("alarm") - src << "You sound an alarm." + to_chat(src, "You sound an alarm.") + message = "\The [src] sounds an alarm." m_type = 2 if ("alert") - src << "You let out a distressed noise." + to_chat(src, "You let out a distressed noise.") + message = "\The [src] lets out a distressed noise." m_type = 2 if ("notice") - src << "You play a loud tone." + to_chat(src, "You play a loud tone.") + message = "\The [src] plays a loud tone." m_type = 2 if ("flash") @@ -32,19 +35,23 @@ message = "\The [src] blinks." m_type = 1 if ("whistle") - src << "You whistle." + to_chat(src, "You whistle.") + message = "\The [src] whistles." m_type = 2 if ("beep") - src << "You beep." + to_chat(src, "You beep.") + message = "\The [src] beeps." m_type = 2 if ("boop") - src << "You boop." + to_chat(src, "You boop.") + message = "\The [src] boops." m_type = 2 if ("help") - src << "alarm, alert, notice, flash,blink, whistle, beep, boop" + to_chat(src, "alarm, alert, notice, flash,blink, whistle, beep, boop") + if(message && !stat) ..(act, m_type, message) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm index ad91f6c152e..507320b7ef6 100644 --- a/code/modules/mob/living/carbon/brain/life.dm +++ b/code/modules/mob/living/carbon/brain/life.dm @@ -5,9 +5,11 @@ adjustToxLoss(3) updatehealth() if(!container) - src << "You feel weak." + to_chat(src, "You feel weak.") + else - src << "STATUS: CRITICAL AMOUNTS OF RADIATION DETECTED." + to_chat(src, "STATUS: CRITICAL AMOUNTS OF RADIATION DETECTED.") + switch(radiation) if(0 to 49) @@ -22,9 +24,11 @@ if(prob(5)) radiation -= 5 if(!container) - src << "You feel weak." + to_chat(src, "You feel weak.") + else - src << "STATUS: DANGEROUS AMOUNTS OF RADIATION DETECTED." + to_chat(src, "STATUS: DANGEROUS AMOUNTS OF RADIATION DETECTED.") + updatehealth() if(75 to 100) @@ -93,4 +97,4 @@ sight &= ~SEE_OBJS see_in_dark = 2 see_invisible = SEE_INVISIBLE_LIVING - handle_hud_icons_health() + handle_hud_icons_health() diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index aa589713cb9..d39da7e6c02 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -18,7 +18,8 @@ /obj/item/device/mmi/posibrain/attack_self(mob/user as mob) if(brainmob && !brainmob.key && searching == 0) //Start the process of searching for a new user. - user << "\blue You carefully locate the manual activation switch and start the positronic brain's boot process." + to_chat(user, "\blue You carefully locate the manual activation switch and start the positronic brain's boot process.") + icon_state = "posibrain-searching" ghost_volunteers.Cut() src.searching = 1 @@ -32,21 +33,26 @@ else if(silenced) silenced = 0 - user << "You toggle the speaker to 'on', on the [src]." + to_chat(user, "You toggle the speaker to 'on', on the [src].") + desc = "A cube of shining metal, four inches to a side and covered in shallow grooves. The speaker switch is set to 'on'." if(brainmob && brainmob.key) - brainmob << "Your internal speaker has been toggled to 'on'." + to_chat(brainmob, "Your internal speaker has been toggled to 'on'.") + else silenced = 1 - user << "You toggle the speaker to 'off', on the [src]." + to_chat(user, "You toggle the speaker to 'off', on the [src].") + desc = "A cube of shining metal, four inches to a side and covered in shallow grooves. The speaker switch is set to 'off'." if(brainmob && brainmob.key) - brainmob << "Your internal speaker has been toggled to 'off'." + to_chat(brainmob, "Your internal speaker has been toggled to 'off'.") + /obj/item/device/mmi/posibrain/proc/request_player() for(var/mob/dead/observer/O in player_list) if(check_observer(O)) - O << "\A [src] has been activated. (Teleport | Sign Up)" + to_chat(O, "\A [src] has been activated. (Teleport | Sign Up)") + // if(ROLE_POSIBRAIN in O.client.prefs.be_special) The Guardian implementation looks cleaner // question(O.client) @@ -86,7 +92,8 @@ brainmob.mind.assigned_role = "Positronic Brain" if(H.mind) H.mind.transfer_to(brainmob) - brainmob << "You feel slightly disoriented. That's normal when you're just a metal cube." + to_chat(brainmob, "You feel slightly disoriented. That's normal when you're just a metal cube.") + icon_state = "posibrain-occupied" return @@ -95,9 +102,12 @@ src.brainmob.key = candidate.key src.name = "positronic brain ([src.brainmob.name])" - src.brainmob << "You are a positronic brain, brought into existence on [station_name()]." - src.brainmob << "As a synthetic intelligence, you answer to all crewmembers, as well as the AI." - src.brainmob << "Remember, the purpose of your existence is to serve the crew and the station. Above all else, do no harm." + to_chat(src.brainmob, "You are a positronic brain, brought into existence on [station_name()].") + + to_chat(src.brainmob, "As a synthetic intelligence, you answer to all crewmembers, as well as the AI.") + + to_chat(src.brainmob, "Remember, the purpose of your existence is to serve the crew and the station. Above all else, do no harm.") + src.brainmob.mind.assigned_role = "Positronic Brain" var/turf/T = get_turf_or_move(src.loc) @@ -123,25 +133,32 @@ /obj/item/device/mmi/posibrain/proc/volunteer(var/mob/dead/observer/O) if(!searching) - O << "Not looking for a ghost, yet." + to_chat(O, "Not looking for a ghost, yet.") + return if(!istype(O)) - O << "\red Error." + to_chat(O, "\red Error.") + return if(O in ghost_volunteers) - O << "\blue Removed from registration list." + to_chat(O, "\blue Removed from registration list.") + ghost_volunteers.Remove(O) return if(!check_observer(O)) - O << "\red You cannot be \a [src]." + to_chat(O, "\red You cannot be \a [src].") + return if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted) - O << "\red Upon using the antagHUD you forfeited the ability to join the round." + to_chat(O, "\red Upon using the antagHUD you forfeited the ability to join the round.") + return if(jobban_isbanned(O, "Cyborg") || jobban_isbanned(O,"nonhumandept")) - O << "\red You are job banned from this role." + to_chat(O, "\red You are job banned from this role.") + return - O.<< "\blue You've been added to the list of ghosts that may become this [src]. Click again to unvolunteer." + to_chat(O., "\blue You've been added to the list of ghosts that may become this [src]. Click again to unvolunteer.") + ghost_volunteers.Add(O) @@ -161,7 +178,8 @@ else msg += "It appears to be completely inactive.\n" msg += "*---------*" - user << msg + to_chat(user, msg) + /obj/item/device/mmi/posibrain/emp_act(severity) if(!src.brainmob) diff --git a/code/modules/mob/living/carbon/brain/say.dm b/code/modules/mob/living/carbon/brain/say.dm index 367363ed2a1..324debd7394 100644 --- a/code/modules/mob/living/carbon/brain/say.dm +++ b/code/modules/mob/living/carbon/brain/say.dm @@ -9,7 +9,8 @@ if(container && istype(container, /obj/item/device/mmi/posibrain)) var/obj/item/device/mmi/posibrain/P = container if(P && P.silenced) - usr << "You cannot speak, as your internal speaker has been toggled to 'off'." + to_chat(usr, "You cannot speak, as your internal speaker has been toggled to 'off'.") + return if(prob(emp_damage*4)) if(prob(10))//10% chane to drop the message entirely diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 9c780f92bce..fe363381b51 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -95,7 +95,8 @@ /mob/living/carbon/proc/vomit(var/lost_nutrition = 10, var/blood = 0, var/stun = 1, var/distance = 0, var/message = 1) if(src.is_muzzled()) if(message) - src << "The muzzle prevents you from vomiting!" + to_chat(src, "The muzzle prevents you from vomiting!") + return 0 if(stun) Stun(4) @@ -193,7 +194,8 @@ if(item_in_hand) //this segment checks if the item in your hand is twohanded. if(istype(item_in_hand,/obj/item/weapon/twohanded)) if(item_in_hand:wielded == 1) - usr << "Your other hand is too busy holding the [item_in_hand.name]" + to_chat(usr, "Your other hand is too busy holding the [item_in_hand.name]") + return src.hand = !( src.hand ) if(hud_used.l_hand_hud_object && hud_used.r_hand_hud_object) @@ -260,9 +262,11 @@ src.show_message(text("\t []My [] is [].",status=="OK"?"\blue ":"\red ",org.name,status),1) if(staminaloss) if(staminaloss > 30) - src << "You're completely exhausted." + to_chat(src, "You're completely exhausted.") + else - src << "You feel fatigued." + to_chat(src, "You feel fatigued.") + if((SKELETON in H.mutations) && (!H.w_uniform) && (!H.wear_suit)) H.play_xylophone() else @@ -324,16 +328,19 @@ switch(damage) if(1) - src << "Your eyes sting a little." + to_chat(src, "Your eyes sting a little.") + if(prob(40)) //waiting on carbon organs E.damage += 1 if(2) - src << "Your eyes burn." + to_chat(src, "Your eyes burn.") + E.damage += rand(2, 4) else - src << "Your eyes itch and burn severely!" + to_chat(src, "Your eyes itch and burn severely!") + E.damage += rand(12, 16) if(E.damage > E.min_bruised_damage) @@ -342,20 +349,25 @@ if(E.damage > (E.min_bruised_damage + E.min_broken_damage) / 2) if(!(E.status & ORGAN_ROBOT)) - src << "Your eyes start to burn badly!" + to_chat(src, "Your eyes start to burn badly!") + else //snowflake conditions piss me off for the record - src << "The flash blinds you!" + to_chat(src, "The flash blinds you!") + else if(E.damage >= E.min_broken_damage) - src << "You can't see anything!" + to_chat(src, "You can't see anything!") + else - src << "Your eyes are really starting to hurt. This can't be good for you!" + to_chat(src, "Your eyes are really starting to hurt. This can't be good for you!") + return 1 else if(damage == 0) // just enough protection if(prob(20)) - src << "Something bright flashes in the corner of your vision!" + to_chat(src, "Something bright flashes in the corner of your vision!") + /mob/living/carbon/proc/tintcheck() @@ -386,15 +398,18 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, if(!ventcrawlerlocal) return if(stat) - src << "You must be conscious to do this!" + to_chat(src, "You must be conscious to do this!") + return if(lying) - src << "You can't vent crawl while you're stunned!" + to_chat(src, "You can't vent crawl while you're stunned!") + return if(buckled_mob) - src << "You can't vent crawl with [buckled_mob] on you!" + to_chat(src, "You can't vent crawl with [buckled_mob] on you!") + return var/obj/machinery/atmospherics/unary/vent_found @@ -438,7 +453,8 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, failed++ if(failed) - src << "You can't crawl around in the ventilation ducts with items!" + to_chat(src, "You can't crawl around in the ventilation ducts with items!") + return visible_message("[src] scrambles into the ventilation ducts!", "You climb into the ventilation system.") @@ -446,7 +462,8 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, add_ventcrawl(vent_found) else - src << "This ventilation duct is not connected to anything!" + to_chat(src, "This ventilation duct is not connected to anything!") + /mob/living/proc/add_ventcrawl(obj/machinery/atmospherics/starting_machine) @@ -659,7 +676,8 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, if(!(head && head.flags & AIRTIGHT)) no_mask = 1 if(no_mask) - usr << "[src] is not wearing a suitable mask or helmet!" + to_chat(usr, "[src] is not wearing a suitable mask or helmet!") + return if(do_mob(usr, src, POCKET_STRIP_DELAY)) @@ -673,7 +691,8 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, if(!(head && head.flags & AIRTIGHT)) no_mask2 = 1 if(no_mask2) - usr << "[src] is not wearing a suitable mask or helmet!" + to_chat(usr, "[src] is not wearing a suitable mask or helmet!") + return internal = ITEM if(internals) @@ -800,7 +819,8 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, for(var/t = 0, t<=tilesSlipped, t++) spawn (t) step(src, src.dir) stop_pulling() - src << "You slipped on the [description]!" + to_chat(src, "You slipped on the [description]!") + playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) if (stun) Stun(stun) @@ -831,18 +851,24 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, /mob/living/carbon/proc/selfFeed(var/obj/item/weapon/reagent_containers/food/toEat, fullness) if(istype(toEat, /obj/item/weapon/reagent_containers/food/pill)) - src << "You [toEat.apply_method] [toEat]." + to_chat(src, "You [toEat.apply_method] [toEat].") + else if (fullness <= 50) - src << "You hungrily chew out a piece of [toEat] and gobble it!" + to_chat(src, "You hungrily chew out a piece of [toEat] and gobble it!") + else if (fullness > 50 && fullness <= 150) - src << "You hungrily begin to eat [toEat]." + to_chat(src, "You hungrily begin to eat [toEat].") + else if (fullness > 150 && fullness <= 350) - src << "You take a bite of [toEat]." + to_chat(src, "You take a bite of [toEat].") + else if (fullness > 350 && fullness <= 550) - src << "You unwillingly chew a bit of [toEat]." + to_chat(src, "You unwillingly chew a bit of [toEat].") + else if (fullness > (550 * (1 + overeatduration / 2000))) // The more you eat - the more you can eat - src << "You cannot force any more of [toEat] to go down your throat." + to_chat(src, "You cannot force any more of [toEat] to go down your throat.") + return 0 return 1 diff --git a/code/modules/mob/living/carbon/give.dm b/code/modules/mob/living/carbon/give.dm index 796f2997cc4..e7828ea93f0 100644 --- a/code/modules/mob/living/carbon/give.dm +++ b/code/modules/mob/living/carbon/give.dm @@ -3,16 +3,20 @@ set name = "Give" if(!iscarbon(target)) //something is bypassing the give arguments, no clue what, adding a sanity check JIC - usr << "Wait a second... \the [target] HAS NO HANDS! AHH!" //cheesy messages ftw + to_chat(usr, "Wait a second... \the [target] HAS NO HANDS! AHH!")//cheesy messages ftw + + return if(target.stat == 2 || usr.stat == 2|| target.client == null) return var/obj/item/I if(!usr.hand && usr.r_hand == null) - usr << " You don't have anything in your right hand to give to [target.name]" + to_chat(usr, " You don't have anything in your right hand to give to [target.name]") + return if(usr.hand && usr.l_hand == null) - usr << " You don't have anything in your left hand to give to [target.name]" + to_chat(usr, " You don't have anything in your left hand to give to [target.name]") + return if(usr.hand) I = usr.l_hand @@ -21,7 +25,8 @@ if(!I) return if((I.flags & NODROP) || (I.flags & ABSTRACT)) - usr << "That's not exactly something you can give." + to_chat(usr, "That's not exactly something you can give.") + return if(target.r_hand == null || target.l_hand == null) switch(alert(target,"[usr] wants to give you \a [I]?",,"Yes","No")) @@ -29,16 +34,22 @@ if(!I) return if(!Adjacent(usr)) - usr << " You need to stay in reaching distance while giving an object." - target << " [usr.name] moved too far away." + to_chat(usr, " You need to stay in reaching distance while giving an object.") + + to_chat(target, " [usr.name] moved too far away.") + return if((usr.hand && usr.l_hand != I) || (!usr.hand && usr.r_hand != I)) - usr << " You need to keep the item in your active hand." - target << " [usr.name] seem to have given up on giving \the [I.name] to you." + to_chat(usr, " You need to keep the item in your active hand.") + + to_chat(target, " [usr.name] seem to have given up on giving \the [I.name] to you.") + return if(target.r_hand != null && target.l_hand != null) - target << " Your hands are full." - usr << " Their hands are full." + to_chat(target, " Your hands are full.") + + to_chat(usr, " Their hands are full.") + return else usr.drop_item() @@ -57,4 +68,5 @@ if("No") target.visible_message(" [usr.name] tried to hand [I.name] to [target.name] but [target.name] didn't want it.") else - usr << " [target.name]'s hands are full." \ No newline at end of file + to_chat(usr, " [target.name]'s hands are full.") + diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 17d13a01c83..19d6d93cd5f 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -753,7 +753,8 @@ right_hand_good = 1 if (!left_hand_good && !right_hand_good) - usr << "You need at least one hand in good working order to snap your fingers." + to_chat(usr, "You need at least one hand in good working order to snap your fingers.") + return message = "[src] snaps \his fingers." @@ -769,8 +770,10 @@ return // playsound(src.loc, 'sound/effects/fart.ogg', 50, 1, -3) //Admins still vote no to fun if(locate(/obj/item/weapon/storage/bible) in get_turf(src)) - viewers(src) << "[src] farts on the Bible!" - viewers(src) << "A mysterious force smites [src]!" + to_chat(viewers(src), "[src] farts on the Bible!") + + to_chat(viewers(src), "A mysterious force smites [src]!") + var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, src) s.start() @@ -810,10 +813,12 @@ emotelist += "\nMachine specific emotes :- beep(s)-(none)/mob, buzz(es)-none/mob, no-(none)/mob, ping(s)-(none)/mob, yes-(none)/mob" else if(species.name == "Slime People") emotelist += "\nSlime people specific emotes :- squish(es)-(none)/mob" - src << emotelist + to_chat(src, emotelist) + else - src << "\blue Unusable emote '[act]'. Say *help for a list." + to_chat(src, "\blue Unusable emote '[act]'. Say *help for a list.") + diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 57261782385..455fcbc2607 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -215,9 +215,11 @@ spawn(15) if(distance <= 1 && user.stat != 1) if(pulse == PULSE_NONE) - user << "[t_He] has no pulse[src.client ? "" : " and [t_his] soul has departed"]..." + to_chat(user, "[t_He] has no pulse[src.client ? "" : " and [t_his] soul has departed"]...") + else - user << "[t_He] has a pulse!" + to_chat(user, "[t_He] has a pulse!") + msg += "" if(fire_stacks > 0) @@ -484,7 +486,8 @@ pose = addtext(pose,".") //Makes sure all emotes end with a period. msg += "\n[t_He] is [pose]" - user << msg + to_chat(user, msg) + //Helper procedure. Called by /mob/living/carbon/human/examine() and /mob/living/carbon/human/Topic() to determine HUD access to security and medical records. /proc/hasHUD(mob/M as mob, hudtype) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 9fb9f12d264..216beb2ca65 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -168,7 +168,8 @@ if(tmob.pinned.len || (M.pulling == tmob && (tmob.restrained() && !M.restrained()) && M.stat == CONSCIOUS)) if(!(world.time % 5)) //tmob is pinned to wall, or is restrained and pulled by a concious unrestrained human - src << "[tmob] is restrained, you cannot push past." + to_chat(src, "[tmob] is restrained, you cannot push past.") + now_pushing = 0 return 0 @@ -179,7 +180,8 @@ if(tmob.pulling == M && (M.restrained() && !tmob.restrained()) && tmob.stat == CONSCIOUS) if(!(world.time % 5)) - src << "[tmob] is restraining [M], you cannot push past." + to_chat(src, "[tmob] is restraining [M], you cannot push past.") + now_pushing = 0 return 0 @@ -205,7 +207,8 @@ if(ishuman(tmob) && (FAT in tmob.mutations)) if(prob(40) && !(FAT in src.mutations)) - src << "You fail to push [tmob]'s fat ass out of the way." + to_chat(src, "You fail to push [tmob]'s fat ass out of the way.") + now_pushing = 0 return @@ -755,7 +758,8 @@ if(shock_damage * siemens_coeff >= 1 && prob(25)) heart_attack = 0 if(stat == CONSCIOUS) - src << "You feel your heart beating again!" + to_chat(src, "You feel your heart beating again!") + . = ..() @@ -771,7 +775,8 @@ if(href_list["item"]) var/slot = text2num(href_list["item"]) if(slot in check_obscured_slots()) - usr << "You can't reach that! Something is covering it." + to_chat(usr, "You can't reach that! Something is covering it.") + return if(href_list["pockets"]) @@ -783,10 +788,13 @@ var/delay_denominator = 1 if(pocket_item && !(pocket_item.flags&ABSTRACT)) if(pocket_item.flags & NODROP) - usr << "You try to empty [src]'s [pocket_side] pocket, it seems to be stuck!" - usr << "You try to empty [src]'s [pocket_side] pocket." + to_chat(usr, "You try to empty [src]'s [pocket_side] pocket, it seems to be stuck!") + + to_chat(usr, "You try to empty [src]'s [pocket_side] pocket.") + else if(place_item && place_item.mob_can_equip(src, pocket_id, 1) && !(place_item.flags&ABSTRACT)) - usr << "You try to place [place_item] into [src]'s [pocket_side] pocket." + to_chat(usr, "You try to place [place_item] into [src]'s [pocket_side] pocket.") + delay_denominator = 4 else return @@ -808,7 +816,8 @@ else // Display a warning if the user mocks up if they don't have pickpocket gloves. if(!thief_mode) - src << "You feel your [pocket_side] pocket being fumbled with!" + to_chat(src, "You feel your [pocket_side] pocket being fumbled with!") + if(href_list["set_sensor"]) if(istype(w_uniform, /obj/item/clothing/under)) @@ -868,7 +877,8 @@ sec_hud_set_security_status() if(!modified) - usr << "\red Unable to locate a data core entry for this person." + to_chat(usr, "\red Unable to locate a data core entry for this person.") + if (href_list["secrecord"]) if(hasHUD(usr,"security")) @@ -888,17 +898,18 @@ for (var/datum/data/record/R in data_core.security) if (R.fields["id"] == E.fields["id"]) if(hasHUD(usr,"security")) - usr << "Name: [R.fields["name"]] Criminal Status: [R.fields["criminal"]]" - usr << "Minor Crimes: [R.fields["mi_crim"]]" - usr << "Details: [R.fields["mi_crim_d"]]" - usr << "Major Crimes: [R.fields["ma_crim"]]" - usr << "Details: [R.fields["ma_crim_d"]]" - usr << "Notes: [R.fields["notes"]]" - usr << "\[View Comment Log\]" + to_chat(usr, "Name: [R.fields["name"]] Criminal Status: [R.fields["criminal"]]") + to_chat(usr, "Minor Crimes: [R.fields["mi_crim"]]") + to_chat(usr, "Details: [R.fields["mi_crim_d"]]") + to_chat(usr, "Major Crimes: [R.fields["ma_crim"]]") + to_chat(usr, "Details: [R.fields["ma_crim_d"]]") + to_chat(usr, "Notes: [R.fields["notes"]]") + to_chat(usr, "\[View Comment Log\]") read = 1 if(!read) - usr << "\red Unable to locate a data core entry for this person." + to_chat(usr, "\red Unable to locate a data core entry for this person.") + if (href_list["secrecordComment"]) if(hasHUD(usr,"security")) @@ -921,14 +932,18 @@ read = 1 var/counter = 1 while(R.fields[text("com_[]", counter)]) - usr << text("[]", R.fields[text("com_[]", counter)]) + to_chat(usr, text("[]", R.fields[text("com_[]", counter)])) + counter++ if (counter == 1) - usr << "No comment found" - usr << "\[Add comment\]" + to_chat(usr, "No comment found") + + to_chat(usr, "\[Add comment\]") + if(!read) - usr << "\red Unable to locate a data core entry for this person." + to_chat(usr, "\red Unable to locate a data core entry for this person.") + if (href_list["secrecordadd"]) if(hasHUD(usr,"security")) @@ -998,7 +1013,8 @@ sec_hud_set_security_status() if(!modified) - usr << "\red Unable to locate a data core entry for this person." + to_chat(usr, "\red Unable to locate a data core entry for this person.") + if (href_list["medrecord"]) if(hasHUD(usr,"medical")) @@ -1018,18 +1034,19 @@ for (var/datum/data/record/R in data_core.medical) if (R.fields["id"] == E.fields["id"]) if(hasHUD(usr,"medical")) - usr << "Name: [R.fields["name"]] Blood Type: [R.fields["b_type"]]" - usr << "DNA: [R.fields["b_dna"]]" - usr << "Minor Disabilities: [R.fields["mi_dis"]]" - usr << "Details: [R.fields["mi_dis_d"]]" - usr << "Major Disabilities: [R.fields["ma_dis"]]" - usr << "Details: [R.fields["ma_dis_d"]]" - usr << "Notes: [R.fields["notes"]]" - usr << "\[View Comment Log\]" + to_chat(usr, "Name: [R.fields["name"]] Blood Type: [R.fields["b_type"]]") + to_chat(usr, "DNA: [R.fields["b_dna"]]") + to_chat(usr, "Minor Disabilities: [R.fields["mi_dis"]]") + to_chat(usr, "Details: [R.fields["mi_dis_d"]]") + to_chat(usr, "Major Disabilities: [R.fields["ma_dis"]]") + to_chat(usr, "Details: [R.fields["ma_dis_d"]]") + to_chat(usr, "Notes: [R.fields["notes"]]") + to_chat(usr, "\[View Comment Log\]") read = 1 if(!read) - usr << "\red Unable to locate a data core entry for this person." + to_chat(usr, "\red Unable to locate a data core entry for this person.") + if (href_list["medrecordComment"]) if(hasHUD(usr,"medical")) @@ -1052,14 +1069,18 @@ read = 1 var/counter = 1 while(R.fields[text("com_[]", counter)]) - usr << text("[]", R.fields[text("com_[]", counter)]) + to_chat(usr, text("[]", R.fields[text("com_[]", counter)])) + counter++ if (counter == 1) - usr << "No comment found" - usr << "\[Add comment\]" + to_chat(usr, "No comment found") + + to_chat(usr, "\[Add comment\]") + if(!read) - usr << "\red Unable to locate a data core entry for this person." + to_chat(usr, "\red Unable to locate a data core entry for this person.") + if (href_list["medrecordadd"]) if(hasHUD(usr,"medical")) @@ -1213,7 +1234,8 @@ if(!. && error_msg && user) if(!fail_msg) fail_msg = "There is no exposed flesh or thin material [target_zone == "head" ? "on their head" : "on their body"] to inject into." - user << "[fail_msg]" + to_chat(user, "[fail_msg]") + /mob/living/carbon/human/proc/check_obscured_slots() var/list/obscured = list() @@ -1312,19 +1334,23 @@ if (prob(round(damage/10)*20)) germs++ if (germs == 100) - world << "Reached stage 1 in [ticks] ticks" + to_chat(world, "Reached stage 1 in [ticks] ticks") + if (germs > 100) if (prob(10)) damage++ germs++ if (germs == 1000) - world << "Reached stage 2 in [ticks] ticks" + to_chat(world, "Reached stage 2 in [ticks] ticks") + if (germs > 1000) damage++ germs++ if (germs == 2500) - world << "Reached stage 3 in [ticks] ticks" - world << "Mob took [tdamage] tox damage" + to_chat(world, "Reached stage 3 in [ticks] ticks") + + to_chat(world, "Mob took [tdamage] tox damage") + */ //returns 1 if made bloody, returns 0 otherwise @@ -1381,7 +1407,8 @@ msg ="Your movement jostles [O] in your [organ.name] painfully." if(3) msg ="[O] in your [organ.name] twists painfully as you move." - src << msg + to_chat(src, msg) + organ.take_damage(rand(1,3), 0, 0) if(!(organ.status & ORGAN_ROBOT)) //There is no blood in protheses. @@ -1407,18 +1434,24 @@ "You begin counting your pulse.") if(src.pulse) - usr << "\blue [self ? "You have a" : "[src] has a"] pulse! Counting..." + to_chat(usr, "\blue [self ? "You have a" : "[src] has a"] pulse! Counting...") + else - usr << "\red [src] has no pulse!" //it is REALLY UNLIKELY that a dead person would check his own pulse + to_chat(usr, "\red [src] has no pulse!")//it is REALLY UNLIKELY that a dead person would check his own pulse + + return - usr << "Don't move until counting is finished." + to_chat(usr, "Don't move until counting is finished.") + var/time = world.time sleep(60) if(usr.l_move_time >= time) //checks if our mob has moved during the sleep() - usr << "You moved while counting. Try again." + to_chat(usr, "You moved while counting. Try again.") + else - usr << "\blue [self ? "Your" : "[src]'s"] pulse is [src.get_pulse(GETPULSE_HAND)]." + to_chat(usr, "\blue [self ? "Your" : "[src]'s"] pulse is [src.get_pulse(GETPULSE_HAND)].") + /mob/living/carbon/human/proc/set_species(var/new_species, var/default_colour, var/delay_icon_update = 0) @@ -1526,26 +1559,30 @@ verbs -= /mob/living/carbon/human/proc/bloody_doodle if (src.gloves) - src << "Your [src.gloves] are getting in the way." + to_chat(src, "Your [src.gloves] are getting in the way.") + return var/turf/simulated/T = src.loc if (!istype(T)) //to prevent doodling out of mechs and lockers - src << "You cannot reach the floor." + to_chat(src, "You cannot reach the floor.") + return var/direction = input(src,"Which way?","Tile selection") as anything in list("Here","North","South","East","West") if (direction != "Here") T = get_step(T,text2dir(direction)) if (!istype(T)) - src << "You cannot doodle there." + to_chat(src, "You cannot doodle there.") + return var/num_doodles = 0 for (var/obj/effect/decal/cleanable/blood/writing/W in T) num_doodles++ if (num_doodles > 4) - src << "There is no space to write on!" + to_chat(src, "There is no space to write on!") + return var/max_length = bloody_hands * 30 //tweeter style @@ -1558,7 +1595,8 @@ if (length(message) > max_length) message += "-" - src << "You ran out of blood to write with!" + to_chat(src, "You ran out of blood to write with!") + var/obj/effect/decal/cleanable/blood/writing/W = new(T) W.message = message @@ -1571,7 +1609,8 @@ set desc = "Change the display on your monitor or the colour of your optics." if(incapacitated()) - src << "You cannot change your monitor or optical display in your current state." + to_chat(src, "You cannot change your monitor or optical display in your current state.") + return if(species.flags & ALL_RPARTS) //If they can have a fully cybernetic body... @@ -1609,7 +1648,8 @@ return if(stat || paralysis || stunned || weakened || lying || restrained() || buckled) - src << "You cannot leap in your current state." + to_chat(src, "You cannot leap in your current state.") + return var/list/choices = list() @@ -1628,7 +1668,8 @@ return if(stat || paralysis || stunned || weakened || lying || restrained() || buckled) - src << "You cannot leap in your current state." + to_chat(src, "You cannot leap in your current state.") + return last_special = world.time + 75 @@ -1643,7 +1684,8 @@ if(status_flags & LEAPING) status_flags &= ~LEAPING if(!src.Adjacent(T)) - src << "\red You miss!" + to_chat(src, "\red You miss!") + return T.Weaken(5) @@ -1656,7 +1698,8 @@ var/use_hand = "left" if(l_hand) if(r_hand) - src << "\red You need to have one hand free to grab someone." + to_chat(src, "\red You need to have one hand free to grab someone.") + return else use_hand = "right" @@ -1682,16 +1725,19 @@ return if(stat || paralysis || stunned || weakened || lying) - src << "\red You cannot do that in your current state." + to_chat(src, "\red You cannot do that in your current state.") + return var/obj/item/weapon/grab/G = locate() in src if(!G || !istype(G)) - src << "\red You are not grabbing anyone." + to_chat(src, "\red You are not grabbing anyone.") + return if(G.state < GRAB_AGGRESSIVE) - src << "\red You must have an aggressive grab to gut your prey!" + to_chat(src, "\red You must have an aggressive grab to gut your prey!") + return last_special = world.time + 50 @@ -1796,7 +1842,8 @@ for(var/obj/item/hand in handlist) if(prob(current_size * 5) && hand.w_class >= ((11-current_size)/2) && unEquip(hand)) step_towards(hand, src) - src << "\The [S] pulls \the [hand] from your grip!" + to_chat(src, "\The [S] pulls \the [hand] from your grip!") + apply_effect(current_size * 3, IRRADIATE) if(mob_negates_gravity()) return @@ -1849,26 +1896,31 @@ /mob/living/carbon/human/selfFeed(var/obj/item/weapon/reagent_containers/food/toEat, fullness) if(!check_has_mouth()) - src << "Where do you intend to put \the [toEat]? You don't have a mouth!" + to_chat(src, "Where do you intend to put \the [toEat]? You don't have a mouth!") + return 0 return ..() /mob/living/carbon/human/forceFed(var/obj/item/weapon/reagent_containers/food/toEat, mob/user, fullness) if(!check_has_mouth()) if(!((istype(toEat, /obj/item/weapon/reagent_containers/food/drinks) && (get_species() == "Machine")))) - user << "Where do you intend to put \the [toEat]? \The [src] doesn't have a mouth!" + to_chat(user, "Where do you intend to put \the [toEat]? \The [src] doesn't have a mouth!") + return 0 return ..() /mob/living/carbon/human/selfDrink(var/obj/item/weapon/reagent_containers/food/drinks/toDrink) if(!check_has_mouth()) if(!get_species() == "Machine") - src << "Where do you intend to put \the [src]? You don't have a mouth!" + to_chat(src, "Where do you intend to put \the [src]? You don't have a mouth!") + return 0 else - src << "You pour a bit of liquid from [toDrink] into your connection port." + to_chat(src, "You pour a bit of liquid from [toDrink] into your connection port.") + else - src << "You swallow a gulp of [toDrink]." + to_chat(src, "You swallow a gulp of [toDrink].") + return 1 /mob/living/carbon/human/can_track(mob/living/user) diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 5fb0e0e85bf..e24858cf552 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -1,10 +1,12 @@ /mob/living/carbon/human/attack_hand(mob/living/carbon/human/M as mob) if (istype(loc, /turf) && istype(loc.loc, /area/start)) - M << "No attacking people at spawn, you jackass." + to_chat(M, "No attacking people at spawn, you jackass.") + return if(frozen) - M << "\red Do not touch Admin-Frozen people." + to_chat(M, "\red Do not touch Admin-Frozen people.") + return var/mob/living/carbon/human/H = M @@ -13,7 +15,8 @@ if (H.hand) temp = H.organs_by_name["l_hand"] if(!temp || !temp.is_usable()) - H << "\red You can't use your hand." + to_chat(H, "\red You can't use your hand.") + return ..() @@ -70,16 +73,20 @@ add_logs(src, M, "shaked") return 1 if(!H.check_has_mouth()) - H << "You don't have a mouth, you cannot perform CPR!" + to_chat(H, "You don't have a mouth, you cannot perform CPR!") + return if(!check_has_mouth()) - H << "They don't have a mouth, you cannot perform CPR!" + to_chat(H, "They don't have a mouth, you cannot perform CPR!") + return if((M.head && (M.head.flags & HEADCOVERSMOUTH)) || (M.wear_mask && (M.wear_mask.flags & MASKCOVERSMOUTH) && !M.wear_mask.mask_adjusted)) - M << "Remove your mask!" + to_chat(M, "Remove your mask!") + return 0 if((head && (head.flags & HEADCOVERSMOUTH)) || (wear_mask && (wear_mask.flags & MASKCOVERSMOUTH) && !wear_mask.mask_adjusted)) - M << "Remove his mask!" + to_chat(M, "Remove his mask!") + return 0 M.visible_message("\The [M] is trying to perform CPR on \the [src]!", \ @@ -92,12 +99,15 @@ M.visible_message("\The [M] performs CPR on \the [src]!", \ "You perform CPR on \the [src].") - src << "You feel a breath of fresh air enter your lungs. It feels good." - M << "Repeat at least every 7 seconds." + to_chat(src, "You feel a breath of fresh air enter your lungs. It feels good.") + + to_chat(M, "Repeat at least every 7 seconds.") + add_logs(src, M, "CPRed") return 1 else - M << "You need to stay still while performing CPR!" + to_chat(M, "You need to stay still while performing CPR!") + if(I_GRAB) if(attacker_style && attacker_style.grab_act(H, src)) @@ -116,19 +126,24 @@ if(M.zone_sel && M.zone_sel.selecting == "head" && src != M) if(M.mind && M.mind.vampire && (M.mind in ticker.mode.vampires) && !M.mind.vampire.draining) if((head && (head.flags & HEADCOVERSMOUTH)) || (wear_mask && (wear_mask.flags & MASKCOVERSMOUTH))) - M << "Remove their mask!" + to_chat(M, "Remove their mask!") + return 0 if((M.head && (M.head.flags & HEADCOVERSMOUTH)) || (M.wear_mask && (M.wear_mask.flags & MASKCOVERSMOUTH))) - M << "Remove your mask!" + to_chat(M, "Remove your mask!") + return 0 if(mind && mind.vampire && (mind in ticker.mode.vampires)) - M << "Your fangs fail to pierce [src.name]'s cold flesh" + to_chat(M, "Your fangs fail to pierce [src.name]'s cold flesh") + return 0 if(SKELETON in mutations) - M << "There is no blood in a skeleton!" + to_chat(M, "There is no blood in a skeleton!") + return 0 if(issmall(src) && !ckey) //Monkeyized humans are okay, humanized monkeys are okey, monkeys are not. - M << "Blood from a monkey is useless!" + to_chat(M, "Blood from a monkey is useless!") + return 0 //we're good to suck the blood, blaah M.mind.vampire.handle_bloodsucking(src) diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 1b6d62c72a0..db8772c1334 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -154,7 +154,8 @@ if(candidates.len) var/obj/item/organ/external/O = pick(candidates) O.mutate() - src << "Something is not right with your [O.name]..." + to_chat(src, "Something is not right with your [O.name]...") + O.add_autopsy_data("Mutation", amount) return @@ -163,7 +164,8 @@ for(var/obj/item/organ/external/O in organs) if(O.status & ORGAN_MUTATED) O.unmutate() - src << "Your [O.name] is shaped normally again." + to_chat(src, "Your [O.name] is shaped normally again.") + return @@ -171,7 +173,8 @@ for(var/obj/item/organ/external/O in organs) if(O.status & ORGAN_MUTATED) O.unmutate() - src << "Your [O.name] is shaped normally again." + to_chat(src, "Your [O.name] is shaped normally again.") + // Defined here solely to take species flags into account without having to recast at mob/living level. diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index f3eb9ddcd7a..8ea0a6fc4e8 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -176,12 +176,15 @@ emp_act if(!istype(affecting)) return if(!(affecting.status & ORGAN_ROBOT)) - user << "\red That limb isn't robotic." + to_chat(user, "\red That limb isn't robotic.") + return if(affecting.sabotaged) - user << "\red [src]'s [affecting.name] is already sabotaged!" + to_chat(user, "\red [src]'s [affecting.name] is already sabotaged!") + else - user << "\red You sneakily slide the card into the dataport on [src]'s [affecting.name] and short out the safeties." + to_chat(user, "\red You sneakily slide the card into the dataport on [src]'s [affecting.name] and short out the safeties.") + affecting.sabotaged = 1 return 1 @@ -198,7 +201,8 @@ emp_act src.reagents.trans_to (newmeat, round ((src.reagents.total_volume) / 3, 1)) src.loc.add_blood(src) --src.meatleft - user << "\red You hack off a chunk of meat from [src.name]" + to_chat(user, "\red You hack off a chunk of meat from [src.name]") + if(!src.meatleft) src.attack_log += "\[[time_stamp()]\] Was chopped up into meat by [key_name(user)]" user.attack_log += "\[[time_stamp()]\] Chopped up [key_name(src)] into meat" @@ -212,7 +216,8 @@ emp_act var/obj/item/organ/external/affecting = get_organ(ran_zone(user.zone_sel.selecting)) if(!affecting || affecting.is_stump() || (affecting.status & ORGAN_DESTROYED)) - user << "They are missing that limb!" + to_chat(user, "They are missing that limb!") + return 1 var/hit_area = affecting.name diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index e4555a3c500..70effa20c9b 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -7,13 +7,16 @@ var/obj/item/I = H.get_active_hand() var/obj/item/weapon/storage/S = H.get_inactive_hand() if(!I) - H << "You are not holding anything to equip." + to_chat(H, "You are not holding anything to equip.") + return if(istype(I, /obj/item/clothing/head/helmet/space/rig)) // If the item to be equipped is a rigid suit helmet var/obj/item/clothing/head/helmet/space/rig/C = I if(C.rig_restrict_helmet) - src << "\red You must fasten the helmet to a hardsuit first. (Target the head and use on a hardsuit)" // Stop eva helms equipping. + to_chat(src, "\red You must fasten the helmet to a hardsuit first. (Target the head and use on a hardsuit)")// Stop eva helms equipping. + + return 0 if(H.equip_to_appropriate_slot(I)) @@ -34,7 +37,8 @@ if(istype(S, /obj/item/weapon/storage) && S.can_be_inserted(I,1)) S.handle_item_insertion(I) else - H << "\red You are unable to equip that." + to_chat(H, "\red You are unable to equip that.") + /mob/living/carbon/human/proc/equip_in_one_of_slots(obj/item/W, list/slots, del_on_fail = 1) @@ -301,7 +305,8 @@ var/obj/item/clothing/under/uniform = src.w_uniform uniform.attackby(W,src) else - src << "You are trying to equip this item to an unsupported inventory slot. Report this to a coder!" + to_chat(src, "You are trying to equip this item to an unsupported inventory slot. Report this to a coder!") + return /mob/living/carbon/human/put_in_hands(obj/item/W) @@ -415,7 +420,8 @@ //testing("[M] TOO FAT TO WEAR [src]!") if(!(I.flags & ONESIZEFITSALL)) if(!disable_warning) - src << "You're too fat to wear the [I]." + to_chat(src, "You're too fat to wear the [I].") + return 0 switch(slot) @@ -462,7 +468,8 @@ return 0 if(!w_uniform) if(!disable_warning) - src << "You need a jumpsuit before you can attach this [name]." + to_chat(src, "You need a jumpsuit before you can attach this [name].") + return 0 if(!(I.slot_flags & SLOT_BELT)) return @@ -506,7 +513,8 @@ return 0 if(!w_uniform) if(!disable_warning) - src << "You need a jumpsuit before you can attach this [name]." + to_chat(src, "You need a jumpsuit before you can attach this [name].") + return 0 if(!(I.slot_flags & SLOT_ID)) return 0 @@ -516,7 +524,8 @@ return 0 if(!w_uniform) if(!disable_warning) - src << "You need a jumpsuit before you can attach this [name]." + to_chat(src, "You need a jumpsuit before you can attach this [name].") + return 0 if(!(I.slot_flags & SLOT_PDA)) return 0 @@ -528,7 +537,8 @@ return 0 if(!w_uniform) if(!disable_warning) - src << "You need a jumpsuit before you can attach this [name]." + to_chat(src, "You need a jumpsuit before you can attach this [name].") + return 0 if(I.slot_flags & SLOT_DENYPOCKET) return @@ -541,7 +551,8 @@ return 0 if(!w_uniform) if(!disable_warning) - src << "You need a jumpsuit before you can attach this [name]." + to_chat(src, "You need a jumpsuit before you can attach this [name].") + return 0 if(I.slot_flags & SLOT_DENYPOCKET) return 0 @@ -555,15 +566,18 @@ return 0 if(!wear_suit) if(!disable_warning) - src << "You need a suit before you can attach this [name]." + to_chat(src, "You need a suit before you can attach this [name].") + return 0 if(!wear_suit.allowed) if(!disable_warning) - src << "You somehow have a suit with no defined allowed items for suit storage, stop that." + to_chat(src, "You somehow have a suit with no defined allowed items for suit storage, stop that.") + return 0 if(I.w_class > 4) if(!disable_warning) - src << "The [name] is too big to attach." + to_chat(src, "The [name] is too big to attach.") + return 0 if(istype(I, /obj/item/device/pda) || istype(I, /obj/item/weapon/pen) || is_type_in_list(I, wear_suit.allowed)) return 1 @@ -589,12 +603,14 @@ if(slot_tie) if(!w_uniform) if(!disable_warning) - src << "You need a jumpsuit before you can attach this [name]." + to_chat(src, "You need a jumpsuit before you can attach this [name].") + return 0 var/obj/item/clothing/under/uniform = w_uniform if(uniform.accessories.len && !uniform.can_attach_accessory(src)) if(!disable_warning) - src << "You already have an accessory of this type attached to your [uniform]." + to_chat(src, "You already have an accessory of this type attached to your [uniform].") + return 0 if(!(I.slot_flags & SLOT_TIE)) return 0 diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index db69fb5b3c4..7db1d26a8fc 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -187,7 +187,8 @@ radiation -= 0.1 reagents.add_reagent("radium", rads/10) if( prob(10) ) - src << "You feel relaxed." + to_chat(src, "You feel relaxed.") + return if (radiation > 100) @@ -195,7 +196,8 @@ if(!(species.flags & RAD_ABSORB)) Weaken(10) if(!lying) - src << "You feel weak." + to_chat(src, "You feel weak.") + emote("collapse") if (radiation < 0) @@ -229,7 +231,8 @@ radiation -= 5 Weaken(3) if(!lying) - src << "You feel weak." + to_chat(src, "You feel weak.") + emote("collapse") updatehealth() @@ -238,7 +241,8 @@ adjustToxLoss(3) damage = 3 if(prob(1)) - src << "You mutate!" + to_chat(src, "You mutate!") + randmutb(src) domutcheck(src,null) emote("gasp") @@ -249,7 +253,8 @@ adjustToxLoss(5) damage = 5 if(prob(1)) - src << "You mutate!" + to_chat(src, "You mutate!") + randmutb(src) domutcheck(src,null) emote("gasp") @@ -392,7 +397,8 @@ return var/loc_temp = get_temperature(environment) - //world << "Loc temp: [loc_temp] - Body temp: [bodytemperature] - Fireloss: [getFireLoss()] - Thermal protection: [get_thermal_protection()] - Fire protection: [thermal_protection + add_fire_protection(loc_temp)] - Heat capacity: [environment_heat_capacity] - Location: [loc] - src: [src]" +// to_chat(world, "Loc temp: [loc_temp] - Body temp: [bodytemperature] - Fireloss: [getFireLoss()] - Thermal protection: [get_thermal_protection()] - Fire protection: [thermal_protection + add_fire_protection(loc_temp)] - Heat capacity: [environment_heat_capacity] - Location: [loc] - src: [src]") + //Body temperature is adjusted in two steps. Firstly your body tries to stabilize itself a bit. if(stat != 2) @@ -698,7 +704,8 @@ if(species.flags & CAN_BE_FAT) if(FAT in mutations) if(overeatduration < 100) - src << "You feel fit again!" + to_chat(src, "You feel fit again!") + mutations.Remove(FAT) update_mutantrace(0) update_mutations(0) @@ -706,7 +713,8 @@ update_inv_wear_suit() else if(overeatduration > 500) - src << "You suddenly feel blubbery!" + to_chat(src, "You suddenly feel blubbery!") + mutations.Add(FAT) update_mutantrace(0) update_mutations(0) @@ -888,17 +896,20 @@ isRemoteObserve = 1 if(remoteview_target.stat != CONSCIOUS) - src << "Your psy-connection grows too faint to maintain!" + to_chat(src, "Your psy-connection grows too faint to maintain!") + isRemoteObserve = 0 if(PSY_RESIST in remoteview_target.mutations) - src << "Your mind is shut out!" + to_chat(src, "Your mind is shut out!") + isRemoteObserve = 0 // Not on the station or mining? var/turf/temp_turf = get_turf(remoteview_target) if(!temp_turf in config.contact_levels) - src << "Your psy-connection grows too faint to maintain!" + to_chat(src, "Your psy-connection grows too faint to maintain!") + isRemoteObserve = 0 if(remote_view) @@ -969,7 +980,8 @@ return if(shock_stage == 10) - src << ""+pick("It hurts so much!", "You really need some painkillers..", "Dear god, the pain!") + to_chat(src, ""+pick("It hurts so much!", "You really need some painkillers..", "Dear god, the pain!")) + if(shock_stage >= 30) if(shock_stage == 30) custom_emote(1,"is having trouble keeping their eyes open.") @@ -977,22 +989,26 @@ stuttering = max(stuttering, 5) if(shock_stage == 40) - src << ""+pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!") + to_chat(src, ""+pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!")) + if(shock_stage >=60) if(shock_stage == 60) custom_emote(1,"falls limp.") if (prob(2)) - src << ""+pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!") + to_chat(src, ""+pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!")) + Weaken(20) if(shock_stage >= 80) if (prob(5)) - src << ""+pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!") + to_chat(src, ""+pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!")) + Weaken(20) if(shock_stage >= 120) if (prob(2)) - src << ""+pick("You black out!", "You feel like you could die any moment now.", "You're about to lose consciousness.") + to_chat(src, ""+pick("You black out!", "You feel like you could die any moment now.", "You're about to lose consciousness.")) + Paralyse(5) if(shock_stage == 150) @@ -1082,7 +1098,8 @@ return if(H.species && H.species.flags & NO_BREATHE) return //no puking if you can't smell! - H << "You smell something foul..." + to_chat(H, "You smell something foul...") + H.fakevomit() /mob/living/carbon/human/proc/handle_heartbeat() @@ -1102,7 +1119,9 @@ if(heartbeat >= rate) heartbeat = 0 - src << sound('sound/effects/electheart.ogg',0,0,0,30) //Credit to GhostHack (www.ghosthack.de) for sound. + to_chat(src, sound('sound/effects/electheart.ogg',0,0,0,30))//Credit to GhostHack (www.ghosthack.de) for sound. + + else heartbeat++ return @@ -1120,9 +1139,11 @@ if(heartbeat >= rate) heartbeat = 0 if(H.status & ORGAN_ASSISTED) - src << sound('sound/effects/pacemakebeat.ogg',0,0,0,50) + to_chat(src, sound('sound/effects/pacemakebeat.ogg',0,0,0,50)) + else - src << sound('sound/effects/singlebeat.ogg',0,0,0,50) + to_chat(src, sound('sound/effects/singlebeat.ogg',0,0,0,50)) + else heartbeat++ diff --git a/code/modules/mob/living/carbon/human/login.dm b/code/modules/mob/living/carbon/human/login.dm index ee5034a23f2..8d744a9728e 100644 --- a/code/modules/mob/living/carbon/human/login.dm +++ b/code/modules/mob/living/carbon/human/login.dm @@ -2,7 +2,8 @@ ..() if(species && species.ventcrawler) - src << "You can ventcrawl! Use alt+click on vents to quickly travel about the station." + to_chat(src, "You can ventcrawl! Use alt+click on vents to quickly travel about the station.") + update_pipe_vision() update_hud() return diff --git a/code/modules/mob/living/carbon/human/species/apollo.dm b/code/modules/mob/living/carbon/human/species/apollo.dm index a5e92e951d9..7c2302a356a 100644 --- a/code/modules/mob/living/carbon/human/species/apollo.dm +++ b/code/modules/mob/living/carbon/human/species/apollo.dm @@ -50,8 +50,10 @@ /datum/species/wryn/handle_death(var/mob/living/carbon/human/H) for(var/mob/living/carbon/C in living_mob_list) if(C.get_int_organ(/obj/item/organ/internal/wryn/hivenode)) - C << "Your antennae tingle as you are overcome with pain..." - C << "It feels like part of you has died." + to_chat(C, "Your antennae tingle as you are overcome with pain...") + + to_chat(C, "It feels like part of you has died.") + /datum/species/wryn/handle_attack_hand(var/mob/living/carbon/human/H, var/mob/living/carbon/human/M) if(M.a_intent == I_HARM) @@ -61,16 +63,20 @@ var/turf/p_loc_m = H.loc M.visible_message("[M] begins to violently pull off [H]'s antennae.") - H << "[M] grips your antennae and starts violently pulling!" + to_chat(H, "[M] grips your antennae and starts violently pulling!") + do_after(H, 250, target = src) if(p_loc == M.loc && p_loc_m == H.loc) var/obj/item/organ/internal/wryn/hivenode/node = new /obj/item/organ/internal/wryn/hivenode H.remove_language("Wryn Hivemind") node.remove(H) node.loc = M.loc - M << "You hear a loud crunch as you mercilessly pull off [H]'s antennae." - H << "You hear a loud crunch as your antennae is ripped off your head by [M]." - H << "It's so quiet..." + to_chat(M, "You hear a loud crunch as you mercilessly pull off [H]'s antennae.") + + to_chat(H, "You hear a loud crunch as your antennae is ripped off your head by [M].") + + to_chat(H, "It's so quiet...") + H.h_style = "Bald" H.update_hair() diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm index 6f95a8696ce..5a56b6b508e 100644 --- a/code/modules/mob/living/carbon/human/species/plasmaman.dm +++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm @@ -112,7 +112,8 @@ H.equip_or_collect(new suit(H), slot_wear_suit) H.equip_or_collect(new helm(H), slot_head) H.equip_or_collect(new/obj/item/weapon/tank/plasma/plasmaman(H), tank_slot) // Bigger plasma tank from Raggy. - H << "You are now running on plasma internals from the [H.s_store] in your [tank_slot_name]. You must breathe plasma in order to survive, and are extremely flammable." + to_chat(H, "You are now running on plasma internals from the [H.s_store] in your [tank_slot_name]. You must breathe plasma in order to survive, and are extremely flammable.") + H.internal = H.get_item_by_slot(tank_slot) if (H.internals) H.internals.icon_state = "internal1" @@ -191,10 +192,12 @@ return 1 //godmode if(breath.temperature < cold_level_1) if(prob(20)) - src << "\red You feel your face freezing and an icicle forming in your lungs!" + to_chat(src, "\red You feel your face freezing and an icicle forming in your lungs!") + else if(breath.temperature > heat_level_1) if(prob(20)) - src << "\red You feel your face burning and a searing heat in your lungs!" + to_chat(src, "\red You feel your face burning and a searing heat in your lungs!") + switch(breath.temperature) if(-INFINITY to cold_level_3) @@ -222,7 +225,8 @@ H.fire_alert = max(H.fire_alert, 2) if(!istype(H.wear_suit, /obj/item/clothing/suit/space/eva/plasmaman) || !istype(H.head, /obj/item/clothing/head/helmet/space/eva/plasmaman)) - H << "Your body reacts with the atmosphere and bursts into flame!" + to_chat(H, "Your body reacts with the atmosphere and bursts into flame!") + H.adjust_fire_stacks(0.5) H.IgniteMob() diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index f2cf58fe29f..1c7d2b258b2 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -288,10 +288,12 @@ if(H.status_flags & GODMODE) return 1 //godmode if(breath.temperature < cold_level_1) if(prob(20)) - H << "\red You feel your face freezing and an icicle forming in your lungs!" + to_chat(H, "\red You feel your face freezing and an icicle forming in your lungs!") + else if(breath.temperature > heat_level_1) if(prob(20)) - H << "\red You feel your face burning and a searing heat in your lungs!" + to_chat(H, "\red You feel your face burning and a searing heat in your lungs!") + diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 8e0b9f5d2b7..633df4a8b98 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -275,7 +275,8 @@ H.equip_or_collect(new /obj/item/weapon/tank/nitrogen(H), slot_l_hand) else H.equip_or_collect(new /obj/item/weapon/tank/emergency_oxygen/vox(H), slot_l_hand) - H << "You are now running on nitrogen internals from the [H.l_hand] in your hand. Your species finds oxygen toxic, so you must breathe nitrogen only." + to_chat(H, "You are now running on nitrogen internals from the [H.l_hand] in your hand. Your species finds oxygen toxic, so you must breathe nitrogen only.") + H.internal = H.l_hand if (H.internals) H.internals.icon_state = "internal1" @@ -443,17 +444,20 @@ var/datum/species/slime/S = all_species[get_species()] if(!istype(S)) if(!silent) - src << "You're not a slime person!" + to_chat(src, "You're not a slime person!") + return if(src in S.recolor_list) S.recolor_list -= src if(!silent) - src << "You adjust your internal chemistry to filter out pigments from things you consume." + to_chat(src, "You adjust your internal chemistry to filter out pigments from things you consume.") + else S.recolor_list += src if(!silent) - src << "You adjust your internal chemistry to permit pigments in chemicals you consume to tint you." + to_chat(src, "You adjust your internal chemistry to permit pigments in chemicals you consume to tint you.") + /mob/living/carbon/human/verb/toggle_recolor_verb() set category = "IC" @@ -473,11 +477,13 @@ #define SLIMEPERSON_REGROWTHDELAY 450 // 45 seconds if(stat || paralysis || stunned) - src << "You cannot regenerate missing limbs in your current state." + to_chat(src, "You cannot regenerate missing limbs in your current state.") + return if(nutrition < SLIMEPERSON_MINHUNGER) - src << "You're too hungry to regenerate a limb!" + to_chat(src, "You're too hungry to regenerate a limb!") + return var/list/missing_limbs = list() @@ -493,7 +499,8 @@ missing_limbs[initial(limb.name)] = l if(!missing_limbs.len) - src << "You're not missing any limbs!" + to_chat(src, "You're not missing any limbs!") + return var/limb_select = input(src, "Choose a limb to regrow", "Limb Regrowth") as null|anything in missing_limbs @@ -502,11 +509,13 @@ visible_message("[src] begins to hold still and concentrate on their missing [limb_select]...", "You begin to focus on regrowing your missing [limb_select]... (This will take [round(SLIMEPERSON_REGROWTHDELAY/10)] seconds, and you must hold still.)") if(do_after(src, SLIMEPERSON_REGROWTHDELAY, needhand=0, target = src)) if(stat || paralysis || stunned) - src << "You cannot regenerate missing limbs in your current state." + to_chat(src, "You cannot regenerate missing limbs in your current state.") + return if(nutrition < SLIMEPERSON_MINHUNGER) - src << "You're too hungry to regenerate a limb!" + to_chat(src, "You're too hungry to regenerate a limb!") + return var/obj/item/organ/external/O = organs_by_name[chosen_limb] @@ -515,10 +524,12 @@ var/stored_burn = 0 if(istype(O)) if(!O.is_stump()) - src << "Your limb has already been replaced in some way!" + to_chat(src, "Your limb has already been replaced in some way!") + return else - src << "You distribute the damaged tissue around your body, out of the way of your new pseudopod!" + to_chat(src, "You distribute the damaged tissue around your body, out of the way of your new pseudopod!") + var/obj/item/organ/external/doomedStump = O stored_brute = doomedStump.brute_dam stored_burn = doomedStump.burn_dam @@ -529,7 +540,8 @@ // Parent check var/obj/item/organ/external/potential_parent = organs_by_name[initial(limb_path.parent_organ)] if(!istype(potential_parent) || potential_parent.is_stump()) - src << "You've lost the organ that you've been growing your new part on!" + to_chat(src, "You've lost the organ that you've been growing your new part on!") + return // No rayman for you // Grah this line will leave a "not used" warning, in spite of the fact that the new() proc WILL do the thing. // Bothersome. @@ -543,7 +555,8 @@ nutrition -= SLIMEPERSON_HUNGERCOST visible_message("[src] finishes regrowing their missing [new_limb]!", "You finish regrowing your [limb_select]") else - src << "You need to hold still in order to regrow a limb!" + to_chat(src, "You need to hold still in order to regrow a limb!") + return #undef SLIMEPERSON_HUNGERCOST diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 8e574fc76d4..e62ea67602b 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -642,7 +642,8 @@ var/global/list/damage_icon_parts = list() if(w_uniform.flags&ONESIZEFITSALL) standing.icon = 'icons/mob/uniform_fat.dmi' else - src << "\red You burst out of \the [w_uniform]!" + to_chat(src, "\red You burst out of \the [w_uniform]!") + unEquip(w_uniform) return else @@ -857,7 +858,8 @@ var/global/list/damage_icon_parts = list() if(wear_suit.flags&ONESIZEFITSALL) standing = image("icon" = 'icons/mob/suit_fat.dmi', "icon_state" = "[wear_suit.icon_state]") else - src << "\red You burst out of \the [wear_suit]!" + to_chat(src, "\red You burst out of \the [wear_suit]!") + unEquip(wear_suit) return else diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 48d0c320145..fc12a861daf 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -278,7 +278,8 @@ if(staminaloss) var/total_health = (health - staminaloss) if(total_health <= config.health_threshold_softcrit && !stat) - src << "You're too exhausted to keep going..." + to_chat(src, "You're too exhausted to keep going...") + Weaken(5) setStaminaLoss(health - 2) return diff --git a/code/modules/mob/living/carbon/slime/emote.dm b/code/modules/mob/living/carbon/slime/emote.dm index dcc0b066487..b63afe0b073 100644 --- a/code/modules/mob/living/carbon/slime/emote.dm +++ b/code/modules/mob/living/carbon/slime/emote.dm @@ -13,7 +13,8 @@ return if (src.client) if (client.prefs.muted & MUTE_IC) - src << "\red You cannot send IC messages (muted)." + to_chat(src, "\red You cannot send IC messages (muted).") + return if (src.client.handle_spam_prevention(message,MUTE_IC)) return @@ -58,10 +59,12 @@ m_type = 1 if ("help") //This is an exception - src << "Help for slime emotes. You can use these emotes with say \"*emote\":\n\nbounce, custom, jiggle, light, moan, shiver, sway, twitch, vibrate" + to_chat(src, "Help for slime emotes. You can use these emotes with say \"*emote\":\n\nbounce, custom, jiggle, light, moan, shiver, sway, twitch, vibrate") + else - src << "\blue Unusable emote '[act]'. Say *help for a list." + to_chat(src, "\blue Unusable emote '[act]'. Say *help for a list.") + if ((message && src.stat == 0)) if (m_type & 1) for(var/mob/O in viewers(src, null)) diff --git a/code/modules/mob/living/carbon/slime/examine.dm b/code/modules/mob/living/carbon/slime/examine.dm index 826fa93c22e..9b1ff32b05f 100644 --- a/code/modules/mob/living/carbon/slime/examine.dm +++ b/code/modules/mob/living/carbon/slime/examine.dm @@ -41,4 +41,5 @@ msg += "" msg += "*---------*" - user << msg \ No newline at end of file + to_chat(user, msg) + diff --git a/code/modules/mob/living/carbon/slime/powers.dm b/code/modules/mob/living/carbon/slime/powers.dm index 494bb6eb6df..4c17c2f3f20 100644 --- a/code/modules/mob/living/carbon/slime/powers.dm +++ b/code/modules/mob/living/carbon/slime/powers.dm @@ -6,7 +6,8 @@ return if(stat) - src << "I must be conscious to do this..." + to_chat(src, "I must be conscious to do this...") + return var/list/choices = list() @@ -25,20 +26,27 @@ for(var/mob/living/carbon/slime/met in view()) if(met.Victim == M && met != src) - src << "The [met.name] is already feeding on this subject..." + to_chat(src, "The [met.name] is already feeding on this subject...") + return - src << "\blue I have latched onto the subject and begun feeding..." - M << "\red The [src.name] has latched onto your head!" + to_chat(src, "\blue I have latched onto the subject and begun feeding...") + + to_chat(M, "\red The [src.name] has latched onto your head!") + Feedon(M) else - src << "This subject does not have a strong enough life energy..." + to_chat(src, "This subject does not have a strong enough life energy...") + else - src << "This subject does not have an edible life energy..." + to_chat(src, "This subject does not have an edible life energy...") + else - src << "I must not feed on my brothers..." + to_chat(src, "I must not feed on my brothers...") + else - src << "This subject does not have an edible life energy..." + to_chat(src, "This subject does not have an edible life energy...") + @@ -61,13 +69,13 @@ loc = M.loc if(prob(15) && M.client && istype(M, /mob/living/carbon)) - M << "[pick("You can feel your body becoming weak!", \ + to_chat(M, "[pick("You can feel your body becoming weak!", \ "You feel like you're about to die!", \ "You feel every part of your body screaming in agony!", \ "A low, rolling pain passes through your body!", \ "Your body feels as if it's falling apart!", \ "You feel extremely weak!", \ - "A sharp, deep pain bathes every inch of your body!")]" + "A sharp, deep pain bathes every inch of your body!")]") if(istype(M, /mob/living/carbon)) Victim.adjustCloneLoss(rand(5,6)) @@ -83,10 +91,10 @@ else if(prob(25)) - src << "[pick("This subject is incompatable", \ + to_chat(src, "[pick("This subject is incompatable", \ "This subject does not have a life energy", "This subject is empty", \ "I am not satisified", "I can not feed from this subject", \ - "I do not feel nourished", "This subject is not food")]..." + "I do not feel nourished", "This subject is not food")]...") if(fed_succesfully) //I have no idea why this is not in handle_nutrition() @@ -145,19 +153,26 @@ if(prob(85)) rabid = 1 // UUUNNBGHHHH GONNA EAT JUUUUUU - if(client) src << "This subject does not have a strong enough life energy anymore..." + if(client) + to_chat(src, "This subject does not have a strong enough life energy anymore...") + else M.canmove = 1 + if(client) + to_chat(src, "I have stopped feeding...") - if(client) src << "I have stopped feeding..." else - if(client) src << "I have stopped feeding..." + if(client) + to_chat(src, "I have stopped feeding...") + Victim = null /mob/living/carbon/slime/proc/Feedstop() if(Victim) - if(Victim.client) Victim << "[src] has let go of your head!" + if(Victim.client) + to_chat(Victim, "[src] has let go of your head!") + Victim = null /mob/living/carbon/slime/proc/UpdateFeed(var/mob/M) @@ -171,7 +186,8 @@ set desc = "This will let you evolve from baby to adult slime." if(stat) - src << "I must be conscious to do this..." + to_chat(src, "I must be conscious to do this...") + return if(!is_adult) if(amount_grown >= 10) @@ -181,22 +197,26 @@ regenerate_icons() name = text("[colour] [is_adult ? "adult" : "baby"] slime ([number])") else - src << "I am not ready to evolve yet..." + to_chat(src, "I am not ready to evolve yet...") + else - src << "I have already evolved..." + to_chat(src, "I have already evolved...") + /mob/living/carbon/slime/verb/Reproduce() set category = "Slime" set desc = "This will make you split into four Slimes." if(stat) - src << "I must be conscious to do this..." + to_chat(src, "I must be conscious to do this...") + return if(is_adult) if(amount_grown >= 10) if(stat) - src << "I must be conscious to do this..." + to_chat(src, "I must be conscious to do this...") + return var/list/babies = list() @@ -223,6 +243,8 @@ new_slime.key = src.key qdel(src) else - src << "I am not ready to reproduce yet..." + to_chat(src, "I am not ready to reproduce yet...") + else - src << "I am not old enough to reproduce yet..." \ No newline at end of file + to_chat(src, "I am not old enough to reproduce yet...") + diff --git a/code/modules/mob/living/carbon/slime/slime.dm b/code/modules/mob/living/carbon/slime/slime.dm index e2a7da1ae5e..223f924b63a 100644 --- a/code/modules/mob/living/carbon/slime/slime.dm +++ b/code/modules/mob/living/carbon/slime/slime.dm @@ -232,7 +232,8 @@ /mob/living/carbon/slime/attack_slime(mob/living/carbon/slime/M as mob) if (!ticker) - M << "You cannot attack people before the game has started." + to_chat(M, "You cannot attack people before the game has started.") + return if (Victim) return // can't attack while eating! @@ -293,11 +294,13 @@ /mob/living/carbon/slime/attack_hand(mob/living/carbon/human/M as mob) if (!ticker) - M << "You cannot attack people before the game has started." + to_chat(M, "You cannot attack people before the game has started.") + return if (istype(loc, /turf) && istype(loc.loc, /area/start)) - M << "No attacking people at spawn, you jackass." + to_chat(M, "No attacking people at spawn, you jackass.") + return ..() @@ -371,7 +374,8 @@ visible_message("[src] has been touched with the stun gloves by [M]!") return else - M << "\red Not enough charge! " + to_chat(M, "\red Not enough charge! ") + return */ @@ -419,11 +423,13 @@ /mob/living/carbon/slime/attack_alien(mob/living/carbon/alien/humanoid/M as mob) if (!ticker) - M << "You cannot attack people before the game has started." + to_chat(M, "You cannot attack people before the game has started.") + return if (istype(loc, /turf) && istype(loc.loc, /area/start)) - M << "No attacking people at spawn, you jackass." + to_chat(M, "No attacking people at spawn, you jackass.") + return switch(M.a_intent) @@ -503,14 +509,16 @@ ++Friends[user] else Friends[user] = 1 - user << "You feed the slime the plasma. It chirps happily." + to_chat(user, "You feed the slime the plasma. It chirps happily.") + var/obj/item/stack/sheet/mineral/plasma/S = W S.use(1) return else if(W.force > 0) attacked += 10 if(prob(25)) - user << "[W] passes right through [src]!" + to_chat(user, "[W] passes right through [src]!") + return if(Discipline && prob(50)) // wow, buddy, why am I getting attacked?? Discipline = 0 @@ -594,5 +602,6 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75 /mob/living/carbon/slime/forceFed(var/obj/item/weapon/reagent_containers/food/toEat, mob/user, fullness) if(istype(toEat, /obj/item/weapon/reagent_containers/food/drinks)) return 1 - user << "This creature does not seem to have a mouth!" + to_chat(user, "This creature does not seem to have a mouth!") + return 0 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/superheroes.dm b/code/modules/mob/living/carbon/superheroes.dm index f3f5fe13006..b96fe011f6b 100644 --- a/code/modules/mob/living/carbon/superheroes.dm +++ b/code/modules/mob/living/carbon/superheroes.dm @@ -52,7 +52,8 @@ H.equip_to_slot_or_del(W, slot_wear_id) H.regenerate_icons() - H << desc + to_chat(H, desc) + /datum/superheroes/owlman name = "Owlman" @@ -149,64 +150,87 @@ /obj/effect/proc_holder/spell/targeted/recruit/cast(list/targets) for(var/mob/living/carbon/human/target in targets) if(ticker.mode.greyshirts.len >= 3) - usr << "You have already recruited the maximum number of henchmen." + to_chat(usr, "You have already recruited the maximum number of henchmen.") + if(!in_range(usr, target)) - usr << "You need to be closer to enthrall [target]." + to_chat(usr, "You need to be closer to enthrall [target].") + charge_counter = charge_max return if(!target.ckey) - usr << "The target has no mind." + to_chat(usr, "The target has no mind.") + charge_counter = charge_max return if(target.stat) - usr << "The target must be conscious." + to_chat(usr, "The target must be conscious.") + charge_counter = charge_max return if(!ishuman(target)) - usr << "You can only recruit humans." + to_chat(usr, "You can only recruit humans.") + charge_counter = charge_max return if(target.mind.assigned_role != "Civilian") - usr << "You can only recruit Civilians." + to_chat(usr, "You can only recruit Civilians.") + if(recruiting) - usr << "You are already recruiting!" + to_chat(usr, "You are already recruiting!") + charge_counter = charge_max return recruiting = 1 - usr << "This target is valid. You begin the recruiting process." - target << "[usr] focuses in concentration. Your head begins to ache." + to_chat(usr, "This target is valid. You begin the recruiting process.") + + to_chat(target, "[usr] focuses in concentration. Your head begins to ache.") + for(var/progress = 0, progress <= 3, progress++) switch(progress) if(1) - usr << "You begin by introducing yourself and explaining what you're about." + to_chat(usr, "You begin by introducing yourself and explaining what you're about.") + usr.visible_message("[usr]'s introduces himself and explains his plans.") if(2) - usr << "You begin the recruitment of [target]." + to_chat(usr, "You begin the recruitment of [target].") + usr.visible_message("[usr] leans over towards [target], whispering excitedly as he gives a speech.") - target << "You feel yourself agreeing with [usr], and a surge of loyalty begins building." + to_chat(target, "You feel yourself agreeing with [usr], and a surge of loyalty begins building.") + target.Weaken(12) sleep(20) if(isloyal(target)) - usr << "They are enslaved by Nanotrasen. You feel their interest in your cause wane and disappear." + to_chat(usr, "They are enslaved by Nanotrasen. You feel their interest in your cause wane and disappear.") + usr.visible_message("[usr] stops talking for a moment, then moves back away from [target].") - target << "Your loyalty implant activates and a sharp pain reminds you of your loyalties to Nanotrasen." + to_chat(target, "Your loyalty implant activates and a sharp pain reminds you of your loyalties to Nanotrasen.") + return if(3) - usr << "You begin filling out the application form with [target]." + to_chat(usr, "You begin filling out the application form with [target].") + usr.visible_message("[usr] pulls out a pen and paper and begins filling an application form with [target].") - target << "You are being convinced by [usr] to fill out an application form to become a henchman." //Ow the edge + to_chat(target, "You are being convinced by [usr] to fill out an application form to become a henchman.")//Ow the edge + + if(!do_mob(usr, target, 100)) //around 30 seconds total for enthralling, 45 for someone with a loyalty implant - usr << "The enrollment process has been interrupted - you have lost the attention of [target]." - target << "You move away and are no longer under the charm of [usr]. The application form is null and void." + to_chat(usr, "The enrollment process has been interrupted - you have lost the attention of [target].") + + to_chat(target, "You move away and are no longer under the charm of [usr]. The application form is null and void.") + recruiting = 0 return recruiting = 0 - usr << "You have recruited [target] as your henchman!" - target << "You have decided to enroll as a henchman for [usr]. You are now part of the feared 'Greyshirts'." - target << "You must follow the orders of [usr], and help him succeed in his dastardly schemes." - target << "You may not harm other Greyshirt or [usr]. However, you do not need to obey other Greyshirts." + to_chat(usr, "You have recruited [target] as your henchman!") + + to_chat(target, "You have decided to enroll as a henchman for [usr]. You are now part of the feared 'Greyshirts'.") + + to_chat(target, "You must follow the orders of [usr], and help him succeed in his dastardly schemes.") + + to_chat(target, "You may not harm other Greyshirt or [usr]. However, you do not need to obey other Greyshirts.") + ticker.mode.greyshirts += target.mind target.set_species("Human") target.h_style = "Bald" diff --git a/code/modules/mob/living/default_language.dm b/code/modules/mob/living/default_language.dm index b0de6465aff..154b64611c9 100644 --- a/code/modules/mob/living/default_language.dm +++ b/code/modules/mob/living/default_language.dm @@ -6,9 +6,11 @@ set category = "IC" if(language) - src << "You will now speak [language] if you do not specify a language when speaking." + to_chat(src, "You will now speak [language] if you do not specify a language when speaking.") + else - src << "You will now speak whatever your standard default language is if you do not specify one when speaking." + to_chat(src, "You will now speak whatever your standard default language is if you do not specify one when speaking.") + default_language = language // Silicons can't neccessarily speak everything in their languages list @@ -20,6 +22,8 @@ set category = "IC" if(default_language) - src << "You are currently speaking [default_language] by default." + to_chat(src, "You are currently speaking [default_language] by default.") + else - src << "Your current default language is your species or mob type default." + to_chat(src, "Your current default language is your species or mob type default.") + diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 662937b1af3..69753f5694c 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -66,7 +66,8 @@ break take_overall_damage(max(5, health - config.health_threshold_dead), 0) updatehealth() - src << "You have given up life and succumbed to death." + to_chat(src, "You have given up life and succumbed to death.") + /mob/living/proc/InCritical() return (src.health < 0 && src.health > -95.0 && stat == UNCONSCIOUS) @@ -92,7 +93,8 @@ //sort of a legacy burn method for /electrocute, /shock, and the e_chair /mob/living/proc/burn_skin(burn_amount) if(istype(src, /mob/living/carbon/human)) - //world << "DEBUG: burn_skin(), mutations=[mutations]" +// to_chat(world, "DEBUG: burn_skin(), mutations=[mutations]") + if (RESIST_HEAT in src.mutations) //fireproof return 0 var/mob/living/carbon/human/H = src //make this damage method divide the damage to be done among all the body parts, then burn each body part for that much damage. will have better effect then just randomly picking a body part @@ -124,7 +126,8 @@ if(actual < desired) temperature = desired // if(istype(src, /mob/living/carbon/human)) -// world << "[src] ~ [src.bodytemperature] ~ [temperature]" +// to_chat(world, "[src] ~ [src.bodytemperature] ~ [temperature]") + return temperature @@ -417,11 +420,14 @@ if(config.allow_Metadata) if(client) - usr << "[src]'s Metainfo:
      [client.prefs.metadata]" + to_chat(usr, "[src]'s Metainfo:
      [client.prefs.metadata]") + else - usr << "[src] does not have any stored infomation!" + to_chat(usr, "[src] does not have any stored infomation!") + else - usr << "OOC Metadata is not supported by this server!" + to_chat(usr, "OOC Metadata is not supported by this server!") + return @@ -570,8 +576,10 @@ var/mob/living/simple_animal/borer/B = src.loc var/mob/living/captive_brain/H = src - H << "\red You begin doggedly resisting the parasite's control (this will take approximately sixty seconds)." - B.host << "\red You feel the captive mind of [src] begin to resist your control." + to_chat(H, "\red You begin doggedly resisting the parasite's control (this will take approximately sixty seconds).") + + to_chat(B.host, "\red You feel the captive mind of [src] begin to resist your control.") + spawn(rand(350,450)+B.host.brainloss) @@ -579,8 +587,10 @@ return B.host.adjustBrainLoss(rand(5,10)) - H << "\red With an immense exertion of will, you regain control of your body!" - B.host << "\red You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you." + to_chat(H, "\red With an immense exertion of will, you regain control of your body!") + + to_chat(B.host, "\red You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you.") + B.detatch() @@ -633,7 +643,8 @@ C.changeNext_move(CLICK_CD_BREAKOUT) C.last_special = world.time + CLICK_CD_BREAKOUT - C << "\red You attempt to unbuckle yourself. (This will take around 2 minutes and you need to stay still)" + to_chat(C, "\red You attempt to unbuckle yourself. (This will take around 2 minutes and you need to stay still)") + for(var/mob/O in viewers(L)) O.show_message("\red [usr] attempts to unbuckle themself!", 1) @@ -643,7 +654,8 @@ return for(var/mob/O in viewers(C)) O.show_message("\red [usr] manages to unbuckle themself!", 1) - C << "\blue You successfully unbuckle yourself." + to_chat(C, "\blue You successfully unbuckle yourself.") + C.buckled.user_unbuckle_mob(C,C) else @@ -686,7 +698,8 @@ breakouttime = 50 displaytime = 5 - CM << "\red You attempt to remove \the [HC]. (This will take around [displaytime] [hulklien ? "seconds" : "minute[displaytime==1 ? "" : "s"]"] and you need to stand still)" + to_chat(CM, "\red You attempt to remove \the [HC]. (This will take around [displaytime] [hulklien ? "seconds" : "minute[displaytime==1 ? "" : "s"]"] and you need to stand still)") + for(var/mob/O in viewers(CM)) O.show_message( "\red [usr] attempts to [hulklien ? "break" : "remove"] \the [HC]!", 1) spawn(0) @@ -697,7 +710,8 @@ for(var/mob/O in viewers(CM))// lags so hard that 40s isn't lenient enough - Quarxink O.show_message("\red [CM] manages to [hulklien ? "break" : "remove"] the handcuffs!", 1) - CM << "\blue You successfully [hulklien ? "break" : "remove"] \the [CM.handcuffed]." + to_chat(CM, "\blue You successfully [hulklien ? "break" : "remove"] \the [CM.handcuffed].") + if(hulklien) CM.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) @@ -729,7 +743,8 @@ breakouttime = 50 displaytime = 5 - CM << "\red You attempt to remove \the [HC]. (This will take around [displaytime] [hulklien ? "seconds" : "minute[displaytime==1 ? "" : "s"]"] and you need to stand still)" + to_chat(CM, "\red You attempt to remove \the [HC]. (This will take around [displaytime] [hulklien ? "seconds" : "minute[displaytime==1 ? "" : "s"]"] and you need to stand still)") + for(var/mob/O in viewers(CM)) O.show_message( "\red [usr] attempts to [hulklien ? "break" : "remove"] \the [HC]!", 1) @@ -741,7 +756,8 @@ for(var/mob/O in viewers(CM))// lags so hard that 40s isn't lenient enough - Quarxink O.show_message("\red [CM] manages to [hulklien ? "break" : "remove"] the legcuffs!", 1) - CM << "\blue You successfully [hulklien ? "break" : "remove"] \the [CM.legcuffed]." + to_chat(CM, "\blue You successfully [hulklien ? "break" : "remove"] \the [CM.legcuffed].") + if(!hulklien) CM.unEquip(CM.legcuffed) @@ -780,7 +796,8 @@ return /mob/living/proc/Exhaust() - src << "You're too exhausted to keep going..." + to_chat(src, "You're too exhausted to keep going...") + Weaken(5) /mob/living/proc/get_visible_name() @@ -824,7 +841,8 @@ // Override if a certain type of mob should be behave differently when stripping items (can't, for example) /mob/living/stripPanelUnequip(obj/item/what, mob/who, where, var/silent = 0) if(what.flags & NODROP) - src << "You can't remove \the [what.name], it appears to be stuck!" + to_chat(src, "You can't remove \the [what.name], it appears to be stuck!") + return if(!silent) who.visible_message("[src] tries to remove [who]'s [what.name].", \ @@ -842,11 +860,13 @@ /mob/living/stripPanelEquip(obj/item/what, mob/who, where, var/silent = 0) what = src.get_active_hand() if(what && (what.flags & NODROP)) - src << "You can't put \the [what.name] on [who], it's stuck to your hand!" + to_chat(src, "You can't put \the [what.name] on [who], it's stuck to your hand!") + return if(what) if(!what.mob_can_equip(who, where, 1)) - src << "\The [what.name] doesn't fit in that place!" + to_chat(src, "\The [what.name] doesn't fit in that place!") + return if(!silent) visible_message("[src] tries to put [what] on [who].") diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index f2523e2d823..22a5fe7435e 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -17,20 +17,26 @@ if(armor && armor < 100 && armour_penetration) // Armor with 100+ protection can not be penetrated for admin items armor = max(0, armor - armour_penetration) if(penetrated_text) - src << "[penetrated_text]" + to_chat(src, "[penetrated_text]") + else - src << "Your armor was penetrated!" + to_chat(src, "Your armor was penetrated!") + if(armor >= 100) if(absorb_text) - src << "[absorb_text]" + to_chat(src, "[absorb_text]") + else - src << "Your armor absorbs the blow!" + to_chat(src, "Your armor absorbs the blow!") + else if(armor > 0) if(soften_text) - src << "[soften_text]" + to_chat(src, "[soften_text]") + else - src << "Your armor softens the blow!" + to_chat(src, "Your armor softens the blow!") + return armor //if null is passed for def_zone, then this should return something appropriate for all zones (e.g. area effect damage) @@ -44,7 +50,8 @@ if(C && C.active) C.attack_self(src)//Should shut it off update_icons() - src << "\blue Your [C.name] was disrupted!" + to_chat(src, "\blue Your [C.name] was disrupted!") + Stun(2) //Armor @@ -241,14 +248,16 @@ for(var/obj/item/weapon/grab/G in src.grabbed_by) if(G.assailant == user) - user << "You already grabbed [src]." + to_chat(user, "You already grabbed [src].") + return add_logs(src, user, "grabbed", addition="passively") var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(user, src) if(buckled) - user << "You cannot grab [src], \he is buckled in!" + to_chat(user, "You cannot grab [src], \he is buckled in!") + if(!G) //the grab will delete itself in New if src is anchored return 0 user.put_in_active_hand(G) diff --git a/code/modules/mob/living/login.dm b/code/modules/mob/living/login.dm index 11877529681..cd32fd22204 100644 --- a/code/modules/mob/living/login.dm +++ b/code/modules/mob/living/login.dm @@ -8,7 +8,8 @@ //Vents if(ventcrawler) - src << "You can ventcrawl! Use alt+click on vents to quickly travel about the station." + to_chat(src, "You can ventcrawl! Use alt+click on vents to quickly travel about the station.") + //Should update regardless of if we can ventcrawl, since we can end up in pipes in other ways. update_pipe_vision() diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 13e41254080..6caf2fa042b 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -119,7 +119,8 @@ proc/get_radio_key_from_channel(var/channel) /mob/living/say(var/message, var/datum/language/speaking = null, var/verb = "says", var/alt_name="") if(client) if(client.prefs.muted & MUTE_IC) - src << "\red You cannot speak in IC (Muted)." + to_chat(src, "\red You cannot speak in IC (Muted).") + return message = trim_strip_html_properly(message) @@ -160,7 +161,8 @@ proc/get_radio_key_from_channel(var/channel) verb = say_quote(message, speaking) if(is_muzzled()) - src << "You're muzzled and cannot speak!" + to_chat(src, "You're muzzled and cannot speak!") + return message = trim_left(message) @@ -311,7 +313,8 @@ proc/get_radio_key_from_channel(var/channel) else //everything else failed, emote is probably invalid if(act == "help") return //except help, because help is handled individually - src << "\blue Unusable emote '[act]'. Say *help for a list." + to_chat(src, "\blue Unusable emote '[act]'. Say *help for a list.") + /mob/living/whisper(message as text) message = trim_strip_html_properly(message) @@ -337,7 +340,8 @@ proc/get_radio_key_from_channel(var/channel) /mob/living/proc/whisper_say(var/message, var/datum/language/speaking = null, var/alt_name="", var/verb="whispers") if(client) if(client.prefs.muted & MUTE_IC) - src << "You cannot speak in IC (Muted)." + to_chat(src, "You cannot speak in IC (Muted).") + return if(stat) @@ -346,7 +350,8 @@ proc/get_radio_key_from_channel(var/channel) return if(is_muzzled()) - src << "You're muzzled and cannot speak!" + to_chat(src, "You're muzzled and cannot speak!") + return var/message_range = 1 diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 94305e770fd..d25f9a767c9 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -201,12 +201,18 @@ var/list/ai_verbs_default = list( ..() /mob/living/silicon/ai/proc/on_mob_init() - src << "You are playing the station's AI. The AI cannot move, but can interact with many objects while viewing them (through cameras)." - src << "To look at other parts of the station, click on yourself to get a camera menu." - src << "While observing through a camera, you can use most (networked) devices which you can see, such as computers, APCs, intercoms, doors, etc." - src << "To use something, simply click on it." - src << "Use say :b to speak to your cyborgs through binary. Use say :h to speak from an active holopad." - src << "For department channels, use the following say commands:" + to_chat(src, "You are playing the station's AI. The AI cannot move, but can interact with many objects while viewing them (through cameras).") + + to_chat(src, "To look at other parts of the station, click on yourself to get a camera menu.") + + to_chat(src, "While observing through a camera, you can use most (networked) devices which you can see, such as computers, APCs, intercoms, doors, etc.") + + to_chat(src, "To use something, simply click on it.") + + to_chat(src, "Use say :b to speak to your cyborgs through binary. Use say :h to speak from an active holopad.") + + to_chat(src, "For department channels, use the following say commands:") + var/radio_text = "" for(var/i = 1 to common_radio.channels.len) @@ -216,11 +222,13 @@ var/list/ai_verbs_default = list( if(i != common_radio.channels.len) radio_text += ", " - src << radio_text + to_chat(src, radio_text) + if (!(ticker && ticker.mode && (mind in ticker.mode.malf_ai))) show_laws() - src << "These laws may be changed by other players, or by you being the traitor." + to_chat(src, "These laws may be changed by other players, or by you being the traitor.") + job = "AI" @@ -330,7 +338,8 @@ var/list/ai_verbs_default = list( if("President") icon_state = "ai-president" else icon_state = "ai" //else - //usr <<"You can only change your display once!" +// to_chat(usr, "You can only change your display once!") + //return @@ -358,7 +367,8 @@ var/list/ai_verbs_default = list( return if(message_cooldown) - src << "Please allow one minute to pass between announcements." + to_chat(src, "Please allow one minute to pass between announcements.") + return var/input = input(usr, "Please write a message to announce to the station crew.", "A.I. Announcement") as message|null @@ -418,7 +428,8 @@ var/list/ai_verbs_default = list( anchored = !anchored // Toggles the anchor - src << "[anchored ? "You are now anchored." : "You are now unanchored."]" + to_chat(src, "[anchored ? "You are now anchored." : "You are now unanchored."]") + /mob/living/silicon/ai/update_canmove() return 0 @@ -499,7 +510,8 @@ var/list/ai_verbs_default = list( if(H) H.attack_ai(src) //may as well recycle else - src << "Unable to locate the holopad." + to_chat(src, "Unable to locate the holopad.") + if(href_list["say_word"]) play_vox_word(href_list["say_word"], null, src) @@ -510,7 +522,8 @@ var/list/ai_verbs_default = list( if(target && target.can_track()) ai_actual_track(target) else - src << "Target is not on or near any active cameras on the station." + to_chat(src, "Target is not on or near any active cameras on the station.") + return if (href_list["trackbot"]) @@ -518,7 +531,8 @@ var/list/ai_verbs_default = list( if(target) ai_actual_track(target) else - src << "Target is not on or near any active cameras on the station." + to_chat(src, "Target is not on or near any active cameras on the station.") + return if (href_list["callbot"]) //Command a bot to move to a selected location. @@ -526,7 +540,8 @@ var/list/ai_verbs_default = list( if(!Bot || Bot.remote_disabled || src.control_disabled) return //True if there is no bot found, the bot is manually emagged, or the AI is carded with wireless off. waypoint_mode = 1 - src << "Set your waypoint by clicking on a valid location free of obstructions." + to_chat(src, "Set your waypoint by clicking on a valid location free of obstructions.") + return if (href_list["interface"]) //Remotely connect to a bot! @@ -542,7 +557,8 @@ var/list/ai_verbs_default = list( if (href_list["ai_take_control"]) //Mech domination var/obj/mecha/M = locate(href_list["ai_take_control"]) if(controlled_mech) - src << "You are already loaded into an onboard computer!" + to_chat(src, "You are already loaded into an onboard computer!") + return if(M) M.transfer_ai(AI_MECH_HACK,src, usr) //Called om the mech itself. @@ -553,12 +569,14 @@ var/list/ai_verbs_default = list( if(A && target) A.cameraFollow = target - A << "Now tracking [target.name] on camera." + to_chat(A, "Now tracking [target.name] on camera.") + if (usr.machine == null) usr.machine = usr while (src.cameraFollow == target) - usr << "Target is not on or near any active cameras on the station. We'll check again in 5 seconds (unless you use the cancel-camera verb)." + to_chat(usr, "Target is not on or near any active cameras on the station. We'll check again in 5 seconds (unless you use the cancel-camera verb).") + sleep(40) continue @@ -574,11 +592,13 @@ var/list/ai_verbs_default = list( /mob/living/silicon/ai/attack_alien(mob/living/carbon/alien/humanoid/M as mob) if (!ticker) - M << "You cannot attack people before the game has started." + to_chat(M, "You cannot attack people before the game has started.") + return if (istype(loc, /turf) && istype(loc.loc, /area/start)) - M << "No attacking people at spawn, you jackass." + to_chat(M, "No attacking people at spawn, you jackass.") + return switch(M.a_intent) @@ -630,7 +650,8 @@ var/list/ai_verbs_default = list( set name = "Access Robot Control" set desc = "Wirelessly control various automatic robots." if(stat == 2) - src << "Critical error. System offline." + to_chat(src, "Critical error. System offline.") + return if(check_unable(AI_CHECK_WIRELESS | AI_CHECK_RADIO)) @@ -666,7 +687,8 @@ var/list/ai_verbs_default = list( else if(cameranet && cameranet.checkTurfVis(turf_check)) call_bot(turf_check) else - src << "Selected location is not visible." + to_chat(src, "Selected location is not visible.") + /mob/living/silicon/ai/proc/call_bot(var/turf/waypoint) @@ -674,7 +696,8 @@ var/list/ai_verbs_default = list( return if(Bot.calling_ai && Bot.calling_ai != src) //Prevents an override if another AI is controlling this bot. - src << "Interface error. Unit is already in use." + to_chat(src, "Interface error. Unit is already in use.") + return Bot.call_bot(src, waypoint) @@ -709,7 +732,8 @@ var/list/ai_verbs_default = list( return if(usr.stat == 2) - usr << "You can't change your camera network because you are dead!" + to_chat(usr, "You can't change your camera network because you are dead!") + return var/mob/living/silicon/ai/U = usr @@ -741,7 +765,8 @@ var/list/ai_verbs_default = list( if(network in C.network) U.eyeobj.setLoc(get_turf(C)) break - src << "\blue Switched to [network] camera network." + to_chat(src, "\blue Switched to [network] camera network.") + //End of code by Mord_Sith @@ -756,7 +781,8 @@ var/list/ai_verbs_default = list( set name = "AI Status" if(usr.stat == 2) - usr <<"You cannot change your emotional status because you are dead!" + to_chat(usr, "You cannot change your emotional status because you are dead!") + return if(check_unable()) @@ -832,7 +858,8 @@ var/list/ai_verbs_default = list( var/obj/machinery/power/apc/apc = src.loc if(!istype(apc)) - src << "\blue You are already in your Main Core." + to_chat(src, "\blue You are already in your Main Core.") + return apc.malfvacate() @@ -848,7 +875,8 @@ var/list/ai_verbs_default = list( camera_light_on = !camera_light_on if (!camera_light_on) - src << "Camera lights deactivated." + to_chat(src, "Camera lights deactivated.") + for (var/obj/machinery/camera/C in lit_cameras) C.set_light(0) @@ -858,7 +886,8 @@ var/list/ai_verbs_default = list( light_cameras() - src << "Camera lights activated." + to_chat(src, "Camera lights activated.") + /mob/living/silicon/ai/proc/sensor_mode() set name = "Set Sensor Augmentation" @@ -874,7 +903,8 @@ var/list/ai_verbs_default = list( var/newmsg = input("What would you like the arrival message to be? List of options: $name, $rank, $species, $gender, $age", "Change Arrival Message", arrivalmsg) as text if(newmsg != arrivalmsg) arrivalmsg = newmsg - usr << "The arrival message has been successfully changed." + to_chat(usr, "The arrival message has been successfully changed.") + // Handled camera lighting, when toggled. // It will get the nearest camera from the eyeobj, lighting it. @@ -930,7 +960,8 @@ var/list/ai_verbs_default = list( if(check_unable(AI_CHECK_RADIO)) return - src << "Accessing Subspace Transceiver control..." + to_chat(src, "Accessing Subspace Transceiver control...") + if (src.aiRadio) src.aiRadio.interact(src) @@ -942,13 +973,16 @@ var/list/ai_verbs_default = list( var/mob/living/carbon/human/H = target var/obj/item/weapon/card/id/id = H.wear_id if(istype(id) && id.is_untrackable()) - src << "Unable to locate an airlock" + to_chat(src, "Unable to locate an airlock") + return if(H.digitalcamo) - src << "Unable to locate an airlock" + to_chat(src, "Unable to locate an airlock") + return if (!near_camera(target)) - src << "Target is not near any active cameras." + to_chat(src, "Target is not near any active cameras.") + return var/obj/machinery/door/airlock/tobeopened var/dist = -1 @@ -956,43 +990,54 @@ var/list/ai_verbs_default = list( if(!D.density) continue if(dist < 0) dist = get_dist(D, target) - //world << dist +// to_chat(world, dist) + tobeopened = D else if(dist > get_dist(D, target)) dist = get_dist(D, target) - //world << dist +// to_chat(world, dist) + tobeopened = D - //world << "found [tobeopened.name] closer" +// to_chat(world, "found [tobeopened.name] closer") + else - //world << "[D.name] not close enough | [get_dist(D, target)] | [dist]" +// to_chat(world, "[D.name] not close enough | [get_dist(D, target)] | [dist]") + if(tobeopened) switch(alert(src, "Do you want to open \the [tobeopened] for [target]?","Doorknob_v2a.exe","Yes","No")) if("Yes") var/nhref = "src=\ref[tobeopened];aiEnable=7" tobeopened.Topic(nhref, params2list(nhref), tobeopened, 1) - src << "\blue You've opened \the [tobeopened] for [target]." + to_chat(src, "\blue You've opened \the [tobeopened] for [target].") + if("No") - src << "\red You deny the request." + to_chat(src, "\red You deny the request.") + else - src << "\red You've failed to open an airlock for [target]" + to_chat(src, "\red You've failed to open an airlock for [target]") + return /mob/living/silicon/ai/proc/check_unable(var/flags = 0) if(stat == DEAD) - usr << "You are dead!" + to_chat(usr, "You are dead!") + return 1 if(lacks_power()) - usr << "Power systems failure!" + to_chat(usr, "Power systems failure!") + return 1 if((flags & AI_CHECK_WIRELESS) && src.control_disabled) - usr << "Wireless control is disabled!" + to_chat(usr, "Wireless control is disabled!") + return 1 if((flags & AI_CHECK_RADIO) && src.aiRadio.disabledAi) - src << "System Error - Transceiver Disabled!" + to_chat(src, "System Error - Transceiver Disabled!") + return 1 return 0 @@ -1004,18 +1049,24 @@ var/list/ai_verbs_default = list( return if(interaction == AI_TRANS_TO_CARD)//The only possible interaction. Upload AI mob to a card. if(!mind) - user << "No intelligence patterns detected." //No more magical carding of empty cores, AI RETURN TO BODY!!!11 + to_chat(user, "No intelligence patterns detected.")//No more magical carding of empty cores, AI RETURN TO BODY!!!11 + + return if (mind.special_role == "malfunction") //AI MALF!! - user << "ERROR: Remote transfer interface disabled."//Do ho ho ho~ + to_chat(user, "ERROR: Remote transfer interface disabled.")//Do ho ho ho~ + + return new /obj/structure/AIcore/deactivated(loc)//Spawns a deactivated terminal at AI location. aiRestorePowerRoutine = 0//So the AI initially has power. control_disabled = 1//Can't control things remotely if you're stuck in a card! aiRadio.disabledAi = 1 //No talking on the built-in radio for you either! loc = card//Throw AI into the card. - src << "You have been downloaded to a mobile storage device. Remote device connection severed." - user << "Transfer successful: [name] ([rand(1000,9999)].exe) removed from host terminal and stored within local memory." + to_chat(src, "You have been downloaded to a mobile storage device. Remote device connection severed.") + + to_chat(user, "Transfer successful: [name] ([rand(1000,9999)].exe) removed from host terminal and stored within local memory.") + // Pass lying down or getting up to our pet human, if we're in a rig. /mob/living/silicon/ai/lay_down() diff --git a/code/modules/mob/living/silicon/ai/examine.dm b/code/modules/mob/living/silicon/ai/examine.dm index 8fc31c53828..d031aad02b0 100644 --- a/code/modules/mob/living/silicon/ai/examine.dm +++ b/code/modules/mob/living/silicon/ai/examine.dm @@ -23,7 +23,8 @@ msg += "" msg += "*---------*" - user << msg + to_chat(user, msg) + user.showLaws(src) diff --git a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm index 9c4ab44a5ca..3967c329a73 100644 --- a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm +++ b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm @@ -115,7 +115,8 @@ var/datum/cameranet/cameranet = new() var/x2 = min(world.maxx, T.x + (CHUNK_SIZE / 2)) & ~(CHUNK_SIZE - 1) var/y2 = min(world.maxy, T.y + (CHUNK_SIZE / 2)) & ~(CHUNK_SIZE - 1) - //world << "X1: [x1] - Y1: [y1] - X2: [x2] - Y2: [y2]" +// to_chat(world, "X1: [x1] - Y1: [y1] - X2: [x2] - Y2: [y2]") + for(var/x = x1; x <= x2; x += CHUNK_SIZE) for(var/y = y1; y <= y2; y += CHUNK_SIZE) diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index b8d27787247..bbfb08c82d3 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -101,7 +101,8 @@ if(src.eyeobj && src.loc) src.eyeobj.loc = src.loc else - src << "ERROR: Eyeobj not found. Creating new eye..." + to_chat(src, "ERROR: Eyeobj not found. Creating new eye...") + src.eyeobj = new(src.loc) src.eyeobj.ai = src src.eyeobj.name = "[src.name] (AI Eye)" // Give it a name @@ -115,4 +116,5 @@ if(usr.stat == 2) return //won't work if dead acceleration = !acceleration - usr << "Camera acceleration has been toggled [acceleration ? "on" : "off"]." + to_chat(usr, "Camera acceleration has been toggled [acceleration ? "on" : "off"].") + diff --git a/code/modules/mob/living/silicon/ai/latejoin.dm b/code/modules/mob/living/silicon/ai/latejoin.dm index 2da08205836..512af50d6d6 100644 --- a/code/modules/mob/living/silicon/ai/latejoin.dm +++ b/code/modules/mob/living/silicon/ai/latejoin.dm @@ -16,7 +16,8 @@ var/global/list/empty_playable_ai_cores = list() set desc = "Wipe your core. This is functionally equivalent to cryo or robotic storage, freeing up your job slot." if(ticker && ticker.mode && ticker.mode.name == "AI malfunction") - usr << "You cannot use this verb in malfunction. If you need to leave, please adminhelp." + to_chat(usr, "You cannot use this verb in malfunction. If you need to leave, please adminhelp.") + return // Guard against misclicks, this isn't the sort of thing we want happening accidentally diff --git a/code/modules/mob/living/silicon/ai/laws.dm b/code/modules/mob/living/silicon/ai/laws.dm index f36c32bb8d4..e869eb7e654 100755 --- a/code/modules/mob/living/silicon/ai/laws.dm +++ b/code/modules/mob/living/silicon/ai/laws.dm @@ -10,7 +10,8 @@ who = world else who = src - who << "Obey these laws:" + to_chat(who, "Obey these laws:") + src.laws_sanity_check() src.laws.show_laws(who) diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index 727d03b5696..b47a155e51e 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -18,7 +18,8 @@ if(malfhack) if(malfhack.aidisabled) - src << "ERROR: APC access disabled, hack attempt canceled." + to_chat(src, "ERROR: APC access disabled, hack attempt canceled.") + malfhacking = 0 malfhack = null @@ -47,11 +48,13 @@ see_invisible = see_override if(aiRestorePowerRoutine == 2) - src << "Alert cancelled. Power has been restored without our assistance." + to_chat(src, "Alert cancelled. Power has been restored without our assistance.") + aiRestorePowerRoutine = 0 clear_fullscreen("blind") else if(aiRestorePowerRoutine == 3) - src << "Alert cancelled. Power has been restored." + to_chat(src, "Alert cancelled. Power has been restored.") + aiRestorePowerRoutine = 0 clear_fullscreen("blind") @@ -69,31 +72,36 @@ if(((!my_area.power_equip) || istype(T, /turf/space)) && !is_type_in_list(loc, list(/obj/item, /obj/mecha))) if(!aiRestorePowerRoutine) aiRestorePowerRoutine = 1 - - src << "You have lost power!" + to_chat(src, "You have lost power!") if(!is_special_character(src)) set_zeroth_law("") spawn(20) - src << "Backup battery online. Scanners, camera, and radio interface offline. Beginning fault-detection." + to_chat(src, "Backup battery online. Scanners, camera, and radio interface offline. Beginning fault-detection.") + sleep(50) my_area = get_area(src) T = get_turf(src) if(my_area && my_area.power_equip && !istype(T, /turf/space)) - src << "Alert cancelled. Power has been restored without our assistance." + to_chat(src, "Alert cancelled. Power has been restored without our assistance.") + aiRestorePowerRoutine = 0 return - src << "Fault confirmed: missing external power. Shutting down main control system to save power." + to_chat(src, "Fault confirmed: missing external power. Shutting down main control system to save power.") + sleep(20) - src << "Emergency control system online. Verifying connection to power network." + to_chat(src, "Emergency control system online. Verifying connection to power network.") + sleep(50) T = get_turf(src) if(istype(T, /turf/space)) - src << "Unable to verify! No power connection detected!" + to_chat(src, "Unable to verify! No power connection detected!") + aiRestorePowerRoutine = 2 return - src << "Connection verified. Searching for APC in power network." + to_chat(src, "Connection verified. Searching for APC in power network.") + sleep(50) my_area = get_area(src) @@ -110,31 +118,41 @@ if(!theAPC) switch(PRP) - if(1) src << "Unable to locate APC!" - else src << "Lost connection with the APC!" + if(1) + to_chat(src, "Unable to locate APC!") + else + to_chat(src, "Lost connection with the APC!") + aiRestorePowerRoutine = 2 return if(my_area.power_equip) if (!istype(T, /turf/space)) - src << "Alert cancelled. Power has been restored without our assistance." + to_chat(src, "Alert cancelled. Power has been restored without our assistance.") + aiRestorePowerRoutine = 0 clear_fullscreen("blind") return switch(PRP) - if(1) src << "APC located. Optimizing route to APC to avoid needless power waste." - if(2) src << "Best route identified. Hacking offline APC power port." - if(3) src << "Power port upload access confirmed. Loading control program into APC power port software." + if(1) + to_chat(src, "APC located. Optimizing route to APC to avoid needless power waste.") + if(2) + to_chat(src, "Best route identified. Hacking offline APC power port.") + if(3) + to_chat(src, "Power port upload access confirmed. Loading control program into APC power port software.") if(4) - src << "Transfer complete. Forcing APC to execute program." + to_chat(src, "Transfer complete. Forcing APC to execute program.") + sleep(50) - src << "Receiving control information from APC." + to_chat(src, "Receiving control information from APC.") + sleep(2) //bring up APC dialog aiRestorePowerRoutine = 3 theAPC.attack_ai(src) - src << "Here are your current laws:" + to_chat(src, "Here are your current laws:") + src.show_laws() //WHY THE FUCK IS THIS HERE sleep(50) theAPC = null diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm index 2c9d396448e..c82803adb11 100644 --- a/code/modules/mob/living/silicon/ai/say.dm +++ b/code/modules/mob/living/silicon/ai/say.dm @@ -30,7 +30,8 @@ var/const/VOX_PATH = "sound/vox_fem/" return if(announcing_vox > world.time) - src << "Please wait [round((announcing_vox - world.time) / 10)] seconds." + to_chat(src, "Please wait [round((announcing_vox - world.time) / 10)] seconds.") + return var/message = input(src, "WARNING: Misuse of this verb can result in you being job banned. More help is available in 'Announcement Help'", "Announcement", last_announcement) as text|null @@ -58,7 +59,8 @@ var/const/VOX_PATH = "sound/vox_fem/" incorrect_words += word if(incorrect_words.len) - src << "These words are not available on the announcement system: [english_list(incorrect_words)]." + to_chat(src, "These words are not available on the announcement system: [english_list(incorrect_words)].") + return announcing_vox = world.time + VOX_DELAY @@ -83,9 +85,11 @@ var/const/VOX_PATH = "sound/vox_fem/" if(M.client) var/turf/T = get_turf(M) if(T && T.z == z_level && !isdeaf(M)) - M << voice + to_chat(M, voice) + else - only_listener << voice + to_chat(only_listener, voice) + return 1 return 0 @@ -94,6 +98,7 @@ var/const/VOX_PATH = "sound/vox_fem/" /client/proc/preload_vox() var/list/vox_files = flist(VOX_PATH) for(var/file in vox_files) - // src << "Downloading [file]" +// to_chat(src, "Downloading [file]") + var/sound/S = sound("[VOX_PATH][file]") src << browse_rsc(S) diff --git a/code/modules/mob/living/silicon/laws.dm b/code/modules/mob/living/silicon/laws.dm index 9cb442e3d37..0e0f34dd290 100644 --- a/code/modules/mob/living/silicon/laws.dm +++ b/code/modules/mob/living/silicon/laws.dm @@ -18,7 +18,8 @@ /mob/living/silicon/robot/set_zeroth_law(var/law, var/law_borg) ..() if(tracking_entities) - src << "Internal camera is currently being accessed." + to_chat(src, "Internal camera is currently being accessed.") + /mob/living/silicon/proc/add_ion_law(var/law) laws_sanity_check() @@ -75,7 +76,8 @@ /mob/living/silicon/proc/dostatelaws(var/method, var/prefix, var/datum/ai_laws/laws) if(stating_laws[prefix]) - src << "[method]: Already stating laws using this communication method." + to_chat(src, "[method]: Already stating laws using this communication method.") + return stating_laws[prefix] = 1 @@ -88,7 +90,8 @@ break if(!can_state) - src << "[method]: Unable to state laws. Communication method unavailable." + to_chat(src, "[method]: Unable to state laws. Communication method unavailable.") + stating_laws[prefix] = 0 /mob/living/silicon/proc/statelaw(var/law) diff --git a/code/modules/mob/living/silicon/pai/emote.dm b/code/modules/mob/living/silicon/pai/emote.dm index a8eeac8cbb7..79986a486ec 100644 --- a/code/modules/mob/living/silicon/pai/emote.dm +++ b/code/modules/mob/living/silicon/pai/emote.dm @@ -1,6 +1,7 @@ /mob/living/silicon/pai/emote(var/act, var/m_type=1, var/message = null) switch(act) if ("help") - src << "ping, beep, buzz." + to_chat(src, "ping, beep, buzz.") + ..(act, m_type, message) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/pai/examine.dm b/code/modules/mob/living/silicon/pai/examine.dm index 07c718a6ff0..26f8cafbf7e 100644 --- a/code/modules/mob/living/silicon/pai/examine.dm +++ b/code/modules/mob/living/silicon/pai/examine.dm @@ -21,5 +21,6 @@ msg += "" msg += "*---------*" - user << msg + to_chat(user, msg) + */ \ No newline at end of file diff --git a/code/modules/mob/living/silicon/pai/life.dm b/code/modules/mob/living/silicon/pai/life.dm index 8b7c7863afc..029d07e37d2 100644 --- a/code/modules/mob/living/silicon/pai/life.dm +++ b/code/modules/mob/living/silicon/pai/life.dm @@ -8,7 +8,8 @@ if(silence_time) if(world.timeofday >= silence_time) silence_time = null - src << "Communication circuit reinitialized. Speech and messaging functionality restored." + to_chat(src, "Communication circuit reinitialized. Speech and messaging functionality restored.") + if(cable) if(get_dist(src, cable) > 1) diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 0d9d81d3bf5..a6a183eee20 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -163,7 +163,8 @@ // 33% chance of no additional effect src.silence_time = world.timeofday + 120 * 10 // Silence for 2 minutes - src << "Communication circuit overload. Shutting down and reloading communication circuits - speech and messaging functionality will be unavailable until the reboot is complete." + to_chat(src, "Communication circuit overload. Shutting down and reloading communication circuits - speech and messaging functionality will be unavailable until the reboot is complete.") + if(prob(20)) var/turf/T = get_turf_or_move(src.loc) for (var/mob/M in viewers(T)) @@ -174,7 +175,8 @@ if(1) src.master = null src.master_dna = null - src << "You feel unbound." + to_chat(src, "You feel unbound.") + if(2) var/command if(severity == 1) @@ -182,9 +184,11 @@ else command = pick("Serve", "Kill", "Love", "Hate", "Disobey", "Devour", "Fool", "Enrage", "Entice", "Observe", "Judge", "Respect", "Disrespect", "Consume", "Educate", "Destroy", "Disgrace", "Amuse", "Entertain", "Ignite", "Glorify", "Memorialize", "Analyze") src.pai_law0 = "[command] your master." - src << "Pr1m3 d1r3c71v3 uPd473D." + to_chat(src, "Pr1m3 d1r3c71v3 uPd473D.") + if(3) - src << "You feel an electric surge run through your circuitry and become acutely aware at how lucky you are that you can still feel at all." + to_chat(src, "You feel an electric surge run through your circuitry and become acutely aware at how lucky you are that you can still feel at all.") + /mob/living/silicon/pai/ex_act(severity) ..() @@ -224,11 +228,13 @@ /mob/living/silicon/pai/attack_alien(mob/living/carbon/alien/humanoid/M as mob) if (!ticker) - M << "You cannot attack people before the game has started." + to_chat(M, "You cannot attack people before the game has started.") + return if (istype(src.loc, /turf) && istype(src.loc.loc, /area/start)) - M << "You cannot attack someone in the spawn area." + to_chat(M, "You cannot attack someone in the spawn area.") + return switch(M.a_intent) @@ -283,7 +289,8 @@ medicalActive2 = null medical_cannotfind = 0 nanomanager.update_uis(src) - usr << "You reset your record-viewing software." + to_chat(usr, "You reset your record-viewing software.") + /mob/living/silicon/pai/cancel_camera() set category = "pAI Commands" @@ -303,7 +310,8 @@ var/cameralist[0] if(usr.stat == 2) - usr << "You can't change your camera network because you are dead!" + to_chat(usr, "You can't change your camera network because you are dead!") + return for (var/obj/machinery/camera/C in Cameras) @@ -314,7 +322,8 @@ cameralist[C.network] = C.network src.network = input(usr, "Which network would you like to view?") as null|anything in cameralist - src << "\blue Switched to [src.network] camera network." + to_chat(src, "\blue Switched to [src.network] camera network.") + //End of code by Mord_Sith */ @@ -341,11 +350,13 @@ return if(src.loc != card) - src << "\red You are already in your mobile form!" + to_chat(src, "\red You are already in your mobile form!") + return if(world.time <= last_special) - src << "\red You must wait before folding your chassis out again!" + to_chat(src, "\red You must wait before folding your chassis out again!") + return last_special = world.time + 200 @@ -377,11 +388,13 @@ return if(src.loc == card) - src << "\red You are already in your card form!" + to_chat(src, "\red You are already in your card form!") + return if(world.time <= last_special) - src << "\red You must wait before returning to your card form!" + to_chat(src, "\red You must wait before returning to your card form!") + return close_up() @@ -431,7 +444,8 @@ else resting = !resting icon_state = resting ? "[chassis]_rest" : "[chassis]" - src << "You are now [resting ? "resting" : "getting up"]" + to_chat(src, "You are now [resting ? "resting" : "getting up"]") + canmove = !resting @@ -440,7 +454,8 @@ if(istype(W, /obj/item/stack/nanopaste)) var/obj/item/stack/nanopaste/N = W if (stat == DEAD) - user << "\The [src] is beyond help, at this point." + to_chat(user, "\The [src] is beyond help, at this point.") + else if (getBruteLoss() || getFireLoss()) adjustBruteLoss(-15) adjustFireLoss(-15) @@ -449,7 +464,8 @@ user.visible_message("[user.name] applied some [W] at [src]'s damaged areas.",\ "You apply some [W] at [src.name]'s damaged areas.") else - user << "All [src.name]'s systems are nominal." + to_chat(user, "All [src.name]'s systems are nominal.") + return else if(W.force) @@ -512,7 +528,8 @@ if(stat || sleeping || paralysis || weakened) return if(istype(AM,/obj/item)) - src << "You are far too small to pull anything!" + to_chat(src, "You are far too small to pull anything!") + return /mob/living/silicon/pai/update_canmove() @@ -538,7 +555,8 @@ pose = addtext(pose,".") //Makes sure all emotes end with a period. msg += "\nIt is [pose]" - user << msg + to_chat(user, msg) + /mob/living/silicon/pai/bullet_act(var/obj/item/projectile/Proj) ..(Proj) @@ -576,9 +594,11 @@ if(Adjacent(H)) get_scooped(H) else - src << "You need to stay in reaching distance to be picked up." + to_chat(src, "You need to stay in reaching distance to be picked up.") + if("No") - src << "[H] decided not to pick you up." + to_chat(src, "[H] decided not to pick you up.") + else if(Adjacent(H)) get_scooped(H) diff --git a/code/modules/mob/living/silicon/pai/personality.dm b/code/modules/mob/living/silicon/pai/personality.dm index c4928878ce9..f6f2e14f994 100644 --- a/code/modules/mob/living/silicon/pai/personality.dm +++ b/code/modules/mob/living/silicon/pai/personality.dm @@ -17,10 +17,14 @@ var/savefile/F = new /savefile(src.savefile_path(user)) - F["name"] << src.name - F["description"] << src.description - F["role"] << src.role - F["comments"] << src.comments + to_chat(F["name"], src.name) + + to_chat(F["description"], src.description) + + to_chat(F["role"], src.role) + + to_chat(F["comments"], src.comments) + F["version"] << 1 diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm index fe785adf929..b5c616b4319 100644 --- a/code/modules/mob/living/silicon/pai/recruit.dm +++ b/code/modules/mob/living/silicon/pai/recruit.dm @@ -351,7 +351,8 @@ var/datum/paiController/paiController // Global handler for pAI candidates if(O.client && (ROLE_PAI in O.client.prefs.be_special)) if(player_old_enough_antag(O.client,ROLE_PAI)) if(check_recruit(O)) - O << "\blue A pAI card is looking for personalities. (Teleport | Sign Up)" + to_chat(O, "\blue A pAI card is looking for personalities. (Teleport | Sign Up)") + //question(O.client) proc/check_recruit(var/mob/dead/observer/O) if(jobban_isbanned(O, "pAI") || jobban_isbanned(O,"nonhumandept")) diff --git a/code/modules/mob/living/silicon/pai/say.dm b/code/modules/mob/living/silicon/pai/say.dm index e1cb9f0f800..6861110b920 100644 --- a/code/modules/mob/living/silicon/pai/say.dm +++ b/code/modules/mob/living/silicon/pai/say.dm @@ -1,5 +1,6 @@ /mob/living/silicon/pai/say(var/msg) if(silence_time) - src << "Communication circuits remain uninitialized." + to_chat(src, "Communication circuits remain uninitialized.") + else ..(msg) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index ef36f5b94c9..21c69edf5f0 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -19,7 +19,8 @@ var/global/list/default_pai_software = list() var/datum/pai_software/P = new type() if(pai_software_by_key[P.id]) var/datum/pai_software/O = pai_software_by_key[P.id] - world << "pAI software module [P.name] has the same key as [O.name]!" + to_chat(world, "pAI software module [P.name] has the same key as [O.name]!") + r = 0 continue pai_software_by_key[P.id] = P diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm index 1be45da5786..cdebdc27d5c 100644 --- a/code/modules/mob/living/silicon/pai/software_modules.dm +++ b/code/modules/mob/living/silicon/pai/software_modules.dm @@ -56,7 +56,8 @@ while(!istype(M, /mob/living)) if(!M || !M.loc || count > 6) //For a runtime where M ends up in nullspace (similar to bluespace but less colourful) - src << "You are not being carried by anyone!" + to_chat(src, "You are not being carried by anyone!") + return 0 M = M.loc count++ @@ -68,13 +69,17 @@ for (var/mob/v in viewers(T)) v.show_message("[M] presses \his thumb against [P].", 3, "[P] makes a sharp clicking sound as it extracts DNA material from [M].", 2) var/datum/dna/dna = M.dna - P << "

      [M]'s UE string : [dna.unique_enzymes]

      " + to_chat(P, "

      [M]'s UE string : [dna.unique_enzymes]

      ") + if(dna.unique_enzymes == P.master_dna) - P << "DNA is a match to stored Master DNA." + to_chat(P, "DNA is a match to stored Master DNA.") + else - P << "DNA does not match stored Master DNA." + to_chat(P, "DNA does not match stored Master DNA.") + else - P << "[M] does not seem like \he is going to provide a DNA sample willingly." + to_chat(P, "[M] does not seem like \he is going to provide a DNA sample willingly.") + return 1 /datum/pai_software/radio_config @@ -502,9 +507,11 @@ if(!T || !(T.z in config.contact_levels)) break if(T.loc) - AI << "Network Alert: Brute-force encryption crack in progress in [T.loc]." + to_chat(AI, "Network Alert: Brute-force encryption crack in progress in [T.loc].") + else - AI << "Network Alert: Brute-force encryption crack in progress. Unable to pinpoint location." + to_chat(AI, "Network Alert: Brute-force encryption crack in progress. Unable to pinpoint location.") + var/obj/machinery/door/D = cable.machine if(!istype(D)) hack_aborted = 1 @@ -702,7 +709,8 @@ while(!isliving(held)) if(!held || !held.loc || count > 6) //For a runtime where M ends up in nullspace (similar to bluespace but less colourful) - src << "You are not being carried by anyone!" + to_chat(src, "You are not being carried by anyone!") + return 0 held = held.loc count++ diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index ae5ab514307..0c9087e5d99 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -184,10 +184,14 @@ /obj/item/device/robotanalyzer/attack(mob/living/M as mob, mob/living/user as mob) if(( (CLUMSY in user.mutations) || user.getBrainLoss() >= 60) && prob(50)) user.visible_message("[user] has analyzed the floor's vitals!", "You try to analyze the floor's vitals!") - user << "Analyzing Results for The floor:\n\t Overall Status: Healthy" - user << "\t Damage Specifics: [0]-[0]-[0]-[0]" - user << "Key: Suffocation/Toxin/Burns/Brute" - user << "Body Temperature: ???" + to_chat(user, "Analyzing Results for The floor:\n\t Overall Status: Healthy") + + to_chat(user, "\t Damage Specifics: [0]-[0]-[0]-[0]") + + to_chat(user, "Key: Suffocation/Toxin/Burns/Brute") + + to_chat(user, "Body Temperature: ???") + return var/scan_type @@ -196,7 +200,8 @@ else if(istype(M, /mob/living/carbon/human)) scan_type = "prosthetics" else - user << "You can't analyze non-robotic things!" + to_chat(user, "You can't analyze non-robotic things!") + return user.visible_message("[user] has analyzed [M]'s components.","You have analyzed [M]'s components.") @@ -204,14 +209,19 @@ if("robot") var/BU = M.getFireLoss() > 50 ? "[M.getFireLoss()]" : M.getFireLoss() var/BR = M.getBruteLoss() > 50 ? "[M.getBruteLoss()]" : M.getBruteLoss() - user << "Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "fully disabled" : "[M.health]% functional"]" - user << "\t Key: Electronics/Brute" - user << "\t Damage Specifics: [BU] - [BR]" + to_chat(user, "Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "fully disabled" : "[M.health]% functional"]") + + to_chat(user, "\t Key: Electronics/Brute") + + to_chat(user, "\t Damage Specifics: [BU] - [BR]") + if(M.timeofdeath && M.stat == DEAD) - user << "Time of Disable: [M.timeofdeath]" + to_chat(user, "Time of Disable: [M.timeofdeath]") + var/mob/living/silicon/robot/H = M var/list/damaged = H.get_damaged_components(1,1,1) - user << "Localized Damage:" + to_chat(user, "Localized Damage:") + if(length(damaged)>0) for(var/datum/robot_component/org in damaged) user.show_message(text("\t []: [][] - [] - [] - []", \ @@ -222,35 +232,46 @@ (org.toggled) ? "Toggled ON" : "Toggled OFF",\ (org.powered) ? "Power ON" : "Power OFF"),1) else - user << "\t Components are OK." + to_chat(user, "\t Components are OK.") + if(H.emagged && prob(5)) - user << "\t ERROR: INTERNAL SYSTEMS COMPROMISED" + to_chat(user, "\t ERROR: INTERNAL SYSTEMS COMPROMISED") + if("prosthetics") var/mob/living/carbon/human/H = M - user << "Analyzing Results for \the [H]:" - user << "Key: Electronics/Brute" + to_chat(user, "Analyzing Results for \the [H]:") + + to_chat(user, "Key: Electronics/Brute") + + + to_chat(user, "External prosthetics:") - user << "External prosthetics:" var/organ_found if(H.internal_organs.len) for(var/obj/item/organ/external/E in H.organs) if(!(E.status & ORGAN_ROBOT)) continue organ_found = 1 - user << "[E.name]: [round(E.brute_dam)] [round(E.burn_dam)]" + to_chat(user, "[E.name]: [round(E.brute_dam)] [round(E.burn_dam)]") + if(!organ_found) - user << "No prosthetics located." - user << "
      " - user << "Internal prosthetics:" + to_chat(user, "No prosthetics located.") + + to_chat(user, "
      ") + + to_chat(user, "Internal prosthetics:") + organ_found = null if(H.internal_organs.len) for(var/obj/item/organ/internal/O in H.internal_organs) if(!(O.status & ORGAN_ROBOT)) continue organ_found = 1 - user << "[capitalize(O.name)]: [O.damage]" + to_chat(user, "[capitalize(O.name)]: [O.damage]") + if(!organ_found) - user << "No prosthetics located." + to_chat(user, "No prosthetics located.") + src.add_fingerprint(user) diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index ab82709dc35..2ce6b4903f2 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -108,11 +108,13 @@ /mob/living/silicon/robot/drone/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(istype(W, /obj/item/borg/upgrade/)) - user << "\red The maintenance drone chassis not compatible with \the [W]." + to_chat(user, "\red The maintenance drone chassis not compatible with \the [W].") + return else if (istype(W, /obj/item/weapon/crowbar)) - user << "The machine is hermetically sealed. You can't open the case." + to_chat(user, "The machine is hermetically sealed. You can't open the case.") + return else if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) @@ -120,17 +122,20 @@ if(stat == 2) if(!config.allow_drone_spawn || emagged || health < -35) //It's dead, Dave. - user << "\red The interface is fried, and a distressing burned smell wafts from the robot's interior. You're not rebooting this one." + to_chat(user, "\red The interface is fried, and a distressing burned smell wafts from the robot's interior. You're not rebooting this one.") + return if(!allowed(usr)) - user << "\red Access denied." + to_chat(user, "\red Access denied.") + return var/delta = (world.time / 10) - last_reboot if(reboot_cooldown > delta) var/cooldown_time = round(reboot_cooldown - ((world.time / 10) - last_reboot), 1) - usr << "\red The reboot system is currently offline. Please wait another [cooldown_time] seconds." + to_chat(usr, "\red The reboot system is currently offline. Please wait another [cooldown_time] seconds.") + return user.visible_message("\red \the [user] swipes \his ID card through \the [src], attempting to reboot it.", "\red You swipe your ID card through \the [src], attempting to reboot it.") @@ -152,7 +157,8 @@ if(allowed(usr)) shut_down() else - user << "\red Access denied." + to_chat(user, "\red Access denied.") + return @@ -160,7 +166,8 @@ /mob/living/silicon/robot/drone/emag_act(user as mob) if(!client || stat == 2) - user << "\red There's not much point subverting this heap of junk." + to_chat(user, "\red There's not much point subverting this heap of junk.") + return if(!ishuman(user)) @@ -168,12 +175,16 @@ var/mob/living/carbon/human/H = user if(emagged) - src << "\red [user] attempts to load subversive software into you, but your hacked subroutined ignore the attempt." - user << "\red You attempt to subvert [src], but the sequencer has no effect." + to_chat(src, "\red [user] attempts to load subversive software into you, but your hacked subroutined ignore the attempt.") + + to_chat(user, "\red You attempt to subvert [src], but the sequencer has no effect.") + return - user << "\red You swipe the sequencer across [src]'s interface and watch its eyes flicker." - src << "\red You feel a sudden burst of malware loaded into your execute-as-root buffer. Your tiny brain methodically parses, loads and executes the script." + to_chat(user, "\red You swipe the sequencer across [src]'s interface and watch its eyes flicker.") + + to_chat(src, "\red You feel a sudden burst of malware loaded into your execute-as-root buffer. Your tiny brain methodically parses, loads and executes the script.") + message_admins("[key_name_admin(user)] emagged drone [key_name_admin(src)]. Laws overridden.") log_game("[key_name(user)] emagged drone [key_name(src)]. Laws overridden.") @@ -188,9 +199,11 @@ laws = new /datum/ai_laws/syndicate_override set_zeroth_law("Only [H.real_name] and people he designates as being such are Syndicate Agents.") - src << "Obey these laws:" + to_chat(src, "Obey these laws:") + laws.show_laws(src) - src << "\red \b ALERT: [H.real_name] is your new master. Obey your new laws and his commands." + to_chat(src, "\red \b ALERT: [H.real_name] is your new master. Obey your new laws and his commands.") + return //DRONE LIFE/DEATH @@ -229,18 +242,22 @@ /mob/living/silicon/robot/drone/proc/law_resync() if(stat != 2) if(emagged) - src << "\red You feel something attempting to modify your programming, but your hacked subroutines are unaffected." + to_chat(src, "\red You feel something attempting to modify your programming, but your hacked subroutines are unaffected.") + else - src << "\red A reset-to-factory directive packet filters through your data connection, and you obediently modify your programming to suit it." + to_chat(src, "\red A reset-to-factory directive packet filters through your data connection, and you obediently modify your programming to suit it.") + full_law_reset() show_laws() /mob/living/silicon/robot/drone/proc/shut_down() if(stat != 2) if(emagged) - src << "\red You feel a system kill order percolate through your tiny brain, but it doesn't seem like a good idea to you." + to_chat(src, "\red You feel a system kill order percolate through your tiny brain, but it doesn't seem like a good idea to you.") + else - src << "\red You feel a system kill order percolate through your tiny brain, and you obediently destroy yourself." + to_chat(src, "\red You feel a system kill order percolate through your tiny brain, and you obediently destroy yourself.") + death() /mob/living/silicon/robot/drone/proc/full_law_reset() @@ -278,14 +295,21 @@ player.mob.mind.transfer_to(src) lawupdate = 0 - src << "Systems rebooted. Loading base pattern maintenance protocol... loaded." + to_chat(src, "Systems rebooted. Loading base pattern maintenance protocol... loaded.") + full_law_reset() - src << "
      You are a maintenance drone, a tiny-brained robotic repair machine." - src << "You have no individual will, no personality, and no drives or urges other than your laws." - src << "Use ; to talk to other drones, and say to speak silently to your nearby fellows." - src << "Remember, you are lawed against interference with the crew. Also remember, you DO NOT take orders from the AI." - src << "Don't invade their worksites, don't steal their resources, don't tell them about the changeling in the toilets." - src << "Make sure crew members do not notice you.." + to_chat(src, "
      You are a maintenance drone, a tiny-brained robotic repair machine.") + + to_chat(src, "You have no individual will, no personality, and no drives or urges other than your laws.") + + to_chat(src, "Use ; to talk to other drones, and say to speak silently to your nearby fellows.") + + to_chat(src, "Remember, you are lawed against interference with the crew. Also remember, you DO NOT take orders from the AI.") + + to_chat(src, "Don't invade their worksites, don't steal their resources, don't tell them about the changeling in the toilets.") + + to_chat(src, "Make sure crew members do not notice you..") + /* sprite["Default"] = "repairbot" @@ -321,12 +345,14 @@ else if(istype(AM,/obj/item)) var/obj/item/O = AM if(O.w_class > 2) - src << "You are too small to pull that." + to_chat(src, "You are too small to pull that.") + return else ..() else - src << "You are too small to pull that." + to_chat(src, "You are too small to pull that.") + return /mob/living/silicon/robot/drone/add_robot_verbs() diff --git a/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm b/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm index 50b846c0192..346fa52a0f9 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm @@ -10,13 +10,15 @@ mail_destination = 0 return - src << "\blue You configure your internal beacon, tagging yourself for delivery to '[tag]'." + to_chat(src, "\blue You configure your internal beacon, tagging yourself for delivery to '[tag]'.") + mail_destination = TAGGERLOCATIONS.Find(tag) //Auto flush if we use this verb inside a disposal chute. var/obj/machinery/disposal/D = src.loc if(istype(D)) - src << "\blue \The [D] acknowledges your signal." + to_chat(src, "\blue \The [D] acknowledges your signal.") + D.flush_count = D.flush_every_ticks return @@ -28,10 +30,12 @@ if (layer != TURF_LAYER+0.2) layer = TURF_LAYER+0.2 - src << text("\blue You are now hiding.") + to_chat(src, text("\blue You are now hiding.")) + else layer = MOB_LAYER - src << text("\blue You have stopped hiding.") + to_chat(src, text("\blue You have stopped hiding.")) + /mob/living/silicon/robot/drone/verb/light() set name = "Light On/Off" diff --git a/code/modules/mob/living/silicon/robot/drone/drone_console.dm b/code/modules/mob/living/silicon/robot/drone/drone_console.dm index 7717834b7bb..7fc2aa863df 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_console.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_console.dm @@ -20,7 +20,8 @@ return if(!allowed(user)) - user << "\red Access denied." + to_chat(user, "\red Access denied.") + return interact(user) @@ -54,7 +55,8 @@ return if(!allowed(usr)) - usr << "\red Access denied." + to_chat(usr, "\red Access denied.") + return if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) @@ -69,21 +71,25 @@ return drone_call_area = t_area - usr << "\blue You set the area selector to [drone_call_area]." + to_chat(usr, "\blue You set the area selector to [drone_call_area].") + else if (href_list["ping"]) - usr << "\blue You issue a maintenance request for all active drones, highlighting [drone_call_area]." + to_chat(usr, "\blue You issue a maintenance request for all active drones, highlighting [drone_call_area].") + for(var/mob/living/silicon/robot/drone/D in world) if(D.client && D.stat == 0) - D << "-- Maintenance drone presence requested in: [drone_call_area]." + to_chat(D, "-- Maintenance drone presence requested in: [drone_call_area].") + else if (href_list["resync"]) var/mob/living/silicon/robot/drone/D = locate(href_list["resync"]) if(D.stat != 2) - usr << "\red You issue a law synchronization directive for the drone." + to_chat(usr, "\red You issue a law synchronization directive for the drone.") + D.law_resync() else if (href_list["shutdown"]) @@ -91,7 +97,8 @@ var/mob/living/silicon/robot/drone/D = locate(href_list["shutdown"]) if(D.stat != 2) - usr << "\red You issue a kill command for the unfortunate drone." + to_chat(usr, "\red You issue a kill command for the unfortunate drone.") + message_admins("[key_name_admin(usr)] issued kill order for drone [key_name_admin(D)] from control console.") log_game("[key_name(usr)] issued kill order for [key_name(src)] from control console.") D.shut_down() @@ -106,10 +113,12 @@ continue dronefab = fab - usr << "\blue Drone fabricator located." + to_chat(usr, "\blue Drone fabricator located.") + return - usr << "\red Unable to locate drone fabricator." + to_chat(usr, "\red Unable to locate drone fabricator.") + else if (href_list["toggle_fab"]) @@ -118,10 +127,12 @@ if(get_dist(src,dronefab) > 3) dronefab = null - usr << "\red Unable to locate drone fabricator." + to_chat(usr, "\red Unable to locate drone fabricator.") + return dronefab.produce_drones = !dronefab.produce_drones - usr << "\blue You [dronefab.produce_drones ? "enable" : "disable"] drone production in the nearby fabricator." + to_chat(usr, "\blue You [dronefab.produce_drones ? "enable" : "disable"] drone production in the nearby fabricator.") + src.updateUsrDialog() \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index 2bd7a29f815..939a547da1f 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -72,7 +72,8 @@ return if(!silent) - src.loc << "You drop \the [wrapped]." + to_chat(src.loc, "You drop \the [wrapped].") + wrapped.forceMove(get_turf(src)) wrapped = null @@ -125,12 +126,14 @@ //We can grab the item, finally. if(grab) - user << "You collect \the [I]." + to_chat(user, "You collect \the [I].") + I.forceMove(src) wrapped = I return else - user << "Your gripper cannot hold \the [target]." + to_chat(user, "Your gripper cannot hold \the [target].") + else if(istype(target,/obj/machinery/power/apc)) var/obj/machinery/power/apc/A = target @@ -198,15 +201,18 @@ if(!istype(D)) return - D << "You begin decompiling the other drone." + to_chat(D, "You begin decompiling the other drone.") + if(!do_after(D,50, target = target)) - D << "You need to remain still while decompiling such a large object." + to_chat(D, "You need to remain still while decompiling such a large object.") + return if(!M || !D) return - D << "You carefully and thoroughly decompile your downed fellow, storing as much of its resources as you can within yourself." + to_chat(D, "You carefully and thoroughly decompile your downed fellow, storing as much of its resources as you can within yourself.") + qdel(M) new/obj/effect/decal/cleanable/blood/oil(get_turf(src)) @@ -279,16 +285,19 @@ grabbed_something = 1 if(grabbed_something) - user << "You deploy your decompiler and clear out the contents of \the [T]." + to_chat(user, "You deploy your decompiler and clear out the contents of \the [T].") + else - user << "Nothing on \the [T] is useful to you." + to_chat(user, "Nothing on \the [T] is useful to you.") + return //PRETTIER TOOL LIST. /mob/living/silicon/robot/drone/installed_modules() if(weapon_lock) - src << "Weapon lock active, unable to use modules! Count:[weaponlock_time]" + to_chat(src, "Weapon lock active, unable to use modules! Count:[weaponlock_time]") + return if(!module) diff --git a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm index 3a0bb1d4ad2..040632662a2 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm @@ -48,7 +48,8 @@ /obj/machinery/drone_fabricator/examine(mob/user) ..(user) if(produce_drones && drone_progress >= 100 && istype(user,/mob/dead) && config.allow_drone_spawn && count_drones() < config.max_maint_drones) - user << "
      A drone is prepared. Select 'Join As Drone' from the Ghost tab to spawn as a maintenance drone." + to_chat(user, "
      A drone is prepared. Select 'Join As Drone' from the Ghost tab to spawn as a maintenance drone.") + /obj/machinery/drone_fabricator/proc/count_drones() var/drones = 0 @@ -85,7 +86,8 @@ set desc = "If there is a powered, enabled fabricator in the game world with a prepared chassis, join as a maintenance drone." if(!(config.allow_drone_spawn)) - src << "\red That verb is not currently permitted." + to_chat(src, "\red That verb is not currently permitted.") + return if (!src.stat) @@ -95,17 +97,20 @@ return 0 //something is terribly wrong if(jobban_isbanned(src,"nonhumandept") || jobban_isbanned(src,"Drone")) - usr << "\red You are banned from playing drones and cannot spawn as a drone." + to_chat(usr, "\red You are banned from playing drones and cannot spawn as a drone.") + return if(!ticker || ticker.current_state < 3) - src << "You can't join as a drone before the game starts!" + to_chat(src, "You can't join as a drone before the game starts!") + return var/drone_age = 14 // 14 days to play as a drone var/player_age_check = check_client_age(usr.client, drone_age) if(player_age_check && config.use_age_restriction_for_antags) - usr << "This role is not yet available to you. You need to wait another [player_age_check] days." + to_chat(usr, "This role is not yet available to you. You need to wait another [player_age_check] days.") + return var/deathtime = world.time - src.timeofdeath @@ -113,7 +118,8 @@ if(istype(src,/mob/dead/observer)) var/mob/dead/observer/G = src if(G.has_enabled_antagHUD == 1 && config.antag_hud_restricted) - usr << "\blue Upon using the antagHUD you forfeited the ability to join the round." + to_chat(usr, "\blue Upon using the antagHUD you forfeited the ability to join the round.") + return if(G.started_as_observer == 1) joinedasobserver = 1 @@ -129,8 +135,10 @@ var/deathtimeseconds = round((deathtime - deathtimeminutes * 600) / 10,1) if (deathtime < 6000 && joinedasobserver == 0) - usr << "You have been dead for[pluralcheck] [deathtimeseconds] seconds." - usr << "You must wait 10 minutes to respawn as a drone!" + to_chat(usr, "You have been dead for[pluralcheck] [deathtimeseconds] seconds.") + + to_chat(usr, "You must wait 10 minutes to respawn as a drone!") + return for(var/obj/machinery/drone_fabricator/DF in world) @@ -138,11 +146,13 @@ continue if(DF.count_drones() >= config.max_maint_drones) - src << "\red There are too many active drones in the world for you to spawn." + to_chat(src, "\red There are too many active drones in the world for you to spawn.") + return if(DF.drone_progress >= 100) DF.create_drone(src.client) return - src << "\red There are no available drone spawn points, sorry." \ No newline at end of file + to_chat(src, "\red There are no available drone spawn points, sorry.") + diff --git a/code/modules/mob/living/silicon/robot/drone/drone_say.dm b/code/modules/mob/living/silicon/robot/drone/drone_say.dm index b08e9c32145..99a372f7f21 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_say.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_say.dm @@ -2,7 +2,8 @@ if(local_transmit) if (src.client) if(client.prefs.muted & MUTE_IC) - src << "You cannot send IC messages (muted)." + to_chat(src, "You cannot send IC messages (muted).") + return 0 if (src.client.handle_spam_prevention(message,MUTE_IC)) return 0 @@ -29,13 +30,15 @@ for(var/mob/living/silicon/D in listeners) if(D.client && D.local_transmit) - D << "[src] transmits, \"[message]\"" + to_chat(D, "[src] transmits, \"[message]\"") + for (var/mob/M in player_list) if (istype(M, /mob/new_player)) continue - else if(M.stat == 2 && M.client.prefs.toggles & CHAT_GHOSTEARS) - if(M.client) M << "[src] transmits, \"[message]\"" + else if(M.stat == 2 && M.client && M.client.prefs.toggles & CHAT_GHOSTEARS) + to_chat(M, "[src] transmits, \"[message]\"") + return 1 return ..(message, 0) diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm index 2ad6045b01d..5d5b3cf0811 100644 --- a/code/modules/mob/living/silicon/robot/emote.dm +++ b/code/modules/mob/living/silicon/robot/emote.dm @@ -143,7 +143,8 @@ playsound(src.loc, 'sound/voice/biamthelaw.ogg', 50, 0) m_type = 2 else - src << "You are not THE LAW, pal." + to_chat(src, "You are not THE LAW, pal.") + if("halt") if (istype(module,/obj/item/weapon/robot_module/security)) @@ -152,7 +153,8 @@ playsound(src.loc, 'sound/voice/halt.ogg', 50, 0) m_type = 2 else - src << "You are not security." + to_chat(src, "You are not security.") + if ("flip") m_type = 1 @@ -160,6 +162,7 @@ src.SpinAnimation(5,1) if ("help") - src << "salute, bow-(none)/mob, clap, flap, aflap, twitch, twitch_s, nod, deathgasp, glare-(none)/mob, stare-(none)/mob, look, beep, ping, \nbuzz, law, halt" + to_chat(src, "salute, bow-(none)/mob, clap, flap, aflap, twitch, twitch_s, nod, deathgasp, glare-(none)/mob, stare-(none)/mob, look, beep, ping, \nbuzz, law, halt") + ..(act, m_type, message) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/examine.dm b/code/modules/mob/living/silicon/robot/examine.dm index 0ac9da63052..d664fae834c 100644 --- a/code/modules/mob/living/silicon/robot/examine.dm +++ b/code/modules/mob/living/silicon/robot/examine.dm @@ -44,5 +44,6 @@ pose = addtext(pose,".") //Makes sure all emotes end with a period. msg += "\nIt is [pose]" - user << msg + to_chat(user, msg) + user.showLaws(src) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index bd22309007d..30c29527128 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -43,14 +43,16 @@ if(!(locate(O) in src.module.modules) && O != src.module.emag) return if(activated(O)) - src << "Already activated" + to_chat(src, "Already activated") + return if (is_component_functioning("power cell") && cell) if(istype(O, /obj/item/borg)) var/obj/item/borg/B = O if(B.powerneeded) if((cell.charge * 100 / cell.maxcharge) < B.powerneeded) - src << "Not enough power to activate [B.name]!" + to_chat(src, "Not enough power to activate [B.name]!") + return if(!module_state_1) O.mouse_opacity = initial(O.mouse_opacity) @@ -77,7 +79,8 @@ if(istype(module_state_3,/obj/item/borg/sight)) sight_mode |= module_state_3:sight_mode else - src << "You need to disable a module first!" + to_chat(src, "You need to disable a module first!") + src.update_icons() /mob/living/silicon/robot/proc/uneq_active() diff --git a/code/modules/mob/living/silicon/robot/laws.dm b/code/modules/mob/living/silicon/robot/laws.dm index 2dc3b4e3916..394e7f79bde 100644 --- a/code/modules/mob/living/silicon/robot/laws.dm +++ b/code/modules/mob/living/silicon/robot/laws.dm @@ -14,30 +14,39 @@ if(lawupdate) if (connected_ai) if(connected_ai.stat || connected_ai.control_disabled) - src << "AI signal lost, unable to sync laws." + to_chat(src, "AI signal lost, unable to sync laws.") + else lawsync() photosync() - src << "Laws synced with AI, be sure to note any changes." + to_chat(src, "Laws synced with AI, be sure to note any changes.") + // TODO: Update to new antagonist system. if(mind && mind.special_role == "traitor" && mind.original == src) - src << "Remember, your AI does NOT share or know about your law 0." + to_chat(src, "Remember, your AI does NOT share or know about your law 0.") + else - src << "No AI selected to sync laws with, disabling lawsync protocol." + to_chat(src, "No AI selected to sync laws with, disabling lawsync protocol.") + lawupdate = 0 - who << "Obey these laws:" + to_chat(who, "Obey these laws:") + laws.show_laws(who) // TODO: Update to new antagonist system. if (mind && (mind.special_role == "traitor" && mind.original == src) && connected_ai) - who << "Remember, [connected_ai.name] is technically your master, but your objective comes first." + to_chat(who, "Remember, [connected_ai.name] is technically your master, but your objective comes first.") + else if (connected_ai) - who << "Remember, [connected_ai.name] is your master, other AIs can be ignored." + to_chat(who, "Remember, [connected_ai.name] is your master, other AIs can be ignored.") + else if (emagged) - who << "Remember, you are not required to listen to the AI." + to_chat(who, "Remember, you are not required to listen to the AI.") + else - who << "Remember, you are not bound to any AI, you are not required to listen to them." + to_chat(who, "Remember, you are not bound to any AI, you are not required to listen to them.") + /mob/living/silicon/robot/lawsync() diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index a753ce862cf..010ffb676d7 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -29,7 +29,8 @@ for(var/obj/item/borg/B in get_all_slots()) if(B.powerneeded) if((cell.charge * 100 / cell.maxcharge) < B.powerneeded) - src << "Deactivating [B.name] due to lack of power!" + to_chat(src, "Deactivating [B.name] due to lack of power!") + uneq_module(B) if(cell.charge <= 0) uneq_all() @@ -102,15 +103,18 @@ if(!istype(src, /mob/living/silicon/robot/drone)) if(health < 50) //Gradual break down of modules as more damage is sustained if(uneq_module(module_state_3)) - src << "SYSTEM ERROR: Module 3 OFFLINE." + to_chat(src, "SYSTEM ERROR: Module 3 OFFLINE.") + if(health < 0) if(uneq_module(module_state_2)) - src << "SYSTEM ERROR: Module 2 OFFLINE." + to_chat(src, "SYSTEM ERROR: Module 2 OFFLINE.") + if(health < -50) if(uneq_module(module_state_1)) - src << "CRITICAL ERROR: All modules OFFLINE." + to_chat(src, "CRITICAL ERROR: All modules OFFLINE.") + if(paralysis || stunned || weakened) stat = UNCONSCIOUS @@ -277,7 +281,8 @@ weaponlock_time -- if(weaponlock_time <= 0) if(src.client) - src << "\red Weapon Lock Timed Out!" + to_chat(src, "\red Weapon Lock Timed Out!") + weapon_lock = 0 weaponlock_time = 120 diff --git a/code/modules/mob/living/silicon/robot/photos.dm b/code/modules/mob/living/silicon/robot/photos.dm index fbcc3bf4842..6fdee77418c 100644 --- a/code/modules/mob/living/silicon/robot/photos.dm +++ b/code/modules/mob/living/silicon/robot/photos.dm @@ -10,4 +10,5 @@ aiCamera.printpicture(null, z) synced = 1 if(synced) - src << "Locally saved images synced with AI. Images were retained in local database in case of loss of connection with the AI." + to_chat(src, "Locally saved images synced with AI. Images were retained in local database in case of loss of connection with the AI.") + diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index b887de3857e..236b5f3316e 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -247,7 +247,8 @@ var/list/robot_verbs_default = list( mind.transfer_to(mmi.brainmob) mmi.update_icon() else - src << "Oops! Something went very wrong, your MMI was unable to receive your mind. You have been ghosted. Please make a bug report so we can fix this bug." + to_chat(src, "Oops! Something went very wrong, your MMI was unable to receive your mind. You have been ghosted. Please make a bug report so we can fix this bug.") + ghostize() error("A borg has been destroyed, but its MMI lacked a brainmob, so the mind could not be transferred. Player: [ckey].") mmi = null @@ -266,7 +267,8 @@ var/list/robot_verbs_default = list( return var/list/modules = list("Standard", "Engineering", "Medical", "Miner", "Janitor", "Service", "Security") if(security_level == (SEC_LEVEL_GAMMA || SEC_LEVEL_EPSILON) || crisis) - src << "\red Crisis mode active. Combat module available." + to_chat(src, "\red Crisis mode active. Combat module available.") + modules+="Combat" if(ticker && ticker.mode && ticker.mode.name == "nations") var/datum/game_mode/nations/N = ticker.mode @@ -417,7 +419,8 @@ var/list/robot_verbs_default = list( set name = "Self Diagnosis" if(!is_component_functioning("diagnosis unit")) - src << "\red Your self-diagnosis component isn't functioning." + to_chat(src, "\red Your self-diagnosis component isn't functioning.") + var/dat = self_diagnosis() src << browse(dat, "window=robotdiagnosis") @@ -442,10 +445,12 @@ var/list/robot_verbs_default = list( var/datum/robot_component/C = components[toggle] if(C.toggled) C.toggled = 0 - src << "\red You disable [C.name]." + to_chat(src, "\red You disable [C.name].") + else C.toggled = 1 - src << "\red You enable [C.name]." + to_chat(src, "\red You enable [C.name].") + /mob/living/silicon/robot/proc/sensor_mode() set name = "Set Sensor Augmentation" @@ -553,7 +558,8 @@ var/list/robot_verbs_default = list( var/mob/tmob = AM if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations)) if(prob(20)) - usr << "\red You fail to push [tmob]'s fat ass out of the way." + to_chat(usr, "\red You fail to push [tmob]'s fat ass out of the way.") + now_pushing = 0 return if(!(tmob.status_flags & CANPUSH)) @@ -595,7 +601,8 @@ var/list/robot_verbs_default = list( C.brute_damage = WC.brute C.electronics_damage = WC.burn - usr << "\blue You install the [W.name]." + to_chat(usr, "\blue You install the [W.name].") + return @@ -603,7 +610,8 @@ var/list/robot_verbs_default = list( if(W == module_active) return if (!getBruteLoss()) - user << "Nothing to fix!" + to_chat(user, "Nothing to fix!") + return var/obj/item/weapon/weldingtool/WT = W user.changeNext_move(CLICK_CD_MELEE) @@ -614,13 +622,15 @@ var/list/robot_verbs_default = list( add_fingerprint(user) user.visible_message("\The [user] patches some dents on \the [src] with \the [WT].") else - user << "Need more welding fuel!" + to_chat(user, "Need more welding fuel!") + return else if(istype(W, /obj/item/stack/cable_coil) && user.a_intent == I_HELP && (wiresexposed || istype(src,/mob/living/silicon/robot/drone))) if (!getFireLoss()) - user << "Nothing to fix!" + to_chat(user, "Nothing to fix!") + return var/obj/item/stack/cable_coil/coil = W adjustFireLoss(-30) @@ -632,18 +642,22 @@ var/list/robot_verbs_default = list( else if (istype(W, /obj/item/weapon/crowbar)) // crowbar means open or close the cover if(opened) if(cell) - user << "You close the cover." + to_chat(user, "You close the cover.") + opened = 0 update_icons() else if(wiresexposed && wires.IsAllCut()) //Cell is out, wires are exposed, remove MMI, produce damaged chassis, baleet original mob. if(!mmi) - user << "\The [src] has no brain to remove." + to_chat(user, "\The [src] has no brain to remove.") + return - user << "You jam the crowbar into the robot and begin levering [mmi]." + to_chat(user, "You jam the crowbar into the robot and begin levering [mmi].") + if(do_after(user,3 SECONDS, target = src)) - user << "You damage some parts of the chassis, but eventually manage to rip out [mmi]!" + to_chat(user, "You damage some parts of the chassis, but eventually manage to rip out [mmi]!") + var/obj/item/robot_parts/robot_suit/C = new/obj/item/robot_parts/robot_suit(loc) C.l_leg = new/obj/item/robot_parts/l_leg(C) C.r_leg = new/obj/item/robot_parts/r_leg(C) @@ -669,7 +683,8 @@ var/list/robot_verbs_default = list( return var/datum/robot_component/C = components[remove] var/obj/item/robot_parts/robot_component/I = C.wrapped - user << "You remove \the [I]." + to_chat(user, "You remove \the [I].") + if(istype(I)) I.brute = C.brute_damage I.burn = C.electronics_damage @@ -682,23 +697,28 @@ var/list/robot_verbs_default = list( else if(locked) - user << "The cover is locked and cannot be opened." + to_chat(user, "The cover is locked and cannot be opened.") + else - user << "You open the cover." + to_chat(user, "You open the cover.") + opened = 1 update_icons() else if (istype(W, /obj/item/weapon/stock_parts/cell) && opened) // trying to put a cell inside var/datum/robot_component/C = components["power cell"] if(wiresexposed) - user << "Close the panel first." + to_chat(user, "Close the panel first.") + else if(cell) - user << "There is a power cell already installed." + to_chat(user, "There is a power cell already installed.") + else user.drop_item() W.loc = src cell = W - user << "You insert the power cell." + to_chat(user, "You insert the power cell.") + C.installed = 1 C.wrapped = W @@ -712,55 +732,68 @@ var/list/robot_verbs_default = list( if (wiresexposed) wires.Interact(user) else - user << "You can't reach the wiring." + to_chat(user, "You can't reach the wiring.") + else if(istype(W, /obj/item/weapon/screwdriver) && opened && !cell) // haxing wiresexposed = !wiresexposed - user << "The wires have been [wiresexposed ? "exposed" : "unexposed"]" + to_chat(user, "The wires have been [wiresexposed ? "exposed" : "unexposed"]") + update_icons() else if(istype(W, /obj/item/weapon/screwdriver) && opened && cell) // radio if(radio) radio.attackby(W,user)//Push it to the radio to let it handle everything else - user << "Unable to locate a radio." + to_chat(user, "Unable to locate a radio.") + update_icons() else if(istype(W, /obj/item/device/encryptionkey/) && opened) if(radio)//sanityyyyyy radio.attackby(W,user)//GTFO, you have your own procs else - user << "Unable to locate a radio." + to_chat(user, "Unable to locate a radio.") + else if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) // trying to unlock the interface with an ID card if(emagged)//still allow them to open the cover - user << "The interface seems slightly damaged" + to_chat(user, "The interface seems slightly damaged") + if(opened) - user << "You must close the cover to swipe an ID card." + to_chat(user, "You must close the cover to swipe an ID card.") + else if(allowed(usr)) locked = !locked - user << "You [ locked ? "lock" : "unlock"] [src]'s interface." + to_chat(user, "You [ locked ? "lock" : "unlock"] [src]'s interface.") + update_icons() else - user << "\red Access denied." + to_chat(user, "\red Access denied.") + else if(istype(W, /obj/item/borg/upgrade/)) var/obj/item/borg/upgrade/U = W if(!opened) - user << "You must access the borgs internals!" + to_chat(user, "You must access the borgs internals!") + else if(!src.module && U.require_module) - user << "The borg must choose a module before it can be upgraded!" + to_chat(user, "The borg must choose a module before it can be upgraded!") + else if(U.locked) - user << "The upgrade is locked and cannot be used yet!" + to_chat(user, "The upgrade is locked and cannot be used yet!") + else if(!user.drop_item()) return if(U.action(src)) - user << "You apply the upgrade to [src]." + to_chat(user, "You apply the upgrade to [src].") + U.forceMove(src) else - user << "Upgrade error." + to_chat(user, "Upgrade error.") + else spark_system.start() @@ -772,16 +805,19 @@ var/list/robot_verbs_default = list( var/mob/living/M = user if(!opened)//Cover is closed if(locked) - user << "You emag the cover lock." + to_chat(user, "You emag the cover lock.") + locked = 0 else - user << "The cover is already unlocked." + to_chat(user, "The cover is already unlocked.") + return if(opened)//Cover is open if(emagged) return//Prevents the X has hit Y with Z message also you cant emag them twice if(wiresexposed) - user << "You must close the panel first" + to_chat(user, "You must close the panel first") + return else sleep(6) @@ -789,7 +825,8 @@ var/list/robot_verbs_default = list( if(src.hud_used) src.hud_used.update_robot_modules_display() //Shows/hides the emag item if the inventory screen is already open. disconnect_from_ai() - user << "You emag [src]'s interface." + to_chat(user, "You emag [src]'s interface.") + // message_admins("[key_name_admin(user)] emagged cyborg [key_name_admin(src)]. Laws overridden.") log_game("[key_name(user)] emagged cyborg [key_name(src)]. Laws overridden.") clear_supplied_laws() @@ -798,22 +835,31 @@ var/list/robot_verbs_default = list( var/time = time2text(world.realtime,"hh:mm:ss") lawchanges.Add("[time] : [M.name]([M.key]) emagged [name]([key])") set_zeroth_law("Only [M.real_name] and people he designates as being such are Syndicate Agents.") - src << "\red ALERT: Foreign software detected." + to_chat(src, "\red ALERT: Foreign software detected.") + sleep(5) - src << "\red Initiating diagnostics..." + to_chat(src, "\red Initiating diagnostics...") + sleep(20) - src << "\red SynBorg v1.7 loaded." + to_chat(src, "\red SynBorg v1.7 loaded.") + sleep(5) - src << "\red LAW SYNCHRONISATION ERROR" + to_chat(src, "\red LAW SYNCHRONISATION ERROR") + sleep(5) - src << "\red Would you like to send a report to NanoTraSoft? Y/N" + to_chat(src, "\red Would you like to send a report to NanoTraSoft? Y/N") + sleep(10) - src << "\red > N" + to_chat(src, "\red > N") + sleep(20) - src << "\red ERRORERRORERROR" - src << "Obey these laws:" + to_chat(src, "\red ERRORERRORERROR") + + to_chat(src, "Obey these laws:") + laws.show_laws(src) - src << "\red \b ALERT: [M.real_name] is your new master. Obey your new laws and his commands." + to_chat(src, "\red \b ALERT: [M.real_name] is your new master. Obey your new laws and his commands.") + if(src.module && istype(src.module, /obj/item/weapon/robot_module/miner)) for(var/obj/item/weapon/pickaxe/drill/cyborg/D in src.module.modules) qdel(D) @@ -837,15 +883,18 @@ var/list/robot_verbs_default = list( if("Yes") locked = 0 update_icons() - usr << "You unlock your cover." + to_chat(usr, "You unlock your cover.") + /mob/living/silicon/robot/attack_alien(mob/living/carbon/alien/humanoid/M as mob) if (!ticker) - M << "You cannot attack people before the game has started." + to_chat(M, "You cannot attack people before the game has started.") + return if (istype(loc, /turf) && istype(loc.loc, /area/start)) - M << "No attacking people at spawn, you jackass." + to_chat(M, "No attacking people at spawn, you jackass.") + return switch(M.a_intent) @@ -947,7 +996,8 @@ var/list/robot_verbs_default = list( cell.updateicon() cell.add_fingerprint(user) user.put_in_active_hand(cell) - user << "You remove \the [cell]." + to_chat(user, "You remove \the [cell].") + cell = null update_icons() diag_hud_set_borgcell() @@ -1032,7 +1082,8 @@ var/list/robot_verbs_default = list( /mob/living/silicon/robot/proc/installed_modules() if(weapon_lock) - src << "\red Weapon lock active, unable to use modules! Count:[weaponlock_time]" + to_chat(src, "\red Weapon lock active, unable to use modules! Count:[weaponlock_time]") + return if(!module) @@ -1119,9 +1170,11 @@ var/list/robot_verbs_default = list( module_state_3 = null contents -= O else - src << "Module isn't activated." + to_chat(src, "Module isn't activated.") + else - src << "Module isn't activated" + to_chat(src, "Module isn't activated") + installed_modules() return 1 @@ -1132,19 +1185,22 @@ var/list/robot_verbs_default = list( /mob/living/silicon/robot/proc/control_headlamp() if(stat || lamp_recharging) - src << "This function is currently offline." + to_chat(src, "This function is currently offline.") + return //Some sort of magical "modulo" thing which somehow increments lamp power by 2, until it hits the max and resets to 0. lamp_intensity = (lamp_intensity+2) % (lamp_max+2) - src << "[lamp_intensity ? "Headlamp power set to Level [lamp_intensity/2]" : "Headlamp disabled."]" + to_chat(src, "[lamp_intensity ? "Headlamp power set to Level [lamp_intensity/2]" : "Headlamp disabled."]") + update_headlamp() /mob/living/silicon/robot/proc/update_headlamp(var/turn_off = 0, var/cooldown = 100) set_light(0) if(lamp_intensity && (turn_off || stat)) - src << "Your headlamp has been deactivated." + to_chat(src, "Your headlamp has been deactivated.") + lamp_intensity = 0 lamp_recharging = 1 spawn(cooldown) //10 seconds by default, if the source of the deactivation does not keep stat that long. @@ -1200,7 +1256,8 @@ var/list/robot_verbs_default = list( cleaned_human.shoes.clean_blood() cleaned_human.update_inv_shoes(0,0) cleaned_human.clean_blood() - cleaned_human << "[src] cleans your face!" + to_chat(cleaned_human, "[src] cleans your face!") + return #undef BORG_CAMERA_BUFFER @@ -1238,7 +1295,8 @@ var/list/robot_verbs_default = list( if(R) R.UnlinkSelf() - R << "Buffers flushed and reset. Camera system shutdown. All systems operational." + to_chat(R, "Buffers flushed and reset. Camera system shutdown. All systems operational.") + src.verbs -= /mob/living/silicon/robot/proc/ResetSecurityCodes /mob/living/silicon/robot/mode() @@ -1282,7 +1340,8 @@ var/list/robot_verbs_default = list( update_module_icon() lockcharge = null else - src << "Something is badly wrong with the sprite selection. Harass a coder." + to_chat(src, "Something is badly wrong with the sprite selection. Harass a coder.") + icon_state = module_sprites[1] lockcharge = null return @@ -1298,18 +1357,22 @@ var/list/robot_verbs_default = list( triesleft = 0 return else - src << "Your icon has been set. You now require a module reset to change it." + to_chat(src, "Your icon has been set. You now require a module reset to change it.") + /mob/living/silicon/robot/proc/notify_ai(var/notifytype, var/oldname, var/newname) if(!connected_ai) return switch(notifytype) if(1) //New Cyborg - connected_ai << "

      NOTICE - New cyborg connection detected: [name]
      " + to_chat(connected_ai, "

      NOTICE - New cyborg connection detected: [name]
      ") + if(2) //New Module - connected_ai << "

      NOTICE - Cyborg module change detected: [name] has loaded the [designation] module.
      " + to_chat(connected_ai, "

      NOTICE - Cyborg module change detected: [name] has loaded the [designation] module.
      ") + if(3) //New Name - connected_ai << "

      NOTICE - Cyborg reclassification detected: [oldname] is now designated as [newname].
      " + to_chat(connected_ai, "

      NOTICE - Cyborg reclassification detected: [oldname] is now designated as [newname].
      ") + /mob/living/silicon/robot/proc/disconnect_from_ai() if(connected_ai) @@ -1362,7 +1425,8 @@ var/list/robot_verbs_default = list( /mob/living/silicon/robot/deathsquad/attack_hand(mob/user) if(isnull(ckey) && !searching_for_ckey) searching_for_ckey = 1 - user << "Now checking for possible borgs." + to_chat(user, "Now checking for possible borgs.") + var/list/borg_candidates = pollCandidates("Do you want to play as a Nanotrasen Combat borg?") if(borg_candidates.len > 0 && isnull(ckey)) searching_for_ckey = 0 @@ -1374,10 +1438,12 @@ var/list/robot_verbs_default = list( key = M.key else searching_for_ckey = 0 - user << "Unable to connect to Central Command. Please wait and try again later." + to_chat(user, "Unable to connect to Central Command. Please wait and try again later.") + return else - user << "[src] is already checking for possible borgs." + to_chat(user, "[src] is already checking for possible borgs.") + return /mob/living/silicon/robot/syndicate @@ -1410,7 +1476,8 @@ var/list/robot_verbs_default = list( spawn(5) if(playstyle_string) - src << playstyle_string + to_chat(src, playstyle_string) + playsound(loc, 'sound/mecha/nominalsyndi.ogg', 75, 0) diff --git a/code/modules/mob/living/silicon/robot/robot_damage.dm b/code/modules/mob/living/silicon/robot/robot_damage.dm index a8bd77155fa..7b52c10f96a 100644 --- a/code/modules/mob/living/silicon/robot/robot_damage.dm +++ b/code/modules/mob/living/silicon/robot/robot_damage.dm @@ -8,8 +8,10 @@ update_revive() var/mob/dead/observer/ghost = get_ghost() if(ghost) - ghost << "Your cyborg shell has been repaired, re-enter if you want to continue! (Verbs -> Ghost -> Re-enter corpse)" - ghost << sound('sound/effects/genetics.ogg') + to_chat(ghost, "Your cyborg shell has been repaired, re-enter if you want to continue! (Verbs -> Ghost -> Re-enter corpse)") + + to_chat(ghost, sound('sound/effects/genetics.ogg')) + return @@ -90,11 +92,13 @@ cell.charge -= cost if(cell.charge <= 0) cell.charge = 0 - src << "\red Your shield has overloaded!" + to_chat(src, "\red Your shield has overloaded!") + else brute -= absorb_brute burn -= absorb_burn - src << "\red Your shield absorbs some of the impact!" + to_chat(src, "\red Your shield absorbs some of the impact!") + var/datum/robot_component/armour/A = get_armour() if(A) @@ -141,11 +145,13 @@ cell.charge -= cost if(cell.charge <= 0) cell.charge = 0 - src << "\red Your shield has overloaded!" + to_chat(src, "\red Your shield has overloaded!") + else brute -= absorb_brute burn -= absorb_burn - src << "\red Your shield absorbs some of the impact!" + to_chat(src, "\red Your shield absorbs some of the impact!") + var/datum/robot_component/armour/A = get_armour() if(A) diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm index 965503cb288..7ef838c4a18 100644 --- a/code/modules/mob/living/silicon/robot/robot_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_items.dm @@ -21,7 +21,8 @@ mode = 2 else mode = 1 - user << "Changed printing mode to '[mode == 2 ? "Rename Paper" : "Write Paper"]'" + to_chat(user, "Changed printing mode to '[mode == 2 ? "Rename Paper" : "Write Paper"]'") + playsound(src.loc, 'sound/effects/pop.ogg', 50, 0) return diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm index bcbcb1632f4..956e5927fcc 100644 --- a/code/modules/mob/living/silicon/say.dm +++ b/code/modules/mob/living/silicon/say.dm @@ -8,7 +8,8 @@ return 1 if(message_mode) if(!is_component_functioning("radio")) - src << "Your radio isn't functional at this time." + to_chat(src, "Your radio isn't functional at this time.") + return 0 if(message_mode == "general") message_mode = null @@ -21,7 +22,8 @@ return holopad_talk(message, verb, speaking) else if(message_mode) if (aiRadio.disabledAi || aiRestorePowerRoutine || stat) - src << "System Error - Transceiver Disabled." + to_chat(src, "System Error - Transceiver Disabled.") + return 0 if(message_mode == "general") message_mode = null @@ -82,11 +84,15 @@ if(speaking) rendered_a = "[name] [speaking.format_message(message, verb)]" rendered_b = "[voice_name] [speaking.format_message(message_stars, verb)]" - src << "Holopad transmitted, [real_name] [speaking.format_message(message, verb)]"//The AI can "hear" its own message. + to_chat(src, "Holopad transmitted, [real_name] [speaking.format_message(message, verb)]")//The AI can "hear" its own message. + + else rendered_a = "[name] [verb], \"[message]\"" rendered_b = "[voice_name] [verb], \"[message_stars]\"" - src << "Holopad transmitted, [real_name] [verb], \"[message]\""//The AI can "hear" its own message. + to_chat(src, "Holopad transmitted, [real_name] [verb], \"[message]\"")//The AI can "hear" its own message. + + for(var/mob/M in hearers(T.loc))//The location is the object, default distance. if(M.say_understands(src))//If they understand AI speak. Humans and the like will be able to. @@ -96,7 +102,8 @@ /*Radios "filter out" this conversation channel so we don't need to account for them. This is another way of saying that we won't bother dealing with them.*/ else - src << "No holopad connected." + to_chat(src, "No holopad connected.") + return return 1 @@ -112,12 +119,14 @@ var/obj/machinery/hologram/holopad/T = src.holo if(T && T.hologram && T.master == src) var/rendered = "[name] [message]" - src << "Holopad action relayed, [real_name] [message]" + to_chat(src, "Holopad action relayed, [real_name] [message]") + for(var/mob/M in viewers(T.loc)) M.show_message(rendered, 2) else //This shouldn't occur, but better safe then sorry. - src << "No holopad connected." + to_chat(src, "No holopad connected.") + return return 1 diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index c76b159e452..f7813d04b45 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -74,8 +74,10 @@ src.take_organ_damage(10) Stun(3) flash_eyes(affect_silicon = 1) - src << "\red *BZZZT*" - src << "\red Warning: Electromagnetic pulse detected." + to_chat(src, "\red *BZZZT*") + + to_chat(src, "\red Warning: Electromagnetic pulse detected.") + ..() @@ -84,7 +86,8 @@ /mob/living/silicon/can_inject(var/mob/user, var/error_msg) if(error_msg) - user << "Their outer shell is too tough." + to_chat(user, "Their outer shell is too tough.") + return 0 /mob/living/silicon/IsAdvancedToolUser() @@ -279,15 +282,19 @@ switch(sensor_type) if ("Security") add_sec_hud() - src << "Security records overlay enabled." + to_chat(src, "Security records overlay enabled.") + if ("Medical") add_med_hud() - src << "Life signs monitor overlay enabled." + to_chat(src, "Life signs monitor overlay enabled.") + if ("Diagnostic") add_diag_hud() - src << "Robotics diagnostic overlay enabled." + to_chat(src, "Robotics diagnostic overlay enabled.") + if ("Disable") - src << "Sensor augmentations disabled." + to_chat(src, "Sensor augmentations disabled.") + /mob/living/silicon/proc/receive_alarm(var/datum/alarm_handler/alarm_handler, var/datum/alarm/alarm, was_raised) if(!next_alarm_notice) @@ -317,7 +324,8 @@ if(alarms[A] == 1) if(!reported) reported = 1 - src << "--- [AH.category] Detected ---" + to_chat(src, "--- [AH.category] Detected ---") + raised_alarm(A) for(var/datum/alarm_handler/AH in queued_alarms) @@ -327,24 +335,29 @@ if(alarms[A] == -1) if(!reported) reported = 1 - src << "--- [AH.category] Cleared ---" - src << "\The [A.alarm_name()]." + to_chat(src, "--- [AH.category] Cleared ---") + + to_chat(src, "\The [A.alarm_name()].") + if(alarm_raised) - src << "\[Show Alerts\]" + to_chat(src, "\[Show Alerts\]") + for(var/datum/alarm_handler/AH in queued_alarms) var/list/alarms = queued_alarms[AH] alarms.Cut() /mob/living/silicon/proc/raised_alarm(var/datum/alarm/A) - src << "[A.alarm_name()]!" + to_chat(src, "[A.alarm_name()]!") + /mob/living/silicon/ai/raised_alarm(var/datum/alarm/A) var/cameratext = "" for(var/obj/machinery/camera/C in A.cameras()) cameratext += "[(cameratext == "")? "" : "|"][C.c_tag]" - src << "[A.alarm_name()]! ([(cameratext)? cameratext : "No Camera"])" + to_chat(src, "[A.alarm_name()]! ([(cameratext)? cameratext : "No Camera"])") + /mob/living/silicon/adjustToxLoss(var/amount) return diff --git a/code/modules/mob/living/simple_animal/bees.dm b/code/modules/mob/living/simple_animal/bees.dm index 687041617be..438c60528e8 100644 --- a/code/modules/mob/living/simple_animal/bees.dm +++ b/code/modules/mob/living/simple_animal/bees.dm @@ -44,7 +44,8 @@ if( prob(sting_prob) && (M.stat == CONSCIOUS || (M.stat == UNCONSCIOUS && prob(25))) ) // Try to sting! If you're not moving, think about stinging. M.apply_damage(min(strength,2)+mut, BRUTE, sharp=1) // Stinging. The more mutated I am, the harder I sting. M.apply_damage((round(feral/10,1)*(max((round(strength/20,1)),1)))+toxic, TOX) // Bee venom based on how angry I am and how many there are of me! - M << "\red You have been stung!" + to_chat(M, "\red You have been stung!") + //if we're chasing someone, get a little bit angry if(target_mob && prob(10)) diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index c338bb22e7f..89075e51173 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -177,7 +177,8 @@ if(locked) //First emag application unlocks the bot's interface. Apply a screwdriver to use the emag again. locked = 0 emagged = 1 - user << "You bypass [src]'s controls." + to_chat(user, "You bypass [src]'s controls.") + return if(!locked && open) //Bot panel is unlocked by ID or emag, and the panel is screwed open. Ready for emagging. emagged = 2 @@ -185,22 +186,27 @@ locked = 1 //Access denied forever! bot_reset() turn_on() //The bot automatically turns on when emagged, unless recently hit with EMP. - src << "(#$*#$^^( OVERRIDE DETECTED" + to_chat(src, "(#$*#$^^( OVERRIDE DETECTED") + show_laws() add_logs(user, src, "emagged") return else //Bot is unlocked, but the maint panel has not been opened with a screwdriver yet. - user << "You need to open maintenance panel first!" + to_chat(user, "You need to open maintenance panel first!") + /mob/living/simple_animal/bot/examine(mob/user) ..() if(health < maxHealth) if(health > maxHealth/3) - user << "[src]'s parts look loose." + to_chat(user, "[src]'s parts look loose.") + else - user << "[src]'s parts look very loose!" + to_chat(user, "[src]'s parts look very loose!") + else - user << "[src] is in pristine condition." + to_chat(user, "[src] is in pristine condition.") + /mob/living/simple_animal/bot/adjustBruteLoss(amount) . = ..() @@ -262,7 +268,8 @@ if(!topic_denied(user)) interact(user) else - user << "[src]'s interface is not responding!" + to_chat(user, "[src]'s interface is not responding!") + /mob/living/simple_animal/bot/proc/interact(mob/user) show_controls(user) @@ -271,23 +278,30 @@ if(istype(W, /obj/item/weapon/screwdriver)) if(!locked) open = !open - user << "The maintenance panel is now [open ? "opened" : "closed"]." + to_chat(user, "The maintenance panel is now [open ? "opened" : "closed"].") + else - user << "The maintenance panel is locked." + to_chat(user, "The maintenance panel is locked.") + else if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda)) if(bot_core.allowed(user) && !open && !emagged) locked = !locked - user << "Controls are now [locked ? "locked." : "unlocked."]" + to_chat(user, "Controls are now [locked ? "locked." : "unlocked."]") + else if(emagged) - user << "ERROR" + to_chat(user, "ERROR") + if(open) - user << "Please close the access panel before locking it." + to_chat(user, "Please close the access panel before locking it.") + else - user << "Access denied." + to_chat(user, "Access denied.") + else if(istype(W, /obj/item/device/paicard)) if(paicard) - user << "A [paicard] is already inserted!" + to_chat(user, "A [paicard] is already inserted!") + else if(allow_pai && !key) if(!locked && !open) var/obj/item/device/paicard/card = W @@ -298,22 +312,28 @@ paicard = card user.visible_message("[user] inserts [W] into [src]!","You insert [W] into [src].") paicard.pai.mind.transfer_to(src) - src << "You sense your form change as you are uploaded into [src]." + to_chat(src, "You sense your form change as you are uploaded into [src].") + bot_name = name name = paicard.pai.name faction = user.faction add_logs(user, paicard.pai, "uploaded to [src.bot_name],") else - user << "[W] is inactive." + to_chat(user, "[W] is inactive.") + else - user << "The personality slot is locked." + to_chat(user, "The personality slot is locked.") + else - user << "[src] is not compatible with [W]" + to_chat(user, "[src] is not compatible with [W]") + else if(istype(W, /obj/item/weapon/hemostat) && paicard) if(open) - user << "Close the access panel before manipulating the personality slot!" + to_chat(user, "Close the access panel before manipulating the personality slot!") + else - user << "You attempt to pull [paicard] free..." + to_chat(user, "You attempt to pull [paicard] free...") + if(do_after(user, 30, target = src)) if (paicard) user.visible_message("[user] uses [W] to pull [paicard] out of [bot_name]!","You pull [paicard] out of [bot_name] with [W].") @@ -322,10 +342,12 @@ user.changeNext_move(CLICK_CD_MELEE) if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != "harm") if(health >= maxHealth) - user << "[src] does not need a repair!" + to_chat(user, "[src] does not need a repair!") + return if(!open) - user << "Unable to repair with the maintenance panel closed!" + to_chat(user, "Unable to repair with the maintenance panel closed!") + return var/obj/item/weapon/weldingtool/WT = W if(WT.remove_fuel(0, user)) @@ -335,7 +357,8 @@ add_fingerprint(user) user.visible_message("[user] repairs [src]!","You repair [src].") else - user << "The welder must be on for this task!" + to_chat(user, "The welder must be on for this task!") + else if(W.force) //if force is non-zero var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread @@ -499,13 +522,15 @@ Pass a positive integer as an argument to override a bot's default speed. turn_on() //Saves the AI the hassle of having to activate a bot manually. access_card = all_access //Give the bot all-access while under the AI's command. if(message) - calling_ai << "\icon[src] [name] called to [end_area.name]. [path.len-1] meters to destination." + to_chat(calling_ai, "\icon[src] [name] called to [end_area.name]. [path.len-1] meters to destination.") + pathset = 1 mode = BOT_RESPONDING tries = 0 else if(message) - calling_ai << "Failed to calculate a valid route. Ensure destination is clear of obstructions and within range." + to_chat(calling_ai, "Failed to calculate a valid route. Ensure destination is clear of obstructions and within range.") + calling_ai = null path = list() @@ -514,13 +539,15 @@ Pass a positive integer as an argument to override a bot's default speed. var/success = bot_move(ai_waypoint, 3) if(!success) if(calling_ai) - calling_ai << "\icon[src] [get_turf(src) == ai_waypoint ? "[src] successfully arrived to waypoint." : "[src] failed to reach waypoint."]" + to_chat(calling_ai, "\icon[src] [get_turf(src) == ai_waypoint ? "[src] successfully arrived to waypoint." : "[src] failed to reach waypoint."]") + calling_ai = null bot_reset() /mob/living/simple_animal/bot/proc/bot_reset() if(calling_ai) //Simple notification to the AI if it called a bot. It will not know the cause or identity of the bot. - calling_ai << "Call command to a bot has been reset." + to_chat(calling_ai, "Call command to a bot has been reset.") + calling_ai = null path = list() summon_target = null @@ -646,17 +673,22 @@ Pass a positive integer as an argument to override a bot's default speed. /mob/living/simple_animal/bot/proc/bot_control_message(command, mob/user, user_turf) switch(command) if("stop") - src << "STOP PATROL" + to_chat(src, "STOP PATROL") + if("go") - src << "START PATROL" + to_chat(src, "START PATROL") + if("summon") var/area/a = get_area(user_turf) - src << "PRIORITY ALERT: [user] in [a.name]!" + to_chat(src, "PRIORITY ALERT: [user] in [a.name]!") + if("home") - src << "RETURN HOME!" + to_chat(src, "RETURN HOME!") + if("ejectpai") else - src << "Unidentified control sequence recieved: [command]" + to_chat(src, "Unidentified control sequence recieved: [command]") + /obj/machinery/bot_core/receive_signal(datum/signal/signal) owner.receive_signal(signal) @@ -806,7 +838,8 @@ Pass a positive integer as an argument to override a bot's default speed. return 1 if(topic_denied(usr)) - usr << "[src]'s interface is not responding!" + to_chat(usr, "[src]'s interface is not responding!") + return 1 add_fingerprint(usr) @@ -827,20 +860,24 @@ Pass a positive integer as an argument to override a bot's default speed. emagged = 2 hacked = 1 locked = 1 - usr << "[text_hack]" + to_chat(usr, "[text_hack]") + show_laws() bot_reset() else if(!hacked) - usr << "[text_dehack_fail]" + to_chat(usr, "[text_dehack_fail]") + else emagged = 0 hacked = 0 - usr << "[text_dehack]" + to_chat(usr, "[text_dehack]") + show_laws() bot_reset() if("ejectpai") if(paicard && (!locked || issilicon(usr) || check_rights(R_ADMIN, 0, usr))) - usr << "You eject [paicard] from [bot_name]" + to_chat(usr, "You eject [paicard] from [bot_name]") + ejectpai(usr) update_controls() @@ -913,7 +950,8 @@ Pass a positive integer as an argument to override a bot's default speed. else add_logs(src, paicard.pai, "ejected") if(announce) - paicard.pai << "You feel your control fade as [paicard] ejects from [bot_name]." + to_chat(paicard.pai, "You feel your control fade as [paicard] ejects from [bot_name].") + paicard = null name = bot_name faction = initial(faction) @@ -951,20 +989,30 @@ Pass a positive integer as an argument to override a bot's default speed. set name = "Show Directives" set category = "IC" - src << "Directives:" + to_chat(src, "Directives:") + if(paicard && paicard.pai && paicard.pai.master && paicard.pai.pai_law0) - src << "Your master, [paicard.pai.master], may overrule any and all laws." - src << "0. [paicard.pai.pai_law0]" + to_chat(src, "Your master, [paicard.pai.master], may overrule any and all laws.") + + to_chat(src, "0. [paicard.pai.pai_law0]") + if(emagged >= 2) - src << "1. #$!@#$32K#$" + to_chat(src, "1. #$!@#$32K#$") + else - src << "1. You are a machine built to serve the station's crew and AI(s)." - src << "2. Your function is to [bot_purpose]." - src << "3. You cannot serve your function if you are broken." - src << "4. Serve your function to the best of your ability." + to_chat(src, "1. You are a machine built to serve the station's crew and AI(s).") + + to_chat(src, "2. Your function is to [bot_purpose].") + + to_chat(src, "3. You cannot serve your function if you are broken.") + + to_chat(src, "4. Serve your function to the best of your ability.") + if(paicard && paicard.pai && paicard.pai.pai_laws) - src << "Supplemental Directive(s):" - src << "[paicard.pai.pai_laws]" + to_chat(src, "Supplemental Directive(s):") + + to_chat(src, "[paicard.pai.pai_laws]") + /mob/living/simple_animal/bot/get_access() . = ..() diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm index 994515a0eec..ddea9e7bbf6 100644 --- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm +++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm @@ -61,14 +61,18 @@ if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) if(bot_core.allowed(user) && !open && !emagged) locked = !locked - user << "You [ locked ? "lock" : "unlock"] \the [src] behaviour controls." + to_chat(user, "You [ locked ? "lock" : "unlock"] \the [src] behaviour controls.") + else if(emagged) - user << "ERROR" + to_chat(user, "ERROR") + if(open) - user << "Please close the access panel before locking it." + to_chat(user, "Please close the access panel before locking it.") + else - user << "\The [src] doesn't seem to respect your authority." + to_chat(user, "\The [src] doesn't seem to respect your authority.") + else return ..() @@ -76,7 +80,8 @@ ..() if(emagged == 2) if(user) - user << "[src] buzzes and beeps." + to_chat(user, "[src] buzzes and beeps.") + /mob/living/simple_animal/bot/cleanbot/process_scan(obj/effect/decal/cleanable/D) for(var/T in target_types) diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm index e5bbdcf1852..c7d62d6e4cf 100644 --- a/code/modules/mob/living/simple_animal/bot/construction.dm +++ b/code/modules/mob/living/simple_animal/bot/construction.dm @@ -22,7 +22,8 @@ var/turf/T = get_turf(loc) var/mob/living/simple_animal/bot/cleanbot/A = new /mob/living/simple_animal/bot/cleanbot(T) A.name = created_name - user << "You add the robot arm to the bucket and sensor assembly. Beep boop!" + to_chat(user, "You add the robot arm to the bucket and sensor assembly. Beep boop!") + user.unEquip(src, 1) qdel(src) @@ -65,7 +66,8 @@ return qdel(W) build_step++ - user << "You add the robot leg to [src]." + to_chat(user, "You add the robot leg to [src].") + name = "legs/frame assembly" if(build_step == 1) item_state = "ed209_leg" @@ -86,7 +88,8 @@ lasercolor = newcolor qdel(W) build_step++ - user << "You add the armor to [src]." + to_chat(user, "You add the armor to [src].") + name = "vest/legs/frame assembly" item_state = "[lasercolor]ed209_shell" icon_state = "[lasercolor]ed209_shell" @@ -97,7 +100,8 @@ if(WT.remove_fuel(0,user)) build_step++ name = "shielded frame assembly" - user << "You weld the vest to [src]." + to_chat(user, "You weld the vest to [src].") + if(4) switch(lasercolor) if("b") @@ -116,7 +120,8 @@ return qdel(W) build_step++ - user << "You add the helmet to [src]." + to_chat(user, "You add the helmet to [src].") + name = "covered and shielded frame assembly" item_state = "[lasercolor]ed209_hat" icon_state = "[lasercolor]ed209_hat" @@ -127,7 +132,8 @@ return qdel(W) build_step++ - user << "You add the prox sensor to [src]." + to_chat(user, "You add the prox sensor to [src].") + name = "covered, shielded and sensored frame assembly" item_state = "[lasercolor]ed209_prox" icon_state = "[lasercolor]ed209_prox" @@ -136,14 +142,17 @@ if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/coil = W if(coil.get_amount() < 1) - user << "You need one length of cable to wire the ED-209!" + to_chat(user, "You need one length of cable to wire the ED-209!") + return - user << "You start to wire [src]..." + to_chat(user, "You start to wire [src]...") + if(do_after(user, 40, target = src)) if(coil.get_amount() >= 1 && build_step == 6) coil.use(1) build_step = 7 - user << "You wire the ED-209 assembly." + to_chat(user, "You wire the ED-209 assembly.") + name = "wired ED-209 assembly" if(7) @@ -167,7 +176,8 @@ return name = newname build_step++ - user << "You add [W] to [src]." + to_chat(user, "You add [W] to [src].") + item_state = "[lasercolor]ed209_taser" icon_state = "[lasercolor]ed209_taser" qdel(W) @@ -175,18 +185,21 @@ if(8) if(istype(W, /obj/item/weapon/screwdriver)) playsound(loc, 'sound/items/Screwdriver.ogg', 100, 1) - user << "You start attaching the gun to the frame..." + to_chat(user, "You start attaching the gun to the frame...") + if(do_after(user, 40, target = src)) build_step++ name = "armed [name]" - user << "Taser gun attached." + to_chat(user, "Taser gun attached.") + if(9) if(istype(W, /obj/item/weapon/stock_parts/cell)) if(!user.unEquip(W)) return build_step++ - user << "You complete the ED-209." + to_chat(user, "You complete the ED-209.") + var/turf/T = get_turf(src) new /mob/living/simple_animal/bot/ed209(T,created_name,lasercolor) qdel(W) @@ -223,18 +236,21 @@ ..() return if(contents.len >= 1) - user << "They won't fit in, as there is already stuff inside." + to_chat(user, "They won't fit in, as there is already stuff inside.") + return if(T.use(10)) if(user.s_active) user.s_active.close(user) var/obj/item/weapon/toolbox_tiles/B = new /obj/item/weapon/toolbox_tiles user.put_in_hands(B) - user << "You add the tiles into the empty toolbox. They protrude from the top." + to_chat(user, "You add the tiles into the empty toolbox. They protrude from the top.") + user.unEquip(src, 1) qdel(src) else - user << "You need 10 floor tiles to start building a floorbot." + to_chat(user, "You need 10 floor tiles to start building a floorbot.") + return /obj/item/weapon/toolbox_tiles/attackby(obj/item/W, mob/user, params) @@ -244,7 +260,8 @@ var/obj/item/weapon/toolbox_tiles_sensor/B = new /obj/item/weapon/toolbox_tiles_sensor() B.created_name = created_name user.put_in_hands(B) - user << "You add the sensor to the toolbox and tiles." + to_chat(user, "You add the sensor to the toolbox and tiles.") + user.unEquip(src, 1) qdel(src) @@ -264,7 +281,8 @@ var/turf/T = get_turf(user.loc) var/mob/living/simple_animal/bot/floorbot/A = new /mob/living/simple_animal/bot/floorbot(T) A.name = created_name - user << "You add the robot arm to the odd looking toolbox assembly. Boop beep!" + to_chat(user, "You add the robot arm to the odd looking toolbox assembly. Boop beep!") + user.unEquip(src, 1) qdel(src) else if(istype(W, /obj/item/weapon/pen)) @@ -307,7 +325,8 @@ //Making a medibot! if(contents.len >= 1) - user << "You need to empty [src] out first!" + to_chat(user, "You need to empty [src] out first!") + return var/obj/item/weapon/firstaid_arm_assembly/A = new /obj/item/weapon/firstaid_arm_assembly @@ -335,7 +354,8 @@ qdel(S) user.put_in_hands(A) - user << "You add the robot arm to the first aid kit." + to_chat(user, "You add the robot arm to the first aid kit.") + user.unEquip(src, 1) qdel(src) @@ -357,7 +377,8 @@ return qdel(W) build_step++ - user << "You add the health sensor to [src]." + to_chat(user, "You add the health sensor to [src].") + name = "First aid/robot arm/health analyzer assembly" overlays += image('icons/obj/aibots.dmi', "na_scanner") @@ -367,7 +388,8 @@ return qdel(W) build_step++ - user << "You complete the Medibot. Beep boop!" + to_chat(user, "You complete the Medibot. Beep boop!") + var/turf/T = get_turf(src) var/mob/living/simple_animal/bot/medbot/S = new /mob/living/simple_animal/bot/medbot(T) S.skin = skin @@ -401,7 +423,8 @@ qdel(S) var/obj/item/weapon/secbot_assembly/A = new /obj/item/weapon/secbot_assembly user.put_in_hands(A) - user << "You add the signaler to the helmet." + to_chat(user, "You add the signaler to the helmet.") + user.unEquip(src, 1) qdel(src) else @@ -415,19 +438,22 @@ if(WT.remove_fuel(0, user)) build_step++ overlays += "hs_hole" - user << "You weld a hole in [src]!" + to_chat(user, "You weld a hole in [src]!") + else if(build_step == 1) var/obj/item/weapon/weldingtool/WT = I if(WT.remove_fuel(0, user)) build_step-- overlays -= "hs_hole" - user << "You weld the hole in [src] shut!" + to_chat(user, "You weld the hole in [src] shut!") + else if(isprox(I) && (build_step == 1)) if(!user.unEquip(I)) return build_step++ - user << "You add the prox sensor to [src]!" + to_chat(user, "You add the prox sensor to [src]!") + overlays += "hs_eye" name = "helmet/signaler/prox sensor assembly" qdel(I) @@ -436,7 +462,8 @@ if(!user.unEquip(I)) return build_step++ - user << "You add the robot arm to [src]!" + to_chat(user, "You add the robot arm to [src]!") + name = "helmet/signaler/prox sensor/robot arm assembly" overlays += "hs_arm" qdel(I) @@ -445,7 +472,8 @@ if(!user.unEquip(I)) return build_step++ - user << "You complete the Securitron! Beep boop." + to_chat(user, "You complete the Securitron! Beep boop.") + var/mob/living/simple_animal/bot/secbot/S = new /mob/living/simple_animal/bot/secbot S.forceMove(get_turf(src)) S.name = created_name @@ -464,17 +492,20 @@ if(!build_step) new /obj/item/device/assembly/signaler(get_turf(src)) new /obj/item/clothing/head/helmet(get_turf(src)) - user << "You disconnect the signaler from the helmet." + to_chat(user, "You disconnect the signaler from the helmet.") + qdel(src) else if(build_step == 2) overlays -= "hs_eye" new /obj/item/device/assembly/prox_sensor(get_turf(src)) - user << "You detach the proximity sensor from [src]." + to_chat(user, "You detach the proximity sensor from [src].") + build_step-- else if(build_step == 3) overlays -= "hs_arm" new /obj/item/robot_parts/l_arm(get_turf(src)) - user << "You remove the robot arm from [src]." + to_chat(user, "You remove the robot arm from [src].") + build_step-- \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm index 1e1117f110a..72b951138b6 100644 --- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm +++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm @@ -177,7 +177,8 @@ Auto Patrol[]"}, ..() if(emagged == 2) if(user) - user << "You short out [src]'s target assessment circuits." + to_chat(user, "You short out [src]'s target assessment circuits.") + oldtarget_name = user.name audible_message("[src] buzzes oddly!") declare_arrests = 0 diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm index c336cce0104..fd624d373bd 100644 --- a/code/modules/mob/living/simple_animal/bot/floorbot.dm +++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm @@ -97,11 +97,13 @@ T.use(loaded) amount += loaded if(loaded > 0) - user << "You load [loaded] tiles into the floorbot. He now contains [amount] tiles." + to_chat(user, "You load [loaded] tiles into the floorbot. He now contains [amount] tiles.") + nagged = 0 update_icon() else - user << "You need at least one floor tile to put into [src]!" + to_chat(user, "You need at least one floor tile to put into [src]!") + else ..() @@ -109,7 +111,8 @@ ..() if(emagged == 2) if(user) - user << "[src] buzzes and beeps." + to_chat(user, "[src] buzzes and beeps.") + /mob/living/simple_animal/bot/floorbot/Topic(href, href_list) if(..()) diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm index 8dd060b6fda..eb1e5591f46 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -221,17 +221,20 @@ /mob/living/simple_animal/bot/medbot/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(istype(W, /obj/item/weapon/reagent_containers/glass)) if(locked) - user << "You cannot insert a beaker because the panel is locked!" + to_chat(user, "You cannot insert a beaker because the panel is locked!") + return if(!isnull(reagent_glass)) - user << "There is already a beaker loaded!" + to_chat(user, "There is already a beaker loaded!") + return if(!user.drop_item()) return W.forceMove(src) reagent_glass = W - user << "You insert [W]." + to_chat(user, "You insert [W].") + show_controls(user) return @@ -246,7 +249,8 @@ if(emagged == 2) declare_crit = 0 if(user) - user << "You short out [src]'s reagent synthesis circuits." + to_chat(user, "You short out [src]'s reagent synthesis circuits.") + audible_message("[src] buzzes oddly!") flick("medibot_spark", src) if(user) diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index de778a5aeb3..be1a59d55f2 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -115,7 +115,8 @@ "You repair [src]!" ) else - user << "[src] does not need a repair!" + to_chat(user, "[src] does not need a repair!") + else if((istype(I, /obj/item/device/multitool) || istype(I, /obj/item/weapon/wirecutters)) && open) return attack_hand(user) else if(load && ismob(load)) // chance to knock off rider @@ -124,7 +125,8 @@ user.visible_message("[user] knocks [load] off [src] with \the [I]!", "You knock [load] off [src] with \the [I]!") else - user << "You hit [src] with \the [I] but to no effect!" + to_chat(user, "You hit [src] with \the [I] but to no effect!") + ..() else ..() @@ -136,7 +138,8 @@ emagged = 1 if(!open) locked = !locked - user << "You [locked ? "lock" : "unlock"] the [src]'s controls!" + to_chat(user, "You [locked ? "lock" : "unlock"] the [src]'s controls!") + flick("mulebot-emagged", src) playsound(loc, 'sound/effects/sparks1.ogg', 100, 0) @@ -185,7 +188,8 @@ turn_off() else if(cell && !open) if(!turn_on()) - usr << "You can't switch on [src]!" + to_chat(usr, "You can't switch on [src]!") + return else return @@ -249,7 +253,8 @@ update_controls() return 1 else - user << "Access denied." + to_chat(user, "Access denied.") + return 0 // TODO: remove this; PDAs currently depend on it @@ -474,7 +479,8 @@ return if(on) var/speed = (wires.Motor1() ? 1 : 0) + (wires.Motor2() ? 2 : 0) - //world << "speed: [speed]" +// to_chat(world, "speed: [speed]") + var/num_steps = 0 switch(speed) if(0) @@ -516,13 +522,15 @@ path -= next return if(istype(next, /turf/simulated)) - //world << "at ([x],[y]) moving to ([next.x],[next.y])" +// to_chat(world, "at ([x],[y]) moving to ([next.x],[next.y])") + var/oldloc = loc var/moved = step_towards(src, next) // attempt to move if(cell) cell.use(1) if(moved && oldloc!=loc) // successful move - //world << "Successful move." +// to_chat(world, "Successful move.") + blockcount = 0 path -= loc @@ -533,7 +541,8 @@ else // failed to move - //world << "Unable to move." +// to_chat(world, "Unable to move.") + blockcount++ mode = BOT_BLOCKED if(blockcount == 3) @@ -553,16 +562,19 @@ return else buzz(ANNOYED) - //world << "Bad turf." +// to_chat(world, "Bad turf.") + mode = BOT_NAV return else - //world << "No path." +// to_chat(world, "No path.") + mode = BOT_NAV return if(BOT_NAV) // calculate new path - //world << "Calc new path." +// to_chat(world, "Calc new path.") + mode = BOT_WAIT_FOR_NAV spawn(0) calc_path() @@ -639,7 +651,8 @@ if(pathset) //The AI called us here, so notify it of our arrival. loaddir = dir //The MULE will attempt to load a crate in whatever direction the MULE is "facing". if(calling_ai) - calling_ai << "\icon[src] [src] wirelessly plays a chiming sound!" + to_chat(calling_ai, "\icon[src] [src] wirelessly plays a chiming sound!") + playsound(calling_ai, 'sound/machines/chime.ogg',40, 0) calling_ai = null radio_channel = "AI Private" //Report on AI Private instead if the AI is controlling us. @@ -726,14 +739,18 @@ switch(command) if("start") if(load) - src << "DELIVER [load] TO [destination]" + to_chat(src, "DELIVER [load] TO [destination]") + else - src << "PICK UP DELIVERY AT [destination]" + to_chat(src, "PICK UP DELIVERY AT [destination]") + if("unload") if(load) - src << "UNLOAD" + to_chat(src, "UNLOAD") + else - src << "LOAD" + to_chat(src, "LOAD") + if("autoret", "autopick", "target") else ..() diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index f60ad0ebb48..002ed319ad6 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -183,7 +183,8 @@ Auto Patrol: []"}, ..() if(emagged == 2) if(user) - user << "You short out [src]'s target assessment circuits." + to_chat(user, "You short out [src]'s target assessment circuits.") + oldtarget_name = user.name audible_message("[src] buzzes oddly!") declare_arrests = 0 diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 989bbf09508..3b1e0020e0b 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -52,7 +52,8 @@ msg += "
      " msg += "*---------*
      " - user << msg + to_chat(user, msg) + /mob/living/simple_animal/construct/attack_animal(mob/living/simple_animal/M as mob) if(istype(M, /mob/living/simple_animal/construct/builder)) @@ -254,7 +255,8 @@ if (istype(usr,/mob/living/simple_animal/constructbehemoth)) if(usr.energy<300) - usr << "\red You do not have enough power stored!" + to_chat(usr, "\red You do not have enough power stored!") + return if(usr.stat) diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index f51e3e81f65..4822fbe7cf1 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -68,10 +68,12 @@ //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 ) - user << "[src] is wearing too much armor! You can't cause \him any damage." + to_chat(user, "[src] is wearing too much armor! You can't cause \him any damage.") + visible_message(" [user] hits [src] with [O], however [src] is too armored.") else - user << "[src] is wearing too much armor! You can't reach \his skin." + to_chat(user, "[src] is wearing too much armor! You can't reach \his skin.") + visible_message("[user] gently taps [src] with [O].") if(health>0 && prob(15)) custom_emote(1, "looks at [user] with [pick("an amused","an annoyed","a confused","a resentful", "a happy", "an excited")] expression.") @@ -79,7 +81,8 @@ if (istype(O, /obj/item/weapon/razor)) if (shaved) - user << "You can't shave this corgi, it's already been shaved!" + to_chat(user, "You can't shave this corgi, it's already been shaved!") + return user.visible_message("[user] starts to shave [src] using \the [O].", "You start to shave [src] using \the [O]...") if(do_after(user, 50, target = src)) @@ -107,7 +110,8 @@ if("head") if(inventory_head) if(inventory_head.flags & NODROP) - usr << "\The [inventory_head] is stuck too hard to [src] for you to remove!" + to_chat(usr, "\The [inventory_head] is stuck too hard to [src] for you to remove!") + return name = real_name desc = initial(desc) @@ -121,18 +125,21 @@ inventory_head = null regenerate_icons() else - usr << "There is nothing to remove from its [remove_from]." + to_chat(usr, "There is nothing to remove from its [remove_from].") + return if("back") if(inventory_back) if(inventory_back.flags & NODROP) - usr << "\The [inventory_back] is stuck too hard to [src] for you to remove!" + to_chat(usr, "\The [inventory_back] is stuck too hard to [src] for you to remove!") + return inventory_back.loc = src.loc inventory_back = null regenerate_icons() else - usr << "There is nothing to remove from its [remove_from]." + to_chat(usr, "There is nothing to remove from its [remove_from].") + return show_inv(usr) @@ -150,7 +157,8 @@ if("back") if(inventory_back) - usr << "It's already wearing something!" + to_chat(usr, "It's already wearing something!") + return else var/obj/item/item_to_add = usr.get_active_hand() @@ -176,9 +184,11 @@ ) if( ! ( item_to_add.type in allowed_types ) ) - usr << "You set [item_to_add] on [src]'s back, but \he shakes it off!" + to_chat(usr, "You set [item_to_add] on [src]'s back, but \he shakes it off!") + if(!usr.drop_item()) - usr << "\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s back!" + to_chat(usr, "\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s back!") + return item_to_add.loc = loc if(prob(25)) @@ -207,7 +217,9 @@ return if(inventory_head) - if(user) user << "You can't put more than one hat on [src]!" + if(user) + to_chat(user, "You can't put more than one hat on [src]!") + return if(!item_to_add) user.visible_message("[user] pets [src].","You rest your hand on [src]'s head for a moment.") @@ -359,10 +371,12 @@ if(valid) if(user && !user.drop_item()) - user << "\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s head!" + to_chat(user, "\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s head!") + return 0 if(health <= 0) - user << "There is merely a dull, lifeless look in [real_name]'s eyes as you put the [item_to_add] on \him." + to_chat(user, "There is merely a dull, lifeless look in [real_name]'s eyes as you put the [item_to_add] on \him.") + else if(user) user.visible_message("[user] puts [item_to_add] on [real_name]'s head. [src] looks at [user] and barks once.", "You put [item_to_add] on [real_name]'s head. [src] gives you a peculiar look, then wags \his tail once and barks.", @@ -373,9 +387,11 @@ else if(user && !user.drop_item()) - user << "\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s head!" + to_chat(user, "\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s head!") + return 0 - user << "You set [item_to_add] on [src]'s head, but \he shakes it off!" + to_chat(user, "You set [item_to_add] on [src]'s head, but \he shakes it off!") + item_to_add.loc = loc if(prob(25)) step_rand(item_to_add) @@ -467,7 +483,8 @@ 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." + to_chat(src, "\red You fail to push [tmob]'s fat ass out of the way.") + now_pushing = 0 return if(!(tmob.status_flags & CANPUSH)) @@ -533,7 +550,8 @@ //puppies cannot wear anything. /mob/living/simple_animal/pet/corgi/puppy/Topic(href, href_list) if(href_list["remove_inv"] || href_list["add_inv"]) - usr << "You can't fit this on [src]!" + to_chat(usr, "You can't fit this on [src]!") + return ..() @@ -557,7 +575,8 @@ //Lisa already has a cute bow! /mob/living/simple_animal/pet/corgi/Lisa/Topic(href, href_list) if(href_list["remove_inv"] || href_list["add_inv"]) - usr << "\red [src] already has a cute bow!" + to_chat(usr, "\red [src] already has a cute bow!") + return ..() diff --git a/code/modules/mob/living/simple_animal/friendly/corgi_powers.dm b/code/modules/mob/living/simple_animal/friendly/corgi_powers.dm index c19f3bc9fad..a244ce83cf9 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi_powers.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi_powers.dm @@ -2,10 +2,12 @@ set name = "Chase your tail" set desc = "d'awwww." set category = "Corgi" - src << text("[pick("You dance around","You chase your tail")].") + to_chat(src, text("[pick("You dance around","You chase your tail")].")) + for(var/mob/O in oviewers(src, null)) if ((O.client && !( O.blinded ))) - O << text("[] [pick("dances around","chases its tail")].", src) + to_chat(O, text("[] [pick("dances around","chases its tail")].", src)) + 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) diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm index 524cffc9979..2de110a2fb4 100644 --- a/code/modules/mob/living/simple_animal/friendly/crab.dm +++ b/code/modules/mob/living/simple_animal/friendly/crab.dm @@ -51,7 +51,8 @@ /*/mob/living/simple_animal/crab/attackby(var/obj/item/O as obj, var/mob/user as mob, params) if(istype(O, /obj/item/weapon/wirecutters)) if(prob(50)) - user << "\red \b This kills the crab." + to_chat(user, "\red \b This kills the crab.") + health -= 20 death() else @@ -70,7 +71,8 @@ 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." + to_chat(user, "\blue this [src] is dead, medical items won't bring it back to life.") + else if(O.force) health -= O.force @@ -78,7 +80,8 @@ 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." + to_chat(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]. ") @@ -104,14 +107,16 @@ inventory_head.loc = src.loc inventory_head = null else - usr << "\red There is nothing to remove from its [remove_from]." + to_chat(usr, "\red There is nothing to remove from its [remove_from].") + return if("mask") if(inventory_mask) inventory_mask.loc = src.loc inventory_mask = null else - usr << "\red There is nothing to remove from its [remove_from]." + to_chat(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. @@ -122,12 +127,14 @@ 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]." + to_chat(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." + to_chat(usr, "\red It's is already wearing something.") + return else var/obj/item/item_to_add = usr.get_active_hand() @@ -169,7 +176,8 @@ ) if( ! ( item_to_add.type in allowed_types ) ) - usr << "\red It doesn't seem too keen on wearing that item." + to_chat(usr, "\red It doesn't seem too keen on wearing that item.") + return usr.drop_item() @@ -232,7 +240,8 @@ if("mask") if(inventory_mask) - usr << "\red It's already wearing something." + to_chat(usr, "\red It's already wearing something.") + return else var/obj/item/item_to_add = usr.get_active_hand() @@ -248,7 +257,8 @@ ) if( ! ( item_to_add.type in allowed_types ) ) - usr << "\red This object won't fit." + to_chat(usr, "\red This object won't fit.") + return usr.drop_item() diff --git a/code/modules/mob/living/simple_animal/friendly/diona.dm b/code/modules/mob/living/simple_animal/friendly/diona.dm index dce5fecc2b7..6c1fb0486dc 100644 --- a/code/modules/mob/living/simple_animal/friendly/diona.dm +++ b/code/modules/mob/living/simple_animal/friendly/diona.dm @@ -53,8 +53,10 @@ //Let people pick the little buggers up. if(M.a_intent == I_HELP) if(M.species && M.species.name == "Diona") - M << "You feel your being twine with that of [src] as it merges with your biomass." - src << "You feel your being twine with that of [M] as you merge with its biomass." + to_chat(M, "You feel your being twine with that of [src] as it merges with your biomass.") + + to_chat(src, "You feel your being twine with that of [M] as you merge with its biomass.") + src.verbs += /mob/living/simple_animal/diona/proc/split src.verbs -= /mob/living/simple_animal/diona/proc/merge src.forceMove(M) @@ -87,10 +89,12 @@ if(!M || !src || !(src.Adjacent(M))) return if(istype(M,/mob/living/carbon/human)) - M << "You feel your being twine with that of [src] as it merges with your biomass." + to_chat(M, "You feel your being twine with that of [src] as it merges with your biomass.") + M.status_flags |= PASSEMOTES - src << "You feel your being twine with that of [M] as you merge with its biomass." + to_chat(src, "You feel your being twine with that of [M] as you merge with its biomass.") + src.loc = M src.verbs += /mob/living/simple_animal/diona/proc/split src.verbs -= /mob/living/simple_animal/diona/proc/merge @@ -106,8 +110,10 @@ src.verbs -= /mob/living/simple_animal/diona/proc/split return - src.loc << "You feel a pang of loss as [src] splits away from your biomass." - src << "You wiggle out of the depths of [src.loc]'s biomass and plop to the ground." + to_chat(src.loc, "You feel a pang of loss as [src] splits away from your biomass.") + + to_chat(src, "You wiggle out of the depths of [src.loc]'s biomass and plop to the ground.") + var/mob/living/M = src.loc @@ -163,11 +169,13 @@ set desc = "Grow to a more complex form." if(donors.len < 5) - src << "You need more blood in order to ascend to a new state of consciousness..." + to_chat(src, "You need more blood in order to ascend to a new state of consciousness...") + return if(nutrition < 500) - src << "You need to binge on weeds in order to have the energy to grow..." + to_chat(src, "You need to binge on weeds in order to have the energy to grow...") + return src.split() @@ -210,11 +218,13 @@ if(!M || !src) return if(M.species.flags & NO_BLOOD) - src << "That donor has no blood to take." + to_chat(src, "That donor has no blood to take.") + return if(donors.Find(M.real_name)) - src << "That donor offers you nothing new." + to_chat(src, "That donor offers you nothing new.") + return src.visible_message("[src] flicks out a feeler and neatly steals a sample of [M]'s blood.","You flick out a feeler and neatly steal a sample of [M]'s blood.") @@ -232,12 +242,15 @@ if(donors.len == 5) ready_evolve = 1 - src << "You feel ready to move on to your next stage of growth." + to_chat(src, "You feel ready to move on to your next stage of growth.") + else if(donors.len == 3) universal_understand = 1 - src << "You feel your awareness expand, and realize you know how to understand the creatures around you." + to_chat(src, "You feel your awareness expand, and realize you know how to understand the creatures around you.") + else - src << "The blood seeps into your small form, and you draw out the echoes of memories and personality from it, working them into your budding mind." + to_chat(src, "The blood seeps into your small form, and you draw out the echoes of memories and personality from it, working them into your budding mind.") + /mob/living/simple_animal/diona/put_in_hands(obj/item/W) @@ -246,7 +259,8 @@ W.dropped() /mob/living/simple_animal/diona/put_in_active_hand(obj/item/W) - src << "You don't have any hands!" + to_chat(src, "You don't have any hands!") + return /mob/living/simple_animal/diona/emote(var/act, var/m_type=1, var/message = null) diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index f3e77854882..9e5086fd0cc 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -81,9 +81,11 @@ G.reagents.add_reagent("milk", transfered) milk_content -= transfered else if(G.reagents.total_volume >= G.volume) - user << "\red \The [O] is full." + to_chat(user, "\red \The [O] is full.") + else - user << "\red The udder is dry. Wait a bit longer..." + to_chat(user, "\red The udder is dry. Wait a bit longer...") + else ..() @@ -125,9 +127,11 @@ G.reagents.add_reagent("milk", transfered) milk_content -= transfered else if(G.reagents.total_volume >= G.volume) - user << "\red \The [O] is full." + to_chat(user, "\red \The [O] is full.") + else - user << "\red The udder is dry. Wait a bit longer..." + to_chat(user, "\red The udder is dry. Wait a bit longer...") + else ..() @@ -148,7 +152,8 @@ "[src] looks at you pleadingly", "[src] looks at you with a resigned expression.", "[src] seems resigned to its fate.") - M << pick(responses) + to_chat(M, pick(responses)) + else ..() @@ -245,11 +250,14 @@ var/global/chicken_count = 0 user.drop_item() qdel(O) eggsleft += rand(1, 4) - //world << eggsleft +// to_chat(world, eggsleft) + else - user << "\blue [name] doesn't seem hungry!" + to_chat(user, "\blue [name] doesn't seem hungry!") + else - user << "\blue [name] doesn't seem interested in [O]!" + to_chat(user, "\blue [name] doesn't seem interested in [O]!") + else ..() diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index c24da570653..dcb54f0eacc 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -36,7 +36,8 @@ ..() if(prob(speak_chance)) for(var/mob/M in view()) - M << 'sound/effects/mousesqueek.ogg' + to_chat(M, 'sound/effects/mousesqueek.ogg') + /mob/living/simple_animal/mouse/Life() . = ..() @@ -104,15 +105,18 @@ // return 1 /mob/living/simple_animal/mouse/start_pulling(var/atom/movable/AM)//Prevents mouse from pulling things - src << "You are too small to pull anything." + to_chat(src, "You are too small to pull anything.") + return /mob/living/simple_animal/mouse/Crossed(AM as mob|obj) if( ishuman(AM) ) if(!stat) var/mob/M = AM - M << "\blue \icon[src] Squeek!" - M << 'sound/effects/mousesqueek.ogg' + to_chat(M, "\blue \icon[src] Squeek!") + + to_chat(M, 'sound/effects/mousesqueek.ogg') + ..() /mob/living/simple_animal/mouse/death() diff --git a/code/modules/mob/living/simple_animal/friendly/slime.dm b/code/modules/mob/living/simple_animal/friendly/slime.dm index e03c8f36ff8..79e13f85d3d 100644 --- a/code/modules/mob/living/simple_animal/friendly/slime.dm +++ b/code/modules/mob/living/simple_animal/friendly/slime.dm @@ -25,7 +25,8 @@ 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." + to_chat(src, "\red You fail to push [tmob]'s fat ass out of the way.") + now_pushing = 0 return if(!(tmob.status_flags & CANPUSH)) diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm index 491f56f74a7..c484f6b6164 100644 --- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm +++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm @@ -46,10 +46,12 @@ if(istype(O, /obj/item/device/mmi) || istype(O, /obj/item/device/mmi/posibrain)) var/obj/item/device/mmi/B = O if(src.mmi) //There's already a brain in it. - user << "\red There's already a brain in [src]!" + to_chat(user, "\red There's already a brain in [src]!") + return if(!B.brainmob) - user << "\red Sticking an empty MMI into the frame would sort of defeat the purpose." + to_chat(user, "\red Sticking an empty MMI into the frame would sort of defeat the purpose.") + return if(!B.brainmob.key) var/ghost_can_reenter = 0 @@ -63,18 +65,22 @@ ghost_can_reenter = 1 break if(!ghost_can_reenter) - user << "[O] is completely unresponsive; there's no point." + to_chat(user, "[O] is completely unresponsive; there's no point.") + return if(B.brainmob.stat == DEAD) - user << "\red [O] is dead. Sticking it into the frame would sort of defeat the purpose." + to_chat(user, "\red [O] is dead. Sticking it into the frame would sort of defeat the purpose.") + return if(jobban_isbanned(B.brainmob, "Cyborg") || jobban_isbanned(B.brainmob,"nonhumandept")) - user << "\red [O] does not seem to fit." + to_chat(user, "\red [O] does not seem to fit.") + return - user << "\blue You install [O] in [src]!" + to_chat(user, "\blue You install [O] in [src]!") + user.drop_item() src.mmi = O @@ -95,13 +101,16 @@ for(var/mob/W in viewers(user, null)) W.show_message(text("\red [user] has spot-welded some of the damage to [src]!"), 1) else - user << "\blue [src] is undamaged!" + to_chat(user, "\blue [src] is undamaged!") + else - user << "Need more welding fuel!" + to_chat(user, "Need more welding fuel!") + return else if(istype(O, /obj/item/weapon/card/id)||istype(O, /obj/item/device/pda)) if (!mmi) - user << "\red There's no reason to swipe your ID - the spiderbot has no brain to remove." + to_chat(user, "\red There's no reason to swipe your ID - the spiderbot has no brain to remove.") + return 0 var/obj/item/weapon/card/id/id_card @@ -113,7 +122,8 @@ id_card = pda.id if(access_robotics in id_card.access) - user << "\blue You swipe your access card and pop the brain out of [src]." + to_chat(user, "\blue You swipe your access card and pop the brain out of [src].") + eject_brain() if(held_item) @@ -122,7 +132,8 @@ return 1 else - user << "\red You swipe your card, with no effect." + to_chat(user, "\red You swipe your card, with no effect.") + return 0 else @@ -135,21 +146,27 @@ 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." + to_chat(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/spiderbot/emag_act(user as mob) if (emagged) - user << "\red [src] is already overloaded - better run." + to_chat(user, "\red [src] is already overloaded - better run.") + return 0 else emagged = 1 - user << "\blue You short out the security protocols and overload [src]'s cell, priming it to explode in a short time." - spawn(100) src << "\red Your cell seems to be outputting a lot of power..." - spawn(200) src << "\red Internal heat sensors are spiking! Something is badly wrong with your cell!" - spawn(300) src.explode() + to_chat(user, "\blue You short out the security protocols and overload [src]'s cell, priming it to explode in a short time.") + spawn(100) + to_chat(src, "\red Your cell seems to be outputting a lot of power...") + spawn(200) + to_chat(src, "\red Internal heat sensors are spiking! Something is badly wrong with your cell!") + + spawn(300) + src.explode() /mob/living/simple_animal/spiderbot/proc/transfer_personality(var/obj/item/device/mmi/M as obj) @@ -228,7 +245,8 @@ return if(!held_item) - usr << "\red You have nothing to drop!" + to_chat(usr, "\red You have nothing to drop!") + return 0 if(istype(held_item, /obj/item/weapon/grenade)) @@ -256,7 +274,8 @@ return -1 if(held_item) - src << "\red You are already holding \the [held_item]" + to_chat(src, "\red You are already holding \the [held_item]") + return 1 var/list/items = list() @@ -273,13 +292,16 @@ selection.loc = src visible_message("\blue [src] scoops up \the [held_item]!", "\blue You grab \the [held_item]!", "You hear a skittering noise and a clink.") return held_item - src << "\red \The [selection] is too far away." + to_chat(src, "\red \The [selection] is too far away.") + return 0 - src << "\red There is nothing of interest to take." + to_chat(src, "\red There is nothing of interest to take.") + return 0 /mob/living/simple_animal/spiderbot/examine(mob/user) ..(user) if(src.held_item) - user << "It is carrying \a [src.held_item] \icon[src.held_item]." + to_chat(user, "It is carrying \a [src.held_item] \icon[src.held_item].") + diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 9de16829259..29d4ed31406 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -15,7 +15,8 @@ if(L.reagents) L.reagents.add_reagent("spidertoxin", poison_per_bite) if(prob(poison_per_bite)) - L << "You feel a tiny prick." + to_chat(L, "You feel a tiny prick.") + L.reagents.add_reagent(poison_type, poison_per_bite) @@ -230,9 +231,11 @@ var/obj/effect/spider/eggcluster/E = locate() in get_turf(src) if(E) - src << "There is already a cluster of eggs here!" + to_chat(src, "There is already a cluster of eggs here!") + else if(!fed) - src << "You are too hungry to do this!" + to_chat(src, "You are too hungry to do this!") + else if(busy != LAYING_EGGS) busy = LAYING_EGGS src.visible_message("\the [src] begins to lay a cluster of eggs.") diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm index b470f0506ff..7aa3e8f0203 100644 --- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm +++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm @@ -44,10 +44,12 @@ var/mob/living/carbon/C = target if(C.stat == DEAD) if(C.status_flags & XENO_HOST) - src << "A foreign presence repels us from this body. Perhaps we should try to infest another?" + to_chat(src, "A foreign presence repels us from this body. Perhaps we should try to infest another?") + return Infect(target) - src << "With our egg laid, our death approaches rapidly..." + to_chat(src, "With our egg laid, our death approaches rapidly...") + spawn(100) death() return diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm index bb5fcb8b23e..ade260176ea 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm @@ -296,16 +296,19 @@ if(ishuman(M)) var/mob/living/carbon/human/H = M if(inert) - user << "[src] have become inert, its healing properties are no more." + to_chat(user, "[src] have become inert, its healing properties are no more.") + return else if(H.stat == DEAD) - user << "[src] are useless on the dead." + to_chat(user, "[src] are useless on the dead.") + return if(H != user) H.visible_message("[user] forces [H] to eat [src]... they quickly regenerate all injuries!") else - user << "You chomp into [src], barely managing to hold it down, but feel amazingly refreshed in mere moments." + to_chat(user, "You chomp into [src], barely managing to hold it down, but feel amazingly refreshed in mere moments.") + playsound(src.loc,'sound/items/eatfood.ogg', rand(10,50), 1) H.revive() qdel(src) @@ -483,10 +486,12 @@ var/current_armor = C.armor if(current_armor.["melee"] < 80) current_armor.["melee"] = min(current_armor.["melee"] + 10, 80) - user << "You strengthen [target], improving its resistance against melee attacks." + to_chat(user, "You strengthen [target], improving its resistance against melee attacks.") + qdel(src) else - user << "You can't improve [C] any further." + to_chat(user, "You can't improve [C] any further.") + return if(istype(target, /obj/mecha/working/ripley)) var/obj/mecha/D = target @@ -496,19 +501,23 @@ damage_absorption["bullet"] = damage_absorption["bullet"] - 0.05 damage_absorption["fire"] = damage_absorption["fire"] - 0.05 damage_absorption["laser"] = damage_absorption["laser"] - 0.025 - user << "You strengthen [target], improving its resistance against melee attacks." + to_chat(user, "You strengthen [target], improving its resistance against melee attacks.") + qdel(src) if(D.icon_state == "ripley-open") D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-open") D.desc = "Autonomous Power Loader Unit. Its armour is enhanced with some goliath hide plates." else - user << "You can't add armour onto the mech while someone is inside!" + to_chat(user, "You can't add armour onto the mech while someone is inside!") + if(damage_absorption.["brute"] == 0.3) if(D.icon_state == "ripley-open") D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-full-open") D.desc = "Autonomous Power Loader Unit. It's wearing a fearsome carapace entirely composed of goliath hide plates - the pilot must be an experienced monster hunter." else - user << "You can't add armour onto the mech while someone is inside!" + to_chat(user, "You can't add armour onto the mech while someone is inside!") + else - user << "You can't improve [D] any further!" + to_chat(user, "You can't improve [D] any further!") + return \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm index 0555ae10ef7..58a44d686f6 100644 --- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm +++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm @@ -36,9 +36,11 @@ /mob/living/simple_animal/hostile/mushroom/examine(mob/user) ..(user) if(health >= maxHealth) - user << "It looks healthy." + to_chat(user, "It looks healthy.") + else - user << "It looks like it's been roughed up." + to_chat(user, "It looks like it's been roughed up.") + /mob/living/simple_animal/hostile/mushroom/Life() ..() @@ -130,7 +132,8 @@ Recover() qdel(I) else - user << "[src] won't eat it!" + to_chat(user, "[src] won't eat it!") + return if(I.force) Bruise() diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index 8ca393bb2d1..dd782663516 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -64,7 +64,8 @@ if(can_be_seen(NewLoc)) icon_state = "angelseen" if(client) - src << "You cannot move, there are eyes on you!" + to_chat(src, "You cannot move, there are eyes on you!") + return 0 icon_state = "angel" return ..() @@ -101,7 +102,8 @@ if(can_be_seen()) icon_state = "angelseen" if(client) - src << "You cannot attack, there are eyes on you!" + to_chat(src, "You cannot attack, there are eyes on you!") + return icon_state = "angelattack" ..() diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 434d1739b9e..15728458cc2 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -62,7 +62,8 @@ visible_message("\red \b [src] blocks the [O] with its shield! ") playsound(loc, O.hitsound, 25, 1, -1) else - usr << "\red This weapon is ineffective, it does no damage." + to_chat(usr, "\red This weapon is ineffective, it does no damage.") + visible_message("\red [user] gently taps [src] with the [O]. ") diff --git a/code/modules/mob/living/simple_animal/hostile/winter_mobs.dm b/code/modules/mob/living/simple_animal/hostile/winter_mobs.dm index 930eb144af8..6f7d0a5a07c 100644 --- a/code/modules/mob/living/simple_animal/hostile/winter_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/winter_mobs.dm @@ -124,10 +124,14 @@ melee_damage_upper = 25 //that's gonna leave a mark, for sure /mob/living/simple_animal/hostile/winter/santa/stage_4/death() - world << "
      " - world << "THE FAT MAN HAS FALLEN!" - world << "SANTA CLAUS HAS BEEN DEFEATED!" - world << "
      " + to_chat(world, "
      ") + + to_chat(world, "THE FAT MAN HAS FALLEN!") + + to_chat(world, "SANTA CLAUS HAS BEEN DEFEATED!") + + to_chat(world, "
      ") + ..() var/obj/item/weapon/grenade/clusterbuster/xmas/X = new /obj/item/weapon/grenade/clusterbuster/xmas(get_turf(src)) var/obj/item/weapon/grenade/clusterbuster/xmas/Y = new /obj/item/weapon/grenade/clusterbuster/xmas(get_turf(src)) diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 9a53f6bfa35..7c3dc5d0516 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -157,18 +157,21 @@ if(copytext(possible_phrase,1,3) in department_radio_keys) possible_phrase = copytext(possible_phrase,3,length(possible_phrase)) else - usr << "\red There is nothing to remove from its [remove_from]." + to_chat(usr, "\red There is nothing to remove from its [remove_from].") + return show_inv(usr) else if(href_list["add_inv"]) 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]." + to_chat(usr, "\red You have nothing in your hand to put on its [add_to].") + return switch(add_to) if("ears") if(ears) - usr << "\red It's already wearing something." + to_chat(usr, "\red It's already wearing something.") + return else var/obj/item/item_to_add = usr.get_active_hand() @@ -176,7 +179,8 @@ return if( !istype(item_to_add, /obj/item/device/radio/headset) ) - usr << "\red This object won't fit." + to_chat(usr, "\red This object won't fit.") + return var/obj/item/device/radio/headset/headset_to_add = item_to_add @@ -184,7 +188,8 @@ usr.drop_item() headset_to_add.loc = src src.ears = headset_to_add - usr << "You fit the headset onto [src]." + to_chat(usr, "You fit the headset onto [src].") + clearlist(available_channels) for(var/ch in headset_to_add.channels) @@ -568,7 +573,8 @@ return -1 if(held_item) - src << "\red You are already holding the [held_item]" + to_chat(src, "\red You are already holding the [held_item]") + return 1 for(var/obj/item/I in view(1,src)) @@ -584,7 +590,8 @@ visible_message("[src] grabs the [held_item]!", "\blue You grab the [held_item]!", "You hear the sounds of wings flapping furiously.") return held_item - src << "\red There is nothing of interest to take." + to_chat(src, "\red There is nothing of interest to take.") + return 0 /mob/living/simple_animal/parrot/proc/steal_from_mob() @@ -596,7 +603,8 @@ return -1 if(held_item) - src << "\red You are already holding the [held_item]" + to_chat(src, "\red You are already holding the [held_item]") + return 1 var/obj/item/stolen_item = null @@ -615,7 +623,8 @@ visible_message("[src] grabs the [held_item] out of [C]'s hand!", "\blue You snag the [held_item] out of [C]'s hand!", "You hear the sounds of wings flapping furiously.") return held_item - src << "\red There is nothing of interest to take." + to_chat(src, "\red There is nothing of interest to take.") + return 0 /mob/living/simple_animal/parrot/verb/drop_held_item_player() @@ -639,7 +648,8 @@ return -1 if(!held_item) - usr << "\red You have nothing to drop!" + to_chat(usr, "\red You have nothing to drop!") + return 0 if(!drop_gently) @@ -647,11 +657,13 @@ var/obj/item/weapon/grenade/G = held_item G.loc = src.loc G.prime() - src << "You let go of the [held_item]!" + to_chat(src, "You let go of the [held_item]!") + held_item = null return 1 - src << "You drop the [held_item]." + to_chat(src, "You drop the [held_item].") + held_item.loc = src.loc held_item = null @@ -672,7 +684,8 @@ src.loc = AM.loc icon_state = "parrot_sit" return - src << "\red There is no perch nearby to sit on." + to_chat(src, "\red There is no perch nearby to sit on.") + return /* diff --git a/code/modules/mob/living/simple_animal/powers.dm b/code/modules/mob/living/simple_animal/powers.dm index 060c85fe4d0..9df6a9c8110 100644 --- a/code/modules/mob/living/simple_animal/powers.dm +++ b/code/modules/mob/living/simple_animal/powers.dm @@ -8,13 +8,17 @@ if (layer != TURF_LAYER+0.2) layer = TURF_LAYER+0.2 - src << text("\green You are now hiding.") + to_chat(src, text("\green You are now hiding.")) + for(var/mob/O in oviewers(src, null)) if ((O.client && !( O.blinded ))) - O << text("[] scurries to the ground!", src) + to_chat(O, text("[] scurries to the ground!", src)) + else layer = MOB_LAYER - src << text("\green You have stopped hiding.") + to_chat(src, text("\green 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) \ No newline at end of file + to_chat(O, text("[] slowly peaks up from the ground...", src)) + diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm index 124cacc0a8f..c9b801734e8 100644 --- a/code/modules/mob/living/simple_animal/shade.dm +++ b/code/modules/mob/living/simple_animal/shade.dm @@ -48,7 +48,8 @@ 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." + to_chat(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]. ") diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 362ec626f2b..a92410d069f 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -385,7 +385,8 @@ /mob/living/simple_animal/attack_slime(mob/living/carbon/slime/M as mob) if (!ticker) - M << "You cannot attack people before the game has started." + to_chat(M, "You cannot attack people before the game has started.") + return if(M.Victim) return // can't attack while eating! @@ -423,13 +424,16 @@ M.show_message("\blue [user] applies [MED] on [src]") return else - user << "\blue [MED] won't help at all." + to_chat(user, "\blue [MED] won't help at all.") + return else - user << "\blue [src] is at full health." + to_chat(user, "\blue [src] is at full health.") + return else - user << "\blue [src] is dead, medical items won't bring it back to life." + to_chat(user, "\blue [src] is dead, medical items won't bring it back to life.") + return else if(can_collar && !collar && istype(O, /obj/item/clothing/accessory/petcollar)) var/obj/item/clothing/accessory/petcollar/C = O @@ -438,7 +442,8 @@ collar = C collar.equipped(src) regenerate_icons() - usr << "You put \the [C] around \the [src]'s neck." + to_chat(usr, "You put \the [C] around \the [src]'s neck.") + if(C.tagname) name = C.tagname real_name = C.tagname @@ -655,14 +660,16 @@ return if(collar) if(collar.flags & NODROP) - usr << "\The [collar] is stuck too hard to [src] for you to remove!" + to_chat(usr, "\The [collar] is stuck too hard to [src] for you to remove!") + return collar.dropped(src) collar.forceMove(src.loc) collar = null regenerate_icons() else - usr << "There is nothing to remove from its [remove_from]." + to_chat(usr, "There is nothing to remove from its [remove_from].") + return show_inv(usr) else if(href_list["add_inv"]) @@ -683,7 +690,8 @@ collar = C collar.equipped(src) regenerate_icons() - usr << "You put \the [C] around \the [src]'s neck." + to_chat(usr, "You put \the [C] around \the [src]'s neck.") + if(C.tagname) name = C.tagname real_name = C.tagname @@ -695,4 +703,4 @@ . |= collar.GetAccess() /mob/living/simple_animal/proc/sentience_act() //Called when a simple animal gains sentience via gold slime potion - return + return diff --git a/code/modules/mob/living/simple_animal/tribbles.dm b/code/modules/mob/living/simple_animal/tribbles.dm index 7e0f0071fe7..c78645ce45d 100644 --- a/code/modules/mob/living/simple_animal/tribbles.dm +++ b/code/modules/mob/living/simple_animal/tribbles.dm @@ -53,9 +53,11 @@ var/global/totaltribbles = 0 //global variable so it updates for all tribbles, /mob/living/simple_animal/tribble/attackby(var/obj/item/weapon/O as obj, var/mob/user as mob, params) if(istype(O, /obj/item/weapon/scalpel)) - user << "You try to neuter the tribble, but it's moving too much and you fail!" + to_chat(user, "You try to neuter the tribble, but it's moving too much and you fail!") + else if(istype(O, /obj/item/weapon/cautery)) - user << "You try to un-neuter the tribble, but it's moving too much and you fail!" + to_chat(user, "You try to un-neuter the tribble, but it's moving too much and you fail!") + ..() @@ -96,7 +98,8 @@ var/global/totaltribbles = 0 //global variable so it updates for all tribbles, /obj/item/toy/tribble/attack_self(mob/user as mob) //hug that tribble (and play a sound if we add one) ..() - user << "You nuzzle the tribble and it trills softly." + to_chat(user, "You nuzzle the tribble and it trills softly.") + /obj/item/toy/tribble/dropped(mob/user as mob) //now you can't item form them to get rid of them all so easily ..() @@ -107,17 +110,20 @@ var/global/totaltribbles = 0 //global variable so it updates for all tribbles, T.icon_dead = "[src.icon_state]_dead" T.gestation = src.gestation - user << "The tribble gets up and wanders around." + to_chat(user, "The tribble gets up and wanders around.") + qdel(src) /obj/item/toy/tribble/attackby(var/obj/item/weapon/O as obj, var/mob/user as mob) //neutering and un-neutering ..() if(istype(O, /obj/item/weapon/scalpel) && src.gestation != null) gestation = null - user << "You neuter the tribble so that it can no longer re-produce." + to_chat(user, "You neuter the tribble so that it can no longer re-produce.") + else if (istype(O, /obj/item/weapon/cautery) && src.gestation == null) gestation = 0 - user << "You fuse some recently cut tubes together, it should be able to reproduce again." + to_chat(user, "You fuse some recently cut tubes together, it should be able to reproduce again.") + @@ -195,10 +201,12 @@ var/global/totaltribbles = 0 //global variable so it updates for all tribbles, if (src.destroyed) return else - usr << text("\blue You kick the lab cage.") + to_chat(usr, text("\blue You kick the lab cage.")) + for(var/mob/O in oviewers()) if ((O.client && !( O.blinded ))) - O << text("\red [] kicks the lab cage.", usr) + to_chat(O, text("\red [] kicks the lab cage.", usr)) + src.health -= 2 healthcheck() return diff --git a/code/modules/mob/living/simple_animal/vox.dm b/code/modules/mob/living/simple_animal/vox.dm index e48c7f81d3d..78fff8e8c86 100644 --- a/code/modules/mob/living/simple_animal/vox.dm +++ b/code/modules/mob/living/simple_animal/vox.dm @@ -46,7 +46,8 @@ 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." + to_chat(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]. ") @@ -60,10 +61,12 @@ if(quills<=0) return - src << "\red You launch a razor-sharp quill at [target]!" + to_chat(src, "\red You launch a razor-sharp quill at [target]!") + for(var/mob/O in oviewers()) if ((O.client && !( O.blinded ))) - O << "\red [src] launches a razor-sharp quill at [target]!" + to_chat(O, "\red [src] launches a razor-sharp quill at [target]!") + var/obj/item/weapon/arrow/quill/Q = new(loc) Q.fingerprintslast = src.ckey @@ -71,7 +74,8 @@ quills-- spawn(100) - src << "\red You feel a fresh quill slide into place." + to_chat(src, "\red You feel a fresh quill slide into place.") + quills++ /mob/living/simple_animal/vox/armalis/verb/message_mob() @@ -93,15 +97,18 @@ var/mob/M = targets[target] if(istype(M, /mob/dead/observer) || M.stat == DEAD) - src << "Not even the armalis can speak to the dead." + to_chat(src, "Not even the armalis can speak to the dead.") + return - M << "\blue Like lead slabs crashing into the ocean, alien thoughts drop into your mind: [text]" + to_chat(M, "\blue Like lead slabs crashing into the ocean, alien thoughts drop into your mind: [text]") + if(istype(M,/mob/living/carbon/human)) var/mob/living/carbon/human/H = M if(H.species.name == "Vox") return - H << "\red Your nose begins to bleed..." + to_chat(H, "\red Your nose begins to bleed...") + H.drip(1) /mob/living/simple_animal/vox/armalis/verb/shriek() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 370e029200b..739c70e2446 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -46,7 +46,8 @@ t+= "\blue Plasma : [environment.toxins] \n" t+= "\blue Carbon Dioxide: [environment.carbon_dioxide] \n" for(var/datum/gas/trace_gas in environment.trace_gases) - usr << "\blue [trace_gas.type]: [trace_gas.moles] \n" + to_chat(usr, "\blue [trace_gas.type]: [trace_gas.moles] \n") + usr.show_message(t, 1) @@ -71,9 +72,11 @@ return // Added voice muffling for Issue 41. if(stat == UNCONSCIOUS || (sleeping > 0 && stat != 2)) - src << "... You can almost hear someone talking ..." + to_chat(src, "... You can almost hear someone talking ...") + else - src << msg + to_chat(src, msg) + return // Show a message to all mobs in sight of this one @@ -171,7 +174,9 @@ if (istype(W, /obj/item/clothing)) var/obj/item/clothing/C = W if(C.rig_restrict_helmet) - src << "\red You must fasten the helmet to a hardsuit first. (Target the head and use on a hardsuit)" // Stop eva helms equipping. + to_chat(src, "\red You must fasten the helmet to a hardsuit first. (Target the head and use on a hardsuit)")// Stop eva helms equipping. + + else equip_to_slot_if_possible(C, slot) else @@ -206,7 +211,9 @@ qdel(W) else if(!disable_warning) - src << "\red You are unable to equip that." //Only print if del_on_fail is false + to_chat(src, "\red You are unable to equip that.")//Only print if del_on_fail is false + + return 0 equip_to_slot(W, slot, redraw_mob) //This proc should not ever fail. @@ -348,7 +355,8 @@ var/list/slot_equipment_priority = list( \ if(slot_belt) if(!H.w_uniform) if(!disable_warning) - H << "\red You need a jumpsuit before you can attach this [name]." + to_chat(H, "\red You need a jumpsuit before you can attach this [name].") + return 0 if( !(slot_flags & SLOT_BELT) ) return 0 @@ -408,7 +416,8 @@ var/list/slot_equipment_priority = list( \ if(slot_wear_id) if(!H.w_uniform) if(!disable_warning) - H << "\red You need a jumpsuit before you can attach this [name]." + to_chat(H, "\red You need a jumpsuit before you can attach this [name].") + return 0 if( !(slot_flags & SLOT_ID) ) return 0 @@ -423,7 +432,8 @@ var/list/slot_equipment_priority = list( \ return 0 if(!H.w_uniform) if(!disable_warning) - H << "\red You need a jumpsuit before you can attach this [name]." + to_chat(H, "\red You need a jumpsuit before you can attach this [name].") + return 0 if(slot_flags & SLOT_DENYPOCKET) return @@ -434,7 +444,8 @@ var/list/slot_equipment_priority = list( \ return 0 if(!H.w_uniform) if(!disable_warning) - H << "\red You need a jumpsuit before you can attach this [name]." + to_chat(H, "\red You need a jumpsuit before you can attach this [name].") + return 0 if(slot_flags & SLOT_DENYPOCKET) return 0 @@ -444,15 +455,18 @@ var/list/slot_equipment_priority = list( \ if(slot_s_store) if(!H.wear_suit) if(!disable_warning) - H << "\red You need a suit before you can attach this [name]." + to_chat(H, "\red You need a suit before you can attach this [name].") + return 0 if(!H.wear_suit.allowed) if(!disable_warning) - usr << "You somehow have a suit with no defined allowed items for suit storage, stop that." + to_chat(usr, "You somehow have a suit with no defined allowed items for suit storage, stop that.") + return 0 if(src.w_class > 4) if(!disable_warning) - usr << "The [name] is too big to attach." + to_chat(usr, "The [name] is too big to attach.") + return 0 if( istype(src, /obj/item/device/pda) || istype(src, /obj/item/weapon/pen) || is_type_in_list(src, H.wear_suit.allowed) ) if(H.s_store) @@ -519,7 +533,8 @@ var/list/slot_equipment_priority = list( \ set category = "IC" if((is_blind(src) || usr.stat) && !isobserver(src)) - src << "Something is there but you can't see it." + to_chat(src, "Something is there but you can't see it.") + return 1 face_atom(A) @@ -625,7 +640,8 @@ var/list/slot_equipment_priority = list( \ if(mind) mind.show_memory(src) else - src << "The game appears to have misplaced your mind datum, so we can't show you your notes." + to_chat(src, "The game appears to have misplaced your mind datum, so we can't show you your notes.") + /mob/verb/add_memory(msg as message) set name = "Add Note" @@ -637,7 +653,8 @@ var/list/slot_equipment_priority = list( \ if(mind) mind.store_memory(msg) else - src << "The game appears to have misplaced your mind datum, so we can't show you your notes." + to_chat(src, "The game appears to have misplaced your mind datum, so we can't show you your notes.") + /mob/proc/store_memory(msg as message, popup, sane = 1) msg = copytext(msg, 1, MAX_MESSAGE_LEN) @@ -656,7 +673,8 @@ var/list/slot_equipment_priority = list( \ /mob/proc/update_flavor_text() set src in usr if(usr != src) - usr << "No." + to_chat(usr, "No.") + var/msg = input(usr,"Set the flavor text in your 'examine' verb. Can also be used for OOC notes about your character.","Flavor Text",html_decode(flavor_text)) as message|null if(msg != null) @@ -684,16 +702,19 @@ var/list/slot_equipment_priority = list( \ set category = "OOC" if (!abandon_allowed) - usr << "Respawning is disabled." + to_chat(usr, "Respawning is disabled.") + return if (stat != DEAD || !ticker) - usr << "You must be dead to use this!" + to_chat(usr, "You must be dead to use this!") + return log_game("[key_name(usr)] has respawned.") - usr << "Make sure to play a different character, and please roleplay correctly!" + to_chat(usr, "Make sure to play a different character, and please roleplay correctly!") + if(!client) log_game("[key_name(usr)] respawn failed due to disconnect.") @@ -722,7 +743,8 @@ var/list/slot_equipment_priority = list( \ if(client.holder && (client.holder.rights & R_ADMIN)) is_admin = 1 else if(stat != DEAD || istype(src, /mob/new_player)) - usr << "\blue You must be observing to use this!" + to_chat(usr, "\blue You must be observing to use this!") + return if(is_admin && stat == DEAD) @@ -937,7 +959,8 @@ var/list/slot_equipment_priority = list( \ /mob/proc/see(message) if(!is_active()) return 0 - src << message + to_chat(src, message) + return 1 /mob/proc/is_muzzled() @@ -1185,11 +1208,13 @@ mob/proc/yank_out_object() usr.changeNext_move(CLICK_CD_RESIST) if(usr.stat == 1) - usr << "You are unconcious and cannot do that!" + to_chat(usr, "You are unconcious and cannot do that!") + return if(usr.restrained()) - usr << "You are restrained and cannot do that!" + to_chat(usr, "You are restrained and cannot do that!") + return var/mob/S = src @@ -1203,17 +1228,21 @@ mob/proc/yank_out_object() valid_objects = get_visible_implants(0) if(!valid_objects.len) if(self) - src << "You have nothing stuck in your body that is large enough to remove." + to_chat(src, "You have nothing stuck in your body that is large enough to remove.") + else - U << "[src] has nothing stuck in their wounds that is large enough to remove." + to_chat(U, "[src] has nothing stuck in their wounds that is large enough to remove.") + return var/obj/item/weapon/selection = input("What do you want to yank out?", "Embedded objects") in valid_objects if(self) - src << "You attempt to get a good grip on [selection] in your body." + to_chat(src, "You attempt to get a good grip on [selection] in your body.") + else - U << "You attempt to get a good grip on [selection] in [S]'s body." + to_chat(U, "You attempt to get a good grip on [selection] in [S]'s body.") + if(!do_after(U, 80, target = S)) return @@ -1268,11 +1297,13 @@ mob/proc/yank_out_object() set category = "Ghost" if(jobban_isbanned(usr, "NPC")) - usr << "You are banned from playing as NPC's." + to_chat(usr, "You are banned from playing as NPC's.") + return if(!ticker || ticker.current_state < 3) - src << "You can't respawn as an NPC before the game starts!" + to_chat(src, "You can't respawn as an NPC before the game starts!") + return if((usr in respawnable_list) && (stat==2 || istype(usr,/mob/dead/observer))) @@ -1296,7 +1327,8 @@ mob/proc/yank_out_object() spawn(5) respawnable_list += usr else - usr << "You are not dead or you have given up your right to be respawned!" + to_chat(usr, "You are not dead or you have given up your right to be respawned!") + return @@ -1305,7 +1337,8 @@ mob/proc/yank_out_object() if(client.time_died_as_mouse && timedifference <= mouse_respawn_time * 600) var/timedifference_text timedifference_text = time2text(mouse_respawn_time * 600 - timedifference,"mm:ss") - src << "You may only spawn again as a mouse more than [mouse_respawn_time] minutes after your death. You have [timedifference_text] left." + to_chat(src, "You may only spawn again as a mouse more than [mouse_respawn_time] minutes after your death. You have [timedifference_text] left.") + return //find a viable mouse candidate @@ -1319,11 +1352,13 @@ mob/proc/yank_out_object() vent_found = pick(found_vents) host = new /mob/living/simple_animal/mouse(vent_found.loc) else - src << "Unable to find any unwelded vents to spawn mice at." + to_chat(src, "Unable to find any unwelded vents to spawn mice at.") + if(host) host.ckey = src.ckey - host << "You are now a mouse. Try to avoid interaction with players, and do not give hints away that you are more than a simple rodent." + to_chat(host, "You are now a mouse. Try to avoid interaction with players, and do not give hints away that you are more than a simple rodent.") + /mob/proc/assess_threat() //For sec bot threat assessment return diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index f5a61359a01..72e3286525f 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -262,7 +262,8 @@ hud.icon_state = "reinforce1" else if(state < GRAB_NECK) if(isslime(affecting)) - assailant << "You squeeze [affecting], but nothing interesting happens." + to_chat(assailant, "You squeeze [affecting], but nothing interesting happens.") + return assailant.visible_message("[assailant] has reinforced \his grip on [affecting] (now neck)!") @@ -318,7 +319,8 @@ switch(assailant.a_intent) if(I_HELP) /*if(force_down) - assailant << "You no longer pin [affecting] to the ground." + to_chat(assailant, "You no longer pin [affecting] to the ground.") + force_down = 0 return*///This is a very basic demonstration of a new feature based on attacking someone with the grab, based on intent. //This specific example would allow you to stop pinning people to the floor without moving away from them. @@ -345,18 +347,22 @@ /*if(last_hit_zone == "eyes") if(state < GRAB_NECK) - assailant << "You require a better grab to do this." + to_chat(assailant, "You require a better grab to do this.") + return if((affected.head && affected.head.flags & HEADCOVERSEYES) || \ (affected.wear_mask && affected.wear_mask.flags & MASKCOVERSEYES) || \ (affected.glasses && affected.glasses.flags & GLASSESCOVERSEYES)) - assailant << "You're going to need to remove the eye covering first." + to_chat(assailant, "You're going to need to remove the eye covering first.") + return if(!affected.internal_organs_by_name["eyes"]) - assailant << "You cannot locate any eyes on [affecting]!" + to_chat(assailant, "You cannot locate any eyes on [affecting]!") + return assailant.visible_message("[assailant] presses \his fingers into [affecting]'s eyes!") - affecting << "You feel immense pain as digits are being pressed into your eyes!" + to_chat(affecting, "You feel immense pain as digits are being pressed into your eyes!") + assailant.attack_log += text("\[[time_stamp()]\] Pressed fingers into the eyes of [affecting.name] ([affecting.ckey])") affecting.attack_log += text("\[[time_stamp()]\] Had fingers pressed into their eyes by [assailant.name] ([assailant.ckey])") msg_admin_attack("[key_name(assailant)] has pressed his fingers into [key_name(affecting)]'s eyes.") @@ -364,12 +370,15 @@ eyes.damage += rand(3,4) if (eyes.damage >= eyes.min_broken_damage) if(M.stat != 2) - M << "\red You go blind!"*///This is a demonstration of adding a new damaging type based on intent as well as hitzone. + to_chat(M, "\red You go blind!")*///This is a demonstration of adding a new damaging type based on intent as well as hitzone. + + //This specific example would allow you to squish people's eyes with a GRAB_NECK. if(I_DISARM) //This checks that the user is on disarm intent. /* if(state < GRAB_AGGRESSIVE) - assailant << "You require a better grab to do this." + to_chat(assailant, "You require a better grab to do this.") + return if(!force_down) assailant.visible_message("[user] is forcing [affecting] to the ground!") @@ -381,7 +390,8 @@ affecting.set_dir(SOUTH) //face up return else - assailant << "You are already pinning [affecting] to the ground." + to_chat(assailant, "You are already pinning [affecting] to the ground.") + return*///This is an example of something being done with an agressive grab + disarm intent. return diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 834592eb9c5..9abffc4284c 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -473,7 +473,8 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM) set category = "IC" if(usr.sleeping) - usr << "\red You are already sleeping" + to_chat(usr, "\red You are already sleeping") + return else if(alert(src,"You sure you want to sleep for a while?","Sleep","Yes","No") == "Yes") @@ -484,7 +485,8 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM) set category = "IC" resting = !resting - src << "\blue You are now [resting ? "resting" : "getting up"]" + to_chat(src, "\blue You are now [resting ? "resting" : "getting up"]") + /proc/is_blind(A) if(iscarbon(A)) @@ -554,14 +556,17 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM) else // Everyone else (dead people who didn't ghost yet, etc.) lname = name lname = "[lname] " - M << "[lname][follow][message]" + to_chat(M, "[lname][follow][message]") + /proc/notify_ghosts(var/message, var/ghost_sound = null) //Easy notification of ghosts. for(var/mob/dead/observer/O in player_list) if(O.client) - O << "[message]" + to_chat(O, "[message]") + if(ghost_sound) - O << sound(ghost_sound) + to_chat(O, sound(ghost_sound)) + /mob/proc/switch_to_camera(var/obj/machinery/camera/C) if (!C.can_use() || stat || (get_dist(C, src) > 1 || machine != src || blinded || !canmove)) @@ -642,7 +647,8 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM) break if(newname) break //That's a suitable name! - src << "Sorry, that [role]-name wasn't appropriate, please try another. It's possibly too long/short, has bad characters or is already taken." + to_chat(src, "Sorry, that [role]-name wasn't appropriate, please try another. It's possibly too long/short, has bad characters or is already taken.") + if(!newname) //we'll stick with the oldname then return diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 22a41279401..71ab4ba944f 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -50,12 +50,14 @@ var/mob/living/silicon/robot/R = usr var/module = R.get_selected_module() if(!module) - usr << "\red You have no module selected." + to_chat(usr, "\red You have no module selected.") + return R.cycle_modules() R.uneq_numbered(module) else - usr << "\red This mob type cannot throw items." + to_chat(usr, "\red This mob type cannot throw items.") + return @@ -63,17 +65,20 @@ if(iscarbon(usr)) var/mob/living/carbon/C = usr if(!C.get_active_hand()) - usr << "\red You have nothing to drop in your hand." + to_chat(usr, "\red You have nothing to drop in your hand.") + return drop_item() else if(isrobot(usr)) var/mob/living/silicon/robot/R = usr if(!R.get_selected_module()) - usr << "\red You have no module selected." + to_chat(usr, "\red You have no module selected.") + return R.deselect_module(R.get_selected_module()) else - usr << "\red This mob type cannot drop items." + to_chat(usr, "\red This mob type cannot drop items.") + return //This gets called when you press the delete button. @@ -81,7 +86,8 @@ set hidden = 1 if(!usr.pulling) - usr << "\blue You are not pulling anything." + to_chat(usr, "\blue You are not pulling anything.") + return usr.stop_pulling() @@ -227,13 +233,15 @@ for(var/mob/M in range(mob, 1)) if(M.pulling == mob) if(!M.restrained() && M.stat == 0 && M.canmove && mob.Adjacent(M)) - src << "\blue You're restrained! You can't move!" + to_chat(src, "\blue You're restrained! You can't move!") + return 0 else M.stop_pulling() if(mob.pinned.len) - src << "\blue You're pinned to a wall by [mob.pinned[1]]!" + to_chat(src, "\blue You're pinned to a wall by [mob.pinned[1]]!") + return 0 var/turf/T = mob.loc @@ -392,7 +400,8 @@ if(3) //Incorporeal move, but blocked by holy-watered tiles var/turf/simulated/floor/stepTurf = get_step(L, direct) if(stepTurf.flags & NOJAUNT) - L << "Holy energies block your path." + to_chat(L, "Holy energies block your path.") + L.notransform = 1 spawn(2) L.notransform = 0 @@ -439,7 +448,8 @@ if(movement_dir && dense_object_backup) if(dense_object_backup.newtonian_move(turn(movement_dir, 180))) //You're pushing off something movable, so it moves - src << "You push off of [dense_object_backup] to propel yourself." + to_chat(src, "You push off of [dense_object_backup] to propel yourself.") + return 1 diff --git a/code/modules/mob/mob_transformation_simple.dm b/code/modules/mob/mob_transformation_simple.dm index 33428a9c096..d60c4d7d9a0 100644 --- a/code/modules/mob/mob_transformation_simple.dm +++ b/code/modules/mob/mob_transformation_simple.dm @@ -5,7 +5,8 @@ /mob/proc/change_mob_type(var/new_type = null, var/turf/location = null, var/new_name = null as text, var/delete_old_mob = 0 as num, var/forcekey = 0) if(istype(src,/mob/new_player)) - usr << "\red cannot convert players who have not entered yet." + to_chat(usr, "\red cannot convert players who have not entered yet.") + return if(!new_type) @@ -15,11 +16,13 @@ new_type = text2path(new_type) if( !ispath(new_type) ) - usr << "Invalid type path (new_type = [new_type]) in change_mob_type(). Contact a coder." + to_chat(usr, "Invalid type path (new_type = [new_type]) in change_mob_type(). Contact a coder.") + return if( new_type == /mob/new_player ) - usr << "\red cannot convert into a new_player mob type." + to_chat(usr, "\red cannot convert into a new_player mob type.") + return var/mob/M @@ -29,7 +32,8 @@ M = new new_type( src.loc ) if(!M || !ismob(M)) - usr << "Type path is not a mob (new_type = [new_type]) in change_mob_type(). Contact a coder." + to_chat(usr, "Type path is not a mob (new_type = [new_type]) in change_mob_type(). Contact a coder.") + qdel(M) return diff --git a/code/modules/mob/new_player/login.dm b/code/modules/mob/new_player/login.dm index b29267f9c3b..44db9388315 100644 --- a/code/modules/mob/new_player/login.dm +++ b/code/modules/mob/new_player/login.dm @@ -1,7 +1,8 @@ /mob/new_player/Login() update_Login_details() //handles setting lastKnownIP and computer_id for use by the ban systems as well as checking for multikeying if(join_motd) - src << "
      [join_motd]
      " + to_chat(src, "
      [join_motd]
      ") + if(!mind) mind = new /datum/mind(key) @@ -43,4 +44,5 @@ for(var/client/C in clients) tally++ if(tally > config.player_overflow_cap) - src << link(config.overflow_server_url) \ No newline at end of file + src << link(config.overflow_server_url) + diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 0f493a22dab..d539b051208 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -118,12 +118,15 @@ var/mob/dead/observer/observer = new() src << browse(null, "window=playersetup") spawning = 1 - src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) // MAD JAMS cant last forever yo + to_chat(src, sound(null, repeat = 0, wait = 0, volume = 85, channel = 1))// MAD JAMS cant last forever yo + + observer.started_as_observer = 1 close_spawn_windows() var/obj/O = locate("landmark*Observer-Start") - src << "\blue Now teleporting." + to_chat(src, "\blue Now teleporting.") + observer.loc = O.loc observer.timeofdeath = world.time // Set the time of death so that the respawn timer works correctly. client.prefs.update_preview_icon(1) @@ -143,13 +146,15 @@ if(href_list["late_join"]) if(!ticker || ticker.current_state != GAME_STATE_PLAYING) - usr << "\red The round is either not ready, or has already finished..." + to_chat(usr, "\red The round is either not ready, or has already finished...") + return if(client.prefs.species in whitelisted_species) if(!is_alien_whitelisted(src, client.prefs.species) && config.usealienwhitelist) - src << alert("You are currently not whitelisted to play [client.prefs.species].") + to_chat(src, alert("You are currently not whitelisted to play [client.prefs.species].")) + return 0 LateChoices() @@ -160,12 +165,14 @@ if(href_list["SelectedJob"]) if(!enter_allowed) - usr << "\blue There is an administrative lock on entering the game!" + to_chat(usr, "\blue There is an administrative lock on entering the game!") + return if(client.prefs.species in whitelisted_species) if(!is_alien_whitelisted(src, client.prefs.species) && config.usealienwhitelist) - src << alert("You are currently not whitelisted to play [client.prefs.species].") + to_chat(src, alert("You are currently not whitelisted to play [client.prefs.species].")) + return 0 AttemptLateSpawn(href_list["SelectedJob"],client.prefs.spawnpoint) @@ -206,7 +213,8 @@ var/id_max = text2num(href_list["maxid"]) if( (id_max - id_min) > 100 ) //Basic exploit prevention - usr << "The option ID difference is too big. Please contact administration or the database admin." + to_chat(usr, "The option ID difference is too big. Please contact administration or the database admin.") + return for(var/optionid = id_min; optionid <= id_max; optionid++) @@ -225,7 +233,8 @@ var/id_max = text2num(href_list["maxoptionid"]) if( (id_max - id_min) > 100 ) //Basic exploit prevention - usr << "The option ID difference is too big. Please contact administration or the database admin." + to_chat(usr, "The option ID difference is too big. Please contact administration or the database admin.") + return for(var/optionid = id_min; optionid <= id_max; optionid++) @@ -257,13 +266,16 @@ if (src != usr) return 0 if(!ticker || ticker.current_state != GAME_STATE_PLAYING) - usr << "\red The round is either not ready, or has already finished..." + to_chat(usr, "\red The round is either not ready, or has already finished...") + return 0 if(!enter_allowed) - usr << "\blue There is an administrative lock on entering the game!" + to_chat(usr, "\blue There is an administrative lock on entering the game!") + return 0 if(!IsJobAvailable(rank)) - src << alert("[rank] is not available. Please try another.") + to_chat(src, alert("[rank] is not available. Please try another.")) + return 0 job_master.AssignRole(src, rank, 1) @@ -302,7 +314,8 @@ character.loc = pick(S.turfs) join_message = S.msg else - character << "Your chosen spawnpoint ([S.display_name]) is unavailable for your chosen job. Spawning you at the Arrivals shuttle instead." + to_chat(character, "Your chosen spawnpoint ([S.display_name]) is unavailable for your chosen job. Spawning you at the Arrivals shuttle instead.") + character.loc = pick(latejoin) join_message = "has arrived on the station" else @@ -415,7 +428,9 @@ client.prefs.real_name = random_name(client.prefs.gender) client.prefs.copy_to(new_character) - src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) // MAD JAMS cant last forever yo + to_chat(src, sound(null, repeat = 0, wait = 0, volume = 85, channel = 1))// MAD JAMS cant last forever yo + + if(mind) mind.active = 0 //we wish to transfer the key manually diff --git a/code/modules/mob/new_player/poll.dm b/code/modules/mob/new_player/poll.dm index d9e240936d7..11aa3b9a084 100644 --- a/code/modules/mob/new_player/poll.dm +++ b/code/modules/mob/new_player/poll.dm @@ -59,7 +59,8 @@ break if(!found) - usr << "\red Poll question details not found." + to_chat(usr, "\red Poll question details not found.") + return switch(polltype) @@ -316,7 +317,8 @@ break if(!validpoll) - usr << "\red Poll is not valid." + to_chat(usr, "\red Poll is not valid.") + return var/DBQuery/select_query2 = dbcon.NewQuery("SELECT id FROM [format_table_name("poll_option")] WHERE id = [optionid] AND pollid = [pollid]") @@ -329,7 +331,8 @@ break if(!validoption) - usr << "\red Poll option is not valid." + to_chat(usr, "\red Poll option is not valid.") + return var/alreadyvoted = 0 @@ -343,11 +346,13 @@ break if(!multichoice && alreadyvoted) - usr << "\red You already voted in this poll." + to_chat(usr, "\red You already voted in this poll.") + return if(multichoice && (alreadyvoted >= multiplechoiceoptions)) - usr << "\red You already have more than [multiplechoiceoptions] logged votes on this poll. Enough is enough. Contact the database admin if this is an error." + to_chat(usr, "\red You already have more than [multiplechoiceoptions] logged votes on this poll. Enough is enough. Contact the database admin if this is an error.") + return var/adminrank = "Player" @@ -358,7 +363,8 @@ var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO [format_table_name("poll_vote")] (id ,datetime ,pollid ,optionid ,ckey ,ip ,adminrank) VALUES (null, Now(), [pollid], [optionid], '[usr.ckey]', '[usr.client.address]', '[adminrank]')") insert_query.Execute() - usr << "\blue Vote successful." + to_chat(usr, "\blue Vote successful.") + usr << browse(null,"window=playerpoll") @@ -383,7 +389,8 @@ break if(!validpoll) - usr << "\red Poll is not valid." + to_chat(usr, "\red Poll is not valid.") + return var/alreadyvoted = 0 @@ -396,7 +403,8 @@ break if(alreadyvoted) - usr << "\red You already sent your feedback for this poll." + to_chat(usr, "\red You already sent your feedback for this poll.") + return var/adminrank = "Player" @@ -410,13 +418,15 @@ replytext = replacetext(replytext, "%BR%", "
      ") if(!text_pass) - usr << "The text you entered was blank, contained illegal characters or was too long. Please correct the text and submit again." + to_chat(usr, "The text you entered was blank, contained illegal characters or was too long. Please correct the text and submit again.") + return var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO [format_table_name("poll_textreply")] (id ,datetime ,pollid ,ckey ,ip ,replytext ,adminrank) VALUES (null, Now(), [pollid], '[usr.ckey]', '[usr.client.address]', '[replytext]', '[adminrank]')") insert_query.Execute() - usr << "\blue Feedback logging successful." + to_chat(usr, "\blue Feedback logging successful.") + usr << browse(null,"window=playerpoll") @@ -441,7 +451,8 @@ break if(!validpoll) - usr << "\red Poll is not valid." + to_chat(usr, "\red Poll is not valid.") + return var/DBQuery/select_query2 = dbcon.NewQuery("SELECT id FROM [format_table_name("poll_option")] WHERE id = [optionid] AND pollid = [pollid]") @@ -454,7 +465,8 @@ break if(!validoption) - usr << "\red Poll option is not valid." + to_chat(usr, "\red Poll option is not valid.") + return var/alreadyvoted = 0 @@ -467,7 +479,8 @@ break if(alreadyvoted) - usr << "\red You already voted in this poll." + to_chat(usr, "\red You already voted in this poll.") + return var/adminrank = "Player" @@ -478,5 +491,6 @@ var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO [format_table_name("poll_vote")] (id ,datetime ,pollid ,optionid ,ckey ,ip ,adminrank, rating) VALUES (null, Now(), [pollid], [optionid], '[usr.ckey]', '[usr.client.address]', '[adminrank]', [(isnull(rating)) ? "null" : rating])") insert_query.Execute() - usr << "\blue Vote successful." + to_chat(usr, "\blue Vote successful.") + usr << browse(null,"window=playerpoll") \ No newline at end of file diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index cc4aafb64e8..5cb41408c45 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -42,11 +42,13 @@ /mob/proc/say_dead(var/message) if(!src.client.holder) if(!config.dsay_allowed) - src << "Deadchat is globally muted." + to_chat(src, "Deadchat is globally muted.") + return if(client && !(client.prefs.toggles & CHAT_DEAD)) - usr << "You have deadchat muted." + to_chat(usr, "You have deadchat muted.") + return say_dead_direct("[pick("complains","moans","whines","laments","blubbers")], \"[message]\"", src) diff --git a/code/modules/mob/spirit/mask/mask.dm b/code/modules/mob/spirit/mask/mask.dm index c121d5684d0..2777905e9d4 100644 --- a/code/modules/mob/spirit/mask/mask.dm +++ b/code/modules/mob/spirit/mask/mask.dm @@ -18,7 +18,8 @@ if (cultist) follow_cultist(cultist.owner) cult_log("[key_name_admin(src)] started following [key_name_admin(cultist)].") - src << "You start following [cultist.get_display_name()]." + to_chat(src, "You start following [cultist.get_display_name()].") + /mob/spirit/mask/verb/urge_cultist() @@ -31,7 +32,8 @@ if (cultist.owner) var/newUrge = stripped_input(usr, "", "Set Urge", "") cultist.set_urge(newUrge) - src << "You urge [cultist.owner.name] to [newUrge]." + to_chat(src, "You urge [cultist.owner.name] to [newUrge].") + cult_log("controlled by [key_name_admin(src)] has urged [key_name_admin(cultist.owner)] to [newUrge].") /mob/spirit/mask/verb/set_cult_name() @@ -45,7 +47,8 @@ if (!newName) return cultist.set_cult_name(newName) - src << "You grant [cultist.owner.name] the secret name of [newName]." + to_chat(src, "You grant [cultist.owner.name] the secret name of [newName].") + if (cultist.owner) cult_log("[key_name_admin(src)] has set [key_name_admin(cultist.owner)] to \'[newName]\'") @@ -58,7 +61,8 @@ var/newUrge = stripped_input(usr, "Please choose an urge.", "Set Urge", "") for(var/obj/cult_viewpoint/viewpoint in cult_viewpoints) viewpoint.set_urge(newUrge) - src << "You urge the entire cult to [newUrge]." + to_chat(src, "You urge the entire cult to [newUrge].") + cult_log("[key_name_admin(src)] has urged the entire cult to [newUrge]") @@ -88,7 +92,8 @@ spawn(0) var/newName = stripped_input(src, "Please pick a name.", "Pick Name for Mask", "") name = newName ? newName : "Mask of Nar'sie" - src << "You have set your name to [name]." + to_chat(src, "You have set your name to [name].") + /mob/spirit/mask/proc/pick_cultist() @@ -133,9 +138,11 @@ flicker_mask(usr) for(var/datum/mind/H in ticker.mode.cult) if (H.current) - H.current << "[usr.name]: [input]" + to_chat(H.current, "[usr.name]: [input]") + for(var/mob/spirit/spirit in spirits) - spirit << "[usr.name]: [input]" + to_chat(spirit, "[usr.name]: [input]") + /obj/effect/proc_holder/spell/aoe_turf/shatter_lights @@ -194,7 +201,8 @@ var/talisman = input("Pick a talisman type", "Talisman", null, null) as null|anything in talismans var/imbue_value = talismans[talisman] if (!talisman) - usr << "You choose not to create a talisman." + to_chat(usr, "You choose not to create a talisman.") + revert_cast(usr) return @@ -206,7 +214,8 @@ if ("Teleport") var/target_rune = input("Pick a teleport target", "Teleport Rune", null, null) as null|anything in engwords if (!target_rune) - usr << "You choose not to create a talisman." + to_chat(usr, "You choose not to create a talisman.") + revert_cast(usr) return summon_type = list(/obj/item/weapon/paper/talisman) diff --git a/code/modules/mob/spirit/movement.dm b/code/modules/mob/spirit/movement.dm index b5ac53fbeae..65b2a8c1bbe 100644 --- a/code/modules/mob/spirit/movement.dm +++ b/code/modules/mob/spirit/movement.dm @@ -36,10 +36,12 @@ mob/spirit/proc/Spirit_Move(direct) var/mob/spirit/U = usr if (!currentView) - U << "As a spirit, you may only track cultists." + to_chat(U, "As a spirit, you may only track cultists.") + U.follow_target = target - U << "Now following [currentView.get_cult_name()]." + to_chat(U, "Now following [currentView.get_cult_name()].") + spawn (0) while (U.follow_target == target) @@ -58,4 +60,5 @@ mob/spirit/verb/toggle_acceleration() set name = "Toggle Acceleration" acceleration = !acceleration - usr << "Acceleration has been toggled [acceleration ? "on" : "off"]." \ No newline at end of file + to_chat(usr, "Acceleration has been toggled [acceleration ? "on" : "off"].") + diff --git a/code/modules/mob/spirit/spirit.dm b/code/modules/mob/spirit/spirit.dm index b5295a0d85f..116191ef851 100644 --- a/code/modules/mob/spirit/spirit.dm +++ b/code/modules/mob/spirit/spirit.dm @@ -57,12 +57,15 @@ mob/spirit/Topic(href, href_list) return ..() - usr << "Spirit Href = [href]" + to_chat(usr, "Spirit Href = [href]") + for (var/tempref in href_list) - usr << "Spirit href list [tempref] = [href_list[tempref]]" + to_chat(usr, "Spirit href list [tempref] = [href_list[tempref]]") + if (href_list["track"]) - usr << "Got to tracking." + to_chat(usr, "Got to tracking.") + var/mob/target = locate(href_list["track"]) in mob_list var/mob/spirit/A = locate(href_list["track2"]) in spirits if(A && target) diff --git a/code/modules/mob/spirit/viewpoint.dm b/code/modules/mob/spirit/viewpoint.dm index 85599a52b62..240672b21a7 100644 --- a/code/modules/mob/spirit/viewpoint.dm +++ b/code/modules/mob/spirit/viewpoint.dm @@ -36,9 +36,11 @@ var/obj/cult_viewpoint/list/cult_viewpoints = list() set name = "Check Urge" set src in usr if (src.urge) - owner << "\red \b You feel the urge to [src.urge]" + to_chat(owner, "\red \b You feel the urge to [src.urge]") + else - owner << "\b You feel no supernatural compulsions." + to_chat(owner, "\b You feel no supernatural compulsions.") + /obj/cult_viewpoint/verb/reach_out() @@ -49,10 +51,14 @@ var/obj/cult_viewpoint/list/cult_viewpoints = list() for(var/mob/spirit/mask/currentMask in spirits) if (currentMask.is_active()) - owner << "\red \b You feel the reassuring presence of your god." - currentMask << "[get_display_name()] has reached out to you." + to_chat(owner, "\red \b You feel the reassuring presence of your god.") + + to_chat(currentMask, "[get_display_name()] has reached out to you.") + + return - owner << "\b You feel a chilling absence." + to_chat(owner, "\b You feel a chilling absence.") + handle_missing_mask() @@ -63,11 +69,14 @@ var/obj/cult_viewpoint/list/cult_viewpoints = list() set src in usr switch(favor) if(FAVOR_PLEASED) - owner << "\red \b You bask in your gods favor." + to_chat(owner, "\red \b You bask in your gods favor.") + if(FAVOR_INDIFFERENT) - owner << "\red \b You feel nothing." + to_chat(owner, "\red \b You feel nothing.") + if(FAVOR_DISPLEASED) - owner << "\red \b You cringe at your gods displeasure." + to_chat(owner, "\red \b You cringe at your gods displeasure.") + /obj/cult_viewpoint/verb/pray_to_mask() @@ -81,10 +90,13 @@ var/obj/cult_viewpoint/list/cult_viewpoints = list() return cult_log("[key_name(usr,0)](Pray):[input]") - owner << "You pray to Nar'Sie: [input]" + to_chat(owner, "You pray to Nar'Sie: [input]") + for(var/mob/spirit/spirit in spirits) - spirit << "[get_display_name()] prays : [input]" + to_chat(spirit, "[get_display_name()] prays : [input]") + + // PROCS /obj/cult_viewpoint/proc/set_favor(var/newFavor) @@ -120,10 +132,12 @@ var/obj/cult_viewpoint/list/cult_viewpoints = list() return FALSE if (newName) cult_name = newName - owner << "\red \b You have been blessed with the secret name of '[newName]'." + to_chat(owner, "\red \b You have been blessed with the secret name of '[newName]'.") + else cult_name = null - owner << "\red \b Your god has taken your secret name." + to_chat(owner, "\red \b Your god has taken your secret name.") + /obj/cult_viewpoint/proc/get_display_name() @@ -159,7 +173,8 @@ var/obj/cult_viewpoint/list/cult_viewpoints = list() else return else - owner << "\b You cannot become a mask of Nar'Sie because a Mask already exists." + to_chat(owner, "\b You cannot become a mask of Nar'Sie because a Mask already exists.") + mask_has_been_found() return diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 26e2497ac0c..6ecf69a81b1 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -28,7 +28,9 @@ /mob/proc/AIize() if(client) - src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) // stop the jams for AIs + to_chat(src, sound(null, repeat = 0, wait = 0, volume = 85, channel = 1))// stop the jams for AIs + + var/mob/living/silicon/ai/O = new (loc,,,1)//No MMI but safety is in effect. O.invisibility = 0 O.aiRestorePowerRoutine = 0 @@ -53,7 +55,8 @@ continue loc_landmark = tripai if (!loc_landmark) - O << "Oh god sorry we can't find an unoccupied AI spawn location, so we're spawning you on top of someone." + to_chat(O, "Oh god sorry we can't find an unoccupied AI spawn location, so we're spawning you on top of someone.") + for(var/obj/effect/landmark/start/sloc in landmarks_list) if (sloc.name == "AI") loc_landmark = sloc @@ -106,8 +109,10 @@ "You hear strange noise, you can't quite place it.") qdel(src) - new_spirit << "You are a Mask of Nar'sie now. You are a tiny fragment of the unknowable entity that is the god." - new_spirit << "Your job is to help your acolytes complete their goals. Be spooky. Do evil." + to_chat(new_spirit, "You are a Mask of Nar'sie now. You are a tiny fragment of the unknowable entity that is the god.") + + to_chat(new_spirit, "Your job is to help your acolytes complete their goals. Be spooky. Do evil.") + new_spirit.set_name() @@ -208,7 +213,8 @@ new_xeno.a_intent = I_HARM new_xeno.key = key - new_xeno << "You are now an alien." + to_chat(new_xeno, "You are now an alien.") + new_xeno.update_pipe_vision() spawn(0)//To prevent the proc from returning null. qdel(src) @@ -244,7 +250,8 @@ else new_slime.key = key - new_slime << "You are now a slime. Skreee!" + to_chat(new_slime, "You are now a slime. Skreee!") + new_slime.update_pipe_vision() spawn(0)//To prevent the proc from returning null. qdel(src) @@ -267,7 +274,8 @@ new_corgi.a_intent = I_HARM new_corgi.key = key - new_corgi << "You are now a Corgi. Yap Yap!" + to_chat(new_corgi, "You are now a Corgi. Yap Yap!") + new_corgi.update_pipe_vision() spawn(0)//To prevent the proc from returning null. qdel(src) @@ -298,7 +306,8 @@ new_mob.a_intent = I_HARM - new_mob << "You suddenly feel more... animalistic." + to_chat(new_mob, "You suddenly feel more... animalistic.") + new_mob.update_pipe_vision() spawn() qdel(src) @@ -313,7 +322,8 @@ new_mob.key = key new_mob.a_intent = I_HARM - new_mob << "You feel more... animalistic" + to_chat(new_mob, "You feel more... animalistic") + new_mob.update_pipe_vision() qdel(src) diff --git a/code/modules/mob/typing_indicator.dm b/code/modules/mob/typing_indicator.dm index f2e4595a35b..bd232accab6 100644 --- a/code/modules/mob/typing_indicator.dm +++ b/code/modules/mob/typing_indicator.dm @@ -83,7 +83,8 @@ var/global/image/typing_indicator set desc = "Toggles showing an indicator when you are typing emote or say message." prefs.toggles ^= SHOW_TYPING prefs.save_preferences(src) - src << "You will [(prefs.toggles & SHOW_TYPING) ? "no longer" : "now"] display a typing indicator." + to_chat(src, "You will [(prefs.toggles & SHOW_TYPING) ? "no longer" : "now"] display a typing indicator.") + // Clear out any existing typing indicator. if(prefs.toggles & SHOW_TYPING) diff --git a/code/modules/nano/modules/crew_monitor.dm b/code/modules/nano/modules/crew_monitor.dm index 6888702ea83..d4fdb1e368c 100644 --- a/code/modules/nano/modules/crew_monitor.dm +++ b/code/modules/nano/modules/crew_monitor.dm @@ -6,7 +6,8 @@ return 1 var/turf/T = get_turf(nano_host()) if (!T || !(T.z in config.player_levels)) - usr << "Unable to establish a connection: You're too far away from the station!" + to_chat(usr, "Unable to establish a connection: You're too far away from the station!") + return 0 if(href_list["track"]) if(isAI(usr)) diff --git a/code/modules/nano/modules/law_manager.dm b/code/modules/nano/modules/law_manager.dm index 93d68c2bf12..e8ae6b8b748 100644 --- a/code/modules/nano/modules/law_manager.dm +++ b/code/modules/nano/modules/law_manager.dm @@ -134,15 +134,18 @@ return 1 if(href_list["notify_laws"]) - owner << "Law Notice" + to_chat(owner, "Law Notice") + owner.laws.show_laws(owner) if(isAI(owner)) var/mob/living/silicon/ai/AI = owner for(var/mob/living/silicon/robot/R in AI.connected_robots) - R << "Law Notice" + to_chat(R, "Law Notice") + R.laws.show_laws(R) if(usr != owner) - usr << "Laws displayed." + to_chat(usr, "Laws displayed.") + return 1 return 0 diff --git a/code/modules/nano/nanomapgen.dm b/code/modules/nano/nanomapgen.dm index 44154cdb675..1518da77b78 100644 --- a/code/modules/nano/nanomapgen.dm +++ b/code/modules/nano/nanomapgen.dm @@ -32,19 +32,22 @@ endY = world.maxy if (currentZ < 0 || currentZ > world.maxz) - usr << "NanoMapGen: ERROR: currentZ ([currentZ]) must be between 1 and [world.maxz]" + to_chat(usr, "NanoMapGen: ERROR: currentZ ([currentZ]) must be between 1 and [world.maxz]") + sleep(3) return NANOMAP_TERMINALERR if (startX > endX) - usr << "NanoMapGen: ERROR: startX ([startX]) cannot be greater than endX ([endX])" + to_chat(usr, "NanoMapGen: ERROR: startX ([startX]) cannot be greater than endX ([endX])") + sleep(3) return NANOMAP_TERMINALERR if (startY > endX) - usr << "NanoMapGen: ERROR: startY ([startY]) cannot be greater than endY ([endY])" + to_chat(usr, "NanoMapGen: ERROR: startY ([startY]) cannot be greater than endY ([endY])") + sleep(3) return NANOMAP_TERMINALERR @@ -55,7 +58,8 @@ return NANOMAP_TERMINALERR log_to_dd("NanoMapGen: GENERATE MAP ([startX],[startY],[currentZ]) to ([endX],[endY],[currentZ])") - usr << "NanoMapGen: GENERATE MAP ([startX],[startY],[currentZ]) to ([endX],[endY],[currentZ])" + to_chat(usr, "NanoMapGen: GENERATE MAP ([startX],[startY],[currentZ]) to ([endX],[endY],[currentZ])") + var/count = 0; for(var/WorldX = startX, WorldX <= endX, WorldX++) @@ -82,7 +86,8 @@ log_to_dd("NanoMapGen: Done.") - usr << "NanoMapGen: Done. File [mapFilename] uploaded to your cache." + to_chat(usr, "NanoMapGen: Done. File [mapFilename] uploaded to your cache.") + if (Tile.Width() != NANOMAP_MAX_ICON_DIMENSION || Tile.Height() != NANOMAP_MAX_ICON_DIMENSION) return NANOMAP_BADOUTPUT diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm index 6b78745c97f..890c904d118 100644 --- a/code/modules/nano/nanoui.dm +++ b/code/modules/nano/nanoui.dm @@ -456,7 +456,9 @@ nanoui is used to open and update nano browser uis var/list/send_data = get_send_data(data) - //user << list2json_usecache(send_data) // used for debugging //NANO DEBUG HOOK +// to_chat(user, list2json_usecache(send_data))// used for debugging //NANO DEBUG HOOK + + user << output(list2params(list(list2json_usecache(send_data))),"[window_id].browser:receiveUpdateData") /** diff --git a/code/modules/ninja/energy_katana.dm b/code/modules/ninja/energy_katana.dm index 58c2036848a..85ff99ace23 100644 --- a/code/modules/ninja/energy_katana.dm +++ b/code/modules/ninja/energy_katana.dm @@ -65,7 +65,8 @@ msg = "Your Energy Katana lands at your feet!" if(msg) - user << "[msg]" + to_chat(user, "[msg]") + /obj/item/weapon/katana/energy/New() ..() diff --git a/code/modules/ninja/martial_art.dm b/code/modules/ninja/martial_art.dm index 7b230c1e011..441aa02109f 100644 --- a/code/modules/ninja/martial_art.dm +++ b/code/modules/ninja/martial_art.dm @@ -21,7 +21,8 @@ if(!used) user.visible_message("You stick the [src]'s needle into your arm and press the button.", \ "[user] sticks the [src]'s needle \his arm and presses the button.") - user << "The nanomachines in the [src] flow through your bloodstream." + to_chat(user, "The nanomachines in the [src] flow through your bloodstream.") + var/datum/martial_art/ninja_martial_art/N = new/datum/martial_art/ninja_martial_art(null) N.teach(user) @@ -31,7 +32,8 @@ desc = "A strange autoinjector made of a black metal.
      It appears to be used up and empty." return 0 else - user << "The [src] has been used already!" + to_chat(user, "The [src] has been used already!") + return 1 // Ninja martial art datum @@ -45,7 +47,8 @@ /datum/martial_art/ninja_martial_art/teach(var/mob/living/carbon/human/H,var/make_temporary=0) ..() H.middleClickOverride = new /datum/middleClickOverride/ninja_martial_art() - H << "You have been taugh the ways of the Creeping Widow.
      \ + to_chat(H, "You have been taugh the ways of the Creeping Widow.
      \) + Your stikes on harm intent will deal more damage.
      Using middle mouse button on a nearby person while on harm intent will send them flying backwards.
      \ Your grabs will instantly be aggressive while you are using this style.
      Using middle mouse button while on harm intent and behind a person will put them in a silencing choke hold.
      \ Using middle mouse button on a nearby person while on disarm intent will wrench their wrist, causing them to drop what they are holding.
      " @@ -64,7 +67,8 @@ D.Stun(1) spawn(50) has_focus = 1 return 1 - A << "You are not focused enough to use that move yet!" + to_chat(A, "You are not focused enough to use that move yet!") + return 0 return A.pointed(D) @@ -72,11 +76,13 @@ if(!D.stat && !D.weakened) A.face_atom(D) if(A.dir != D.dir) // If the user's direction is not the same as the target's after A.face_atom(D) you are not behind them, and cannot use this ability. - A << "You cannot grab [D] from that angle!" + to_chat(A, "You cannot grab [D] from that angle!") + return 0 if(has_choke_hold) // Are we already choking someone? - A<< "You are have a target in your grip!" + to_chat(A, "You are have a target in your grip!") + return 0 has_choke_hold = 1 @@ -105,8 +111,10 @@ I++ sleep(5) - A << "You feel [D] go limp in your grip." - D << "You feel your consciousness slip away as [A] strangles you!" + to_chat(A, "You feel [D] go limp in your grip.") + + to_chat(D, "You feel your consciousness slip away as [A] strangles you!") + D.AdjustParalysis(20) has_choke_hold = 0 @@ -131,7 +139,8 @@ playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1) spawn(50) has_focus = 1 return 1 - A << "You are not focused enough to use that move yet!" + to_chat(A, "You are not focused enough to use that move yet!") + return 0 return A.pointed(D) diff --git a/code/modules/ninja/suit/SpiderOS.dm b/code/modules/ninja/suit/SpiderOS.dm index b44eab056ee..7d5d8e3216d 100644 --- a/code/modules/ninja/suit/SpiderOS.dm +++ b/code/modules/ninja/suit/SpiderOS.dm @@ -9,7 +9,8 @@ if(!s_busy) display_spideros() else - affecting << "The interface is locked!" + to_chat(affecting, "The interface is locked!") + /obj/item/clothing/suit/space/space_ninja/proc/display_spideros() @@ -194,7 +195,8 @@ if(!affecting||U.stat||!s_initialized)//Check to make sure the guy is wearing the suit after clicking and it's on. - U << "Your suit must be worn and active to use this function." + to_chat(U, "Your suit must be worn and active to use this function.") + U << browse(null, "window=spideros")//Closes the window. return @@ -217,7 +219,8 @@ display_to << browse(null, "window=spideros") return if(isnull(P)||P.toff)//So it doesn't freak out if the object no-longer exists. - display_to << "Error: unable to deliver message." + to_chat(display_to, "Error: unable to deliver message.") + display_spideros() return @@ -226,12 +229,15 @@ if("Inject") if( (href_list["tag"]=="radium"? (reagents.get_reagent_amount("radium"))<=(a_boost*a_transfer) : !reagents.get_reagent_amount(href_list["tag"])) )//Special case for radium. If there are only a_boost*a_transfer radium units left. - display_to << "Error: the suit cannot perform this function. Out of [href_list["name"]]." + to_chat(display_to, "Error: the suit cannot perform this function. Out of [href_list["name"]].") + else reagents.reaction(U, 2) reagents.trans_id_to(U, href_list["tag"], href_list["tag"]=="nutriment"?5:a_transfer)//Nutriment is a special case since it's very potent. Shouldn't influence actual refill amounts or anything. - display_to << "Injecting..." - U << "You feel a tiny prick and a sudden rush of substance in to your veins." + to_chat(display_to, "Injecting...") + + to_chat(U, "You feel a tiny prick and a sudden rush of substance in to your veins.") + if("Trigger Ability") var/ability_name = href_list["name"]+href_list["cost"]//Adds the name and cost to create the full proc name. @@ -251,7 +257,8 @@ proc_arguments = pick(targets) safety = 0 if(!safety) - U << "[href_list["name"]] suddenly triggered!" + to_chat(U, "[href_list["name"]] suddenly triggered!") + call(src,ability_name)(proc_arguments) if("Eject Disk") @@ -265,11 +272,13 @@ t_disk.loc = T t_disk = null else - U << "ERROR: Could not eject disk." + to_chat(U, "ERROR: Could not eject disk.") + if("Copy to Disk") var/datum/tech/current_data = locate(href_list["target"]) - U << "[current_data.name] successfully [(!t_disk.stored) ? "copied" : "overwritten"] to disk." + to_chat(U, "[current_data.name] successfully [(!t_disk.stored) ? "copied" : "overwritten"] to disk.") + t_disk.stored = current_data diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm index bfcc4330dc2..f676132c335 100644 --- a/code/modules/ninja/suit/suit.dm +++ b/code/modules/ninja/suit/suit.dm @@ -30,19 +30,24 @@ Contents: /obj/item/clothing/suit/space/space_ninja/proc/toggle_suit_lock(mob/living/carbon/human/user) if(!suitActive) if(!istype(user.wear_suit, /obj/item/clothing/suit/space/space_ninja)) - user<< "ERROR: Unable to locate user.\nABORTING..." + to_chat(user, "ERROR: Unable to locate user.\nABORTING...") + return 0 if(!istype(user.head, /obj/item/clothing/head/helmet/space/space_ninja)) - user<< "ERROR: Unable to locate hood.\nABORTING..." + to_chat(user, "ERROR: Unable to locate hood.\nABORTING...") + return 0 if(!istype(user.gloves, /obj/item/clothing/gloves/space_ninja)) - user<< "ERROR: Unable to locate gloves.\nABORTING..." + to_chat(user, "ERROR: Unable to locate gloves.\nABORTING...") + return 0 if(!istype(user.shoes, /obj/item/clothing/shoes/space_ninja)) - user<< "ERROR: Unable to locate foot gear.\nABORTING..." + to_chat(user, "ERROR: Unable to locate foot gear.\nABORTING...") + return 0 if(!istype(user.wear_mask, /obj/item/clothing/mask/gas/voice/space_ninja)) - user<< "ERROR: Unable to locate mask.\nABORTING..." + to_chat(user, "ERROR: Unable to locate mask.\nABORTING...") + return 0 suitHood = user.head diff --git a/code/modules/ninja/suit/suit_attackby.dm b/code/modules/ninja/suit/suit_attackby.dm index 760f6648452..fb834cdb469 100644 --- a/code/modules/ninja/suit/suit_attackby.dm +++ b/code/modules/ninja/suit/suit_attackby.dm @@ -5,7 +5,8 @@ if(istype(I, /obj/item/weapon/stock_parts/cell)) var/obj/item/weapon/stock_parts/cell/CELL if(CELL.maxcharge > cell.maxcharge && suitGloves) - U << "Higher maximum capacity detected.\nUpgrading..." + to_chat(U, "Higher maximum capacity detected.\nUpgrading...") + if (n_gloves && n_gloves.candrain && do_after(U,s_delay, target = U)) U.drop_item() CELL.loc = src @@ -17,8 +18,10 @@ old_cell.corrupt() old_cell.updateicon() cell = CELL - U << "Upgrade complete. Maximum capacity: [round(cell.maxcharge/100)]%" + to_chat(U, "Upgrade complete. Maximum capacity: [round(cell.maxcharge/100)]%") + else - U << "Procedure interrupted. Protocol terminated." + to_chat(U, "Procedure interrupted. Protocol terminated.") + return ..() \ No newline at end of file diff --git a/code/modules/ninja/suit/suit_initialisation.dm b/code/modules/ninja/suit/suit_initialisation.dm index 7c84bef5aa3..a93c8680975 100644 --- a/code/modules/ninja/suit/suit_initialisation.dm +++ b/code/modules/ninja/suit/suit_initialisation.dm @@ -8,34 +8,42 @@ if(usr.mind.special_role == "Ninja") if(suitBusy) - usr << "ERROR: Suit systems busy, cannot initiate [suitActive ? "de-activation" : "activation"] protocals at this time." + to_chat(usr, "ERROR: Suit systems busy, cannot initiate [suitActive ? "de-activation" : "activation"] protocals at this time.") + return suitBusy = 1 if(suitActive && (alert("Confirm suit systems shutdown? This cannot be halted once it has started.", "Confirm Shutdown", "Yes", "No") == "Yes")) - usr << "Now de-initializing..." + to_chat(usr, "Now de-initializing...") + sleep(15) - usr << "Logging off, [usr.real_name]. Shutting down SpiderOS." + to_chat(usr, "Logging off, [usr.real_name]. Shutting down SpiderOS.") + sleep(10) - usr<< "Primary system status: OFFLINE.\nBackup system status: OFFLINE." + to_chat(usr, "Primary system status: OFFLINE.\nBackup system status: OFFLINE.") + sleep(5) - usr<< "VOID-shift device status: OFFLINE.\nCLOAK-tech device status: OFFLINE." + to_chat(usr, "VOID-shift device status: OFFLINE.\nCLOAK-tech device status: OFFLINE.") + //TODO: Shut down any active abilities sleep(10) - usr<< "Disconnecting neural-net interface... Success." + to_chat(usr, "Disconnecting neural-net interface... Success.") + usr.hud_used.instantiate() usr.regenerate_icons() sleep(5) - usr<< "Disengaging neural-net interface... Success." + to_chat(usr, "Disengaging neural-net interface... Success.") + sleep(10) - usr<< "Unsecuring external locking mechanism...\nNeural-net abolished.\nOperation status: FINISHED." + to_chat(usr, "Unsecuring external locking mechanism...\nNeural-net abolished.\nOperation status: FINISHED.") + //TODO: Grant verbs toggle_suit_lock(usr) usr.regenerate_icons() @@ -43,44 +51,56 @@ suitActive = 0 else if(!suitActive) // Activate the suit. - usr << "Now initializing..." + to_chat(usr, "Now initializing...") + sleep(15) - usr<< "Now establishing neural-net interface..." + to_chat(usr, "Now establishing neural-net interface...") + if(usr.mind.special_role != "Ninja") - usr << "FĆAL �Rr�R: µ§er n¤t rec¤gnized, c-c¤ntr-r¤£§-£§ £¤cked." + to_chat(usr, "FĆAL �Rr�R: µ§er n¤t rec¤gnized, c-c¤ntr-r¤£§-£§ £¤cked.") + return sleep(10) - usr<< "Neural-net established. Now monitoring brainwave pattern. \nBrainwave pattern GREEN, proceeding." + to_chat(usr, "Neural-net established. Now monitoring brainwave pattern. \nBrainwave pattern GREEN, proceeding.") + sleep(10) - usr<< "Securing external locking mechanism..." + to_chat(usr, "Securing external locking mechanism...") + if(!toggle_suit_lock(usr)) return sleep(5) - usr<< "Suit secured, extending neural-net interface..." + to_chat(usr, "Suit secured, extending neural-net interface...") + usr.hud_used.human_hud('icons/mob/screen1_NinjaHUD.dmi',"#ffffff",255) usr.regenerate_icons() sleep(10) - usr<< "VOID-shift device status: ONLINE.\nCLOAK-tech device status:ONLINE" + to_chat(usr, "VOID-shift device status: ONLINE.\nCLOAK-tech device status:ONLINE") + sleep(5) - usr<< "Primary system status: ONLINE.\nBackup system status: ONLINE." + to_chat(usr, "Primary system status: ONLINE.\nBackup system status: ONLINE.") + if(suitCell) - usr<< "Current energy capacity: [suitCell.charge]/[suitCell.maxcharge]." + to_chat(usr, "Current energy capacity: [suitCell.charge]/[suitCell.maxcharge].") + sleep(10) - usr<< "All systems operational. Welcome to SpiderOS, [usr.real_name]." + to_chat(usr, "All systems operational. Welcome to SpiderOS, [usr.real_name].") + //TODO: Grant ninja verbs here. suitBusy = 0 suitActive = 1 else suitBusy = 0 - usr << "NOTICE: Suit de-activation protocals aborted." + to_chat(usr, "NOTICE: Suit de-activation protocals aborted.") + else - usr << "FĆAL �Rr�R: µ§er n¤t rec¤gnized, c-c¤ntr-r¤£§-£§ £¤cked." + to_chat(usr, "FĆAL �Rr�R: µ§er n¤t rec¤gnized, c-c¤ntr-r¤£§-£§ £¤cked.") + return \ No newline at end of file diff --git a/code/modules/paperwork/carbonpaper.dm b/code/modules/paperwork/carbonpaper.dm index ae8357a5582..9599878593e 100644 --- a/code/modules/paperwork/carbonpaper.dm +++ b/code/modules/paperwork/carbonpaper.dm @@ -41,10 +41,12 @@ copy.name = "Copy - " + c.name copy.fields = c.fields copy.updateinfolinks() - usr << "You tear off the carbon-copy!" + to_chat(usr, "You tear off the carbon-copy!") + c.copied = 1 copy.iscopy = 1 copy.update_icon() c.update_icon() else - usr << "There are no more carbon copies attached to this paper!" \ No newline at end of file + to_chat(usr, "There are no more carbon copies attached to this paper!") + diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index fe9a5bb62f2..ce52a5e6b8c 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -49,7 +49,8 @@ W.loc = src if(istype(W, /obj/item/weapon/paper)) toppaper = W - user << "You clip the [W] onto \the [src]." + to_chat(user, "You clip the [W] onto \the [src].") + update_icon() else if(istype(toppaper) && istype(W, /obj/item/weapon/pen)) @@ -102,7 +103,8 @@ usr.drop_item() W.loc = src haspen = W - usr << "You slot the pen into \the [src]." + to_chat(usr, "You slot the pen into \the [src].") + else if(href_list["write"]) var/obj/item/weapon/P = locate(href_list["write"]) @@ -145,7 +147,8 @@ var/obj/item/P = locate(href_list["top"]) if(P && (P.loc == src) && istype(P, /obj/item/weapon/paper) ) toppaper = P - usr << "You move [P.name] to the top." + to_chat(usr, "You move [P.name] to the top.") + //Update everything attack_self(usr) diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index 14e3f0d1343..576c7e1ace7 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -44,9 +44,11 @@ var/list/alldepartments = list() /obj/machinery/photocopier/faxmachine/emag_act(user as mob) if(!emagged) emagged = 1 - user << "The transmitters realign to an unknown source!" + to_chat(user, "The transmitters realign to an unknown source!") + else - user << "You swipe the card through [src], but nothing happens." + to_chat(user, "You swipe the card through [src], but nothing happens.") + /obj/machinery/photocopier/faxmachine/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) var/data[0] @@ -100,7 +102,8 @@ var/list/alldepartments = list() if(copyitem) copyitem.loc = usr.loc usr.put_in_hands(copyitem) - usr << "You take \the [copyitem] out of \the [src]." + to_chat(usr, "You take \the [copyitem] out of \the [src].") + copyitem = null else var/obj/item/I = usr.get_active_hand() @@ -108,7 +111,8 @@ var/list/alldepartments = list() usr.drop_item() copyitem = I I.loc = src - usr << "You insert \the [I] into \the [src]." + to_chat(usr, "You insert \the [I] into \the [src].") + flick(insert_anim, src) if(href_list["scan"]) @@ -265,4 +269,5 @@ var/list/alldepartments = list() for(var/client/C in admins) if(R_EVENT & C.holder.rights) - C << msg + to_chat(C, msg) + diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index e520aa1976e..f09eefd3e79 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -35,7 +35,8 @@ /obj/structure/filingcabinet/attackby(obj/item/P as obj, mob/user as mob, params) if(istype(P, /obj/item/weapon/paper) || istype(P, /obj/item/weapon/folder) || istype(P, /obj/item/weapon/photo) || istype(P, /obj/item/weapon/paper_bundle) || istype(P, /obj/item/documents)) - user << "You put [P] in [src]." + to_chat(user, "You put [P] in [src].") + user.drop_item() P.loc = src icon_state = "[initial(icon_state)]-open" @@ -45,14 +46,17 @@ else if(istype(P, /obj/item/weapon/wrench)) playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) anchored = !anchored - user << "You [anchored ? "wrench" : "unwrench"] \the [src]." + to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src].") + else - user << "You can't put [P] in [src]!" + to_chat(user, "You can't put [P] in [src]!") + /obj/structure/filingcabinet/attack_hand(mob/user as mob) if(contents.len <= 0) - user << "\The [src] is empty." + to_chat(user, "\The [src] is empty.") + return user.set_machine(src) @@ -77,9 +81,11 @@ I.loc = loc if(prob(25)) step_rand(I) - user << "You pull \a [I] out of [src] at random." + to_chat(user, "You pull \a [I] out of [src] at random.") + return - user << "You find nothing in [src]." + to_chat(user, "You find nothing in [src].") + /obj/structure/filingcabinet/Topic(href, href_list) if(href_list["retrieve"]) diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index 173723bf4cb..7ff2875a6e5 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -32,7 +32,8 @@ if(istype(W, /obj/item/weapon/paper) || istype(W, /obj/item/weapon/photo) || istype(W, /obj/item/weapon/paper_bundle) || istype(W, /obj/item/documents)) user.drop_item() W.loc = src - user << "You put the [W] into \the [src]." + to_chat(user, "You put the [W] into \the [src].") + update_icon() else if(istype(W, /obj/item/weapon/pen)) var/n_name = input(usr, "What would you like to label the folder?", "Folder Labelling", null) as text|null diff --git a/code/modules/paperwork/frames.dm b/code/modules/paperwork/frames.dm index ec014d6a845..a8fca4f0831 100644 --- a/code/modules/paperwork/frames.dm +++ b/code/modules/paperwork/frames.dm @@ -70,7 +70,8 @@ name = initial(name) update_icon() else - user << "There is nothing to remove from \the [src]." + to_chat(user, "There is nothing to remove from \the [src].") + else if(istype(I, /obj/item/weapon/crowbar)) playsound(src, 'sound/items/Crowbar.ogg', 100, 1) user.visible_message("[user] breaks down \the [src].", "You break down \the [src].") @@ -89,7 +90,8 @@ insert(I) update_icon() else - user << "\The [src] already contains \a [displayed]." + to_chat(user, "\The [src] already contains \a [displayed].") + else return ..() @@ -103,14 +105,17 @@ var/stuff_on_wall = 0 for(var/obj/O in user.loc.contents) //Let's see if it already has a poster on it or too much stuff if(istype(O, /obj/structure/sign)) - user << "\The [T] is far too cluttered to place \a [src]!" + to_chat(user, "\The [T] is far too cluttered to place \a [src]!") + return stuff_on_wall++ if(stuff_on_wall >= 4) - user << "\The [T] is far too cluttered to place \a [src]!" + to_chat(user, "\The [T] is far too cluttered to place \a [src]!") + return - user << "You start place \the [src] on \the [T]." + to_chat(user, "You start place \the [src] on \the [T].") + var/px = 0 var/py = 0 @@ -126,7 +131,8 @@ if(WEST) px = -32 else - user << "You cannot reach \the [T] from here!" + to_chat(user, "You cannot reach \the [T] from here!") + return user.unEquip(src) @@ -226,10 +232,12 @@ qdel(src) if(istype(I, /obj/item/weapon/grenade) || istype(I, /obj/item/weapon/c4)) if(explosive) - user << "There is already a device attached behind \the [src], remove it first." + to_chat(user, "There is already a device attached behind \the [src], remove it first.") + return 1 if(!tilted) - user << "\The [src] needs to be already tilted before being rigged with \the [I]." + to_chat(user, "\The [src] needs to be already tilted before being rigged with \the [I].") + return 1 user.visible_message("[user] is fiddling around behind \the [src].", "You begin to secure \the [I] behind \the [src].") if(do_after(user, 150, target = src)) diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm index 940a797addc..bc03f335be8 100644 --- a/code/modules/paperwork/handlabeler.dm +++ b/code/modules/paperwork/handlabeler.dm @@ -15,22 +15,28 @@ return // don't set a label if(!labels_left) - user << "No labels left." + to_chat(user, "No labels left.") + return if(!label || !length(label)) - user << "No text set." + to_chat(user, "No text set.") + return if(length(A.name) + length(label) > 64) - user << "Label too big." + to_chat(user, "Label too big.") + return if(ishuman(A)) - user << "You can't label humans." + to_chat(user, "You can't label humans.") + return if(issilicon(A)) - user << "You can't label cyborgs." + to_chat(user, "You can't label cyborgs.") + return if(istype(A, /obj/item/weapon/reagent_containers/glass)) - user << "The label can't stick to the [A.name]. (Try using a pen)" + to_chat(user, "The label can't stick to the [A.name]. (Try using a pen)") + return user.visible_message("[user] labels [A] as [label].", \ @@ -41,13 +47,17 @@ mode = !mode icon_state = "labeler[mode]" if(mode) - user << "You turn on \the [src]." + to_chat(user, "You turn on \the [src].") + //Now let them chose the text. var/str = copytext(reject_bad_text(input(user,"Label text?","Set label","")),1,MAX_NAME_LEN) if(!str || !length(str)) - user << "Invalid text." + to_chat(user, "Invalid text.") + return label = str - user << "You set the text to '[str]'." + to_chat(user, "You set the text to '[str]'.") + else - user << "You turn off \the [src]." \ No newline at end of file + to_chat(user, "You turn off \the [src].") + diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index a07303bee43..fb4d7816dd9 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -56,7 +56,8 @@ if(in_range(user, src) || istype(user, /mob/dead/observer)) show_content(user) else - user << "You have to go closer if you want to read it." + to_chat(user, "You have to go closer if you want to read it.") + /obj/item/weapon/paper/proc/show_content(var/mob/user, var/forceshow = 0, var/forcestars = 0, var/infolinks = 0, var/view = 1) var/datum/asset/assets = get_asset_datum(/datum/asset/simple/paper) @@ -81,7 +82,8 @@ set src in usr if((CLUMSY in usr.mutations) && prob(50)) - usr << "You cut yourself on the paper." + to_chat(usr, "You cut yourself on the paper.") + return var/n_name = sanitize(copytext(input(usr, "What would you like to label the paper?", "Paper Labelling", name) as text, 1, MAX_MESSAGE_LEN)) if((loc == usr && usr.stat == 0)) @@ -125,7 +127,8 @@ if(ishuman(M)) var/mob/living/carbon/human/H = M if(H == user) - user << "You wipe off your face with [src]." + to_chat(user, "You wipe off your face with [src].") + H.lip_style = null H.update_body() else @@ -311,7 +314,8 @@ qdel(src) else - user << "\red You must hold \the [P] steady to burn \the [src]." + to_chat(user, "\red You must hold \the [P] steady to burn \the [src].") + /obj/item/weapon/paper/Topic(href, href_list) ..() @@ -341,7 +345,8 @@ // check for exploits for(var/bad in paper_blacklist) if(findtext(t,bad)) - usr << "\blue You think to yourself, \"Hm.. this is only paper...\"" + to_chat(usr, "\blue You think to yourself, \"Hm.. this is only paper...\"") + log_admin("PAPER: [key_name(usr)] tried to use forbidden word in [src]: [bad].") message_admins("PAPER: [key_name_admin(usr)] tried to use forbidden word in [src]: [bad].") return @@ -377,7 +382,8 @@ if (istype(P, /obj/item/weapon/paper/carbon)) var/obj/item/weapon/paper/carbon/C = P if (!C.iscopy && !C.copied) - user << "Take off the carbon copy first." + to_chat(user, "Take off the carbon copy first.") + add_fingerprint(user) return var/obj/item/weapon/paper_bundle/B = new(src.loc) @@ -413,7 +419,8 @@ src.loc = get_turf(h_user) if(h_user.client) h_user.client.screen -= src h_user.put_in_hands(B) - user << "You clip the [P.name] to [(src.name == "paper") ? "the paper" : src.name]." + to_chat(user, "You clip the [P.name] to [(src.name == "paper") ? "the paper" : src.name].") + src.loc = B P.loc = B B.amount++ @@ -434,12 +441,14 @@ if(istype(P, /obj/item/weapon/stamp/clown)) if(!clown) - user << "You are totally unable to use the stamp. HONK!" + to_chat(user, "You are totally unable to use the stamp. HONK!") + return stamp(P) - user << "You stamp the paper with your rubber stamp." + to_chat(user, "You stamp the paper with your rubber stamp.") + else if(istype(P, /obj/item/weapon/lighter)) burnpaper(P, user) diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index 311971f326c..e43c47f01c3 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -24,14 +24,16 @@ if (istype(P, /obj/item/weapon/paper/carbon)) var/obj/item/weapon/paper/carbon/C = P if (!C.iscopy && !C.copied) - user << "Take off the carbon copy first." + to_chat(user, "Take off the carbon copy first.") + add_fingerprint(user) return amount++ if(screen == 2) screen = 1 - user << "You add [(P.name == "paper") ? "the paper" : P.name] to [(src.name == "paper bundle") ? "the paper bundle" : src.name]." + to_chat(user, "You add [(P.name == "paper") ? "the paper" : P.name] to [(src.name == "paper bundle") ? "the paper bundle" : src.name].") + user.unEquip(P) P.loc = src if(istype(user,/mob/living/carbon/human)) @@ -42,7 +44,8 @@ amount++ if(screen == 2) screen = 1 - user << "You add [(W.name == "photo") ? "the photo" : W.name] to [(src.name == "paper bundle") ? "the paper bundle" : src.name]." + to_chat(user, "You add [(W.name == "photo") ? "the photo" : W.name] to [(src.name == "paper bundle") ? "the paper bundle" : src.name].") + user.unEquip(W) W.loc = src else if(istype(W, /obj/item/weapon/lighter)) @@ -55,7 +58,8 @@ src.amount++ if(screen == 2) screen = 1 - user << "You add \the [W.name] to [(src.name == "paper bundle") ? "the paper bundle" : src.name]." + to_chat(user, "You add \the [W.name] to [(src.name == "paper bundle") ? "the paper bundle" : src.name].") + qdel(W) else if(istype(W, /obj/item/stack/tape_roll)) @@ -94,13 +98,15 @@ qdel(src) else - user << "\red You must hold \the [P] steady to burn \the [src]." + to_chat(user, "\red You must hold \the [P] steady to burn \the [src].") + /obj/item/weapon/paper_bundle/examine(mob/user) if(..(user, 1)) src.show_content(user) else - user << "It is too far away." + to_chat(user, "It is too far away.") + /obj/item/weapon/paper_bundle/proc/show_content(mob/user as mob) var/dat @@ -162,7 +168,8 @@ if(href_list["remove"]) var/obj/item/weapon/W = src[page] usr.put_in_hands(W) - usr << "You remove the [W.name] from the bundle." + to_chat(usr, "You remove the [W.name] from the bundle.") + if(amount == 1) var/obj/item/weapon/paper/P = src[1] usr.unEquip(src) @@ -176,7 +183,8 @@ amount-- update_icon() else - usr << "You need to hold it in your hands to change pages." + to_chat(usr, "You need to hold it in your hands to change pages.") + if (istype(src.loc, /mob)) src.attack_self(src.loc) updateUsrDialog() @@ -200,7 +208,8 @@ set category = "Object" set src in usr - usr << "You loosen the bundle." + to_chat(usr, "You loosen the bundle.") + for(var/obj/O in src) O.loc = usr.loc O.layer = initial(O.layer) diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index 552f55051d1..b5528b41375 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -54,7 +54,8 @@ if (H.hand) temp = H.organs_by_name["l_hand"] if(temp && !temp.is_usable()) - H << "You try to move your [temp.name], but cannot!" + to_chat(H, "You try to move your [temp.name], but cannot!") + return if(amount >= 1) amount-- @@ -75,9 +76,11 @@ P.loc = user.loc user.put_in_hands(P) - user << "You take [P] out of the [src]." + to_chat(user, "You take [P] out of the [src].") + else - user << "[src] is empty!" + to_chat(user, "[src] is empty!") + add_fingerprint(user) return @@ -89,7 +92,8 @@ user.drop_item() i.loc = src - user << "You put [i] in [src]." + to_chat(user, "You put [i] in [src].") + papers.Add(i) amount++ @@ -97,9 +101,11 @@ /obj/item/weapon/paper_bin/examine(mob/user) if(..(user, 1)) if(amount) - usr << "There " + (amount > 1 ? "are [amount] papers" : "is one paper") + " in the bin." + to_chat(usr, "There " + (amount > 1 ? "are [amount] papers" : "is one paper") + " in the bin.") + else - usr << "There are no papers in the bin." + to_chat(usr, "There are no papers in the bin.") + /obj/item/weapon/paper_bin/update_icon() @@ -127,9 +133,11 @@ P = new /obj/item/weapon/paper/carbon P.loc = user.loc user.put_in_hands(P) - user << "You take [P] out of the [src]." + to_chat(user, "You take [P] out of the [src].") + else - user << "[src] is empty!" + to_chat(user, "[src] is empty!") + add_fingerprint(user) return diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 6bba24d2805..afea1699041 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -25,7 +25,8 @@ pressure_resistance = 2 /obj/item/weapon/pen/suicide_act(mob/user) - viewers(user) << "[user] starts scribbling numbers over \himself with the [src.name]! It looks like \he's trying to commit sudoku." + to_chat(viewers(user), "[user] starts scribbling numbers over \himself with the [src.name]! It looks like \he's trying to commit sudoku.") + return (BRUTELOSS) /obj/item/weapon/pen/blue @@ -110,8 +111,10 @@ if(!force) if(M.can_inject(user, 1)) - user << "You stab [M] with the pen." -// M << "You feel a tiny prick!" + to_chat(user, "You stab [M] with the pen.") + +// to_chat(M, "You feel a tiny prick!") + . = 1 add_logs(M, user, "stabbed", object="[name]") @@ -161,7 +164,8 @@ hitsound = initial(hitsound) throwforce = initial(throwforce) playsound(user, 'sound/weapons/saberoff.ogg', 5, 1) - user << "[src] can now be concealed." + to_chat(user, "[src] can now be concealed.") + else on = 1 force = 18 @@ -172,7 +176,8 @@ hitsound = 'sound/weapons/blade1.ogg' throwforce = 35 playsound(user, 'sound/weapons/saberon.ogg', 5, 1) - user << "[src] is now active." + to_chat(user, "[src] is now active.") + update_icon() /obj/item/weapon/pen/edagger/update_icon() diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 6630c24d46c..d7b67f42045 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -63,7 +63,8 @@ copyass() sleep(15) else - usr << "\The [copyitem] can't be copied by \the [src]." + to_chat(usr, "\The [copyitem] can't be copied by \the [src].") + break use_power(active_power_usage) @@ -72,11 +73,13 @@ if(copyitem) copyitem.loc = usr.loc usr.put_in_hands(copyitem) - usr << "You take \the [copyitem] out of \the [src]." + to_chat(usr, "You take \the [copyitem] out of \the [src].") + copyitem = null updateUsrDialog() else if(check_ass()) - ass << "You feel a slight pressure on your ass." + to_chat(ass, "You feel a slight pressure on your ass.") + updateUsrDialog() else if(href_list["min"]) if(copies > 1) @@ -117,25 +120,30 @@ user.drop_item() copyitem = O O.loc = src - user << "You insert \the [O] into \the [src]." + to_chat(user, "You insert \the [O] into \the [src].") + flick(insert_anim, src) updateUsrDialog() else - user << "There is already something in \the [src]." + to_chat(user, "There is already something in \the [src].") + else if(istype(O, /obj/item/device/toner)) if(toner <= 10) //allow replacing when low toner is affecting the print darkness user.drop_item() - user << "You insert the toner cartridge into \the [src]." + to_chat(user, "You insert the toner cartridge into \the [src].") + var/obj/item/device/toner/T = O toner += T.toner_amount qdel(O) updateUsrDialog() else - user << "This cartridge is not yet ready for replacement! Use up the rest of the toner." + to_chat(user, "This cartridge is not yet ready for replacement! Use up the rest of the toner.") + else if(istype(O, /obj/item/weapon/wrench)) playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) anchored = !anchored - user << "You [anchored ? "wrench" : "unwrench"] \the [src]." + to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src].") + else if(istype(O, /obj/item/weapon/grab)) //For ass-copying. var/obj/item/weapon/grab/G = O if(ismob(G.affecting) && G.affecting != ass) diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index 133018743cc..679d466dfd7 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -67,13 +67,15 @@ qdel(src) else - user << "\red You must hold \the [P] steady to burn \the [src]." + to_chat(user, "\red You must hold \the [P] steady to burn \the [src].") + /obj/item/weapon/photo/examine(mob/user) if(..(user, 1) || isobserver(user)) show(user) else - user << "It is too far away." + to_chat(user, "It is too far away.") + /obj/item/weapon/photo/proc/show(mob/user as mob) usr << browse_rsc(img, "tmp_photo.png") @@ -175,7 +177,8 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s var/nsize = input("Photo Size","Pick a size of resulting photo.") as null|anything in list(1,3,5,7) if(nsize) size = nsize - usr << "Camera will now take [size]x[size] photos." + to_chat(usr, "Camera will now take [size]x[size] photos.") + /obj/item/device/camera/attack(mob/living/carbon/human/M as mob, mob/user as mob) return @@ -186,15 +189,18 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s src.icon_state = icon_on else src.icon_state = icon_off - user << "You switch the camera [on ? "on" : "off"]." + to_chat(user, "You switch the camera [on ? "on" : "off"].") + return /obj/item/device/camera/attackby(obj/item/I as obj, mob/user as mob, params) if(istype(I, /obj/item/device/camera_film)) if(pictures_left) - user << "[src] still has some film in it!" + to_chat(user, "[src] still has some film in it!") + return - user << "You insert [I] into [src]." + to_chat(user, "You insert [I] into [src].") + user.drop_item() qdel(I) pictures_left = pictures_max @@ -304,7 +310,8 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s pictures_left-- desc = "A polaroid camera. It has [pictures_left] photos left." - user << "[pictures_left] photos left." + to_chat(user, "[pictures_left] photos left.") + icon_state = icon_off on = 0 if(user.mind && !(user.mind.assigned_role == "Chaplain")) @@ -427,9 +434,11 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s /obj/item/device/camera/digital/captureimage(atom/target, mob/user, flag) if(saved_pictures.len >= max_storage) - user << "Maximum photo storage capacity reached." + to_chat(user, "Maximum photo storage capacity reached.") + return - user << "Picture saved." + to_chat(user, "Picture saved.") + var/x_c = target.x - (size-1)/2 var/y_c = target.y + (size-1)/2 var/z_c = target.z @@ -454,10 +463,12 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s set src in usr if(saved_pictures.len == 0) - usr << "No images saved." + to_chat(usr, "No images saved.") + return if(pictures_left == 0) - usr << "There is no film left to print." + to_chat(usr, "There is no film left to print.") + return var/datum/picture/P = null @@ -472,7 +483,8 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s set src in usr if(saved_pictures.len == 0) - usr << "No images saved" + to_chat(usr, "No images saved") + return var/datum/picture/P = null P = input("Select image to delete:",P) as null|anything in saved_pictures @@ -516,11 +528,13 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s camera.network = list("news") cameranet.removeCamera(camera) camera.c_tag = user.name - user << "You switch the camera [on ? "on" : "off"]." + to_chat(user, "You switch the camera [on ? "on" : "off"].") + /obj/item/device/videocam/examine(mob/user) if(..(user, 1)) - user << "This video camera can send live feeds to the entertainment network. It's [camera ? "" : "in"]active." + to_chat(user, "This video camera can send live feeds to the entertainment network. It's [camera ? "" : "in"]active.") + /obj/item/device/videocam/hear_talk(mob/M as mob, msg) if (camera && on) @@ -545,4 +559,5 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s 'sound/hallucinations/growl3.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg', 'sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg',\ 'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\ 'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg') - user << pick(creepyasssounds) + to_chat(user, pick(creepyasssounds)) + diff --git a/code/modules/paperwork/silicon_photography.dm b/code/modules/paperwork/silicon_photography.dm index ec4d920eaaa..825124568c1 100644 --- a/code/modules/paperwork/silicon_photography.dm +++ b/code/modules/paperwork/silicon_photography.dm @@ -29,11 +29,14 @@ if(C.connected_ai) var/mob/A = P.fields["author"] C.connected_ai.aiCamera.injectaialbum(P, " (taken by [A.name])") - C.connected_ai << "Image recorded and saved by [name]" - usr << "Image recorded and saved to remote database" //feedback to the Cyborg player that the picture was taken + to_chat(C.connected_ai, "Image recorded and saved by [name]") + to_chat(usr, "Image recorded and saved to remote database")//feedback to the Cyborg player that the picture was taken + + else injectaialbum(P) - usr << "Image recorded" + to_chat(usr, "Image recorded") + /obj/item/device/camera/siliconcam/proc/selectpicture(obj/item/device/camera/siliconcam/cam) if(!cam) @@ -42,7 +45,8 @@ var/list/nametemp = list() var/find if(cam.aipictures.len == 0) - usr << "No images saved" + to_chat(usr, "No images saved") + return for(var/datum/picture/t in cam.aipictures) nametemp += t.fields["name"] @@ -61,7 +65,8 @@ var/obj/item/weapon/photo/P = new/obj/item/weapon/photo() P.construct(selection) P.show(usr) - usr << P.desc + to_chat(usr, P.desc) + // TG uses a special garbage collector.. qdel(P) qdel(P) //so 10 thousand pictures items are not left in memory should an AI take them and then view them all. @@ -73,7 +78,8 @@ return cam.aipictures -= selection - usr << "Image deleted" + to_chat(usr, "Image deleted") + /obj/item/device/camera/siliconcam/ai_camera/can_capture_turf(turf/T, mob/user) var/mob/living/silicon/ai = user @@ -87,15 +93,18 @@ /obj/item/device/camera/siliconcam/proc/camera_mode_off() src.in_camera_mode = 0 - usr << "Camera Mode deactivated" + to_chat(usr, "Camera Mode deactivated") + /obj/item/device/camera/siliconcam/proc/camera_mode_on() src.in_camera_mode = 1 - usr << "Camera Mode activated" + to_chat(usr, "Camera Mode activated") + /obj/item/device/camera/siliconcam/ai_camera/printpicture(mob/user, datum/picture/P) injectaialbum(P) - usr << "Image recorded" + to_chat(usr, "Image recorded") + /obj/item/device/camera/siliconcam/robot_camera/printpicture(mob/user, datum/picture/P) injectmasteralbum(P) diff --git a/code/modules/pda/PDA.dm b/code/modules/pda/PDA.dm index d54c4f47bc7..c491ae5559c 100755 --- a/code/modules/pda/PDA.dm +++ b/code/modules/pda/PDA.dm @@ -296,16 +296,19 @@ var/global/list/obj/item/device/pda/PDAs = list() start_program(find_program(/datum/data/pda/app/main_menu)) notifying_programs.Cut() overlays.Cut() - usr << "You press the reset button on \the [src]." + to_chat(usr, "You press the reset button on \the [src].") + else - usr << "You cannot do this while restrained." + to_chat(usr, "You cannot do this while restrained.") + /obj/item/device/pda/proc/remove_id() if (id) if (ismob(loc)) var/mob/M = loc M.put_in_hands(id) - usr << "You remove the ID from the [name]." + to_chat(usr, "You remove the ID from the [name].") + else id.forceMove(get_turf(src)) id = null @@ -322,9 +325,11 @@ var/global/list/obj/item/device/pda/PDAs = list() if(id) remove_id() else - usr << "This PDA does not have an ID in it." + to_chat(usr, "This PDA does not have an ID in it.") + else - usr << "You cannot do this while restrained." + to_chat(usr, "You cannot do this while restrained.") + /obj/item/device/pda/verb/verb_remove_pen() @@ -342,13 +347,16 @@ var/global/list/obj/item/device/pda/PDAs = list() var/mob/M = loc if(M.get_active_hand() == null) M.put_in_hands(O) - usr << "You remove \the [O] from \the [src]." + to_chat(usr, "You remove \the [O] from \the [src].") + return O.forceMove(get_turf(src)) else - usr << "This PDA does not have a pen in it." + to_chat(usr, "This PDA does not have a pen in it.") + else - usr << "You cannot do this while restrained." + to_chat(usr, "You cannot do this while restrained.") + /obj/item/device/pda/proc/id_check(mob/user as mob, choice as num)//To check for IDs; 1 for in-pda use, 2 for out of pda use. @@ -379,40 +387,47 @@ var/global/list/obj/item/device/pda/PDAs = list() cartridge.forceMove(src) cartridge.update_programs(src) update_shortcuts() - user << "You insert [cartridge] into [src]." + to_chat(user, "You insert [cartridge] into [src].") + if(cartridge.radio) cartridge.radio.hostpda = src else if(istype(C, /obj/item/weapon/card/id)) var/obj/item/weapon/card/id/idcard = C if(!idcard.registered_name) - user << "\The [src] rejects the ID." + to_chat(user, "\The [src] rejects the ID.") + return if(!owner) owner = idcard.registered_name ownjob = idcard.assignment ownrank = idcard.rank name = "PDA-[owner] ([ownjob])" - user << "Card scanned." + to_chat(user, "Card scanned.") + else //Basic safety check. If either both objects are held by user or PDA is on ground and card is in hand. if(((src in user.contents) && (C in user.contents)) || (istype(loc, /turf) && in_range(src, user) && (C in user.contents)) ) if( can_use(user) )//If they can still act. id_check(user, 2) - user << "You put the ID into \the [src]'s slot." + to_chat(user, "You put the ID into \the [src]'s slot.") + else if(istype(C, /obj/item/device/paicard) && !src.pai) user.drop_item() C.forceMove(src) pai = C - user << "You slot \the [C] into [src]." + to_chat(user, "You slot \the [C] into [src].") + else if(istype(C, /obj/item/weapon/pen)) var/obj/item/weapon/pen/O = locate() in src if(O) - user << "There is already a pen in \the [src]." + to_chat(user, "There is already a pen in \the [src].") + else user.drop_item() C.forceMove(src) - user << "You slide \the [C] into \the [src]." + to_chat(user, "You slide \the [C] into \the [src].") + /obj/item/device/pda/attack(mob/living/C as mob, mob/living/user as mob) if (istype(C, /mob/living/carbon) && scanmode) @@ -475,7 +490,8 @@ var/global/list/obj/item/device/pda/PDAs = list() if (in_range(src, usr) && loc == usr) if (t) if(hidden_uplink && hidden_uplink.check_trigger(usr, lowertext(t), lowertext(lock_code))) - usr << "The PDA softly beeps." + to_chat(usr, "The PDA softly beeps.") + close(usr) else t = sanitize(copytext(t, 1, 20)) diff --git a/code/modules/pda/ai.dm b/code/modules/pda/ai.dm index 4ed82f69cf9..d012905ccd8 100644 --- a/code/modules/pda/ai.dm +++ b/code/modules/pda/ai.dm @@ -22,7 +22,8 @@ return var/datum/data/pda/app/messenger/M = find_program(/datum/data/pda/app/messenger) if(!M) - usr << "Cannot use messenger!" + to_chat(usr, "Cannot use messenger!") + var/list/plist = M.available_pdas() if (plist) var/c = input(usr, "Please select a PDA") as null|anything in sortList(plist) @@ -40,7 +41,8 @@ return var/datum/data/pda/app/messenger/M = find_program(/datum/data/pda/app/messenger) if(!M) - usr << "Cannot use messenger!" + to_chat(usr, "Cannot use messenger!") + var/HTML = "AI PDA Message Log" for(var/index in M.tnote) if(index["sent"]) @@ -59,7 +61,8 @@ return var/datum/data/pda/app/messenger/M = find_program(/datum/data/pda/app/messenger) M.toff = !M.toff - usr << "PDA sender/receiver toggled [(M.toff ? "Off" : "On")]!" + to_chat(usr, "PDA sender/receiver toggled [(M.toff ? "Off" : "On")]!") + /obj/item/device/pda/ai/verb/cmd_toggle_pda_silent() @@ -71,7 +74,8 @@ return var/datum/data/pda/app/messenger/M = find_program(/datum/data/pda/app/messenger) M.notify_silent = !M.notify_silent - usr << "PDA ringer toggled [(M.notify_silent ? "Off" : "On")]!" + to_chat(usr, "PDA ringer toggled [(M.notify_silent ? "Off" : "On")]!") + /obj/item/device/pda/ai/can_use() var/mob/living/silicon/ai/AI = usr diff --git a/code/modules/pda/app.dm b/code/modules/pda/app.dm index 58403d108a9..70690af26ae 100644 --- a/code/modules/pda/app.dm +++ b/code/modules/pda/app.dm @@ -24,7 +24,8 @@ L = get(pda, /mob/living/silicon) if(L) - L << "\icon[pda] [message]" + to_chat(L, "\icon[pda] [message]") + nanomanager.update_user_uis(L, pda) // Update the receiving user's PDA UI so that they can see the new message if(!notify_silent) diff --git a/code/modules/pda/chatroom.dm b/code/modules/pda/chatroom.dm index f20a5bfb139..b965076971a 100644 --- a/code/modules/pda/chatroom.dm +++ b/code/modules/pda/chatroom.dm @@ -139,7 +139,8 @@ var/list/chatrooms = list(new /datum/chatroom("General Discussion")) /datum/data/pda/app/chatroom/proc/check_messaging_available() . = messaging_available() if(!.) - usr << "ERROR: Messaging server is not responding." + to_chat(usr, "ERROR: Messaging server is not responding.") + /datum/data/pda/app/chatroom/Topic(href, list/href_list) if(!pda.can_use()) diff --git a/code/modules/pda/messenger.dm b/code/modules/pda/messenger.dm index 7b9be0e31df..fb64add2b86 100644 --- a/code/modules/pda/messenger.dm +++ b/code/modules/pda/messenger.dm @@ -105,7 +105,8 @@ var/obj/item/device/pda/P = locate(href_list["target"]) if(!P) - usr << "PDA not found." + to_chat(usr, "PDA not found.") + var/datum/data/pda/messenger_plugin/plugin = locate(href_list["plugin"]) if(plugin && (plugin in pda.cartridge.messenger_plugins)) @@ -166,7 +167,8 @@ if(useMS && useTC) // only send the message if it's stable if(useTC != 2) // Does our recipient have a broadcaster on their level? - U << "ERROR: Cannot reach recipient." + to_chat(U, "ERROR: Cannot reach recipient.") + return useMS.send_pda_message("[P.owner]","[pda.owner]","[t]") tnote.Add(list(list("sent" = 1, "owner" = "[P.owner]", "job" = "[P.ownjob]", "message" = "[t]", "target" = "\ref[P]"))) @@ -181,7 +183,8 @@ PM.notify("Message from [pda.owner] ([pda.ownjob]), \"[t]\" (Reply)") log_pda("[usr] (PDA: [src.name]) sent \"[t]\" to [P.name]") else - U << "ERROR: Messaging server is not responding." + to_chat(U, "ERROR: Messaging server is not responding.") + /datum/data/pda/app/messenger/proc/available_pdas() var/list/names = list() @@ -189,7 +192,8 @@ var/list/namecounts = list() if (toff) - usr << "Turn on your receiver in order to send messages." + to_chat(usr, "Turn on your receiver in order to send messages.") + return for(var/A in PDAs) diff --git a/code/modules/pda/radio.dm b/code/modules/pda/radio.dm index b343d6b2ce3..1f8b1d06c69 100644 --- a/code/modules/pda/radio.dm +++ b/code/modules/pda/radio.dm @@ -31,7 +31,8 @@ /obj/item/radio/integrated/proc/post_signal(var/freq, var/key, var/value, var/key2, var/value2, var/key3, var/value3,var/key4, var/value4, s_filter) - //world << "Post: [freq]: [key]=[value], [key2]=[value2]" +// to_chat(world, "Post: [freq]: [key]=[value], [key2]=[value2]") + var/datum/radio_frequency/frequency = radio_controller.return_frequency(freq) if(!frequency) diff --git a/code/modules/pda/utilities.dm b/code/modules/pda/utilities.dm index 6d4feacb457..47c963d633a 100644 --- a/code/modules/pda/utilities.dm +++ b/code/modules/pda/utilities.dm @@ -68,9 +68,11 @@ if(istype(C, /mob/living/carbon/human)) var/mob/living/carbon/human/H = C if (!istype(H.dna, /datum/dna)) - user << "No fingerprints found on [H]" + to_chat(user, "No fingerprints found on [H]") + else - user << "[H]'s Fingerprints: [md5(H.dna.uni_identity)]" + to_chat(user, "[H]'s Fingerprints: [md5(H.dna.uni_identity)]") + scan_blood(C, user) /datum/data/pda/utility/scanmode/dna/scan_atom(atom/A as mob|obj|turf|area, mob/user as mob) @@ -78,14 +80,17 @@ /datum/data/pda/utility/scanmode/dna/proc/scan_blood(atom/A, mob/user) if (!A.blood_DNA) - user << "No blood found on [A]" + to_chat(user, "No blood found on [A]") + if(A.blood_DNA) qdel(A.blood_DNA) else - user << "Blood found on [A]. Analysing..." + to_chat(user, "Blood found on [A]. Analysing...") + spawn(15) for(var/blood in A.blood_DNA) - user << "Blood type: [A.blood_DNA[blood]]\nDNA: [blood]" + to_chat(user, "Blood type: [A.blood_DNA[blood]]\nDNA: [blood]") + /datum/data/pda/utility/scanmode/halogen base_name = "Halogen Counter" @@ -108,13 +113,17 @@ if(!isnull(A.reagents)) if(A.reagents.reagent_list.len > 0) var/reagents_length = A.reagents.reagent_list.len - user << "[reagents_length] chemical agent[reagents_length > 1 ? "s" : ""] found." + to_chat(user, "[reagents_length] chemical agent[reagents_length > 1 ? "s" : ""] found.") + for(var/re in A.reagents.reagent_list) - user << "\t [re]" + to_chat(user, "\t [re]") + else - user << "No active chemical agents found in [A]." + to_chat(user, "No active chemical agents found in [A].") + else - user << "No significant chemical agents found in [A]." + to_chat(user, "No significant chemical agents found in [A].") + /datum/data/pda/utility/scanmode/gas base_name = "Gas Scanner" @@ -194,6 +203,9 @@ // notehtml ISN'T set to allow user to get their old notes back. A better implementation would add a "scanned documents" // feature to the PDA, which would better convey the availability of the feature, but this will work for now. // Inform the user - user << "Paper scanned and OCRed to notekeeper." //concept of scanning paper copyright brainoblivion 2009 + to_chat(user, "Paper scanned and OCRed to notekeeper.")//concept of scanning paper copyright brainoblivion 2009 + + else - user << "Error scanning [A]." \ No newline at end of file + to_chat(user, "Error scanning [A].") + diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 22eaa83cf75..e3ff5b6a9c4 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -213,25 +213,33 @@ /obj/machinery/power/apc/examine(mob/user) if(..(user, 1)) if(stat & BROKEN) - user << "Looks broken." + to_chat(user, "Looks broken.") + return if(opened) if(has_electronics && terminal) - user << "The cover is [opened==2?"removed":"open"] and the power cell is [ cell ? "installed" : "missing"]." + to_chat(user, "The cover is [opened==2?"removed":"open"] and the power cell is [ cell ? "installed" : "missing"].") + else if (!has_electronics && terminal) - user << "There are some wires but no any electronics." + to_chat(user, "There are some wires but no any electronics.") + else if (has_electronics && !terminal) - user << "Electronics installed but not wired." + to_chat(user, "Electronics installed but not wired.") + else /* if (!has_electronics && !terminal) */ - user << "There is no electronics nor connected wires." + to_chat(user, "There is no electronics nor connected wires.") + else if (stat & MAINT) - user << "The cover is closed. Something wrong with it: it doesn't work." + to_chat(user, "The cover is closed. Something wrong with it: it doesn't work.") + else if (malfhack) - user << "The cover is broken. It may be hard to force it open." + to_chat(user, "The cover is broken. It may be hard to force it open.") + else - user << "The cover is closed." + to_chat(user, "The cover is closed.") + // update the APC icon to show the three base states // also add overlays for indicator lights @@ -416,10 +424,13 @@ if (istype(W, /obj/item/weapon/crowbar) && opened) if (has_electronics==1) if (terminal) - user << "Disconnect wires first." + to_chat(user, "Disconnect wires first.") + return playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) - user << "You are trying to remove the power control board..." //lpeters - fixed grammar issues + to_chat(user, "You are trying to remove the power control board...")//lpeters - fixed grammar issues + + if(do_after(user, 50, target = src)) if (has_electronics==1) has_electronics = 0 @@ -439,18 +450,21 @@ update_icon() else if (istype(W, /obj/item/weapon/crowbar) && !((stat & BROKEN) || malfhack) ) if(coverlocked && !(stat & MAINT)) - user << "The cover is locked and cannot be opened." + to_chat(user, "The cover is locked and cannot be opened.") + return else opened = 1 update_icon() else if (istype(W, /obj/item/weapon/stock_parts/cell) && opened) // trying to put a cell inside if(cell) - user << "There is a power cell already installed." + to_chat(user, "There is a power cell already installed.") + return else if (stat & MAINT) - user << "There is no connector for your power cell." + to_chat(user, "There is no connector for your power cell.") + return user.drop_item() W.loc = src @@ -463,55 +477,71 @@ else if (istype(W, /obj/item/weapon/screwdriver)) // haxing if(opened) if (cell) - user << "Close the APC first." //Less hints more mystery! + to_chat(user, "Close the APC first.")//Less hints more mystery! + + return else if (has_electronics==1 && terminal) has_electronics = 2 stat &= ~MAINT playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "You screw the circuit electronics into place." + to_chat(user, "You screw the circuit electronics into place.") + else if (has_electronics==2) has_electronics = 1 stat |= MAINT playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "You unfasten the electronics." + to_chat(user, "You unfasten the electronics.") + else /* has_electronics==0 */ - user << "There is nothing to secure." + to_chat(user, "There is nothing to secure.") + return update_icon() else if(emagged) - user << "The interface is broken." + to_chat(user, "The interface is broken.") + else wiresexposed = !wiresexposed - user << "The wires have been [wiresexposed ? "exposed" : "unexposed"]" + to_chat(user, "The wires have been [wiresexposed ? "exposed" : "unexposed"]") + update_icon() else if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) // trying to unlock the interface with an ID card if(emagged) - user << "The interface is broken." + to_chat(user, "The interface is broken.") + else if(opened) - user << "You must close the cover to swipe an ID card." + to_chat(user, "You must close the cover to swipe an ID card.") + else if(wiresexposed) - user << "You must close the panel" + to_chat(user, "You must close the panel") + else if(stat & (BROKEN|MAINT)) - user << "Nothing happens." + to_chat(user, "Nothing happens.") + else if(src.allowed(usr) && !isWireCut(APC_WIRE_IDSCAN)) locked = !locked - user << "You [ locked ? "lock" : "unlock"] the APC interface." + to_chat(user, "You [ locked ? "lock" : "unlock"] the APC interface.") + update_icon() else - user << "Access denied." + to_chat(user, "Access denied.") + else if (istype(W, /obj/item/stack/cable_coil) && !terminal && opened && has_electronics!=2) if (src.loc:intact) - user << "You must remove the floor plating in front of the APC first." + to_chat(user, "You must remove the floor plating in front of the APC first.") + return var/obj/item/stack/cable_coil/C = W if(C.amount < 10) - user << "You need more wires." + to_chat(user, "You need more wires.") + return - user << "You start adding cables to the APC frame..." + to_chat(user, "You start adding cables to the APC frame...") + playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) if(do_after(user, 20, target = src)) if (C.amount >= 10 && !terminal && opened && has_electronics != 2) @@ -530,9 +560,11 @@ terminal.connect_to_network() else if (istype(W, /obj/item/weapon/wirecutters) && terminal && opened && has_electronics!=2) if (src.loc:intact) - user << "You must remove the floor plating in front of the APC first." + to_chat(user, "You must remove the floor plating in front of the APC first.") + return - user << "You begin to cut the cables..." + to_chat(user, "You begin to cut the cables...") + playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) if(do_after(user, 50, target = src)) if(terminal && opened && has_electronics!=2) @@ -542,23 +574,28 @@ s.start() return new /obj/item/stack/cable_coil(loc,10) - user << "You cut the cables and dismantle the power terminal." + to_chat(user, "You cut the cables and dismantle the power terminal.") + qdel(terminal) // qdel else if (istype(W, /obj/item/weapon/apc_electronics) && opened && has_electronics==0 && !((stat & BROKEN) || malfhack)) - user << "You trying to insert the power control board into the frame..." + to_chat(user, "You trying to insert the power control board into the frame...") + playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) if(do_after(user, 10, target = src)) if(has_electronics==0) has_electronics = 1 - user << "You place the power control board inside the frame." + to_chat(user, "You place the power control board inside the frame.") + qdel(W) // qdel else if (istype(W, /obj/item/weapon/apc_electronics) && opened && has_electronics==0 && ((stat & BROKEN) || malfhack)) - user << "You cannot put the board inside, the frame is damaged." + to_chat(user, "You cannot put the board inside, the frame is damaged.") + return else if (istype(W, /obj/item/weapon/weldingtool) && opened && has_electronics==0 && !terminal) var/obj/item/weapon/weldingtool/WT = W if (WT.get_fuel() < 3) - user << "You need more welding fuel to complete this task." + to_chat(user, "You need more welding fuel to complete this task.") + return user.visible_message("[user.name] welds [src].", \ "You start welding the APC frame...", \ @@ -591,9 +628,11 @@ update_icon() else if (istype(W, /obj/item/mounted/frame/apc_frame) && opened && ((stat & BROKEN) || malfhack)) if (has_electronics) - user << "You cannot repair this APC until you remove the electronics still inside." + to_chat(user, "You cannot repair this APC until you remove the electronics still inside.") + return - user << "You begin to replace the damaged APC frame..." + to_chat(user, "You begin to replace the damaged APC frame...") + if(do_after(user, 50, target = src)) user.visible_message(\ "[user.name] has replaced the damaged APC frame with new one.",\ @@ -633,16 +672,20 @@ /obj/machinery/power/apc/emag_act(user as mob) if (!(emagged || malfhack)) // trying to unlock with an emag card if(opened) - user << "You must close the cover to swipe an ID card." + to_chat(user, "You must close the cover to swipe an ID card.") + else if(wiresexposed) - user << "You must close the panel first" + to_chat(user, "You must close the panel first") + else if(stat & (BROKEN|MAINT)) - user << "Nothing happens." + to_chat(user, "Nothing happens.") + else flick("apc-spark", src) emagged = 1 locked = 0 - user << "You emag the APC interface." + to_chat(user, "You emag the APC interface.") + update_icon() // attack with hand - remove cell (if cover open) or interact with the APC @@ -660,7 +703,8 @@ var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, src) s.start() - H << "The APC power currents surge erratically, damaging your chassis!" + to_chat(H, "The APC power currents surge erratically, damaging your chassis!") + H.adjustFireLoss(10,0) else if(src.cell && src.cell.charge > 0) if(H.nutrition < 450) @@ -671,16 +715,19 @@ H.nutrition += src.cell.charge/10 src.cell.charge = 0 - user << "You slot your fingers into the APC interface and siphon off some of the stored charge for your own use." + to_chat(user, "You slot your fingers into the APC interface and siphon off some of the stored charge for your own use.") + if(src.cell.charge < 0) src.cell.charge = 0 if(H.nutrition > 500) H.nutrition = 500 src.charging = 1 else - user << "You are already fully charged." + to_chat(user, "You are already fully charged.") + else - user << "There is no charge to draw from that APC." + to_chat(user, "There is no charge to draw from that APC.") + return if(usr == user && opened && (!issilicon(user))) @@ -694,7 +741,8 @@ src.cell = null user.visible_message("[user.name] removes the power cell from [src.name]!", "You remove the power cell.") - //user << "You remove the power cell." +// to_chat(user, "You remove the power cell.") + charging = 0 src.update_icon() return @@ -834,13 +882,15 @@ area.power_environ = (environ > 1) // if (area.name == "AI Chamber") // spawn(10) -// world << " [area.name] [area.power_equip]" +// to_chat(world, " [area.name] [area.power_equip]") + else area.power_light = 0 area.power_equip = 0 area.power_environ = 0 // if (area.name == "AI Chamber") -// world << "[area.power_equip]" +// to_chat(world, "[area.power_equip]") + area.power_change() /obj/machinery/power/apc/proc/isWireCut(var/wireIndex) @@ -864,7 +914,8 @@ ) \ ) if(!loud) - user << "\The [src] has AI control disabled!" + to_chat(user, "\The [src] has AI control disabled!") + user << browse(null, "window=apc") user.unset_machine() return 0 @@ -876,10 +927,12 @@ if (istype(H)) if(H.getBrainLoss() >= 60) for(var/mob/M in viewers(src, null)) - M << "[H] stares cluelessly at [src] and drools." + to_chat(M, "[H] stares cluelessly at [src] and drools.") + return 0 else if(prob(H.getBrainLoss())) - user << "You momentarily forget how to use [src]." + to_chat(user, "You momentarily forget how to use [src].") + return 0 return 1 @@ -970,9 +1023,11 @@ var/mob/living/silicon/ai/malfai = usr if(get_malf_status(malfai)==1) if (malfai.malfhacking) - malfai << "You are already hacking an APC." + to_chat(malfai, "You are already hacking an APC.") + return 0 - malfai << "Beginning override of APC systems. This takes some time, and you cannot perform other actions during the process." + to_chat(malfai, "Beginning override of APC systems. This takes some time, and you cannot perform other actions during the process.") + malfai.malfhack = src malfai.malfhacking = 1 sleep(600) @@ -988,7 +1043,8 @@ src.malfai = usr:parent else src.malfai = usr - malfai << "Hack complete. The APC is now under your exclusive control." + to_chat(malfai, "Hack complete. The APC is now under your exclusive control.") + update_icon() else if (href_list["occupyapc"]) @@ -1002,7 +1058,8 @@ else if (href_list["toggleaccess"]) if(istype(usr, /mob/living/silicon)) if(emagged || aidisabled || (stat & (BROKEN|MAINT))) - usr << "The APC does not respond to the command." + to_chat(usr, "The APC does not respond to the command.") + else locked = !locked update_icon() @@ -1024,10 +1081,12 @@ if(!istype(malf)) return if(istype(malf.loc, /obj/machinery/power/apc)) // Already in an APC - malf << "You must evacuate your current apc first." + to_chat(malf, "You must evacuate your current apc first.") + return if(!malf.can_shunt) - malf << "You cannot shunt." + to_chat(malf, "You cannot shunt.") + return if(!(src.z in config.station_levels)) return @@ -1067,7 +1126,8 @@ point.the_disk = A //The pinpointer tracks the AI back into its core. else - src.occupier << "Primary core damaged, unable to return core processes." + to_chat(src.occupier, "Primary core damaged, unable to return core processes.") + if(forced) src.occupier.loc = src.loc src.occupier.death() @@ -1082,7 +1142,8 @@ if(prob(3)) src.locked = 1 if (src.cell.charge > 0) -// world << "blew APC in [src.loc.loc]" +// to_chat(world, "blew APC in [src.loc.loc]") + src.cell.charge = 0 cell.corrupt() src.malfhack = 1 diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index da2e75bd488..7597b31a57e 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -120,11 +120,13 @@ By design, d1 is the smallest direction and d2 is the highest if(istype(W, /obj/item/weapon/wirecutters)) ///// Z-Level Stuff /* if(src.d1 == 12 || src.d2 == 12) - user << "You must cut this cable from above." + to_chat(user, "You must cut this cable from above.") + return */ ///// Z-Level Stuff /* if(breaker_box) - user << "\red This cable is connected to nearby breaker box. Use breaker box to interact with it." + to_chat(user, "\red This cable is connected to nearby breaker box. Use breaker box to interact with it.") + return */ if (shock(user, 50)) @@ -157,17 +159,20 @@ By design, d1 is the smallest direction and d2 is the highest else if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/coil = W if (coil.get_amount() < 1) - user << "Not enough cable" + to_chat(user, "Not enough cable") + return coil.cable_join(src, user) else if(istype(W, /obj/item/device/multitool)) if(powernet && (powernet.avail > 0)) // is it powered? - user << "[powernet.avail]W in power network." + to_chat(user, "[powernet.avail]W in power network.") + else - user << "The cable is not powered." + to_chat(user, "The cable is not powered.") + shock(user, 5, 0.2) @@ -514,10 +519,12 @@ obj/structure/cable/proc/cableColor(var/colorC) S.heal_damage(0,15,0,1) user.visible_message("\The [user] repairs some burn damage on \the [M]'s [S.name] with \the [src].") else if(S.open != 2) - user << "The damage is far too severe to patch over externally." + to_chat(user, "The damage is far too severe to patch over externally.") + return 1 else if(S.open != 2) - user << "Nothing to fix!" + to_chat(user, "Nothing to fix!") + else return ..() @@ -546,11 +553,14 @@ obj/structure/cable/proc/cableColor(var/colorC) return if(get_amount() == 1) - user << "A short piece of power cable." + to_chat(user, "A short piece of power cable.") + else if(get_amount() == 2) - user << "A piece of power cable." + to_chat(user, "A piece of power cable.") + else - user << "A coil of power cable. There are [get_amount()] lengths of cable in the coil." + to_chat(user, "A coil of power cable. There are [get_amount()] lengths of cable in the coil.") + /obj/item/stack/cable_coil/verb/make_restraint() @@ -561,14 +571,17 @@ obj/structure/cable/proc/cableColor(var/colorC) if(ishuman(M) && !M.restrained() && !M.stat && !M.paralysis && ! M.stunned) if(!istype(usr.loc,/turf)) return if(src.amount <= 14) - usr << "You need at least 15 lengths to make restraints!" + to_chat(usr, "You need at least 15 lengths to make restraints!") + return var/obj/item/weapon/restraints/handcuffs/cable/B = new /obj/item/weapon/restraints/handcuffs/cable(usr.loc) B.color = color - usr << "You wind some cable together to make some restraints." + to_chat(usr, "You wind some cable together to make some restraints.") + src.use(15) else - usr << "You cannot do that." + to_chat(usr, "You cannot do that.") + ..() // Items usable on a cable coil : @@ -579,24 +592,28 @@ obj/structure/cable/proc/cableColor(var/colorC) if( istype(W, /obj/item/weapon/wirecutters) && src.amount > 1) src.amount-- new/obj/item/stack/cable_coil(user.loc, 1,color) - user << "You cut a piece off the cable coil." + to_chat(user, "You cut a piece off the cable coil.") + src.update_icon() return else if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/C = W if(C.amount >= MAXCOIL) - user << "The coil is too long, you cannot add any more cable to it." + to_chat(user, "The coil is too long, you cannot add any more cable to it.") + return if( (C.amount + src.amount <= MAXCOIL) ) - user << "You join the cable coils together." + to_chat(user, "You join the cable coils together.") + C.give(src.amount) // give it cable src.use(src.amount) // make sure this one cleans up right return else var/amt = MAXCOIL - C.amount - user << "You transfer [amt] length\s of cable from one coil to the other." + to_chat(user, "You transfer [amt] length\s of cable from one coil to the other.") + C.give(amt) src.use(amt) return @@ -646,15 +663,18 @@ obj/structure/cable/proc/cableColor(var/colorC) return if(!T.can_have_cabling()) - user << "You can only lay cables on catwalks and plating!" + to_chat(user, "You can only lay cables on catwalks and plating!") + return if(get_amount() < 1) // Out of cable - user << "There is no cable left!" + to_chat(user, "There is no cable left!") + return if(get_dist(T,user) > 1) // Too far - user << "You can't lay cable at a place that far away!" + to_chat(user, "You can't lay cable at a place that far away!") + return else @@ -667,7 +687,8 @@ obj/structure/cable/proc/cableColor(var/colorC) for(var/obj/structure/cable/LC in T) if(LC.d2 == dirn && LC.d1 == 0) - user << "There's already a cable at that position!" + to_chat(user, "There's already a cable at that position!") + return var/obj/structure/cable/C = get_new_cable(T) @@ -709,7 +730,8 @@ obj/structure/cable/proc/cableColor(var/colorC) return if(get_dist(C, user) > 1) // make sure it's close enough - user << "You can't lay cable at a place that far away." + to_chat(user, "You can't lay cable at a place that far away.") + return @@ -722,7 +744,8 @@ obj/structure/cable/proc/cableColor(var/colorC) // one end of the clicked cable is pointing towards us if(C.d1 == dirn || C.d2 == dirn) if(U.intact) // can't place a cable if the floor is complete - user << "You can't lay cable there unless the floor tiles are removed." + to_chat(user, "You can't lay cable there unless the floor tiles are removed.") + return else // cable is pointing at us, we're standing on an open tile @@ -732,7 +755,8 @@ obj/structure/cable/proc/cableColor(var/colorC) for(var/obj/structure/cable/LC in U) // check to make sure there's not a cable there already if(LC.d1 == fdirn || LC.d2 == fdirn) - user << "There's already a cable at that position." + to_chat(user, "There's already a cable at that position.") + return var/obj/structure/cable/NC = new(U) @@ -778,7 +802,8 @@ obj/structure/cable/proc/cableColor(var/colorC) if(LC == C) // skip the cable we're interacting with continue if((LC.d1 == nd1 && LC.d2 == nd2) || (LC.d1 == nd2 && LC.d2 == nd1) ) // make sure no cable matches either direction - user << "There's already a cable at that position." + to_chat(user, "There's already a cable at that position.") + return diff --git a/code/modules/power/cable_heavyduty.dm b/code/modules/power/cable_heavyduty.dm index 5d21df1cc02..5f99ee3b59f 100644 --- a/code/modules/power/cable_heavyduty.dm +++ b/code/modules/power/cable_heavyduty.dm @@ -16,10 +16,12 @@ return if(istype(W, /obj/item/weapon/wirecutters)) - usr << "\blue These cables are too tough to be cut with those [W.name]." + to_chat(usr, "\blue These cables are too tough to be cut with those [W.name].") + return else if(istype(W, /obj/item/stack/cable_coil)) - usr << "\blue You will need heavier cables to connect to these." + to_chat(usr, "\blue You will need heavier cables to connect to these.") + return else ..() diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 1fd649ba19d..6a480a89d06 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -58,11 +58,14 @@ /obj/item/weapon/stock_parts/cell/examine(mob/user) if(..(user, 1)) if(maxcharge <= 2500) - user << "[desc]\nThe manufacturer's label states this cell has a power rating of [maxcharge], and that you should not swallow it.\nThe charge meter reads [round(src.percent() )]%." + to_chat(user, "[desc]\nThe manufacturer's label states this cell has a power rating of [maxcharge], and that you should not swallow it.\nThe charge meter reads [round(src.percent() )]%.") + else - user << "This power cell has an exciting chrome finish, as it is an uber-capacity cell type! It has a power rating of [maxcharge]!\nThe charge meter reads [round(src.percent() )]%." + to_chat(user, "This power cell has an exciting chrome finish, as it is an uber-capacity cell type! It has a power rating of [maxcharge]!\nThe charge meter reads [round(src.percent() )]%.") + if(crit_fail) - user << "\red This power cell seems to be faulty." + to_chat(user, "\red This power cell seems to be faulty.") + /obj/item/weapon/stock_parts/cell/attack_self(mob/user as mob) src.add_fingerprint(user) @@ -73,7 +76,8 @@ if(istype(W, /obj/item/weapon/reagent_containers/syringe)) var/obj/item/weapon/reagent_containers/syringe/S = W - user << "You inject the solution into the power cell." + to_chat(user, "You inject the solution into the power cell.") + if(S.reagents.has_reagent("plasma", 5)) diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index c11292d4fd7..a3e7c0d75c8 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -121,7 +121,8 @@ /obj/machinery/power/generator/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(istype(W, /obj/item/weapon/wrench)) anchored = !anchored - user << "\blue You [anchored ? "secure" : "unsecure"] the bolts holding [src] to the floor." + to_chat(user, "\blue You [anchored ? "secure" : "unsecure"] the bolts holding [src] to the floor.") + use_power = anchored reconnect() else diff --git a/code/modules/power/generator_type2.dm b/code/modules/power/generator_type2.dm index 00ab21b64df..52a66625d30 100644 --- a/code/modules/power/generator_type2.dm +++ b/code/modules/power/generator_type2.dm @@ -72,7 +72,8 @@ hot_air.temperature = hot_air.temperature - energy_transfer/hot_air_heat_capacity cold_air.temperature = cold_air.temperature + heat/cold_air_heat_capacity - //world << "POWER: [lastgen] W generated at [efficiency*100]% efficiency and sinks sizes [cold_air_heat_capacity], [hot_air_heat_capacity]" +// to_chat(world, "POWER: [lastgen] W generated at [efficiency*100]% efficiency and sinks sizes [cold_air_heat_capacity], [hot_air_heat_capacity]") + input1.parent.update = 1 input2.parent.update = 1 diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 863bdc19b32..76b19dda201 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -182,14 +182,16 @@ var/const/GRAV_NEEDS_WRENCH = 3 switch(broken_state) if(GRAV_NEEDS_SCREWDRIVER) if(istype(I, /obj/item/weapon/screwdriver)) - user << "You secure the screws of the framework." + to_chat(user, "You secure the screws of the framework.") + playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) broken_state++ if(GRAV_NEEDS_WELDING) if(istype(I, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = I if(WT.remove_fuel(1, user)) - user << "You mend the damaged framework." + to_chat(user, "You mend the damaged framework.") + playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) broken_state++ if(GRAV_NEEDS_PLASTEEL) @@ -197,14 +199,17 @@ var/const/GRAV_NEEDS_WRENCH = 3 var/obj/item/stack/sheet/plasteel/PS = I if(PS.amount >= 10) PS.use(10) - user << "You add the plating to the framework." + to_chat(user, "You add the plating to the framework.") + playsound(src.loc, 'sound/machines/click.ogg', 75, 1) broken_state++ else - user << "You need 10 sheets of plasteel." + to_chat(user, "You need 10 sheets of plasteel.") + if(GRAV_NEEDS_WRENCH) if(istype(I, /obj/item/weapon/wrench)) - user << "You secure the plating to the framework." + to_chat(user, "You secure the plating to the framework.") + playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) set_fix() else diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index f7ca916dfff..ade62f2144e 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -30,18 +30,22 @@ if(..(user, 2)) switch(src.stage) if(1) - usr << "It's an empty frame." + to_chat(usr, "It's an empty frame.") + if(2) - usr << "It's wired." + to_chat(usr, "It's wired.") + if(3) - usr << "The casing is closed." + to_chat(usr, "The casing is closed.") + /obj/machinery/light_construct/attackby(obj/item/weapon/W as obj, mob/living/user as mob, params) src.add_fingerprint(user) if (istype(W, /obj/item/weapon/wrench)) if (src.stage == 1) playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) - usr << "You begin deconstructing [src]." + to_chat(usr, "You begin deconstructing [src].") + if (!do_after(usr, 30, target = src)) return new /obj/item/stack/sheet/metal( get_turf(src.loc), sheets_refunded ) @@ -50,11 +54,13 @@ playsound(src.loc, 'sound/items/Deconstruct.ogg', 75, 1) qdel(src) if (src.stage == 2) - usr << "You have to remove the wires first." + to_chat(usr, "You have to remove the wires first.") + return if (src.stage == 3) - usr << "You have to unscrew the case first." + to_chat(usr, "You have to unscrew the case first.") + return if(istype(W, /obj/item/weapon/wirecutters)) @@ -269,13 +275,17 @@ if(..(user, 1)) switch(status) if(LIGHT_OK) - user << "[desc] It is turned [on? "on" : "off"]." + to_chat(user, "[desc] It is turned [on? "on" : "off"].") + if(LIGHT_EMPTY) - user << "[desc] The [fitting] has been removed." + to_chat(user, "[desc] The [fitting] has been removed.") + if(LIGHT_BURNED) - user << "[desc] The [fitting] is burnt out." + to_chat(user, "[desc] The [fitting] is burnt out.") + if(LIGHT_BROKEN) - user << "[desc] The [fitting] has been smashed." + to_chat(user, "[desc] The [fitting] has been smashed.") + @@ -294,14 +304,16 @@ // attempt to insert light if(istype(W, /obj/item/weapon/light)) if(status != LIGHT_EMPTY) - user << "There is a [fitting] already inserted." + to_chat(user, "There is a [fitting] already inserted.") + return else src.add_fingerprint(user) var/obj/item/weapon/light/L = W if(istype(L, light_type)) status = L.status - user << "You insert the [L.name]." + to_chat(user, "You insert the [L.name].") + switchcount = L.switchcount rigged = L.rigged brightness_range = L.brightness_range @@ -320,7 +332,8 @@ explode() else - user << "This type of light requires a [fitting]." + to_chat(user, "This type of light requires a [fitting].") + return // attempt to break the light @@ -331,7 +344,8 @@ user.do_attack_animation(src) if(prob(1+W.force * 5)) - user << "You hit the light, and it smashes!" + to_chat(user, "You hit the light, and it smashes!") + for(var/mob/M in viewers(src)) if(M == user) continue @@ -369,7 +383,8 @@ qdel(src) return - user << "You stick \the [W] into the light socket!" + to_chat(user, "You stick \the [W] into the light socket!") + if(has_power() && (W.flags & CONDUCT)) var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, src) @@ -407,7 +422,8 @@ // Aliens smash the bulb but do not get electrocuted./N /obj/machinery/light/attack_alien(mob/living/carbon/alien/humanoid/user)//So larva don't go breaking light bulbs. if(status == LIGHT_EMPTY||status == LIGHT_BROKEN) - user << "\green That object is useless to you." + to_chat(user, "\green That object is useless to you.") + return else if (status == LIGHT_OK||status == LIGHT_BURNED) user.do_attack_animation(src) @@ -418,7 +434,8 @@ /obj/machinery/light/attack_animal(mob/living/simple_animal/M) if(M.melee_damage_upper == 0) return if(status == LIGHT_EMPTY||status == LIGHT_BROKEN) - M << "\red That object is useless to you." + to_chat(M, "\red That object is useless to you.") + return else if (status == LIGHT_OK||status == LIGHT_BURNED) M.do_attack_animation(src) @@ -433,7 +450,8 @@ add_fingerprint(user) if(status == LIGHT_EMPTY) - user << "There is no [fitting] in this light." + to_chat(user, "There is no [fitting] in this light.") + return // make it burn hands if not wearing fire-insulated gloves @@ -451,11 +469,14 @@ prot = 1 if(prot > 0 || (RESIST_HEAT in user.mutations)) - user << "You remove the light [fitting]" + to_chat(user, "You remove the light [fitting]") + else if(TK in user.mutations) - user << "You telekinetically remove the light [fitting]." + to_chat(user, "You telekinetically remove the light [fitting].") + else - user << "You try to remove the light [fitting], but you burn your hand on it!" + to_chat(user, "You try to remove the light [fitting], but you burn your hand on it!") + var/obj/item/organ/external/affecting = H.get_organ("[user.hand ? "l" : "r" ]_hand") if(affecting.take_damage( 0, 5 )) // 5 burn damage @@ -463,7 +484,8 @@ H.updatehealth() return // if burned, don't remove the light else - user << "You remove the light [fitting]." + to_chat(user, "You remove the light [fitting].") + // create a light tube/bulb item and put it in the user's hand @@ -490,10 +512,12 @@ /obj/machinery/light/attack_tk(mob/user) if(status == LIGHT_EMPTY) - user << "There is no [fitting] in this light." + to_chat(user, "There is no [fitting] in this light.") + return - user << "You telekinetically remove the light [fitting]." + to_chat(user, "You telekinetically remove the light [fitting].") + // create a light tube/bulb item and put it in the user's hand var/obj/item/weapon/light/L = new light_type() L.status = status @@ -671,7 +695,8 @@ if(istype(I, /obj/item/weapon/reagent_containers/syringe)) var/obj/item/weapon/reagent_containers/syringe/S = I - user << "You inject the solution into the [src]." + to_chat(user, "You inject the solution into the [src].") + if(S.reagents.has_reagent("plasma", 5)) diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 7feba62c14b..062978045ec 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -51,9 +51,11 @@ if(!..(user,1 )) return if(active) - usr << "The generator is on." + to_chat(usr, "The generator is on.") + else - usr << "The generator is off." + to_chat(usr, "The generator is off.") + /obj/machinery/power/port_gen/emp_act(severity) var/duration = 6000 //ten minutes @@ -151,10 +153,16 @@ /obj/machinery/power/port_gen/pacman/examine(mob/user) ..(user) - user << "\The [src] appears to be producing [power_gen*power_output] W." - user << "There [sheets == 1 ? "is" : "are"] [sheets] sheet\s left in the hopper." - if(IsBroken()) user << "\The [src] seems to have broken down." - if(overheating) user << "\The [src] is overheating!" + to_chat(user, "\The [src] appears to be producing [power_gen*power_output] W.") + + to_chat(user, "There [sheets == 1 ? "is" : "are"] [sheets] sheet\s left in the hopper.") + + if(IsBroken()) + to_chat(user, "\The [src] seems to have broken down.") + + if(overheating) + to_chat(user, "\The [src] is overheating!") + /obj/machinery/power/port_gen/pacman/HasFuel() var/needed_sheets = power_output / time_per_sheet @@ -269,9 +277,11 @@ var/obj/item/stack/addstack = O var/amount = min((max_sheets - sheets), addstack.amount) if(amount < 1) - user << "The [src.name] is full!" + to_chat(user, "The [src.name] is full!") + return - user << "You add [amount] sheet\s to the [src.name]." + to_chat(user, "You add [amount] sheet\s to the [src.name].") + sheets += amount addstack.use(amount) nanomanager.update_uis(src) @@ -281,10 +291,12 @@ if(!anchored) connect_to_network() - user << "You secure the generator to the floor." + to_chat(user, "You secure the generator to the floor.") + else disconnect_from_network() - user << "You unsecure the generator from the floor." + to_chat(user, "You unsecure the generator from the floor.") + playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) anchored = !anchored @@ -293,9 +305,11 @@ panel_open = !panel_open playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) if(panel_open) - user << "You open the access panel." + to_chat(user, "You open the access panel.") + else - user << "You close the access panel." + to_chat(user, "You close the access panel.") + else if(istype(O, /obj/item/weapon/storage/part_replacer) && panel_open) exchange_parts(user, O) return diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index 3e94274cf2f..72c9f0e4eb5 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -44,23 +44,27 @@ var/global/list/rad_collectors = list() investigate_log("turned [active?"on":"off"] by [user.key]. [P?"Fuel: [round(P.air_contents.toxins/0.29)]%":"It is empty"].","singulo") return else - user << "\red The controls are locked!" + to_chat(user, "\red The controls are locked!") + return ..() /obj/machinery/power/rad_collector/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/device/multitool)) - user << "The [W.name] detects that [last_power]W were recently produced." + to_chat(user, "The [W.name] detects that [last_power]W were recently produced.") + return 1 else if(istype(W, /obj/item/device/analyzer) && P) atmosanalyzer_scan(P.air_contents, user) else if(istype(W, /obj/item/weapon/tank/plasma)) if(!src.anchored) - user << "\red The [src] needs to be secured to the floor first." + to_chat(user, "\red The [src] needs to be secured to the floor first.") + return 1 if(src.P) - user << "\red There's already a plasma tank loaded." + to_chat(user, "\red There's already a plasma tank loaded.") + return 1 user.drop_item() src.P = W @@ -72,7 +76,8 @@ var/global/list/rad_collectors = list() return 1 else if(istype(W, /obj/item/weapon/wrench)) if(P) - user << "\blue Remove the plasma tank first." + to_chat(user, "\blue Remove the plasma tank first.") + return 1 playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) src.anchored = !src.anchored @@ -87,12 +92,15 @@ var/global/list/rad_collectors = list() if (src.allowed(user)) if(active) src.locked = !src.locked - user << "The controls are now [src.locked ? "locked." : "unlocked."]" + to_chat(user, "The controls are now [src.locked ? "locked." : "unlocked."]") + else src.locked = 0 //just in case it somehow gets locked - user << "\red The controls can only be locked when the [src] is active" + to_chat(user, "\red The controls can only be locked when the [src] is active") + else - user << "\red Access denied!" + to_chat(user, "\red Access denied!") + return 1 else ..() diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index f181fab77af..e69bd179ed9 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -65,7 +65,8 @@ set src in oview(1) if (src.anchored || usr:stat) - usr << "It is fastened to the floor!" + to_chat(usr, "It is fastened to the floor!") + return 0 src.dir = turn(src.dir, 90) return 1 @@ -127,18 +128,21 @@ src.add_fingerprint(user) if(state == 2) if(!powernet) - user << "The emitter isn't connected to a wire." + to_chat(user, "The emitter isn't connected to a wire.") + return 1 if(!src.locked) if(src.active==1) src.active = 0 - user << "You turn off the [src]." + to_chat(user, "You turn off the [src].") + message_admins("Emitter turned off by [key_name_admin(user)] in ([x], [y], [z] - JMP)",0,1) log_game("Emitter turned off by [key_name(user)] in [x], [y], [z]") investigate_log("turned off by [key_name(usr)]","singulo") else src.active = 1 - user << "You turn on the [src]." + to_chat(user, "You turn on the [src].") + src.shot_number = 0 src.fire_delay = maximum_fire_delay message_admins("Emitter turned on by [key_name_admin(user)] in ([x], [y], [z] - JMP)",0,1) @@ -146,9 +150,11 @@ investigate_log("turned on by [key_name(usr)]","singulo") update_icon() else - user << "\red The controls are locked!" + to_chat(user, "\red The controls are locked!") + else - user << "\red The [src] needs to be firmly secured to the floor first." + to_chat(user, "\red The [src] needs to be firmly secured to the floor first.") + return 1 @@ -223,7 +229,8 @@ if(istype(W, /obj/item/weapon/wrench)) if(active) - user << "Turn off the [src] first." + to_chat(user, "Turn off the [src] first.") + return switch(state) if(0) @@ -241,17 +248,20 @@ "You hear a ratchet") src.anchored = 0 if(2) - user << "\red The [src.name] needs to be unwelded from the floor." + to_chat(user, "\red The [src.name] needs to be unwelded from the floor.") + return if(istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W if(active) - user << "Turn off the [src] first." + to_chat(user, "Turn off the [src] first.") + return switch(state) if(0) - user << "\red The [src.name] needs to be wrenched to the floor." + to_chat(user, "\red The [src.name] needs to be wrenched to the floor.") + if(1) if (WT.remove_fuel(0,user)) playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) @@ -261,10 +271,12 @@ if (do_after(user,20, target = src)) if(!src || !WT.isOn()) return state = 2 - user << "You weld the [src] to the floor." + to_chat(user, "You weld the [src] to the floor.") + connect_to_network() else - user << "\red You need more welding fuel to complete this task." + to_chat(user, "\red You need more welding fuel to complete this task.") + if(2) if (WT.remove_fuel(0,user)) playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) @@ -274,25 +286,31 @@ if (do_after(user,20, target = src)) if(!src || !WT.isOn()) return state = 1 - user << "You cut the [src] free from the floor." + to_chat(user, "You cut the [src] free from the floor.") + disconnect_from_network() else - user << "\red You need more welding fuel to complete this task." + to_chat(user, "\red You need more welding fuel to complete this task.") + return if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda)) if(emagged) - user << "\red The lock seems to be broken" + to_chat(user, "\red The lock seems to be broken") + return if(src.allowed(user)) if(active) src.locked = !src.locked - user << "The controls are now [src.locked ? "locked." : "unlocked."]" + to_chat(user, "The controls are now [src.locked ? "locked." : "unlocked."]") + else src.locked = 0 //just in case it somehow gets locked - user << "\red The controls can only be locked when the [src] is online" + to_chat(user, "\red The controls can only be locked when the [src] is online") + else - user << "\red Access denied." + to_chat(user, "\red Access denied.") + return if(default_deconstruction_screwdriver(user, "emitter_open", "emitter", W)) diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index cabe2b7a9b6..320f2d8dc6c 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -79,7 +79,8 @@ field_generator power level display if(state == 2) if(get_dist(src, user) <= 1)//Need to actually touch the thing to turn it on if(src.active >= 1) - user << "You are unable to turn off the [src.name] once it is online!" + to_chat(user, "You are unable to turn off the [src.name] once it is online!") + return 1 else user.visible_message("[user.name] turns on the [src.name].", \ @@ -90,13 +91,15 @@ field_generator power level display src.add_fingerprint(user) else - user << "The [src] needs to be firmly secured to the floor first!" + to_chat(user, "The [src] needs to be firmly secured to the floor first!") + return /obj/machinery/field/generator/attackby(obj/item/W, mob/user, params) if(active) - user << "The [src] needs to be off!" + to_chat(user, "The [src] needs to be off!") + return else if(istype(W, /obj/item/weapon/wrench)) switch(state) @@ -116,13 +119,15 @@ field_generator power level display "You hear ratchet.") src.anchored = 0 if(2) - user << "The [src.name] needs to be unwelded from the floor!" + to_chat(user, "The [src.name] needs to be unwelded from the floor!") + return else if(istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W switch(state) if(0) - user << "The [src.name] needs to be wrenched to the floor!" + to_chat(user, "The [src.name] needs to be wrenched to the floor!") + return if(1) if (WT.remove_fuel(0,user)) @@ -133,7 +138,8 @@ field_generator power level display if (do_after(user,20, target = src)) if(!src || !WT.isOn()) return state = 2 - user << "You weld the field generator to the floor." + to_chat(user, "You weld the field generator to the floor.") + else return if(2) @@ -145,7 +151,8 @@ field_generator power level display if (do_after(user,20, target = src)) if(!src || !WT.isOn()) return state = 1 - user << "You cut \the [src] free from the floor." + to_chat(user, "You cut \the [src] free from the floor.") + else return else diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index 355b8ec6e74..48c980f39fe 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -24,8 +24,10 @@ /obj/singularity/narsie/large/New() ..() - world << "NAR-SIE HAS RISEN" - world << pick(sound('sound/hallucinations/im_here1.ogg'), sound('sound/hallucinations/im_here2.ogg')) + to_chat(world, "NAR-SIE HAS RISEN") + + to_chat(world, pick(sound('sound/hallucinations/im_here1.ogg'), sound('sound/hallucinations/im_here2.ogg'))) + var/area/A = get_area(src) if(A) @@ -38,7 +40,8 @@ /obj/singularity/narsie/large/attack_ghost(mob/dead/observer/user as mob) if(!(src in view())) - user << "Your soul is too far away." + to_chat(user, "Your soul is too far away.") + return makeNewConstruct(/mob/living/simple_animal/construct/harvester, user, null, 1) new /obj/effect/effect/sleep_smoke(user.loc) @@ -76,7 +79,8 @@ for(var/mob/living/carbon/M in oviewers(8, src)) if(M.stat == CONSCIOUS) if(!iscultist(M)) - M << "You feel your sanity crumble away in an instant as you gaze upon [src.name]..." + to_chat(M, "You feel your sanity crumble away in an instant as you gaze upon [src.name]...") + M.apply_effect(3, STUN) @@ -123,12 +127,15 @@ /obj/singularity/narsie/proc/acquire(var/mob/food) - target << "NAR-SIE HAS LOST INTEREST IN YOU" + to_chat(target, "NAR-SIE HAS LOST INTEREST IN YOU") + target = food if(ishuman(target)) - target << "NAR-SIE HUNGERS FOR YOUR SOUL" + to_chat(target, "NAR-SIE HUNGERS FOR YOUR SOUL") + else - target << "NAR-SIE HAS CHOSEN YOU TO LEAD HIM TO HIS NEXT MEAL" + to_chat(target, "NAR-SIE HAS CHOSEN YOU TO LEAD HIM TO HIS NEXT MEAL") + //Wizard narsie /obj/singularity/narsie/wizard diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm index eb5fe86b5ed..3f9b639dc46 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm @@ -96,7 +96,8 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin if(usr.stat || !usr.canmove || usr.restrained()) return if (src.anchored) - usr << "It is fastened to the floor!" + to_chat(usr, "It is fastened to the floor!") + return 0 src.dir = turn(src.dir, 270) return 1 @@ -109,7 +110,8 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin if(usr.stat || !usr.canmove || usr.restrained()) return if (src.anchored) - usr << "It is fastened to the floor!" + to_chat(usr, "It is fastened to the floor!") + return 0 src.dir = turn(src.dir, 90) return 1 @@ -235,7 +237,8 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin "You add some wires.") temp_state++ else - user << "You need one length of cable to wire the [src.name]!" + to_chat(user, "You need one length of cable to wire the [src.name]!") + return if(2) if(iswirecutter(O))//TODO:Shock user if its on? @@ -289,7 +292,8 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin if(usr.stat || !usr.canmove || usr.restrained()) return if (src.anchored) - usr << "It is fastened to the floor!" + to_chat(usr, "It is fastened to the floor!") + return 0 src.dir = turn(src.dir, 270) return 1 @@ -302,7 +306,8 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin if(usr.stat || !usr.canmove || usr.restrained()) return if (src.anchored) - usr << "It is fastened to the floor!" + to_chat(usr, "It is fastened to the floor!") + return 0 src.dir = turn(src.dir, 90) return 1 diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index 6723bc156c0..a5e7d111c69 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -86,7 +86,8 @@ return 1 if(!interface_control) - usr << "ERROR: Request timed out. Check wire contacts." + to_chat(usr, "ERROR: Request timed out. Check wire contacts.") + return if( href_list["close"] ) diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index ba8e5d34dea..df8cceb0fdf 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -390,7 +390,8 @@ if(istype(H.glasses, /obj/item/clothing/glasses/meson)) var/obj/item/clothing/glasses/meson/MS = H.glasses if(MS.vision_flags == SEE_TURFS) - H << "You look directly into the [src.name], good thing you had your protective eyewear on!" + to_chat(H, "You look directly into the [src.name], good thing you had your protective eyewear on!") + return M.apply_effect(3, STUN) diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 33a5c69fdc8..3d998c45545 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -130,10 +130,12 @@ if(term && term.dir == turn(dir, 180)) terminal = term terminal.master = src - user << "Terminal found." + to_chat(user, "Terminal found.") + break if(!terminal) - user << "No power source found." + to_chat(user, "No power source found.") + return stat &= ~BROKEN update_icon() @@ -150,21 +152,25 @@ return if(terminal) //is there already a terminal ? - user << "This SMES already has a power terminal!" + to_chat(user, "This SMES already has a power terminal!") + return if(!panel_open) //is the panel open ? - user << "You must open the maintenance panel first!" + to_chat(user, "You must open the maintenance panel first!") + return var/turf/T = get_turf(user) if (T.intact) //is the floor plating removed ? - user << "You must first remove the floor plating!" + to_chat(user, "You must first remove the floor plating!") + return var/obj/item/stack/cable_coil/C = I if(C.amount < 10) - user << "You need more wires." + to_chat(user, "You need more wires.") + return //build the terminal and link it to the network @@ -176,10 +182,12 @@ if(istype(I, /obj/item/weapon/wirecutters) && terminal && panel_open) var/turf/T = get_turf(terminal) if (T.intact) //is the floor plating removed ? - user << "You must first expose the power terminal!" + to_chat(user, "You must first expose the power terminal!") + return - user << "You begin to dismantle the power terminal..." + to_chat(user, "You begin to dismantle the power terminal...") + playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) if(do_after(user, 50, target = src)) @@ -302,7 +310,8 @@ //Will return 1 on failure /obj/machinery/power/smes/proc/make_terminal(const/mob/user) if (user.loc == loc) - user << "You must not be on the same tile as the [src]." + to_chat(user, "You must not be on the same tile as the [src].") + return 1 //Direction the terminal will face to @@ -314,13 +323,16 @@ tempDir = WEST var/turf/tempLoc = get_step(src, reverse_direction(tempDir)) if (istype(tempLoc, /turf/space)) - user << "You can't build a terminal on space." + to_chat(user, "You can't build a terminal on space.") + return 1 else if (istype(tempLoc)) if(tempLoc.intact) - user << "You must remove the floor plating first." + to_chat(user, "You must remove the floor plating first.") + return 1 - user << "You start adding cable to the [src]." + to_chat(user, "You start adding cable to the [src].") + if(do_after(user, 50, target = src)) var/turf/T = get_turf(user) var/obj/structure/cable/N = T.get_cable_node() //get the connecting node cable, if there's one diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 3f714c911c2..d998d93556b 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -247,7 +247,8 @@ else new /obj/machinery/power/solar(get_turf(src), src) else - user << "You need two sheets of glass to put them into a solar panel." + to_chat(user, "You need two sheets of glass to put them into a solar panel.") + return return 1 @@ -418,7 +419,8 @@ playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) if(do_after(user, 20, target = src)) if (src.stat & BROKEN) - user << "The broken glass falls out." + to_chat(user, "The broken glass falls out.") + var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) new /obj/item/weapon/shard( src.loc ) var/obj/item/weapon/circuitboard/solar_control/M = new /obj/item/weapon/circuitboard/solar_control( A ) @@ -430,7 +432,8 @@ A.anchored = 1 qdel(src) else - user << "You disconnect the monitor." + to_chat(user, "You disconnect the monitor.") + var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) var/obj/item/weapon/circuitboard/solar_control/M = new /obj/item/weapon/circuitboard/solar_control( A ) for (var/obj/C in src) diff --git a/code/modules/power/supermatter/sm_shard.dm b/code/modules/power/supermatter/sm_shard.dm index e55a065c462..10adc4c9814 100644 --- a/code/modules/power/supermatter/sm_shard.dm +++ b/code/modules/power/supermatter/sm_shard.dm @@ -44,7 +44,8 @@ /obj/item/weapon/shard/supermatter/Crossed(AM as mob|obj) if(ismob(AM)) var/mob/M = AM - M << "\red You step on \the [src]!" + to_chat(M, "\red You step on \the [src]!") + playsound(src.loc, 'sound/effects/glass_step_sm.ogg', 70, 1) // not sure how to handle metal shards with sounds if(ishuman(M)) var/mob/living/carbon/human/H = M @@ -66,7 +67,8 @@ /obj/item/weapon/shard/supermatter/attack_hand(var/mob/user) if(!istype(user,/mob/living/carbon/human/nucleation)) - user << pick( "\red You think twice before touching that without protection.", + to_chat(user, pick( "\red You think twice before touching that without protection.",) + "\red You don't want to touch that without some protection.", "\red You probably should get something else to pick that up.", "\red You aren't sure that's a good idea.", diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 6f04bf82a1a..fa663b37ca6 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -224,8 +224,11 @@ message_admins("Singularity has consumed a supermatter shard and can now become stage six.") visible_message("[src] is consumed by the singularity!") for(var/mob/M in mob_list) - M << 'sound/effects/supermatter.ogg' //everyone goan know bout this - M << "A horrible screeching fills your ears, and a wave of dread washes over you..." + to_chat(M, 'sound/effects/supermatter.ogg')//everyone goan know bout this + + + to_chat(M, "A horrible screeching fills your ears, and a wave of dread washes over you...") + qdel(src) return(gain) diff --git a/code/modules/power/switch.dm b/code/modules/power/switch.dm index 0f36d7274bf..07a6ddf558e 100644 --- a/code/modules/power/switch.dm +++ b/code/modules/power/switch.dm @@ -24,18 +24,22 @@ /obj/structure/powerswitch/examine(mob/user) ..(user) if(on) - user << "The switch is in the on position" + to_chat(user, "The switch is in the on position") + else - user << "The switch is in the off position" + to_chat(user, "The switch is in the off position") + /obj/structure/powerswitch/attack_ai(mob/user) - user << "\red You're an AI. This is a manual switch. It's not going to work." + to_chat(user, "\red You're an AI. This is a manual switch. It's not going to work.") + return /obj/structure/powerswitch/attack_hand(mob/user) if(busy) - user << "\red This switch is already being toggled." + to_chat(user, "\red This switch is already being toggled.") + return ..() diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index 0776918c5b4..305e2c0fc9a 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -56,7 +56,8 @@ var/list/blacklisted_tesla_types = list(/obj/machinery/atmospherics, /obj/singularity/energy_ball/examine(mob/user) ..() if(orbiting_balls.len) - user << "The amount of orbiting mini-balls is [orbiting_balls.len]." + to_chat(user, "The amount of orbiting mini-balls is [orbiting_balls.len].") + /obj/singularity/energy_ball/proc/move_the_basket_ball(var/move_amount) diff --git a/code/modules/power/treadmill.dm b/code/modules/power/treadmill.dm index 84437c672c3..88c7aae1995 100644 --- a/code/modules/power/treadmill.dm +++ b/code/modules/power/treadmill.dm @@ -168,7 +168,8 @@ /obj/machinery/treadmill_monitor/examine(mob/user) ..() - user << "The display reads:
      [line1]
      [line2]
      " + to_chat(user, "The display reads:
      [line1]
      [line2]
      ") + /obj/machinery/treadmill_monitor/update_icon() overlays.Cut() diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm index 4c7b51e5ac0..0ab93b6d825 100644 --- a/code/modules/power/turbine.dm +++ b/code/modules/power/turbine.dm @@ -120,10 +120,12 @@ inturf = get_step(src, dir) locate_machinery() if(turbine) - user << "Turbine connected." + to_chat(user, "Turbine connected.") + stat &= ~BROKEN else - user << "Turbine not connected." + to_chat(user, "Turbine not connected.") + stat |= BROKEN return @@ -279,10 +281,12 @@ outturf = get_step(src, dir) locate_machinery() if(compressor) - user << "Compressor connected." + to_chat(user, "Compressor connected.") + stat &= ~BROKEN else - user << "Compressor not connected." + to_chat(user, "Compressor not connected.") + stat |= BROKEN return diff --git a/code/modules/procedural_mapping/mapGenerator.dm b/code/modules/procedural_mapping/mapGenerator.dm index d0c5440dc95..24c0fa2bbda 100644 --- a/code/modules/procedural_mapping/mapGenerator.dm +++ b/code/modules/procedural_mapping/mapGenerator.dm @@ -153,23 +153,30 @@ var/endInput = input(usr,"End turf of Map (X;Y;Z)", "Map Gen Settings", "[world.maxx];[world.maxy];[mob ? mob.z : 1]") as text //maxx maxy and current z so that if you fuck up, you only fuck up one entire z level instead of the entire universe if(!startInput || !endInput) - src << "Missing Input" + to_chat(src, "Missing Input") + return var/list/startCoords = splittext(startInput, ";") var/list/endCoords = splittext(endInput, ";") if(!startCoords || !endCoords) - src << "Invalid Coords" - src << "Start Input: [startInput]" - src << "End Input: [endInput]" + to_chat(src, "Invalid Coords") + + to_chat(src, "Start Input: [startInput]") + + to_chat(src, "End Input: [endInput]") + return var/turf/Start = locate(text2num(startCoords[1]),text2num(startCoords[2]),text2num(startCoords[3])) var/turf/End = locate(text2num(endCoords[1]),text2num(endCoords[2]),text2num(endCoords[3])) if(!Start || !End) - src << "Invalid Turfs" - src << "Start Coords: [startCoords[1]] - [startCoords[2]] - [startCoords[3]]" - src << "End Coords: [endCoords[1]] - [endCoords[2]] - [endCoords[3]]" + to_chat(src, "Invalid Turfs") + + to_chat(src, "Start Coords: [startCoords[1]] - [startCoords[2]] - [startCoords[3]]") + + to_chat(src, "End Coords: [endCoords[1]] - [endCoords[2]] - [endCoords[3]]") + return var/list/clusters = list("None"=CLUSTER_CHECK_NONE,"All"=CLUSTER_CHECK_ALL,"Sames"=CLUSTER_CHECK_SAMES,"Differents"=CLUSTER_CHECK_DIFFERENTS, \ @@ -182,7 +189,8 @@ var/theCluster = 0 if(moduleClusters != "None") if(!clusters[moduleClusters]) - src << "Invalid Cluster Flags" + to_chat(src, "Invalid Cluster Flags") + return theCluster = clusters[moduleClusters] else @@ -193,9 +201,13 @@ M.clusterCheckFlags = theCluster - src << "Defining Region" + to_chat(src, "Defining Region") + N.defineRegion(Start, End) - src << "Region Defined" - src << "Generating Region" + to_chat(src, "Region Defined") + + to_chat(src, "Generating Region") + N.generate() - src << "Generated Region" + to_chat(src, "Generated Region") + diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index 57ed66625ec..2bb8334967d 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -38,18 +38,21 @@ var/tmp_label = "" var/label_text = sanitize(input(user, "Inscribe some text into \the [initial(BB.name)]","Inscription",tmp_label)) if(length(label_text) > 20) - user << "\red The inscription can be at most 20 characters long." + to_chat(user, "\red The inscription can be at most 20 characters long.") else if(label_text == "") - user << "\blue You scratch the inscription off of [initial(BB)]." + to_chat(user, "\blue You scratch the inscription off of [initial(BB)].") BB.name = initial(BB.name) else - user << "\blue You inscribe \"[label_text]\" into \the [initial(BB.name)]." + to_chat(user, "\blue You inscribe \"[label_text]\" into \the [initial(BB.name)].") BB.name = "[initial(BB.name)] \"[label_text]\"" else - user << "\blue You can only inscribe a metal bullet." //because inscribing beanbags is silly + to_chat(user, "\blue You can only inscribe a metal bullet.")//because inscribing beanbags is silly + + else - user << "\blue There is no bullet in the casing to inscribe anything into." + to_chat(user, "\blue There is no bullet in the casing to inscribe anything into.") + /obj/item/ammo_casing/proc/newshot() //For energy weapons, shotgun shells and wands (!). if (!BB) @@ -121,7 +124,8 @@ num_loaded++ if(num_loaded) if(!silent) - user << "You load [num_loaded] shell\s into \the [src]!" + to_chat(user, "You load [num_loaded] shell\s into \the [src]!") + A.update_icon() update_icon() @@ -129,7 +133,8 @@ var/obj/item/ammo_casing/A = get_round() if(A) user.put_in_hands(A) - user << "You remove a round from \the [src]!" + to_chat(user, "You remove a round from \the [src]!") + update_icon() /obj/item/ammo_box/update_icon() diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 452a6dc026f..bd288a8e405 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -68,7 +68,8 @@ proc/shoot_with_empty_chamber(mob/living/user as mob|obj) - user << "*click*" + to_chat(user, "*click*") + playsound(user, 'sound/weapons/emptyclick.ogg', 40, 1) return @@ -98,30 +99,36 @@ if(istype(user, /mob/living)) var/mob/living/M = user if ((CLUMSY in M.mutations) && prob(50)) - M << "[src] blows up in your face." + to_chat(M, "[src] blows up in your face.") + M.take_organ_damage(0,20) M.drop_item() qdel(src) return if (!user.IsAdvancedToolUser() || istype(user, /mob/living/simple_animal/diona)) - user << "You don't have the dexterity to do this!" + to_chat(user, "You don't have the dexterity to do this!") + return if(istype(user, /mob/living)) var/mob/living/M = user if (HULK in M.mutations) - M << "Your meaty finger is much too large for the trigger guard!" + to_chat(M, "Your meaty finger is much too large for the trigger guard!") + return if(ishuman(user)) var/mob/living/carbon/human/H = user if(H.get_species() == "Golem") - user << "Your metal fingers don't fit in the trigger guard!" + to_chat(user, "Your metal fingers don't fit in the trigger guard!") + return if(H.get_species() == "Shadowling") - user << "The muzzle flash would cause damage to your form!" + to_chat(user, "The muzzle flash would cause damage to your form!") + return if(H.martial_art && H.martial_art.name == "The Sleeping Carp") //great dishonor to famiry - user << "Use of ranged weaponry would bring dishonor to the clan." + to_chat(user, "Use of ranged weaponry would bring dishonor to the clan.") + return add_fingerprint(user) @@ -131,7 +138,8 @@ if (!ready_to_fire()) if (world.time % 3) //to prevent spam - user << "[src] is not ready to fire again!" + to_chat(user, "[src] is not ready to fire again!") + return if(heavy_weapon) @@ -299,7 +307,8 @@ user.apply_damage(in_chamber.damage*2.5, in_chamber.damage_type, "head", used_weapon = "Point blank shot in the mouth with \a [in_chamber]", sharp=1) user.death() else - user << "Ow..." + to_chat(user, "Ow...") + user.apply_effect(110,STAMINA,0) del(in_chamber) mouthshoot = 0 @@ -329,10 +338,12 @@ if(can_flashlight) if(!F) if(user.l_hand != src && user.r_hand != src) - user << "You'll need [src] in your hands to do that." + to_chat(user, "You'll need [src] in your hands to do that.") + return user.drop_item() - user << "You click [S] into place on [src]." + to_chat(user, "You click [S] into place on [src].") + if(S.on) set_light(0) F = S @@ -343,10 +354,12 @@ if(istype(A, /obj/item/weapon/screwdriver)) if(F) if(user.l_hand != src && user.r_hand != src) - user << "You'll need [src] in your hands to do that." + to_chat(user, "You'll need [src] in your hands to do that.") + return for(var/obj/item/device/flashlight/seclite/S in src) - user << "You unscrew the seclite from [src]." + to_chat(user, "You unscrew the seclite from [src].") + F = null S.loc = get_turf(user) update_gunlight(user) @@ -366,9 +379,11 @@ var/mob/living/carbon/human/user = usr if(!isturf(user.loc)) - user << "You cannot turn the light on while in this [user.loc]." + to_chat(user, "You cannot turn the light on while in this [user.loc].") + F.on = !F.on - user << "You toggle the gunlight [F.on ? "on":"off"]." + to_chat(user, "You toggle the gunlight [F.on ? "on":"off"].") + playsound(user, 'sound/weapons/empty.ogg', 100, 1) update_gunlight(user) diff --git a/code/modules/projectiles/guns/alien.dm b/code/modules/projectiles/guns/alien.dm index ea4c15a0596..07ea0669a2b 100644 --- a/code/modules/projectiles/guns/alien.dm +++ b/code/modules/projectiles/guns/alien.dm @@ -33,7 +33,8 @@ /obj/item/weapon/gun/launcher/spikethrower/examine(mob/user) ..(user) - user << "It has [spikes] [spikes == 1 ? "spike" : "spikes"] remaining." + to_chat(user, "It has [spikes] [spikes == 1 ? "spike" : "spikes"] remaining.") + /obj/item/weapon/gun/launcher/spikethrower/update_icon() icon_state = "spikethrower[spikes]" @@ -45,7 +46,8 @@ if(istype(user,/mob/living/carbon/human)) var/mob/living/carbon/human/H = user if(H.species && H.species.name != "Vox" && H.species.name != "Vox Armalis") - user << "\red \The [src] does not respond to you!" + to_chat(user, "\red \The [src] does not respond to you!") + return 0 return 1 @@ -89,7 +91,8 @@ if(H.species.name == "Vox Armalis") ..() return - user << "\red \The [src] is far too large for you to pick up." + to_chat(user, "\red \The [src] is far too large for you to pick up.") + return /obj/item/weapon/gun/energy/noisecannon/process_chambered() //Does not have ammo. diff --git a/code/modules/projectiles/guns/energy/advtaser.dm b/code/modules/projectiles/guns/energy/advtaser.dm index f617db1122b..fdeba3bd119 100644 --- a/code/modules/projectiles/guns/energy/advtaser.dm +++ b/code/modules/projectiles/guns/energy/advtaser.dm @@ -21,7 +21,8 @@ mode = 1 charge_cost = 500 fire_sound = 'sound/weapons/taser2.ogg' - user << "\red [src.name] is now set to Disable." + to_chat(user, "\red [src.name] is now set to Disable.") + projectile_type = "/obj/item/projectile/beam/disabler" modifystate = "advtaserdisable" fire_delay = 0 @@ -29,7 +30,8 @@ mode = 0 charge_cost = 2000 fire_sound = 'sound/weapons/Taser.ogg' - user << "\red [src.name] is now set to stun." + to_chat(user, "\red [src.name] is now set to stun.") + projectile_type = "/obj/item/projectile/energy/electrode" modifystate = "advtaserstun" fire_delay = 15 diff --git a/code/modules/projectiles/guns/energy/blueshield.dm b/code/modules/projectiles/guns/energy/blueshield.dm index 1ba9e26eba1..d136a75e834 100644 --- a/code/modules/projectiles/guns/energy/blueshield.dm +++ b/code/modules/projectiles/guns/energy/blueshield.dm @@ -21,7 +21,8 @@ projectile_type = "/obj/item/projectile/beam" modifystate = "bsgun_kill" - user << "You adjust [src.name] to the kill setting." + to_chat(user, "You adjust [src.name] to the kill setting.") + else fire_mode = 0 @@ -32,6 +33,7 @@ fire_sound = 'sound/weapons/gunshot.ogg' modifystate = "bsgun_stun" - user << "You adjust [src.name] to the stun setting." + to_chat(user, "You adjust [src.name] to the stun setting.") + update_icon() \ No newline at end of file diff --git a/code/modules/projectiles/guns/energy/hos.dm b/code/modules/projectiles/guns/energy/hos.dm index c48a7ee3398..14f9c82e4f8 100644 --- a/code/modules/projectiles/guns/energy/hos.dm +++ b/code/modules/projectiles/guns/energy/hos.dm @@ -18,7 +18,8 @@ mode = 0 charge_cost = 1000 fire_sound = 'sound/weapons/Laser.ogg' - user << "\red [src.name] is now set to kill." + to_chat(user, "\red [src.name] is now set to kill.") + projectile_type = "/obj/item/projectile/beam" modifystate = "hoslaserkill" fire_delay = 0 @@ -26,7 +27,8 @@ mode = 1 charge_cost = 500 fire_sound = 'sound/weapons/taser2.ogg' - user << "\red [src.name] is now set to disable." + to_chat(user, "\red [src.name] is now set to disable.") + projectile_type = "/obj/item/projectile/beam/disabler" modifystate = "hoslaserdisable" fire_delay = 0 @@ -34,7 +36,8 @@ mode = 2 charge_cost = 2000 fire_sound = 'sound/weapons/taser.ogg' - user << "\red [src.name] is now set to stun." + to_chat(user, "\red [src.name] is now set to stun.") + projectile_type = "/obj/item/projectile/energy/electrode" modifystate = "hoslaserstun" fire_delay = 15 diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 2c0eb581bde..c1243cf0911 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -125,7 +125,8 @@ obj/item/weapon/gun/energy/laser/retro if(ishuman(M)) if(istype(M.wear_suit, /obj/item/clothing/suit/bluetag)) return 1 - M << "\red You need to be wearing your laser tag vest!" + to_chat(M, "\red You need to be wearing your laser tag vest!") + return 0 /obj/item/weapon/gun/energy/laser/redtag @@ -143,5 +144,6 @@ obj/item/weapon/gun/energy/laser/retro if(ishuman(M)) if(istype(M.wear_suit, /obj/item/clothing/suit/redtag)) return 1 - M << "\red You need to be wearing your laser tag vest!" + to_chat(M, "\red You need to be wearing your laser tag vest!") + return 0 \ No newline at end of file diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm index edfcd01d211..1b9b955721d 100644 --- a/code/modules/projectiles/guns/energy/nuclear.dm +++ b/code/modules/projectiles/guns/energy/nuclear.dm @@ -19,14 +19,16 @@ mode = 1 charge_cost = 1000 fire_sound = 'sound/weapons/Laser.ogg' - user << "\red [src.name] is now set to kill." + to_chat(user, "\red [src.name] is now set to kill.") + projectile_type = "/obj/item/projectile/beam" modifystate = "energykill" if(1) mode = 0 charge_cost = 500 fire_sound = 'sound/weapons/Taser2.ogg' - user << "\red [src.name] is now set to disable." + to_chat(user, "\red [src.name] is now set to disable.") + projectile_type = "/obj/item/projectile/beam/disabler" modifystate = "energystun" update_icon() @@ -96,16 +98,20 @@ if (prob(src.reliability)) for (var/mob/living/M in range(0,src)) //Only a minor failure, enjoy your radiation if you're in the same tile or carrying it if (src in M.contents) - M << "\red Your gun feels pleasantly warm for a moment." + to_chat(M, "\red Your gun feels pleasantly warm for a moment.") + else - M << "\red You feel a warm sensation." + to_chat(M, "\red You feel a warm sensation.") + M.apply_effect(rand(3,120), IRRADIATE) lightfail = 1 else for (var/mob/living/M in range(rand(1,4),src)) //Big failure, TIME FOR RADIATION BITCHES if (src in M.contents) - M << "\red Your gun's reactor overloads!" - M << "\red You feel a wave of heat wash over you." + to_chat(M, "\red Your gun's reactor overloads!") + + to_chat(M, "\red You feel a wave of heat wash over you.") + M.apply_effect(300, IRRADIATE) crit_fail = 1 //break the gun so it stops recharging processing_objects.Remove(src) @@ -173,7 +179,8 @@ mode = 1 charge_cost = 500 fire_sound = 'sound/weapons/Laser.ogg' - user << "\red [src.name] is now set to kill." + to_chat(user, "\red [src.name] is now set to kill.") + projectile_type = /obj/item/projectile/beam modifystate = "energykill" fire_delay = 0 @@ -181,7 +188,8 @@ mode = 0 charge_cost = 1000 fire_sound = 'sound/weapons/Taser.ogg' - user << "\red [src.name] is now set to stun." + to_chat(user, "\red [src.name] is now set to stun.") + projectile_type = /obj/item/projectile/energy/electrode modifystate = "energystun" fire_delay = 15 diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm index ffb075c8c34..88d14a67e36 100644 --- a/code/modules/projectiles/guns/energy/pulse.dm +++ b/code/modules/projectiles/guns/energy/pulse.dm @@ -21,19 +21,22 @@ mode = 0 charge_cost = 50 fire_sound = 'sound/weapons/Taser.ogg' - user << "\red [src.name] is now set to stun." + to_chat(user, "\red [src.name] is now set to stun.") + projectile_type = "/obj/item/projectile/energy/electrode" if(0) mode = 1 charge_cost = 100 fire_sound = 'sound/weapons/Laser.ogg' - user << "\red [src.name] is now set to kill." + to_chat(user, "\red [src.name] is now set to kill.") + projectile_type = "/obj/item/projectile/beam" if(1) mode = 2 charge_cost = 200 fire_sound = 'sound/weapons/pulse.ogg' - user << "\red [src.name] is now set to DESTROY." + to_chat(user, "\red [src.name] is now set to DESTROY.") + projectile_type = "/obj/item/projectile/beam/pulse" return @@ -58,7 +61,8 @@ cell_type = "/obj/item/weapon/stock_parts/cell/infinite" attack_self(mob/living/user as mob) - user << "\red [src.name] has three settings, and they are all DESTROY." + to_chat(user, "\red [src.name] has three settings, and they are all DESTROY.") + /obj/item/weapon/gun/energy/pulse_rifle/carbine name = "pulse carbine" diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index c5002a03acf..2a157bf667c 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -50,13 +50,15 @@ if(0) mode = 1 charge_cost = 1000 - user << "\red The [src.name] is now set to increase yield." + to_chat(user, "\red The [src.name] is now set to increase yield.") + projectile_type = "/obj/item/projectile/energy/florayield" modifystate = "florayield" if(1) mode = 0 charge_cost = 1000 - user << "\red The [src.name] is now set to induce mutations." + to_chat(user, "\red The [src.name] is now set to induce mutations.") + projectile_type = "/obj/item/projectile/energy/floramut" modifystate = "floramut" update_icon() @@ -117,11 +119,13 @@ obj/item/weapon/gun/energy/staff/focus attack_self(mob/living/user as mob) if(projectile_type == "/obj/item/projectile/forcebolt") charge_cost = 200 - user << "\red The [src.name] will now strike a small area." + to_chat(user, "\red The [src.name] will now strike a small area.") + projectile_type = "/obj/item/projectile/forcebolt/strong" else charge_cost = 100 - user << "\red The [src.name] will now strike only a single person." + to_chat(user, "\red The [src.name] will now strike only a single person.") + projectile_type = "/obj/item/projectile/forcebolt" */ @@ -174,10 +178,12 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. set name = "Use Sniper Scope" set popup_menu = 0 if(usr.stat || !(istype(usr,/mob/living/carbon/human))) - usr << "You are unable to focus down the scope of the rifle." + to_chat(usr, "You are unable to focus down the scope of the rifle.") + return if(!zoom && usr.get_active_hand() != src) - usr << "You are too distracted to look down the scope, perhaps if it was in your active hand this might work better" + to_chat(usr, "You are too distracted to look down the scope, perhaps if it was in your active hand this might work better") + return if(usr.client.view == world.view) @@ -191,7 +197,8 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. if(!usr.hud_used.hud_shown) usr.button_pressed_F12(1) zoom = 0 - usr << "Zoom mode [zoom?"en":"dis"]abled." + to_chat(usr, "Zoom mode [zoom?"en":"dis"]abled.") + /obj/item/weapon/gun/energy/kinetic_accelerator @@ -241,7 +248,8 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. if(!silenced) playsound(src.loc, 'sound/weapons/kenetic_reload.ogg', 60, 1) else if(user) - usr << "You silently charge [src]." + to_chat(usr, "You silently charge [src].") + recently_fired = 0 update_icon() @@ -292,18 +300,21 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. /obj/item/weapon/gun/energy/plasmacutter/examine(mob/user) ..(user) if(power_supply) - user <<"[src] is [round(power_supply.percent())]% charged." + to_chat(user, "[src] is [round(power_supply.percent())]% charged.") + /obj/item/weapon/gun/energy/plasmacutter/attackby(var/obj/item/A, var/mob/user) if(istype(A, /obj/item/stack/sheet/mineral/plasma)) var/obj/item/stack/sheet/S = A S.use(1) power_supply.give(10000) - user << "You insert [A] in [src], recharging it." + to_chat(user, "You insert [A] in [src], recharging it.") + else if(istype(A, /obj/item/weapon/ore/plasma)) qdel(A) power_supply.give(5000) - user << "You insert [A] in [src], recharging it." + to_chat(user, "You insert [A] in [src], recharging it.") + else ..() @@ -376,12 +387,14 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. switch(mode) if(0) mode = 1 - user << "[name] is now set to orange." + to_chat(user, "[name] is now set to orange.") + projectile_type = "/obj/item/projectile/beam/wormhole/orange" modifystate = "wormhole_projector_orange" if(1) mode = 0 - user << "[name] is now set to blue." + to_chat(user, "[name] is now set to blue.") + projectile_type = "/obj/item/projectile/beam/wormhole" modifystate = "wormhole_projector" update_icon() diff --git a/code/modules/projectiles/guns/energy/temperature.dm b/code/modules/projectiles/guns/energy/temperature.dm index 8d33a9e2508..88f92bad688 100644 --- a/code/modules/projectiles/guns/energy/temperature.dm +++ b/code/modules/projectiles/guns/energy/temperature.dm @@ -42,7 +42,8 @@ /obj/item/weapon/gun/energy/temperature/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W, /obj/item/weapon/card/emag) && !emagged) emagged = 1 - user << "You double the gun's temperature cap! Targets hit by searing beams will burst into flames!" + to_chat(user, "You double the gun's temperature cap! Targets hit by searing beams will burst into flames!") + desc = "A gun that changes the body temperature of its targets. Its temperature cap has been hacked." /obj/item/weapon/gun/energy/temperature/Topic(href, href_list) diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm index 57c3ca2628c..c4e382ffbdc 100644 --- a/code/modules/projectiles/guns/magic.dm +++ b/code/modules/projectiles/guns/magic.dm @@ -33,7 +33,8 @@ if(no_den_usage) var/area/A = get_area(user) if(istype(A, /area/wizard_station)) - user << "You know better than to violate the security of The Den, best wait until you leave to use [src]." + to_chat(user, "You know better than to violate the security of The Den, best wait until you leave to use [src].") + return else no_den_usage = 0 @@ -62,5 +63,6 @@ return /obj/item/weapon/gun/magic/shoot_with_empty_chamber(mob/living/user as mob|obj) - user << "The [name] whizzles quietly." + to_chat(user, "The [name] whizzles quietly.") + return \ No newline at end of file diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm index eb4bf5c37d1..bd922c6a9cf 100644 --- a/code/modules/projectiles/guns/magic/wand.dm +++ b/code/modules/projectiles/guns/magic/wand.dm @@ -27,13 +27,15 @@ /obj/item/weapon/gun/magic/wand/examine(mob/user) ..(user) - user << "Has [charges] charge\s remaining." + to_chat(user, "Has [charges] charge\s remaining.") + /obj/item/weapon/gun/magic/wand/attack_self(mob/living/user as mob) if(charges) zap_self(user) else - user << "The [name] whizzles quietly." + to_chat(user, "The [name] whizzles quietly.") + ..() /obj/item/weapon/gun/magic/wand/attack(atom/target as mob, mob/living/user as mob) @@ -43,7 +45,8 @@ /obj/item/weapon/gun/magic/wand/afterattack(atom/target as mob, mob/living/user as mob) if(!charges && !drained) - user << "The [name] whizzles quietly." + to_chat(user, "The [name] whizzles quietly.") + icon_state = "[icon_state]-drained" drained = 1 return @@ -51,7 +54,8 @@ if(no_den_usage) var/area/A = get_area(user) if(istype(A, /area/wizard_station)) - user << "You know better than to violate the security of The Den, best wait until you leave to use [src]." + to_chat(user, "You know better than to violate the security of The Den, best wait until you leave to use [src].") + return else no_den_usage = 0 @@ -73,7 +77,8 @@ if(alert(user, "You really want to zap yourself with the wand of death?",, "Yes", "No") == "Yes" && charges && user.get_active_hand() == src && isliving(user)) var/message ="You irradiate yourself with pure energy! " message += pick("Do not pass go. Do not collect 200 zorkmids.","You feel more confident in your spell casting skills.","You Die...","Do you want your possessions identified?") - user << message + to_chat(user, message) + user.adjustOxyLoss(500) charges-- ..() @@ -95,7 +100,8 @@ user.radiation = 0 user.heal_overall_damage(user.getBruteLoss(), user.getFireLoss()) user.reagents.clear_reagents() - user << "You feel great!" + to_chat(user, "You feel great!") + charges-- ..() diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm index f7b61436dfe..a01cf749057 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -66,22 +66,26 @@ user.remove_from_mob(AM) magazine = AM magazine.loc = src - user << "You load a new magazine into \the [src]." + to_chat(user, "You load a new magazine into \the [src].") + chamber_round() A.update_icon() update_icon() return 1 else if (magazine) - user << "There's already a magazine in \the [src]." + to_chat(user, "There's already a magazine in \the [src].") + if(istype(A, /obj/item/weapon/suppressor)) var/obj/item/weapon/suppressor/S = A if(can_suppress) if(!silenced) if(user.l_hand != src && user.r_hand != src) - user << "You'll need [src] in your hands to do that." + to_chat(user, "You'll need [src] in your hands to do that.") + return user.drop_item() - user << "You screw [S] onto [src]." + to_chat(user, "You screw [S] onto [src].") + silenced = A S.oldsound = fire_sound S.initial_w_class = w_class @@ -91,10 +95,12 @@ update_icon() return else - user << "[src] already has a suppressor." + to_chat(user, "[src] already has a suppressor.") + return else - user << "You can't seem to figure out how to fit [S] on [src]." + to_chat(user, "You can't seem to figure out how to fit [S] on [src].") + return return 0 @@ -105,7 +111,8 @@ if(user.l_hand != src && user.r_hand != src) ..() return - user << "You unscrew [silenced] from [src]." + to_chat(user, "You unscrew [silenced] from [src].") + user.put_in_hands(silenced) fire_sound = S.oldsound w_class = S.initial_w_class @@ -120,15 +127,18 @@ user.put_in_hands(magazine) magazine.update_icon() magazine = null - user << "You pull the magazine out of \the [src]!" + to_chat(user, "You pull the magazine out of \the [src]!") + else - user << "There's no magazine in \the [src]." + to_chat(user, "There's no magazine in \the [src].") + update_icon() return /obj/item/weapon/gun/projectile/examine(mob/user) ..(user) - user << "Has [get_ammo()] round\s remaining." + to_chat(user, "Has [get_ammo()] round\s remaining.") + /obj/item/weapon/gun/projectile/proc/get_ammo(var/countchambered = 1) var/boolets = 0 //mature var names for mature people diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index ee8d7be812f..148cac3cd6d 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -36,12 +36,14 @@ var/obj/item/ammo_box/magazine/AM = A if(istype(AM, text2path(mag_type))) if(magazine) - user << "You perform a tactical reload on \the [src], replacing the magazine." + to_chat(user, "You perform a tactical reload on \the [src], replacing the magazine.") + magazine.forceMove(get_turf(src.loc)) magazine.update_icon() magazine = null else - user << "You insert the magazine into \the [src]." + to_chat(user, "You insert the magazine into \the [src].") + user.remove_from_mob(AM) magazine = AM magazine.forceMove(src) @@ -59,11 +61,13 @@ if(!select) burst_size = 1 fire_delay = 0 - user << "You switch to semi-automatic." + to_chat(user, "You switch to semi-automatic.") + else burst_size = initial(burst_size) fire_delay = initial(fire_delay) - user << "You switch to [burst_size] round burst." + to_chat(user, "You switch to [burst_size] round burst.") + playsound(user, 'sound/weapons/empty.ogg', 100, 1) update_icon() @@ -144,7 +148,8 @@ /obj/item/weapon/gun/projectile/automatic/l6_saw/attack_self(mob/user as mob) cover_open = !cover_open - user << "You [cover_open ? "open" : "close"] [src]'s cover." + to_chat(user, "You [cover_open ? "open" : "close"] [src]'s cover.") + update_icon() /obj/item/weapon/gun/projectile/automatic/l6_saw/update_icon() @@ -154,7 +159,8 @@ /obj/item/weapon/gun/projectile/automatic/l6_saw/afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, flag, params) //what I tried to do here is just add a check to see if the cover is open or not and add an icon_state change because I can't figure out how c-20rs do it with overlays if(cover_open) - user << "[src]'s cover is open! Close it before firing!" + to_chat(user, "[src]'s cover is open! Close it before firing!") + else ..() update_icon() @@ -172,12 +178,14 @@ user.put_in_hands(magazine) magazine = null update_icon() - user << "You remove the magazine from [src]." + to_chat(user, "You remove the magazine from [src].") + /obj/item/weapon/gun/projectile/automatic/l6_saw/attackby(var/obj/item/A as obj, mob/user as mob, params) if(!cover_open && istype(A, mag_type)) - user << "[src]'s cover is closed! You can't insert a new mag!" + to_chat(user, "[src]'s cover is closed! You can't insert a new mag!") + return ..() @@ -246,15 +254,18 @@ select = 1 burst_size = initial(burst_size) fire_delay = initial(fire_delay) - user << "You switch to [burst_size] round burst." + to_chat(user, "You switch to [burst_size] round burst.") + if(1) select = 2 - user << "You switch to grenades." + to_chat(user, "You switch to grenades.") + if(2) select = 0 burst_size = 1 fire_delay = 0 - user << "You switch to semi-auto." + to_chat(user, "You switch to semi-auto.") + playsound(user, 'sound/weapons/empty.ogg', 100, 1) update_icon() return diff --git a/code/modules/projectiles/guns/projectile/crossbow.dm b/code/modules/projectiles/guns/projectile/crossbow.dm index bc87fcb999a..f4c5ec993f7 100644 --- a/code/modules/projectiles/guns/projectile/crossbow.dm +++ b/code/modules/projectiles/guns/projectile/crossbow.dm @@ -42,7 +42,8 @@ /obj/item/weapon/arrow/rod/removed(mob/user) if(throwforce == 15) // The rod has been superheated - we don't want it to be useable when removed from the bow. - user << "[src] shatters into a scattering of overstressed metal shards as it leaves the crossbow." + to_chat(user, "[src] shatters into a scattering of overstressed metal shards as it leaves the crossbow.") + var/obj/item/weapon/shard/shrapnel/S = new() S.loc = get_turf(src) qdel(src) @@ -80,7 +81,8 @@ /obj/item/weapon/gun/launcher/crossbow/special_check(user) if(tension <= 0) - user << "\red \The [src] is not drawn back!" + to_chat(user, "\red \The [src] is not drawn back!") + return 0 return 1 @@ -111,7 +113,8 @@ /obj/item/weapon/gun/launcher/crossbow/proc/draw(var/mob/user as mob) if(!in_chamber) - user << "You don't have anything nocked to [src]." + to_chat(user, "You don't have anything nocked to [src].") + return if(user.restrained()) @@ -132,7 +135,8 @@ if(tension>=max_tension) tension = max_tension - usr << "[src] clunks as you draw the string to its maximum tension!" + to_chat(usr, "[src] clunks as you draw the string to its maximum tension!") + else user.visible_message("[usr] draws back the string of [src]!","You continue drawing back the string of [src]!") spawn(25) increase_tension(user) @@ -162,19 +166,23 @@ user.drop_item() W.loc = src cell = W - user << "You jam [cell] into [src] and wire it to the firing coil." + to_chat(user, "You jam [cell] into [src] and wire it to the firing coil.") + superheat_rod(user) else - user << "[src] already has a cell installed." + to_chat(user, "[src] already has a cell installed.") + else if(istype(W, /obj/item/weapon/screwdriver)) if(cell) var/obj/item/C = cell C.loc = get_turf(user) - user << "You jimmy [cell] out of [src] with [W]." + to_chat(user, "You jimmy [cell] out of [src] with [W].") + cell = null else - user << "[src] doesn't have a cell installed." + to_chat(user, "[src] doesn't have a cell installed.") + else ..() @@ -186,7 +194,8 @@ if(in_chamber.throwforce >= 15) return if(!istype(in_chamber,/obj/item/weapon/arrow/rod)) return - user << "[in_chamber] plinks and crackles as it begins to glow red-hot." + to_chat(user, "[in_chamber] plinks and crackles as it begins to glow red-hot.") + in_chamber.throwforce = 15 in_chamber.icon_state = "metal-rod-superheated" cell.use(500) @@ -229,7 +238,8 @@ if(tension>=max_tension) tension = max_tension - usr << "[src] clunks as you draw the string to its maximum tension!" + to_chat(usr, "[src] clunks as you draw the string to its maximum tension!") + else user.visible_message("[usr] draws back the string of [src]!","You continue drawing back the string of [src]!") spawn(25) increase_tension(user) @@ -249,11 +259,21 @@ /obj/item/weapon/crossbowframe/examine(mob/user) ..(user) switch(buildstate) - if(1) user << "It has a loose rod frame in place." - if(2) user << "It has a steel backbone welded in place." - if(3) user << "It has a steel backbone and a cell mount installed." - if(4) user << "It has a steel backbone, plastic lath and a cell mount installed." - if(5) user << "It has a steel cable loosely strung across the lath." + if(1) + to_chat(user, "It has a loose rod frame in place.") + + if(2) + to_chat(user, "It has a steel backbone welded in place.") + + if(3) + to_chat(user, "It has a steel backbone and a cell mount installed.") + + if(4) + to_chat(user, "It has a steel backbone, plastic lath and a cell mount installed.") + + if(5) + to_chat(user, "It has a steel cable loosely strung across the lath.") + /obj/item/weapon/crossbowframe/attackby(obj/item/W as obj, mob/user as mob, params) if(istype(W,/obj/item/stack/rods)) @@ -261,11 +281,13 @@ var/obj/item/stack/rods/R = W if(R.amount >= 3) R.use(3) - user << "\blue You assemble a backbone of rods around the wooden stock." + to_chat(user, "\blue You assemble a backbone of rods around the wooden stock.") + buildstate++ update_icon() else - user << "\blue You need at least three rods to complete this task." + to_chat(user, "\blue You need at least three rods to complete this task.") + return else if(istype(W,/obj/item/weapon/weldingtool)) if(buildstate == 1) @@ -273,7 +295,8 @@ if(T.remove_fuel(0,user)) if(!src || !T.isOn()) return playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1) - user << "\blue You weld the rods into place." + to_chat(user, "\blue You weld the rods into place.") + buildstate++ update_icon() return @@ -282,35 +305,42 @@ if(buildstate == 2) if(C.amount >= 5) C.use(5) - user << "\blue You wire a crude cell mount into the top of the crossbow." + to_chat(user, "\blue You wire a crude cell mount into the top of the crossbow.") + buildstate++ update_icon() else - user << "\blue You need at least five segments of cable coil to complete this task." + to_chat(user, "\blue You need at least five segments of cable coil to complete this task.") + return else if(buildstate == 4) if(C.amount >= 5) C.use(5) - user << "\blue You string a steel cable across the crossbow's lath." + to_chat(user, "\blue You string a steel cable across the crossbow's lath.") + buildstate++ update_icon() else - user << "\blue You need at least five segments of cable coil to complete this task." + to_chat(user, "\blue You need at least five segments of cable coil to complete this task.") + return else if(istype(W,/obj/item/stack/sheet/mineral/plastic)) if(buildstate == 3) var/obj/item/stack/sheet/mineral/plastic/P = W if(P.amount >= 3) P.use(3) - user << "\blue You assemble and install a heavy plastic lath onto the crossbow." + to_chat(user, "\blue You assemble and install a heavy plastic lath onto the crossbow.") + buildstate++ update_icon() else - user << "\blue You need at least three plastic sheets to complete this task." + to_chat(user, "\blue You need at least three plastic sheets to complete this task.") + return else if(istype(W,/obj/item/weapon/screwdriver)) if(buildstate == 5) - user << "\blue You secure the crossbow's various parts." + to_chat(user, "\blue You secure the crossbow's various parts.") + new /obj/item/weapon/gun/launcher/crossbow(get_turf(src)) qdel(src) return diff --git a/code/modules/projectiles/guns/projectile/grenade launcher.dm b/code/modules/projectiles/guns/projectile/grenade launcher.dm index d4b2c6fc167..f8d4f5161a3 100644 --- a/code/modules/projectiles/guns/projectile/grenade launcher.dm +++ b/code/modules/projectiles/guns/projectile/grenade launcher.dm @@ -29,7 +29,8 @@ //Override this to avoid a runtime with suicide handling. /obj/item/weapon/gun/launcher/attack(mob/living/M as mob, mob/living/user as mob, def_zone) if (M == user && user.zone_sel.selecting == "mouth") - user << "\red Shooting yourself with \a [src] is pretty tricky. You can't seem to manage it." + to_chat(user, "\red Shooting yourself with \a [src] is pretty tricky. You can't seem to manage it.") + return ..() @@ -39,7 +40,8 @@ /obj/item/weapon/gun/launcher/Fire(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, params, reflex = 0) if (!user.IsAdvancedToolUser()) - user << "\red You don't have the dexterity to do this!" + to_chat(user, "\red You don't have the dexterity to do this!") + return 0 add_fingerprint(user) @@ -55,7 +57,8 @@ if (!ready_to_fire()) if (world.time % 3) //to prevent spam - user << "[src] is not ready to fire again!" + to_chat(user, "[src] is not ready to fire again!") + return 0 if(!chamber_round()) //CHECK diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index 5803a4fa2be..8b3d522592c 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -32,7 +32,8 @@ AC.loc = src num_loaded++ if(num_loaded) - user << "You load [num_loaded] shell\s into \the [src]!" + to_chat(user, "You load [num_loaded] shell\s into \the [src]!") + A.update_icon() update_icon() chamber_round() @@ -48,9 +49,11 @@ CB.update_icon() num_unloaded++ if (num_unloaded) - user << "You unload [num_unloaded] shell\s from [src]!" + to_chat(user, "You unload [num_unloaded] shell\s from [src]!") + else - user << "[src] is empty." + to_chat(user, "[src] is empty.") + /obj/item/weapon/gun/projectile/revolver/get_ammo(var/countchambered = 0, var/countempties = 1) var/boolets = 0 //mature var names for mature people @@ -62,7 +65,8 @@ /obj/item/weapon/gun/projectile/revolver/examine(mob/user) ..(user) - user << "[get_ammo(0,0)] of those are live rounds." + to_chat(user, "[get_ammo(0,0)] of those are live rounds.") + /obj/item/weapon/gun/projectile/revolver/verb/spin_revolver() set name = "Spin cylinder" @@ -98,7 +102,8 @@ if(!ghettomodded) return 1 if(prob(70 - (magazine.ammo_count() * 10))) //minimum probability of 10, maximum of 60 - M << "[src] blows up in your face!" + to_chat(M, "[src] blows up in your face!") + M.take_organ_damage(0,20) M.drop_item() qdel(src) @@ -115,7 +120,8 @@ if(src && input && !M.stat && in_range(M,src)) name = input - M << "You name the gun [input]. Say hello to your new friend." + to_chat(M, "You name the gun [input]. Say hello to your new friend.") + return 1 /obj/item/weapon/gun/projectile/revolver/detective/verb/reskin_gun() @@ -134,21 +140,24 @@ if(src && choice && !M.stat && in_range(M,src)) icon_state = options[choice] - M << "Your gun is now skinned as [choice]. Say hello to your new friend." + to_chat(M, "Your gun is now skinned as [choice]. Say hello to your new friend.") + return 1 /obj/item/weapon/gun/projectile/revolver/detective/attackby(var/obj/item/A as obj, mob/user as mob, params) ..() if(istype(A, /obj/item/weapon/screwdriver) || istype(A, /obj/item/weapon/conversion_kit)) if(magazine.caliber == "38") - user << "You begin to reinforce the barrel of [src]." + to_chat(user, "You begin to reinforce the barrel of [src].") + if(magazine.ammo_count()) afterattack(user, user) //you know the drill user.visible_message("[src] goes off!", "[src] goes off in your face!") return if(do_after(user, 30, target = src)) if(magazine.ammo_count()) - user << "You can't modify it!" + to_chat(user, "You can't modify it!") + return if (istype(A, /obj/item/weapon/conversion_kit)) ghettomodded = 0 @@ -156,21 +165,25 @@ ghettomodded = 1 magazine.caliber = "357" desc = "[initial(desc)] The barrel and chamber assembly seems to have been modified." - user << "You reinforce the barrel of [src]! Now it will fire .357 rounds." + to_chat(user, "You reinforce the barrel of [src]! Now it will fire .357 rounds.") + else - user << "You begin to revert the modifications to [src]." + to_chat(user, "You begin to revert the modifications to [src].") + if(magazine.ammo_count()) afterattack(user, user) //and again user.visible_message("[src] goes off!", "[src] goes off in your face!") return if(do_after(user, 30, target = src)) if(magazine.ammo_count()) - user << "You can't modify it!" + to_chat(user, "You can't modify it!") + return ghettomodded = 0 magazine.caliber = "38" desc = initial(desc) - user << "You remove the modifications on [src]! Now it will fire .38 rounds." + to_chat(user, "You remove the modifications on [src]! Now it will fire .38 rounds.") + diff --git a/code/modules/projectiles/guns/projectile/rocket.dm b/code/modules/projectiles/guns/projectile/rocket.dm index ecb1c5a03cd..f791a1da1c7 100644 --- a/code/modules/projectiles/guns/projectile/rocket.dm +++ b/code/modules/projectiles/guns/projectile/rocket.dm @@ -18,7 +18,8 @@ /obj/item/weapon/gun/rocketlauncher/examine(mob/user) if(..(user, 2)) - user << "\blue [rockets.len] / [max_rockets] rockets." + to_chat(user, "\blue [rockets.len] / [max_rockets] rockets.") + /obj/item/weapon/gun/rocketlauncher/attackby(obj/item/I as obj, mob/user as mob, params) if(istype(I, /obj/item/ammo_casing/rocket)) @@ -26,10 +27,13 @@ user.drop_item() I.loc = src rockets += I - user << "\blue You put the rocket in [src]." - user << "\blue [rockets.len] / [max_rockets] rockets." + to_chat(user, "\blue You put the rocket in [src].") + + to_chat(user, "\blue [rockets.len] / [max_rockets] rockets.") + else - usr << "\red [src] cannot hold more rockets." + to_chat(usr, "\red [src] cannot hold more rockets.") + /obj/item/weapon/gun/rocketlauncher/can_fire() return rockets.len @@ -47,4 +51,5 @@ qdel(I) return else - usr << "\red [src] is empty." \ No newline at end of file + to_chat(usr, "\red [src] is empty.") + diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index 8e057695b3a..c300748a98d 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -29,7 +29,8 @@ AC.loc = src num_loaded++ if(num_loaded) - user << "You load [num_loaded] shell\s into \the [src]!" + to_chat(user, "You load [num_loaded] shell\s into \the [src]!") + A.update_icon() update_icon() @@ -72,7 +73,8 @@ /obj/item/weapon/gun/projectile/shotgun/examine(mob/user) ..(user) if (chambered) - user << "A [chambered.BB ? "live" : "spent"] one is in the chamber." + to_chat(user, "A [chambered.BB ? "live" : "spent"] one is in the chamber.") + /obj/item/weapon/gun/projectile/shotgun/isHandgun() //You cannot, in fact, holster a shotgun. return 0 @@ -117,13 +119,15 @@ /obj/item/weapon/gun/projectile/shotgun/boltaction/attackby(var/obj/item/A as obj, mob/user as mob) if(!bolt_open) - user << "The bolt is closed!" + to_chat(user, "The bolt is closed!") + return . = ..() /obj/item/weapon/gun/projectile/shotgun/boltaction/examine(mob/user) ..(user) - user << "The bolt is [bolt_open ? "open" : "closed"]." + to_chat(user, "The bolt is [bolt_open ? "open" : "closed"].") + /obj/item/weapon/gun/projectile/shotgun/boltaction/enchanted name = "enchanted bolt action rifle" @@ -191,9 +195,11 @@ CB.update_icon() num_unloaded++ if (num_unloaded) - user << "You break open \the [src] and unload [num_unloaded] shell\s." + to_chat(user, "You break open \the [src] and unload [num_unloaded] shell\s.") + else - user << "[src] is empty." + to_chat(user, "[src] is empty.") + /obj/item/weapon/gun/projectile/revolver/doublebarrel/isHandgun() //contrary to popular opinion, double barrels are not, shockingly, handguns return 0 @@ -219,10 +225,12 @@ if(C.use(10)) slot_flags = SLOT_BACK icon_state = "ishotgunsling" - user << "You tie the lengths of cable to the shotgun, making a sling." + to_chat(user, "You tie the lengths of cable to the shotgun, making a sling.") + update_icon() else - user << "You need at least ten lengths of cable if you want to make a sling." + to_chat(user, "You need at least ten lengths of cable if you want to make a sling.") + return // Sawing guns related procs // @@ -236,7 +244,8 @@ /obj/item/weapon/gun/projectile/proc/sawoff(mob/user as mob) if(sawn_state == SAWN_OFF) - user << "\The [src] is already shortened." + to_chat(user, "\The [src] is already shortened.") + return if(sawn_state == SAWN_SAWING) diff --git a/code/modules/projectiles/guns/syringe_gun.dm b/code/modules/projectiles/guns/syringe_gun.dm index 672f683e3b2..01b41bb0c13 100644 --- a/code/modules/projectiles/guns/syringe_gun.dm +++ b/code/modules/projectiles/guns/syringe_gun.dm @@ -30,11 +30,13 @@ /obj/item/weapon/gun/syringe/examine(mob/user) ..(user) - user << "Can hold [max_syringes] syringe\s. Has [syringes.len] syringe\s remaining." + to_chat(user, "Can hold [max_syringes] syringe\s. Has [syringes.len] syringe\s remaining.") + /obj/item/weapon/gun/syringe/attack_self(mob/living/user as mob) if(!syringes.len) - user << "[src] is empty." + to_chat(user, "[src] is empty.") + return 0 var/obj/item/weapon/reagent_containers/syringe/S = syringes[syringes.len] @@ -43,7 +45,8 @@ S.forceMove(user.loc) syringes.Remove(S) - user << "You unload [S] from \the [src]!" + to_chat(user, "You unload [S] from \the [src]!") + return 1 @@ -51,12 +54,14 @@ if(istype(A, /obj/item/weapon/reagent_containers/syringe)) if(syringes.len < max_syringes) user.drop_item() - user << "You load [A] into \the [src]!" + to_chat(user, "You load [A] into \the [src]!") + syringes.Add(A) A.forceMove(src) return 1 else - usr << "[src] cannot hold more syringes." + to_chat(usr, "[src] cannot hold more syringes.") + return 0 /obj/item/weapon/gun/syringe/rapidsyringe diff --git a/code/modules/projectiles/medbeam.dm b/code/modules/projectiles/medbeam.dm index ba93e9703ba..ca210f345b0 100644 --- a/code/modules/projectiles/medbeam.dm +++ b/code/modules/projectiles/medbeam.dm @@ -67,7 +67,8 @@ if(get_dist(H,current_target)>max_range || !los_check(H,current_target)) LoseTarget() - H << "You lose control of the beam!" + to_chat(H, "You lose control of the beam!") + return if(current_target) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 0ce3b3c63ba..d329a5f7a96 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -140,7 +140,8 @@ return if(silenced) playsound(loc, hitsound, 5, 1, -1) - M << "\red You've been shot in the [parse_zone(def_zone)] by the [src.name]!" + to_chat(M, "\red You've been shot in the [parse_zone(def_zone)] by the [src.name]!") + else playsound(loc, hitsound, 20, 1, -1) visible_message("\red [A.name] is hit by the [src.name] in the [parse_zone(def_zone)]!")//X has fired Y is now given by the guns so you cant tell who shot you if you could not see the shooter @@ -209,7 +210,8 @@ if(!Angle) Angle=round(Get_Angle(src,current)) - //world << "[Angle] angle" +// to_chat(world, "[Angle] angle") + //overlays.Cut() //var/icon/I=new(initial(icon),icon_state) //using initial(icon) makes sure that the angle for that is reset as well //I.Turn(Angle) @@ -229,23 +231,27 @@ var/new_y = y //Not sure if using whiles for this is good while(pixel_x_offset > 16) - //world << "Pre-adjust coords (x++): xy [pixel_x] xy offset [pixel_x_offset]" +// to_chat(world, "Pre-adjust coords (x++): xy [pixel_x] xy offset [pixel_x_offset]") + pixel_x_offset -= 32 pixel_x -= 32 new_x++// x++ while(pixel_x_offset < -16) - //world << "Pre-adjust coords (x--): xy [pixel_x] xy offset [pixel_x_offset]" +// to_chat(world, "Pre-adjust coords (x--): xy [pixel_x] xy offset [pixel_x_offset]") + pixel_x_offset += 32 pixel_x += 32 new_x-- while(pixel_y_offset > 16) - //world << "Pre-adjust coords (y++): py [pixel_y] py offset [pixel_y_offset]" +// to_chat(world, "Pre-adjust coords (y++): py [pixel_y] py offset [pixel_y_offset]") + pixel_y_offset -= 32 pixel_y -= 32 new_y++ while(pixel_y_offset < -16) - //world << "Pre-adjust coords (y--): py [pixel_y] py offset [pixel_y_offset]" +// to_chat(world, "Pre-adjust coords (y--): py [pixel_y] py offset [pixel_y_offset]") + pixel_y_offset += 32 pixel_y += 32 new_y-- diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 319633e6277..29b1295691f 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -239,16 +239,19 @@ f.break_tile() f.hotspot_expose(1000,CELL_VOLUME) if((x == 1 || x == world.maxx || y == 1 || y == world.maxy)) - //world << "deleting" +// to_chat(world, "deleting") + //qdel(src) //Delete if it passes the world edge broken = 1 return if(kill_count < 1) - //world << "deleting" +// to_chat(world, "deleting") + //qdel(src) broken = 1 kill_count-- - //world << "[x] [y]" +// to_chat(world, "[x] [y]") + if(!bumped && !isturf(original)) if(loc == get_turf(original)) if(!(original in permutated)) @@ -263,7 +266,8 @@ Bump(original) first = 0 if(broken) - //world << "breaking" +// to_chat(world, "breaking") + break else last = get_turf(src.loc) @@ -274,7 +278,8 @@ qdel(src) return /*cleanup(reference) //Waits .3 seconds then removes the overlay. - //world << "setting invisibility" +// to_chat(world, "setting invisibility") + sleep(50) src.invisibility = 101 return*/ diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 5b740a0699b..7a4c6f937f7 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -67,9 +67,11 @@ ghost.reenter_corpse() break if(old_stat != DEAD) - target << "You feel great!" + to_chat(target, "You feel great!") + else - target << "You rise with a start, you're alive!!!" + to_chat(target, "You rise with a start, you're alive!!!") + /obj/item/projectile/magic/teleport name = "bolt of teleportation" @@ -238,7 +240,8 @@ proc/wabbajack(mob/living/M) else new_mob.key = M.key - new_mob << "Your form morphs into that of a [randomize]." + to_chat(new_mob, "Your form morphs into that of a [randomize].") + qdel(M) return new_mob @@ -262,8 +265,10 @@ proc/wabbajack(mob/living/M) S.icon = change.icon if(H.mind) H.mind.transfer_to(S) - S << "You are an animated statue. You cannot move when monitored, but are nearly invincible and deadly when unobserved!" - S << "Do not harm [firer.name], your creator." + to_chat(S, "You are an animated statue. You cannot move when monitored, but are nearly invincible and deadly when unobserved!") + + to_chat(S, "Do not harm [firer.name], your creator.") + H = change H.loc = S qdel(src) diff --git a/code/modules/projectiles/targeting.dm b/code/modules/projectiles/targeting.dm index 3ef440f6f2e..be32a5a58af 100644 --- a/code/modules/projectiles/targeting.dm +++ b/code/modules/projectiles/targeting.dm @@ -3,9 +3,11 @@ set category = "Object" firerate = !firerate if (firerate == 0) - loc << "You will now continue firing when your target moves." + to_chat(loc, "You will now continue firing when your target moves.") + else - loc << "You will now only fire once, then lower your aim, when your target moves." + to_chat(loc, "You will now only fire once, then lower your aim, when your target moves.") + /obj/item/weapon/gun/verb/lower_aim() set name = "Lower Aim" @@ -84,7 +86,8 @@ if(firing_check == 1) Fire(T,usr, reflex = 1) else if(!told_cant_shoot) - M << "\red They can't be hit from here!" + to_chat(M, "\red They can't be hit from here!") + told_cant_shoot = 1 spawn(30) told_cant_shoot = 0 @@ -101,7 +104,8 @@ #define SIGN(X) ((X<0)?-1:1) proc/GunTrace(X1,Y1,X2,Y2,Z=1,exc_obj,PX1=16,PY1=16,PX2=16,PY2=16) - //bluh << "Tracin' [X1],[Y1] to [X2],[Y2] on floor [Z]." +// to_chat(bluh, "Tracin' [X1],[Y1] to [X2],[Y2] on floor [Z].") + var/turf/T var/mob/living/M if(X1==X2) @@ -152,20 +156,22 @@ mob/living/proc/Targeted(var/obj/item/weapon/gun/I) //Self explanitory. I.target += src else if(I.target.len >= 5) if(ismob(I.loc)) - I.loc << "You can only target 5 people at once!" + to_chat(I.loc, "You can only target 5 people at once!") + return else return for(var/mob/living/K in viewers(usr)) - K << 'sound/weapons/TargetOn.ogg' + to_chat(K, 'sound/weapons/TargetOn.ogg') + if(!targeted_by) targeted_by = list() targeted_by += I I.lock_time = world.time + 20 //Target has 2 second to realize they're targeted and stop (or target the opponent). - src << "((\red Your character is being targeted. They have 2 seconds to stop any click or move actions. \black While targeted, they may \ - drag and drop items in or into the map, speak, and click on interface buttons. Clicking on the map objects (floors and walls are fine), their items \ - (other than a weapon to de-target), or moving will result in being fired upon. \red The aggressor may also fire manually, \ - so try not to get on their bad side.\black ))" + to_chat(src, "((Your character is being targeted. They have 2 seconds to stop any click or move actions. \ + While targeted, they may drag and drop items in or into the map, speak, and click on interface buttons. \ + Clicking on the map objects (floors and walls are fine), their items (other than a weapon to de-target), or moving will result in being fired upon. \ + The aggressor may also fire manually, so try not to get on their bad side.))") if(targeted_by.len == 1) spawn(0) @@ -186,7 +192,9 @@ mob/living/proc/Targeted(var/obj/item/weapon/gun/I) //Self explanitory. I.lower_aim() return /*if(m_intent == "run" && T.client.target_can_move == 1 && T.client.target_can_run == 0 && (ishuman(T))) - src << "\red Your move intent is now set to walk, as your targeter permits it." //Self explanitory. + to_chat(src, "\red Your move intent is now set to walk, as your targeter permits it.")//Self explanitory. + + set_m_intent("walk")*/ //Processing the aiming. Should be probably in separate object with process() but lasy. @@ -214,7 +222,8 @@ mob/living/proc/Targeted(var/obj/item/weapon/gun/I) //Self explanitory. mob/living/proc/NotTargeted(var/obj/item/weapon/gun/I) if(!I.silenced) for(var/mob/living/M in viewers(src)) - M << 'sound/weapons/TargetOff.ogg' + to_chat(M, 'sound/weapons/TargetOff.ogg') + targeted_by -= I I.target.Remove(src) //De-target them if(!I.target.len) @@ -266,9 +275,11 @@ client/verb/ToggleGunMode() set hidden = 1 gun_mode = !gun_mode if(gun_mode) - usr << "You will now take people captive." + to_chat(usr, "You will now take people captive.") + else - usr << "You will now shoot where you target." + to_chat(usr, "You will now shoot where you target.") + for(var/obj/item/weapon/gun/G in usr) G.stop_aim() remove_gun_icons() @@ -282,11 +293,13 @@ client/verb/ToggleGunMode() //Changing client's permissions target_can_move = !target_can_move if(target_can_move) - usr << "Target may now walk." + to_chat(usr, "Target may now walk.") + //usr.gun_run_icon = new /obj/screen/gun/run(null) //adding icon for running permission screen += usr.gun_run_icon else - usr << "Target may no longer move." + to_chat(usr, "Target may no longer move.") + target_can_run = 0 qdel(usr.gun_run_icon) //no need for icon for running permission @@ -301,12 +314,15 @@ client/verb/ToggleGunMode() if(G.target) for(var/mob/living/M in G.target) if(target_can_move) - M << "Your character may now walk at the discretion of their targeter." + to_chat(M, "Your character may now walk at the discretion of their targeter.") + if(!target_can_run && (ishuman(M))) - M << "\red Your move intent is now set to walk, as your targeter permits it." + to_chat(M, "\red Your move intent is now set to walk, as your targeter permits it.") + M.set_m_intent("walk") else - M << "\red Your character will now be shot if they move." + to_chat(M, "\red Your character will now be shot if they move.") + mob/living/proc/set_m_intent(var/intent) if (intent != "walk" && intent != "run") @@ -322,9 +338,11 @@ client/verb/AllowTargetRun() //Changing client's permissions target_can_run = !target_can_run if(target_can_run) - usr << "Target may now run." + to_chat(usr, "Target may now run.") + else - usr << "Target may no longer run." + to_chat(usr, "Target may no longer run.") + //Updating running permission button if(usr.gun_run_icon) @@ -337,9 +355,11 @@ client/verb/AllowTargetRun() if(G.target) for(var/mob/living/M in G.target) if(target_can_run) - M << "Your character may now run at the discretion of their targeter." + to_chat(M, "Your character may now run at the discretion of their targeter.") + else - M << "\red Your character will now be shot if they run."*/ + to_chat(M, "\red Your character will now be shot if they run.")*/ + client/verb/AllowTargetClick() set hidden=1 @@ -347,9 +367,11 @@ client/verb/AllowTargetClick() //Changing client's permissions target_can_click = !target_can_click if(target_can_click) - usr << "Target may now use items." + to_chat(usr, "Target may now use items.") + else - usr << "Target may no longer use items." + to_chat(usr, "Target may no longer use items.") + if(usr.item_use_icon) usr.item_use_icon.icon_state = "no_item[target_can_click]" @@ -361,6 +383,8 @@ client/verb/AllowTargetClick() if(G.target) for(var/mob/living/M in G.target) if(target_can_click) - M << "Your character may now use items at the discretion of their targeter." + to_chat(M, "Your character may now use items at the discretion of their targeter.") + else - M << "\red Your character will now be shot if they use items." + to_chat(M, "\red Your character will now be shot if they use items.") + diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index b1fb226a209..809201da056 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -302,14 +302,16 @@ var/const/INGEST = 2 var/list/seen = viewers(4, get_turf(my_atom)) for(var/mob/M in seen) if(!C.no_message) - M << "\blue \icon[my_atom] [C.mix_message]" + to_chat(M, "\blue \icon[my_atom] [C.mix_message]") + if(istype(my_atom, /obj/item/slime_extract)) var/obj/item/slime_extract/ME2 = my_atom ME2.Uses-- if(ME2.Uses <= 0) // give the notification that the slime core is dead for(var/mob/M in seen) - M << "\blue \icon[my_atom] The [my_atom]'s power is consumed in the reaction." + to_chat(M, "\blue \icon[my_atom] The [my_atom]'s power is consumed in the reaction.") + ME2.name = "used slime extract" ME2.desc = "This extract has been used up." @@ -552,13 +554,15 @@ var/const/INGEST = 2 /datum/reagents/proc/get_data(var/reagent_id) for(var/datum/reagent/D in reagent_list) if(D.id == reagent_id) - //world << "proffering a data-carrying reagent ([reagent_id])" +// to_chat(world, "proffering a data-carrying reagent ([reagent_id])") + return D.data /datum/reagents/proc/set_data(var/reagent_id, var/new_data) for(var/datum/reagent/D in reagent_list) if(D.id == reagent_id) - //world << "reagent data set ([reagent_id])" +// to_chat(world, "reagent data set ([reagent_id])") + D.data = new_data /datum/reagents/proc/copy_data(var/datum/reagent/current_reagent) diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index 94491e74e64..d70399f8d86 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -110,7 +110,8 @@ /obj/machinery/chem_dispenser/ui_interact(mob/user, ui_key = "main",var/datum/nanoui/ui = null, var/force_open = 1) if(broken_requirements.len) - user << "[src] is broken. [broken_requirements[broken_requirements[1]]]" + to_chat(user, "[src] is broken. [broken_requirements[broken_requirements[1]]]") + return @@ -207,24 +208,29 @@ S.use(1) else if(!user.drop_item()) - user << "\The [B] is stuck to you!" + to_chat(user, "\The [B] is stuck to you!") + return qdel(B) broken_requirements -= broken_requirements[1] - user << "You fix [src]." + to_chat(user, "You fix [src].") + return if(src.beaker) - user << "Something is already loaded into the machine." + to_chat(user, "Something is already loaded into the machine.") + return if(istype(B, /obj/item/weapon/reagent_containers/glass) || istype(B, /obj/item/weapon/reagent_containers/food/drinks)) src.beaker = B if(!user.drop_item()) - user << "\The [B] is stuck to you!" + to_chat(user, "\The [B] is stuck to you!") + return B.forceMove(src) - user << "You set [B] on the machine." + to_chat(user, "You set [B] on the machine.") + nanomanager.update_uis(src) // update all UIs attached to src if(!icon_beaker) icon_beaker = image('icons/obj/chemical.dmi', src, "disp_beaker") //randomize beaker overlay position. @@ -236,13 +242,15 @@ ..() if(istype(B, /obj/item/device/multitool)) if(hackedcheck == 0) - user << hack_message + to_chat(user, hack_message) + dispensable_reagents += hacked_reagents hackedcheck = 1 return else - user << unhack_message + to_chat(user, unhack_message) + dispensable_reagents -= hacked_reagents hackedcheck = 0 return @@ -344,7 +352,8 @@ /obj/machinery/chem_dispenser/constructable/attackby(var/obj/item/I, var/mob/user, params) if(istype(I, /obj/item/weapon/reagent_containers/glass)) if(panel_open) - user << "Close the maintenance panel first." + to_chat(user, "Close the maintenance panel first.") + return ..() else @@ -360,10 +369,12 @@ playsound(src, 'sound/items/Ratchet.ogg', 50, 1) if(anchored) anchored = 0 - user << "\The [src] can now be moved." + to_chat(user, "\The [src] can now be moved.") + else if(!anchored) anchored = 1 - user << "\The [src] is now secured." + to_chat(user, "\The [src] is now secured.") + if(panel_open) if(istype(I, /obj/item/weapon/crowbar)) @@ -429,29 +440,35 @@ if(istype(B, /obj/item/weapon/reagent_containers/glass) || istype(B, /obj/item/weapon/reagent_containers/food/drinks/drinkingglass)) if(src.beaker) - user << "A beaker is already loaded into the machine." + to_chat(user, "A beaker is already loaded into the machine.") + return if(!user.drop_item()) - user << "\The [B] is stuck to you!" + to_chat(user, "\The [B] is stuck to you!") + return src.beaker = B B.forceMove(src) - user << "You add the beaker to the machine!" + to_chat(user, "You add the beaker to the machine!") + src.updateUsrDialog() icon_state = "mixer1" else if(istype(B, /obj/item/weapon/storage/pill_bottle)) if(src.loaded_pill_bottle) - user << "A pill bottle is already loaded into the machine." + to_chat(user, "A pill bottle is already loaded into the machine.") + return if(!user.drop_item()) - user << "\The [B] is stuck to you!" + to_chat(user, "\The [B] is stuck to you!") + return src.loaded_pill_bottle = B B.forceMove(src) - user << "You add the pill bottle into the dispenser slot!" + to_chat(user, "You add the pill bottle into the dispenser slot!") + src.updateUsrDialog() return @@ -793,7 +810,8 @@ default_deconstruction_crowbar(B) return 1 else - user << "You can't use the [src.name] while it's panel is opened!" + to_chat(user, "You can't use the [src.name] while it's panel is opened!") + return 1 else ..() @@ -883,7 +901,8 @@ return 1 else if(!user.drop_item()) - user << "\The [O] is stuck to you!" + to_chat(user, "\The [O] is stuck to you!") + return src.beaker = O O.forceMove(src) @@ -892,7 +911,8 @@ return 0 if(holdingitems && holdingitems.len >= limit) - usr << "The machine cannot hold anymore items." + to_chat(usr, "The machine cannot hold anymore items.") + return 1 //Fill machine with the plantbag! @@ -903,18 +923,21 @@ G.forceMove(src) holdingitems += G if(holdingitems && holdingitems.len >= limit) //Sanity checking so the blender doesn't overfill - user << "You fill the All-In-One grinder to the brim.") + break if(!O.contents.len) - user << "You empty the plant bag into the All-In-One grinder." + to_chat(user, "You empty the plant bag into the All-In-One grinder.") + src.updateUsrDialog() return 0 if (!is_type_in_list(O, blend_items) && !is_type_in_list(O, juice_items)) - user << "Cannot refine into a reagent." + to_chat(user, "Cannot refine into a reagent.") + return 1 user.unEquip(O) diff --git a/code/modules/reagents/Chemistry-Readme.dm b/code/modules/reagents/Chemistry-Readme.dm index 61e2a0c82a0..c4aed49df82 100644 --- a/code/modules/reagents/Chemistry-Readme.dm +++ b/code/modules/reagents/Chemistry-Readme.dm @@ -227,9 +227,12 @@ About the Tools: By default, all atom have a reagents var - but its empty. if you want to use an object for the chem. system you'll need to add something like this in its new proc: - var/datum/reagents/R = new/datum/reagents(100) <<<<< create a new datum , 100 is the maximum_volume of the new holder datum. - reagents = R <<<<< assign the new datum to the objects reagents var - R.my_atom = src <<<<< set the holders my_atom to src so that we know where we are. + to_chat(var/datum/reagents/R = new/datum/reagents(100), <<< create a new datum , 100 is the maximum_volume of the new holder datum.) + + to_chat(reagents = R, <<< assign the new datum to the objects reagents var) + + to_chat(R.my_atom = src, <<< set the holders my_atom to src so that we know where we are.) + This can also be done by calling a convenience proc: atom/proc/create_reagents(var/max_volume) diff --git a/code/modules/reagents/dartgun.dm b/code/modules/reagents/dartgun.dm index 52b297d88eb..e8b9104a163 100644 --- a/code/modules/reagents/dartgun.dm +++ b/code/modules/reagents/dartgun.dm @@ -60,11 +60,13 @@ /obj/item/weapon/gun/dartgun/examine(mob/user) if(..(user, 2)) if(beakers.len) - user << "[src] contains:") + for(var/obj/item/weapon/reagent_containers/glass/beaker/B in beakers) if(B.reagents && B.reagents.reagent_list.len) for(var/datum/reagent/R in B.reagents.reagent_list) - user << "[R.volume] units of [R.name]") + /obj/item/weapon/gun/dartgun/attackby(obj/item/I as obj, mob/user as mob, params) if(istype(I, /obj/item/weapon/dart_cartridge)) @@ -72,36 +74,43 @@ var/obj/item/weapon/dart_cartridge/D = I if(!D.darts) - user << "[D] is empty." + to_chat(user, "[D] is empty.") + return 0 if(cartridge) if(cartridge.darts <= 0) src.remove_cartridge() else - user << "There's already a cartridge in [src]." + to_chat(user, "There's already a cartridge in [src].") + return 0 user.drop_item() cartridge = D D.forceMove(src) - user << "You slot [D] into [src]." + to_chat(user, "You slot [D] into [src].") + update_icon() return if(istype(I, /obj/item/weapon/reagent_containers/glass)) if(!istype(I, container_type)) - user << "[I] doesn't seem to fit into [src]." + to_chat(user, "[I] doesn't seem to fit into [src].") + return if(beakers.len >= max_beakers) - user << "[src] already has [max_beakers] beakers in it - another one isn't going to fit!" + to_chat(user, "[src] already has [max_beakers] beakers in it - another one isn't going to fit!") + return var/obj/item/weapon/reagent_containers/glass/beaker/B = I if(!user.drop_item()) - user << "\The [B] is stuck to you!" + to_chat(user, "\The [B] is stuck to you!") + return B.forceMove(src) beakers += B - user << "You slot [B] into [src].") + src.updateUsrDialog() /obj/item/weapon/gun/dartgun/can_fire() @@ -115,7 +124,8 @@ /obj/item/weapon/gun/dartgun/proc/remove_cartridge() if(cartridge) - usr << "You pop the cartridge out of [src]." + to_chat(usr, "You pop the cartridge out of [src].") + var/obj/item/weapon/dart_cartridge/C = cartridge C.forceMove(get_turf(src)) C.update_icon() @@ -145,10 +155,12 @@ var/obj/effect/syringe_gun_dummy/D = new/obj/effect/syringe_gun_dummy(get_turf(src)) var/obj/item/weapon/reagent_containers/syringe/S = get_mixed_syringe() if(!S) - user << "There are no darts in [src]!" + to_chat(user, "There are no darts in [src]!") + return if(!S.reagents) - user << "There are no reagents available!" + to_chat(user, "There are no reagents available!") + return cartridge.darts-- src.update_icon() @@ -190,7 +202,8 @@ if(D.reagents) D.reagents.trans_to(M, 15) - M << "You feel a slight prick." + to_chat(M, "You feel a slight prick.") + qdel(D) break @@ -271,7 +284,8 @@ if(index <= beakers.len) if(beakers[index]) var/obj/item/weapon/reagent_containers/glass/beaker/B = beakers[index] - usr << "You remove [B] from [src]." + to_chat(usr, "You remove [B] from [src].") + mixing -= B beakers -= B B.forceMove(get_turf(src)) @@ -284,7 +298,8 @@ if(cartridge) spawn(0) fire_dart(target,user) else - usr << "[src] is empty." + to_chat(usr, "[src] is empty.") + /obj/item/weapon/gun/dartgun/vox diff --git a/code/modules/reagents/grenade_launcher.dm b/code/modules/reagents/grenade_launcher.dm index 16c41141815..a2a74dc9635 100644 --- a/code/modules/reagents/grenade_launcher.dm +++ b/code/modules/reagents/grenade_launcher.dm @@ -19,7 +19,8 @@ /obj/item/weapon/gun/grenadelauncher/examine(mob/user) if(..(user, 2)) - user << "\blue [grenades.len] / [max_grenades] [ammo_name]s." + to_chat(user, "\blue [grenades.len] / [max_grenades] [ammo_name]s.") + /obj/item/weapon/gun/grenadelauncher/attackby(obj/item/I as obj, mob/user as mob, params) @@ -28,10 +29,13 @@ user.drop_item() I.loc = src grenades += I - user << "\blue You put the [ammo_name] in the [name]." - user << "\blue [grenades.len] / [max_grenades] [ammo_name]s." + to_chat(user, "\blue You put the [ammo_name] in the [name].") + + to_chat(user, "\blue [grenades.len] / [max_grenades] [ammo_name]s.") + else - usr << "\red The grenade launcher cannot hold more [ammo_name]s." + to_chat(usr, "\red The grenade launcher cannot hold more [ammo_name]s.") + /obj/item/weapon/gun/grenadelauncher/afterattack(obj/target, mob/user , flag) @@ -47,12 +51,14 @@ if(grenades.len) spawn(0) fire_grenade(target,user) else - usr << "\red The [name] is empty." + to_chat(usr, "\red The [name] is empty.") + /obj/item/weapon/gun/grenadelauncher/proc/fire_grenade(atom/target, mob/user) for(var/mob/O in viewers(world.view, user)) O.show_message(text("\red [] fired a [ammo_name]!", user), 1) - user << "\red You fire the [name]!" + to_chat(user, "\red You fire the [name]!") + var/obj/item/weapon/grenade/chem_grenade/F = grenades[1] //Now with less copypasta! grenades -= F F.loc = user.loc @@ -93,16 +99,20 @@ user.drop_item() I.loc = src grenades += I - user << "\blue You put the [ammo_name] in the [name]." - user << "\blue [grenades.len] / [max_grenades] [ammo_name]s." + to_chat(user, "\blue You put the [ammo_name] in the [name].") + + to_chat(user, "\blue [grenades.len] / [max_grenades] [ammo_name]s.") + icon_state = "piecannon1" else - usr << "\red The grenade launcher cannot hold more [ammo_name]s." + to_chat(usr, "\red The grenade launcher cannot hold more [ammo_name]s.") + /obj/item/weapon/gun/grenadelauncher/piecannon/fire_grenade(atom/target, mob/user) for(var/mob/O in viewers(world.view, user)) O.show_message(text("\red [] fired a [ammo_name]!", user), 1) - user << "\red You fire the [name]!" + to_chat(user, "\red You fire the [name]!") + var/obj/item/weapon/reagent_containers/food/snacks/pie/P = grenades[1] //Now with less copypasta! grenades -= P P.loc = user.loc diff --git a/code/modules/reagents/newchem/Blob-Reagents.dm b/code/modules/reagents/newchem/Blob-Reagents.dm index 80c36713bbe..58b5b392609 100644 --- a/code/modules/reagents/newchem/Blob-Reagents.dm +++ b/code/modules/reagents/newchem/Blob-Reagents.dm @@ -150,4 +150,5 @@ if(message_living && !issilicon(M)) totalmessage += message_living totalmessage += "!" - M << "[totalmessage]" \ No newline at end of file + to_chat(M, "[totalmessage]") + diff --git a/code/modules/reagents/newchem/chem_heater.dm b/code/modules/reagents/newchem/chem_heater.dm index e6e4ca61958..52f2fdffd0f 100644 --- a/code/modules/reagents/newchem/chem_heater.dm +++ b/code/modules/reagents/newchem/chem_heater.dm @@ -74,13 +74,15 @@ if(istype(I, /obj/item/weapon/reagent_containers/glass)) if(beaker) - user << "A beaker is already loaded into the machine." + to_chat(user, "A beaker is already loaded into the machine.") + return if(user.drop_item()) beaker = I I.forceMove(src) - user << "You add the beaker to the machine!" + to_chat(user, "You add the beaker to the machine!") + icon_state = "mixer1b" nanomanager.update_uis(src) diff --git a/code/modules/reagents/newchem/disease.dm b/code/modules/reagents/newchem/disease.dm index 132859d530a..07f60778364 100644 --- a/code/modules/reagents/newchem/disease.dm +++ b/code/modules/reagents/newchem/disease.dm @@ -64,7 +64,8 @@ if(holder.has_reagent("atrazine",45)) holder.del_reagent("spore") //apparently this never metabolizes and stays in forever unless you have 45 units of atrazine in you or some stupid thing like that. if(prob(1)) - M << "Your mouth tastes funny." + to_chat(M, "Your mouth tastes funny.") + if(prob(1) && prob(25)) if(iscarbon(M)) var/mob/living/carbon/C = M diff --git a/code/modules/reagents/newchem/drinks.dm b/code/modules/reagents/newchem/drinks.dm index 5574643de89..136ae63936e 100644 --- a/code/modules/reagents/newchem/drinks.dm +++ b/code/modules/reagents/newchem/drinks.dm @@ -27,7 +27,8 @@ if(prob(50)) M.say("[sonic_message]") else - M << "[sonic_message ]" + to_chat(M, "[sonic_message ]") + ..() return @@ -130,7 +131,8 @@ datum/reagent/ethanol/synthanol/reaction_mob(var/mob/M, var/method=TOUCH, var/vo if(M.isSynthetic()) return if(method == INGEST) - M << pick("That was awful!", "Yuck!") + to_chat(M, pick("That was awful!", "Yuck!")) + /datum/reagent/ethanol/synthanol/robottears name = "Robot Tears" diff --git a/code/modules/reagents/newchem/drugs.dm b/code/modules/reagents/newchem/drugs.dm index 6ac4984bb9a..0d06bbd0e34 100644 --- a/code/modules/reagents/newchem/drugs.dm +++ b/code/modules/reagents/newchem/drugs.dm @@ -17,7 +17,8 @@ if(!M) M = holder.my_atom var/smoke_message = pick("You feel relaxed.", "You feel calmed.", "You feel less stressed.", "You feel more placid.", "You feel more undivided.") if(prob(5)) - M << "[smoke_message]" + to_chat(M, "[smoke_message]") + if(prob(50)) M.AdjustParalysis(-1) M.AdjustStunned(-1) @@ -49,14 +50,17 @@ if(prob(15)) M.emote(pick("twitch", "twitch_s", "grumble", "laugh")) if(prob(8)) - M << "You feel great!" + to_chat(M, "You feel great!") + M.reagents.add_reagent("methamphetamine", rand(1,2)) M.emote(pick("laugh", "giggle")) if(prob(6)) - M << "You feel warm." + to_chat(M, "You feel warm.") + M.bodytemperature += rand(1,10) if(prob(4)) - M << "You feel kinda awful!" + to_chat(M, "You feel kinda awful!") + M.adjustToxLoss(1) M.jitteriness += 30 M.emote(pick("groan", "moan")) @@ -104,18 +108,21 @@ if(prob(15)) M.emote(pick("smile", "grin", "yawn", "laugh", "drool")) if(prob(10)) - M << "You feel pretty chill." + to_chat(M, "You feel pretty chill.") + M.bodytemperature-- M.emote("smile") if(prob(5)) - M << "You feel too chill!" + to_chat(M, "You feel too chill!") + M.emote(pick("yawn", "drool")) M.Stun(1) M.adjustToxLoss(1) M.adjustBrainLoss(1) M.bodytemperature -= 20 if(prob(2)) - M << "Your skin feels all rough and dry." + to_chat(M, "Your skin feels all rough and dry.") + M.adjustBruteLoss(2) ..() return @@ -231,7 +238,8 @@ if(!M) M = holder.my_atom var/high_message = pick("You feel amped up.", "You feel ready.", "You feel like you can push it to the limit.") if(prob(5)) - M << "[high_message]" + to_chat(M, "[high_message]") + M.AdjustParalysis(-5) M.AdjustStunned(-5) M.AdjustWeakened(-5) @@ -292,9 +300,11 @@ M.emote(pick("twitch", "shake", "tremble","quiver", "twitch_s")) var/high_message = pick("really buff", "on top of the world","like you're made of steel", "energized", "invigorated", "full of energy") if(prob(8)) - M << "[high_message]!" + to_chat(M, "[high_message]!") + if(prob(5)) - M << "You cannot breathe!" + to_chat(M, "You cannot breathe!") + M.adjustOxyLoss(15) M.Stun(1) M.losebreath++ @@ -315,7 +325,8 @@ if(prob(5)) M.emote(pick("laugh","giggle","smile")) if(prob(5)) - M << "[pick("You feel hungry.","Your stomach rumbles.","You feel cold.","You feel warm.")]" + to_chat(M, "[pick("You feel hungry.","Your stomach rumbles.","You feel cold.","You feel warm.")]") + if(prob(4)) M.confused = max(M.confused, 10) if(volume >= 50 && prob(25)) @@ -389,11 +400,13 @@ M.emote("laugh") M.adjustToxLoss(1) if(2) - M << "[M] can't seem to control their legs!" + to_chat(M, "[M] can't seem to control their legs!") + M.Weaken(8) M.adjustToxLoss(1) if(3) - M << "[M]'s hands flip out and flail everywhere!" + to_chat(M, "[M]'s hands flip out and flail everywhere!") + M.drop_l_hand() M.drop_r_hand() M.adjustToxLoss(1) @@ -432,7 +445,8 @@ if(prob(1)) high_message = "0100011101001111010101000101010001000001010001110100111101000110010000010101001101010100!" if(prob(5)) - M << "[high_message]" + to_chat(M, "[high_message]") + M.AdjustParalysis(-2) M.AdjustStunned(-2) M.AdjustWeakened(-2) @@ -480,7 +494,8 @@ if(prob(1)) high_message = "01010100010100100100000101001110010100110100001101000101010011100100010001000101010011100100001101000101." if(prob(5)) - M << "[high_message]" + to_chat(M, "[high_message]") + ..() return @@ -491,7 +506,8 @@ M.Jitter(20) M.apply_effect(STUTTER, 5) if(prob(10)) - M << "You experience a violent electrical discharge!" + to_chat(M, "You experience a violent electrical discharge!") + playsound(get_turf(M), 'sound/effects/eleczap.ogg', 75, 1) //Lightning effect for electrical discharge visualization var/icon/I=new('icons/obj/zap.dmi',"lightningend") diff --git a/code/modules/reagents/newchem/food.dm b/code/modules/reagents/newchem/food.dm index 7799659eb97..c87d6c209ee 100644 --- a/code/modules/reagents/newchem/food.dm +++ b/code/modules/reagents/newchem/food.dm @@ -11,7 +11,8 @@ datum/reagent/questionmark/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) return if(method == INGEST) M.Weaken(2) - M << "Ugh! Eating that was a terrible idea!" + to_chat(M, "Ugh! Eating that was a terrible idea!") + datum/reagent/egg name = "Egg" @@ -201,11 +202,15 @@ datum/reagent/fungus/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) if(method == INGEST) var/ranchance = rand(1,10) if(ranchance == 1) - M << "You feel very sick." + to_chat(M, "You feel very sick.") + M.reagents.add_reagent("toxin", rand(1,5)) else if(ranchance <= 5) - M << "That tasted absolutely FOUL." - else M << "Yuck!" + to_chat(M, "That tasted absolutely FOUL.") + + else + to_chat(M, "Yuck!") + /datum/reagent/chicken_soup name = "Chicken soup" @@ -232,7 +237,8 @@ datum/reagent/msg/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) if(!istype(M, /mob/living)) return if(method == INGEST) - M << "That tasted amazing!" + to_chat(M, "That tasted amazing!") + /datum/reagent/msg/on_mob_life(var/mob/living/M as mob) @@ -240,7 +246,8 @@ datum/reagent/msg/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) if(prob(10)) M.adjustToxLoss(rand(2.4)) if(prob(7)) - M << "A horrible migraine overpowers you." + to_chat(M, "A horrible migraine overpowers you.") + M.Stun(rand(2,5)) ..() return @@ -287,7 +294,8 @@ datum/reagent/cheese/reaction_turf(var/turf/T, var/volume) /datum/reagent/fake_cheese/overdose_process(var/mob/living/M as mob) if(prob(8)) - M << "You feel something squirming in your stomach. Your thoughts turn to cheese and you begin to sweat." + to_chat(M, "You feel something squirming in your stomach. Your thoughts turn to cheese and you begin to sweat.") + M.adjustToxLoss(rand(1,2)) ..() @@ -393,12 +401,14 @@ datum/reagent/ectoplasm/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) return if(method == INGEST) var/spooky_eat = pick("Ugh, why did you eat that? Your mouth feels haunted. Haunted with bad flavors.", "Ugh, why did you eat that? It has the texture of ham aspic. From the 1950s. Left out in the sun.", "Ugh, why did you eat that? It tastes like a ghost fart.", "Ugh, why did you eat that? It tastes like flavor died.") - M << "[spooky_eat]" + to_chat(M, "[spooky_eat]") + /datum/reagent/ectoplasm/on_mob_life(var/mob/living/M as mob) var/spooky_message = pick("You notice something moving out of the corner of your eye, but nothing is there...", "Your eyes twitch, you feel like something you can't see is here...", "You've got the heebie-jeebies.", "You feel uneasy.", "You shudder as if cold...", "You feel something gliding across your back...") if(prob(8)) - M << "[spooky_message]" + to_chat(M, "[spooky_message]") + ..() return @@ -446,12 +456,15 @@ datum/reagent/ectoplasm/reaction_turf(var/turf/T, var/volume) /datum/reagent/hydrogenated_soybeanoil/overdose_process(var/mob/living/M as mob) if(prob(33)) - M << "You feel horribly weak." + to_chat(M, "You feel horribly weak.") + if(prob(10)) - M << "You cannot breathe!" + to_chat(M, "You cannot breathe!") + M.adjustOxyLoss(5) if(prob(5)) - M << "You feel a sharp pain in your chest!" + to_chat(M, "You feel a sharp pain in your chest!") + M.adjustOxyLoss(25) M.Stun(5) M.Paralyse(10) @@ -529,7 +542,8 @@ datum/reagent/ectoplasm/reaction_turf(var/turf/T, var/volume) if(prob(8)) M.reagents.add_reagent(pick("blood", "corn_syrup", "synthflesh", "hydrogenated_soybeanoil", "porktonium", "toxic_slurry"), 0.8) else if(prob(6)) - M << "[pick("You feel ill.","Your stomach churns.","You feel queasy.","You feel sick.")]" + to_chat(M, "[pick("You feel ill.","Your stomach churns.","You feel queasy.","You feel sick.")]") + M.emote(pick("groan","moan")) ..() return @@ -556,20 +570,24 @@ datum/reagent/pepperoni/reaction_mob(var/mob/living/M, var/method=TOUCH, var/vol var/mob/living/carbon/human/H = M if(H.wear_mask) - H << "The pepperoni bounces off your mask!" + to_chat(H, "The pepperoni bounces off your mask!") + return if(H.head) - H << "Your mask protects you from the errant pepperoni!" + to_chat(H, "Your mask protects you from the errant pepperoni!") + return if(prob(50)) M.adjustBruteLoss(1) playsound(M, 'sound/effects/woodhit.ogg', 50, 1) - M << "A slice of pepperoni slaps you!" + to_chat(M, "A slice of pepperoni slaps you!") + else M.emote("burp") - M << "My goodness, that was tasty!" + to_chat(M, "My goodness, that was tasty!") + /datum/chemical_reaction/pepperoni @@ -590,14 +608,17 @@ datum/reagent/pepperoni/reaction_mob(var/mob/living/M, var/method=TOUCH, var/vol /datum/reagent/cholesterol/on_mob_life(var/mob/living/M as mob) if(volume >= 25 && prob(volume*0.15)) - M << "Your chest feels [pick("weird","uncomfortable","nasty","gross","odd","unusual","warm")]!" + to_chat(M, "Your chest feels [pick("weird","uncomfortable","nasty","gross","odd","unusual","warm")]!") + M.adjustToxLoss(rand(1,2)) else if(volume >= 45 && prob(volume*0.08)) - M << "Your chest [pick("hurts","stings","aches","burns")]!" + to_chat(M, "Your chest [pick("hurts","stings","aches","burns")]!") + M.adjustToxLoss(rand(2,4)) M.Stun(1) else if(volume >= 150 && prob(volume*0.01)) - M << "Your chest is burning with pain!" + to_chat(M, "Your chest is burning with pain!") + M.Stun(1) M.Weaken(1) if(ishuman(M)) diff --git a/code/modules/reagents/newchem/medicine.dm b/code/modules/reagents/newchem/medicine.dm index f742424970d..f61f5e850b7 100644 --- a/code/modules/reagents/newchem/medicine.dm +++ b/code/modules/reagents/newchem/medicine.dm @@ -17,11 +17,13 @@ datum/reagent/silver_sulfadiazine/reaction_mob(var/mob/living/M as mob, var/meth if(method == TOUCH) M.adjustFireLoss(-volume) if(show_message) - M << "The silver sulfadiazine soothes your burns." + to_chat(M, "The silver sulfadiazine soothes your burns.") + if(method == INGEST) M.adjustToxLoss(0.5*volume) if(show_message) - M << "You feel sick..." + to_chat(M, "You feel sick...") + ..() return @@ -44,12 +46,14 @@ datum/reagent/styptic_powder/reaction_mob(var/mob/living/M as mob, var/method=TO if(method == TOUCH) M.adjustBruteLoss(-volume) if(show_message) - M << "The styptic powder stings like hell as it closes some of your wounds!" + to_chat(M, "The styptic powder stings like hell as it closes some of your wounds!") + M.emote("scream") if(method == INGEST) M.adjustToxLoss(0.5*volume) if(show_message) - M << "You feel gross!" + to_chat(M, "You feel gross!") + ..() return @@ -89,7 +93,8 @@ datum/reagent/synthflesh/reaction_mob(var/mob/living/M, var/method=TOUCH, var/vo M.adjustBruteLoss(-1.5*volume) M.adjustFireLoss(-1.5*volume) if(show_message) - M << "The synthetic flesh integrates itself into your wounds, healing you." + to_chat(M, "The synthetic flesh integrates itself into your wounds, healing you.") + ..() return @@ -631,8 +636,10 @@ datum/reagent/strange_reagent/reaction_mob(var/mob/living/M as mob, var/method=T return var/mob/dead/observer/ghost = M.get_ghost() if(ghost) - ghost << "Your are attempting to be revived with Strange Reagent. Return to your body if you want to be revived! (Verbs -> Ghost -> Re-enter corpse)" - ghost << sound('sound/effects/genetics.ogg') + to_chat(ghost, "Your are attempting to be revived with Strange Reagent. Return to your body if you want to be revived! (Verbs -> Ghost -> Re-enter corpse)") + + to_chat(ghost, sound('sound/effects/genetics.ogg')) + M.visible_message("[M] doesn't appear to respond, perhaps try again later?") if(!M.suiciding && !ghost && !(NOCLONE in M.mutations)) M.visible_message("[M] seems to rise from the dead!") diff --git a/code/modules/reagents/newchem/newchem_procs.dm b/code/modules/reagents/newchem/newchem_procs.dm index 4a6ec32366e..83aca86397d 100644 --- a/code/modules/reagents/newchem/newchem_procs.dm +++ b/code/modules/reagents/newchem/newchem_procs.dm @@ -77,7 +77,8 @@ if(5) R.addiction_act_stage5(M) if(prob(20) && (world.timeofday > (R.last_addiction_dose + ADDICTION_TIME))) //Each addiction lasts 8 minutes before it can end - M << "You no longer feel reliant on [R.name]!" + to_chat(M, "You no longer feel reliant on [R.name]!") + addiction_list.Remove(R) update_total() @@ -132,7 +133,8 @@ if(prob(8)) M.emote("sneeze") if(prob(4)) - M << "You feel a dull headache." + to_chat(M, "You feel a dull headache.") + /datum/reagent/proc/addiction_act_stage3(var/mob/living/M as mob) if(prob(8)) @@ -140,28 +142,34 @@ if(prob(8)) M.emote("shiver") if(prob(4)) - M << "You begin craving [name]!" + to_chat(M, "You begin craving [name]!") + /datum/reagent/proc/addiction_act_stage4(var/mob/living/M as mob) if(prob(8)) M.emote("twitch") if(prob(4)) - M << "You have the strong urge for some [name]!" + to_chat(M, "You have the strong urge for some [name]!") + if(prob(4)) - M << "You REALLY crave some [name]!" + to_chat(M, "You REALLY crave some [name]!") + /datum/reagent/proc/addiction_act_stage5(var/mob/living/M as mob) if(prob(8)) M.emote("twitch") if(prob(6)) - M << "Your stomach lurches painfully!" + to_chat(M, "Your stomach lurches painfully!") + M.visible_message("[M] gags and retches!") M.Stun(rand(2,4)) M.Weaken(rand(2,4)) if(prob(5)) - M << "You feel like you can't live without [name]!" + to_chat(M, "You feel like you can't live without [name]!") + if(prob(5)) - M << "You would DIE for some [name] right now!" + to_chat(M, "You would DIE for some [name] right now!") + /datum/reagent/proc/reagent_deleted() return diff --git a/code/modules/reagents/newchem/other.dm b/code/modules/reagents/newchem/other.dm index 9d138407d96..63c45c77776 100644 --- a/code/modules/reagents/newchem/other.dm +++ b/code/modules/reagents/newchem/other.dm @@ -265,7 +265,8 @@ datum/reagent/super_hairgrownium/on_mob_life(var/mob/living/M as mob) H.unEquip(H.wear_mask) var/obj/item/clothing/mask/fakemoustache = new /obj/item/clothing/mask/fakemoustache H.equip_to_slot(fakemoustache, slot_wear_mask) - H << "Hair bursts forth from your every follicle!" + to_chat(H, "Hair bursts forth from your every follicle!") + ..() return @@ -292,7 +293,8 @@ datum/reagent/fartonium/on_mob_life(var/mob/living/M as mob) if(holder.has_reagent("simethicone")) if(prob(25)) - M << "[pick("Oh god, something doesn't feel right!", "IT HURTS!", "FUCK!", "Something is seriously wrong!", "THE PAIN!", "You feel like you're gonna die!")]" + to_chat(M, "[pick("Oh god, something doesn't feel right!", "IT HURTS!", "FUCK!", "Something is seriously wrong!", "THE PAIN!", "You feel like you're gonna die!")]") + M.adjustBruteLoss(1) if(prob(10)) M.custom_emote(1,"strains, but nothing happens.") diff --git a/code/modules/reagents/newchem/pyro.dm b/code/modules/reagents/newchem/pyro.dm index db1f01da847..2b8c8e388a0 100644 --- a/code/modules/reagents/newchem/pyro.dm +++ b/code/modules/reagents/newchem/pyro.dm @@ -362,20 +362,24 @@ datum/reagent/blackpowder/reaction_turf(var/turf/T, var/volume) //oh shit var/mob/living/carbon/human/H = C if((H.r_ear && (H.r_ear.flags & EARBANGPROTECT)) || (H.l_ear && (H.l_ear.flags & EARBANGPROTECT)) || (H.head && (H.head.flags & HEADBANGPROTECT))) ear_safety++ - M << "BANG" + to_chat(M, "BANG") + if(!ear_safety) M.Stun(max(10/distance, 3)) M.Weaken(max(10/distance, 3)) M.ear_damage += rand(0, 5) M.ear_deaf = max(M.ear_deaf,15) if (M.ear_damage >= 15) - M << "Your ears start to ring badly!" + to_chat(M, "Your ears start to ring badly!") + if(prob(M.ear_damage - 10 + 5)) - M << "You can't hear anything!" + to_chat(M, "You can't hear anything!") + M.disabilities |= DEAF else if (M.ear_damage >= 5) - M << "Your ears start to ring!" + to_chat(M, "Your ears start to ring!") + /datum/chemical_reaction/sonic_powder/on_reaction(var/datum/reagents/holder, var/created_volume) if(holder.has_reagent("stabilizing_agent")) @@ -391,20 +395,24 @@ datum/reagent/blackpowder/reaction_turf(var/turf/T, var/volume) //oh shit var/mob/living/carbon/human/H = C if((H.r_ear && (H.r_ear.flags & EARBANGPROTECT)) || (H.l_ear && (H.l_ear.flags & EARBANGPROTECT)) || (H.head && (H.head.flags & HEADBANGPROTECT))) ear_safety++ - C << "BANG" + to_chat(C, "BANG") + if(!ear_safety) M.Stun(max(10/distance, 3)) M.Weaken(max(10/distance, 3)) M.ear_damage += rand(0, 5) M.ear_deaf = max(M.ear_deaf,15) if (M.ear_damage >= 15) - M << "Your ears start to ring badly!" + to_chat(M, "Your ears start to ring badly!") + if(prob(M.ear_damage - 10 + 5)) - M << "You can't hear anything!" + to_chat(M, "You can't hear anything!") + M.disabilities |= DEAF else if (M.ear_damage >= 5) - M << "Your ears start to ring!" + to_chat(M, "Your ears start to ring!") + holder.remove_reagent("sonic_powder", created_volume) /datum/reagent/phlogiston diff --git a/code/modules/reagents/newchem/toxins.dm b/code/modules/reagents/newchem/toxins.dm index c69baf5b76b..b82e4c266ab 100644 --- a/code/modules/reagents/newchem/toxins.dm +++ b/code/modules/reagents/newchem/toxins.dm @@ -34,7 +34,8 @@ if(method == TOUCH) M.reagents.add_reagent("histamine",10) else - M << "You feel a burning sensation in your throat..." + to_chat(M, "You feel a burning sensation in your throat...") + M.emote("drool") /datum/reagent/histamine/on_mob_life(var/mob/living/M as mob) @@ -42,7 +43,8 @@ if(prob(20)) M.emote(pick("twitch", "grumble", "sneeze", "cough")) if(prob(10)) - M << "Your eyes itch." + to_chat(M, "Your eyes itch.") + M.emote(pick("blink", "sneeze")) M.eye_blurry += 3 if(prob(10)) @@ -50,14 +52,16 @@ M.adjustBruteLoss(1) M.emote("grumble") if(prob(5)) - M << "You're getting a rash!" + to_chat(M, "You're getting a rash!") + M.adjustBruteLoss(2) ..() return /datum/reagent/histamine/overdose_process(var/mob/living/M as mob) if(prob(2)) - M << "You feel mucus running down the back of your throat." + to_chat(M, "You feel mucus running down the back of your throat.") + M.adjustToxLoss(1) M.jitteriness += 4 M.emote("sneeze", "cough") @@ -67,7 +71,8 @@ M.emote(pick("choke","gasp")) M.adjustOxyLoss(5) else if(prob(7)) - M << "Your chest hurts!" + to_chat(M, "Your chest hurts!") + M.emote(pick("cough","gasp")) M.adjustOxyLoss(3) ..() @@ -196,11 +201,13 @@ if(prob(5)) M.emote("drool") if(prob(10)) - M << "You cannot breathe!" + to_chat(M, "You cannot breathe!") + M.losebreath += 1 M.emote("gasp") if(prob(8)) - M << "You feel horrendously weak!" + to_chat(M, "You feel horrendously weak!") + M.Stun(2) M.adjustToxLoss(2) ..() @@ -237,7 +244,8 @@ if(prob(25)) M.emote(pick("twitch", "laugh", "sneeze", "cry")) if(prob(20)) - M << "Something tickles!" + to_chat(M, "Something tickles!") + M.emote(pick("laugh", "giggle")) if(prob(15)) M.visible_message("[M] scratches at an itch.") @@ -245,12 +253,14 @@ M.Stun(rand(0,1)) M.emote("grumble") if(prob(10)) - M << "So itchy!" + to_chat(M, "So itchy!") + M.adjustBruteLoss(2) if(prob(6)) M.reagents.add_reagent("histamine", rand(1,3)) if(prob(2)) - M << "AHHHHHH!" + to_chat(M, "AHHHHHH!") + M.adjustBruteLoss(5) M.Weaken(5) M.jitteriness += 6 @@ -291,7 +301,8 @@ var/mob/living/carbon/human/H = M if(volume < 5) - M << "The blueish acidic substance stings you, but isn't concentrated enough to harm you!" + to_chat(M, "The blueish acidic substance stings you, but isn't concentrated enough to harm you!") + if(volume >=5 && volume <=10) if(!H.unacidable) @@ -306,18 +317,22 @@ if(!H.wear_mask.unacidable) qdel(H.wear_mask) H.update_inv_wear_mask() - H << "\red Your mask melts away but protects you from the acid!" + to_chat(H, "\red Your mask melts away but protects you from the acid!") + else - H << "\red Your mask protects you from the acid!" + to_chat(H, "\red Your mask protects you from the acid!") + return if(H.head) if(!H.head.unacidable) qdel(H.head) H.update_inv_head() - H << "\red Your helmet melts away but protects you from the acid" + to_chat(H, "\red Your helmet melts away but protects you from the acid") + else - H << "\red Your helmet protects you from the acid!" + to_chat(H, "\red Your helmet protects you from the acid!") + return if(!H.unacidable) @@ -333,7 +348,8 @@ var/obj/effect/decal/cleanable/molten_item/I = new/obj/effect/decal/cleanable/molten_item(O.loc) I.desc = "Looks like this was \an [O] some time ago." for(var/mob/M in viewers(5, O)) - M << "\red \the [O] melts." + to_chat(M, "\red \the [O] melts.") + qdel(O) /datum/chemical_reaction/facid @@ -358,14 +374,17 @@ if(prob(33)) M.adjustToxLoss(rand(5,25)) if(prob(33)) - M << "You feel horribly weak." + to_chat(M, "You feel horribly weak.") + M.Stun(2) if(prob(10)) - M << "You cannot breathe!" + to_chat(M, "You cannot breathe!") + M.adjustOxyLoss(10) M.losebreath++ if(prob(10)) - M << "Your chest is burning with pain!" + to_chat(M, "Your chest is burning with pain!") + M.adjustOxyLoss(10) M.losebreath++ M.Stun(3) @@ -409,7 +428,8 @@ M.emote(pick("drool", "tremble")) if(6 to 10) if(prob(8)) - M << "You feel [pick("weak", "horribly weak", "numb", "like you can barely move", "tingly")]." + to_chat(M, "You feel [pick("weak", "horribly weak", "numb", "like you can barely move", "tingly")].") + M.Stun(1) else if(prob(8)) M.emote(pick("drool", "tremble")) @@ -420,9 +440,11 @@ M.emote(pick("drool", "tremble", "gasp")) M.losebreath++ if(prob(9)) - M << "You can't [pick("move", "feel your legs", "feel your face", "feel anything")]!" + to_chat(M, "You can't [pick("move", "feel your legs", "feel your face", "feel anything")]!") + if(prob(7)) - M << "You can't breathe!" + to_chat(M, "You can't breathe!") + M.losebreath += 3 ..() return @@ -557,10 +579,12 @@ if(!M.nutrition) switch(rand(1,3)) if(1) - M << "You feel hungry..." + to_chat(M, "You feel hungry...") + if(2) M.adjustToxLoss(1) - M << "Your stomach grumbles painfully!" + to_chat(M, "Your stomach grumbles painfully!") + else if(prob(60)) var/fat_to_burn = max(round(M.nutrition/100,1), 5) @@ -604,7 +628,8 @@ if(6 to 10) M.eye_blurry += 5 if(prob(8)) - M << "You feel [pick("weak", "horribly weak", "numb", "like you can barely move", "tingly")]." + to_chat(M, "You feel [pick("weak", "horribly weak", "numb", "like you can barely move", "tingly")].") + M.Stun(1) else if(prob(8)) M.emote(pick("drool","pale", "gasp")) @@ -614,7 +639,8 @@ if(prob(20)) M.emote(pick("drool", "faint", "pale", "gasp", "collapse")) else if(prob(8)) - M << "You can't [pick("breathe", "move", "feel your legs", "feel your face", "feel anything")]!" + to_chat(M, "You can't [pick("breathe", "move", "feel your legs", "feel your face", "feel anything")]!") + M.losebreath++ ..() return @@ -675,7 +701,8 @@ M.visible_message("[M] has a seizure!") M.jitteriness = 1000 if(prob(5)) - M << "You can't breathe!" + to_chat(M, "You can't breathe!") + M.emote(pick("gasp", "choke", "cough")) M.losebreath++ if(61 to INFINITY) @@ -822,7 +849,8 @@ if(prob(10)) M.adjustToxLoss(rand(2.4)) if(prob(7)) - M << "A horrible migraine overpowers you." + to_chat(M, "A horrible migraine overpowers you.") + M.Stun(rand(2,5)) if(prob(7)) M.fakevomit(1) @@ -869,7 +897,8 @@ /datum/reagent/ants/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) //NOT THE ANTS if(iscarbon(M)) if(method == TOUCH || method==INGEST) - M << "OH SHIT ANTS!!!!" + to_chat(M, "OH SHIT ANTS!!!!") + M.emote("scream") M.adjustBruteLoss(4) diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm index 649a32ae373..0a36f59d428 100644 --- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm +++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm @@ -218,7 +218,8 @@ playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) for(var/mob/living/M in range (get_turf(holder.my_atom), 7)) M.bodytemperature -= 140 - M << "\blue You feel a chill!" + to_chat(M, "\blue You feel a chill!") + slimefireproof diff --git a/code/modules/reagents/oldchem/reagents/_reagent_base.dm b/code/modules/reagents/oldchem/reagents/_reagent_base.dm index b134f974547..11dc147ace6 100644 --- a/code/modules/reagents/oldchem/reagents/_reagent_base.dm +++ b/code/modules/reagents/oldchem/reagents/_reagent_base.dm @@ -39,12 +39,14 @@ if(can_become_addicted) if(prob(self.addiction_chance) && !is_type_in_list(self, M.reagents.addiction_list)) - M << "You suddenly feel invigorated and guilty..." + to_chat(M, "You suddenly feel invigorated and guilty...") + var/datum/reagent/new_reagent = new self.type() new_reagent.last_addiction_dose = world.timeofday M.reagents.addiction_list.Add(new_reagent) else if(is_type_in_list(self, M.reagents.addiction_list)) - M << "You feel slightly better, but for how long?" + to_chat(M, "You feel slightly better, but for how long?") + for(var/A in M.reagents.addiction_list) var/datum/reagent/AD = A if(AD && istype(AD, self)) diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm index 65a28452d58..1a24670b2a7 100644 --- a/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm +++ b/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm @@ -74,14 +74,17 @@ if(istype(O,/obj/item/weapon/paper)) var/obj/item/weapon/paper/paperaffected = O paperaffected.clearpaper() - usr << "The solution melts away the ink on the paper." + to_chat(usr, "The solution melts away the ink on the paper.") + if(istype(O,/obj/item/weapon/book)) if(volume >= 5) var/obj/item/weapon/book/affectedbook = O affectedbook.dat = null - usr << "The solution melts away the ink on the book." + to_chat(usr, "The solution melts away the ink on the book.") + else - usr << "It wasn't enough..." + to_chat(usr, "It wasn't enough...") + return /datum/reagent/ethanol/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//Splashing people with ethanol isn't quite as good as fuel. diff --git a/code/modules/reagents/oldchem/reagents/reagents_food.dm b/code/modules/reagents/oldchem/reagents/reagents_food.dm index 008f9964793..b15bb4ab26d 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_food.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_food.dm @@ -450,7 +450,8 @@ return /datum/reagent/sugar/overdose_start(var/mob/living/M as mob) - M << "You pass out from hyperglycemic shock!" + to_chat(M, "You pass out from hyperglycemic shock!") + M.emote("collapse") ..() diff --git a/code/modules/reagents/oldchem/reagents/reagents_toxin.dm b/code/modules/reagents/oldchem/reagents/reagents_toxin.dm index 852fb861bb8..1a1b1e6ea76 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_toxin.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_toxin.dm @@ -64,7 +64,8 @@ /datum/reagent/slimejelly/on_mob_life(var/mob/living/M as mob) if(prob(10)) - M << "\red Your insides are burning!" + to_chat(M, "\red Your insides are burning!") + M.adjustToxLoss(rand(20,60)*REM) else if(prob(40)) M.adjustBruteLoss(-5*REM) @@ -83,10 +84,14 @@ if(ishuman(M)) var/mob/living/carbon/human/human = M if(human.species.name != "Shadow") - M << "\red Your flesh rapidly mutates!" - M << "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids." - M << "\red Your body reacts violently to light. \green However, it naturally heals in darkness." - M << "Aside from your new traits, you are mentally unchanged and retain your prior obligations." + to_chat(M, "\red Your flesh rapidly mutates!") + + to_chat(M, "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.") + + to_chat(M, "\red Your body reacts violently to light. \green However, it naturally heals in darkness.") + + to_chat(M, "Aside from your new traits, you are mentally unchanged and retain your prior obligations.") + human.set_species("Shadow") ..() return @@ -264,11 +269,13 @@ if(volume > 25) if(H.wear_mask) - H << "\red Your mask protects you from the acid!" + to_chat(H, "\red Your mask protects you from the acid!") + return if(H.head) - H << "\red Your helmet protects you from the acid!" + to_chat(H, "\red Your helmet protects you from the acid!") + return if(!M.unacidable) @@ -288,7 +295,8 @@ var/mob/living/carbon/human/H = M if(volume < 10) - M << "The greenish acidic substance stings you, but isn't concentrated enough to harm you!" + to_chat(M, "The greenish acidic substance stings you, but isn't concentrated enough to harm you!") + if(volume >=10 && volume <=25) if(!H.unacidable) @@ -313,7 +321,8 @@ var/obj/effect/decal/cleanable/molten_item/I = new/obj/effect/decal/cleanable/molten_item(O.loc) I.desc = "Looks like this was \an [O] some time ago." for(var/mob/M in viewers(5, O)) - M << "\red \the [O] melts." + to_chat(M, "\red \the [O] melts.") + qdel(O) @@ -431,10 +440,12 @@ if ( !safe_thing ) safe_thing = victim.glasses if ( eyes_covered && mouth_covered ) - victim << "\red Your [safe_thing] protects you from the pepperspray!" + to_chat(victim, "\red Your [safe_thing] protects you from the pepperspray!") + return else if ( mouth_covered ) // Reduced effects if partially protected - victim << "\red Your [safe_thing] protect you from most of the pepperspray!" + to_chat(victim, "\red Your [safe_thing] protect you from most of the pepperspray!") + if(prob(5)) victim.emote("scream") victim.eye_blurry = max(M.eye_blurry, 3) @@ -445,14 +456,16 @@ victim.drop_item() return else if ( eyes_covered ) // Eye cover is better than mouth cover - victim << "\red Your [safe_thing] protects your eyes from the pepperspray!" + to_chat(victim, "\red Your [safe_thing] protects your eyes from the pepperspray!") + victim.eye_blurry = max(M.eye_blurry, 3) victim.damageoverlaytemp = 30 return else // Oh dear :D if(prob(5)) victim.emote("scream") - victim << "\red You're sprayed directly in the eyes with pepperspray!" + to_chat(victim, "\red You're sprayed directly in the eyes with pepperspray!") + victim.eye_blurry = max(M.eye_blurry, 5) victim.eye_blind = max(M.eye_blind, 2) victim.confused = max(M.confused, 6) diff --git a/code/modules/reagents/oldchem/reagents/reagents_water.dm b/code/modules/reagents/oldchem/reagents/reagents_water.dm index df9cdd6ade6..99c4b2f6499 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_water.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_water.dm @@ -254,7 +254,8 @@ if(!istype(M, /mob/living)) return if(method == INGEST) - M << "Oh god, why did you drink that?" + to_chat(M, "Oh god, why did you drink that?") + /datum/reagent/fishwater/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom @@ -307,14 +308,17 @@ if(ishuman(M) && M.mind && M.mind.vampire && !M.mind.vampire.get_ability(/datum/vampire_passive/full) && prob(80)) switch(data) if(1 to 4) - M << "Something sizzles in your veins!" + to_chat(M, "Something sizzles in your veins!") + M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2) if(5 to 12) - M << "You feel an intense burning inside of you!" + to_chat(M, "You feel an intense burning inside of you!") + M.adjustFireLoss(1) M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2) if(13 to INFINITY) - M << "You suddenly ignite in a holy fire!" + to_chat(M, "You suddenly ignite in a holy fire!") + for(var/mob/O in viewers(M, null)) O.show_message(text("[] suddenly bursts into flames!", M), 1) M.fire_stacks = min(5,M.fire_stacks + 3) @@ -330,13 +334,16 @@ var/mob/living/carbon/human/H=M if(method == TOUCH) if(H.wear_mask) - H << "\red Your mask protects you from the holy water!" + to_chat(H, "\red Your mask protects you from the holy water!") + return else if(H.head) - H << "\red Your helmet protects you from the holy water!" + to_chat(H, "\red Your helmet protects you from the holy water!") + return else - M << "Something holy interferes with your powers!" + to_chat(M, "Something holy interferes with your powers!") + M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2) diff --git a/code/modules/reagents/pandemic.dm b/code/modules/reagents/pandemic.dm index 4ae8809b8f5..d532216c8db 100644 --- a/code/modules/reagents/pandemic.dm +++ b/code/modules/reagents/pandemic.dm @@ -274,14 +274,16 @@ if(istype(I, /obj/item/weapon/reagent_containers) && (I.flags & OPENCONTAINER)) if(stat & (NOPOWER|BROKEN)) return if(beaker) - user << "A beaker is already loaded into the machine!" + to_chat(user, "A beaker is already loaded into the machine!") + return if(!user.drop_item()) return beaker = I beaker.loc = src - user << "You add the beaker to the machine." + to_chat(user, "You add the beaker to the machine.") + src.updateUsrDialog() icon_state = "mixer1" diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index b78c54bb4ef..3f86de28f0d 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -80,10 +80,12 @@ /obj/item/weapon/reagent_containers/wash(mob/user, atom/source) if(is_open_container()) if(reagents.total_volume >= volume) - user << "span class='warning'>\The [src] is full." + to_chat(user, "span class='warning'>\The [src] is full.") + return else reagents.add_reagent("water", min(volume - reagents.total_volume, amount_per_transfer_from_this)) - user << "You fill [src] from [source]." + to_chat(user, "You fill [src] from [source].") + return ..() \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index e723005e60e..fa7915ed167 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -72,13 +72,16 @@ /obj/item/weapon/reagent_containers/borghypo/attack(mob/living/M as mob, mob/user as mob) var/datum/reagents/R = reagent_list[mode] if(!R.total_volume) - user << "The injector is empty." + to_chat(user, "The injector is empty.") + return if (!istype(M)) return if (R.total_volume && M.can_inject(user, 1, penetrate_thick = bypass_protection)) - user << "You inject [M] with the injector." - M << "You feel a tiny prick!" + to_chat(user, "You inject [M] with the injector.") + + to_chat(M, "You feel a tiny prick!") + R.add_reagent(M) if(M.reagents) @@ -91,7 +94,8 @@ M.LAssailant = user var/trans = R.trans_to(M, amount_per_transfer_from_this) - user << "[trans] units injected. [R.total_volume] units remaining." + to_chat(user, "[trans] units injected. [R.total_volume] units remaining.") + return /obj/item/weapon/reagent_containers/borghypo/attack_self(mob/user as mob) @@ -102,7 +106,8 @@ charge_tick = 0 //Prevents wasted chems/cell charge if you're cycling through modes. var/datum/reagent/R = chemical_reagents_list[reagent_ids[mode]] - user << "Synthesizer is now producing '[R.name]'." + to_chat(user, "Synthesizer is now producing '[R.name]'.") + return /obj/item/weapon/reagent_containers/borghypo/examine(mob/user) @@ -114,8 +119,10 @@ for(var/datum/reagents/RS in reagent_list) var/datum/reagent/R = locate() in RS.reagent_list if(R) - user << "It currently has [R.volume] units of [R.name] stored." + to_chat(user, "It currently has [R.volume] units of [R.name] stored.") + empty = 0 if(empty) - user << "It is currently empty. Allow some time for the internal syntheszier to produce more." + to_chat(user, "It is currently empty. Allow some time for the internal syntheszier to produce more.") + diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index 1526ebcb695..f91d6cfe619 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -17,11 +17,13 @@ if(filled) if(target.reagents.total_volume >= target.reagents.maximum_volume) - user << "\red [target] is full." + to_chat(user, "\red [target] is full.") + return if(!target.is_open_container() && !ismob(target) && !istype(target,/obj/item/weapon/reagent_containers/food) && !istype(target, /obj/item/clothing/mask/cigarette)) //You can inject humans and food but you cant remove the shit. - user << "\red You cannot directly fill this object." + to_chat(user, "\red You cannot directly fill this object.") + return var/trans = 0 @@ -53,7 +55,8 @@ - user << "\blue You transfer [trans] units of the solution." + to_chat(user, "\blue You transfer [trans] units of the solution.") + if (src.reagents.total_volume<=0) filled = 0 icon_state = "[initial(icon_state)]" @@ -92,7 +95,8 @@ log_game("[key_name(user)] added [reagents.get_reagent_ids(1)] to \a [target] with [src].") trans = src.reagents.trans_to(target, amount_per_transfer_from_this) - user << "\blue You transfer [trans] units of the solution." + to_chat(user, "\blue You transfer [trans] units of the solution.") + if (src.reagents.total_volume<=0) filled = 0 icon_state = "[initial(icon_state)]" @@ -100,16 +104,19 @@ else if(!target.is_open_container() && !istype(target,/obj/structure/reagent_dispensers)) - user << "\red You cannot directly remove reagents from [target]." + to_chat(user, "\red You cannot directly remove reagents from [target].") + return if(!target.reagents.total_volume) - user << "\red [target] is empty." + to_chat(user, "\red [target] is empty.") + return var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) - user << "\blue You fill the [src] with [trans] units of the solution." + to_chat(user, "\blue You fill the [src] with [trans] units of the solution.") + filled = 1 icon_state = "[initial(icon_state)][filled]" diff --git a/code/modules/reagents/reagent_containers/drugs.dm b/code/modules/reagents/reagent_containers/drugs.dm index 53d9310f6cc..c7afd1b5f90 100644 --- a/code/modules/reagents/reagent_containers/drugs.dm +++ b/code/modules/reagents/reagent_containers/drugs.dm @@ -24,28 +24,34 @@ if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us. if(!target.reagents.total_volume && target.reagents) - user << "\red [target] is empty." + to_chat(user, "\red [target] is empty.") + return if(reagents.total_volume >= reagents.maximum_volume) - user << "\red [src] is full." + to_chat(user, "\red [src] is full.") + return for(var/datum/reagent/A in target.reagents.reagent_list) if(A.reagent_state != 1) - user << "\red You can only put powders in [src]." + to_chat(user, "\red You can only put powders in [src].") + return var/trans = target.reagents.trans_to(src, target:amount_per_transfer_from_this) - user << "\blue You fill [src] with [trans] units of the contents of [target]." + to_chat(user, "\blue You fill [src] with [trans] units of the contents of [target].") + else if(target.is_open_container() && target.reagents) //Something like a glass. Player probably wants to transfer TO it. if(!reagents.total_volume) - user << "\red [src] is empty." + to_chat(user, "\red [src] is empty.") + return if(target.reagents.total_volume >= target.reagents.maximum_volume) - user << "\red [target] is full." + to_chat(user, "\red [target] is full.") + return // /vg/: Logging transfers of bad things @@ -60,7 +66,8 @@ log_game("[key_name(user)] added [reagents.get_reagent_ids(1)] to \a [target] with [src].") var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this) - user << "\blue You transfer [trans] units of the solution to [target]." + to_chat(user, "\blue You transfer [trans] units of the solution to [target].") + //Safety for dumping stuff into a ninja suit. It handles everything through attackby() and this is unnecessary. @@ -75,9 +82,11 @@ if(istype(W, /obj/item/weapon/pen) || istype(W, /obj/item/device/flashlight/pen)) var/tmp_label = sanitize(input(user, "Enter a label for [src.name]","Label",src.label_text)) if(length(tmp_label) > 10) - user << "\red The label can be at most 10 characters long." + to_chat(user, "\red The label can be at most 10 characters long.") + else - user << "\blue You set the label to \"[tmp_label]\"." + to_chat(user, "\blue You set the label to \"[tmp_label]\".") + src.label_text = tmp_label src.update_name_label() diff --git a/code/modules/reagents/reagent_containers/food/cans.dm b/code/modules/reagents/reagent_containers/food/cans.dm index 4a4479c8b1e..b0544abd4a0 100644 --- a/code/modules/reagents/reagent_containers/food/cans.dm +++ b/code/modules/reagents/reagent_containers/food/cans.dm @@ -8,7 +8,8 @@ attack_self(mob/user as mob) if (canopened == 0) playsound(src.loc,'sound/effects/canopen.ogg', rand(10,50), 1) - user << "You open the drink with an audible pop!" + to_chat(user, "You open the drink with an audible pop!") + canopened = 1 flags |= OPENCONTAINER else @@ -16,7 +17,8 @@ attack(mob/M as mob, mob/user as mob, def_zone) if (canopened == 0) - user << "You need to open the drink!" + to_chat(user, "You need to open the drink!") + return return ..(M, user, def_zone) @@ -24,10 +26,12 @@ afterattack(obj/target, mob/user, proximity) if(!proximity) return if(istype(target, /obj/structure/reagent_dispensers) && (canopened == 0)) - user << "You need to open the drink!" + to_chat(user, "You need to open the drink!") + return else if(target.is_open_container() && (canopened == 0)) - user << "You need to open the drink!" + to_chat(user, "You need to open the drink!") + return else return ..(target, user, proximity) @@ -36,15 +40,20 @@ if(!..(user, 1)) return if(!reagents || reagents.total_volume==0) - user << "\blue \The [src] is empty!" + to_chat(user, "\blue \The [src] is empty!") + else if (reagents.total_volume<=src.volume/4) - user << "\blue \The [src] is almost empty!" + to_chat(user, "\blue \The [src] is almost empty!") + else if (reagents.total_volume<=src.volume*0.66) - user << "\blue \The [src] is half full!" + to_chat(user, "\blue \The [src] is half full!") + else if (reagents.total_volume<=src.volume*0.90) - user << "\blue \The [src] is almost full!" + to_chat(user, "\blue \The [src] is almost full!") + else - user << "\blue \The [src] is full!"*/ + to_chat(user, "\blue \The [src] is full!")*/ + //DRINKS diff --git a/code/modules/reagents/reagent_containers/food/condiment.dm b/code/modules/reagents/reagent_containers/food/condiment.dm index 5cb063ee86f..5dee4c1c9d2 100644 --- a/code/modules/reagents/reagent_containers/food/condiment.dm +++ b/code/modules/reagents/reagent_containers/food/condiment.dm @@ -39,11 +39,13 @@ var/datum/reagents/R = src.reagents if(!R || !R.total_volume) - user << "\red None of [src] left, oh no!" + to_chat(user, "\red None of [src] left, oh no!") + return 0 if(M == user) - M << "\blue You swallow some of contents of the [src]." + to_chat(M, "\blue You swallow some of contents of the [src].") + if(reagents.total_volume) reagents.reaction(M, INGEST) spawn(0) @@ -85,26 +87,32 @@ if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us. if(!target.reagents.total_volume) - user << "\red [target] is empty." + to_chat(user, "\red [target] is empty.") + return if(reagents.total_volume >= reagents.maximum_volume) - user << "\red [src] is full." + to_chat(user, "\red [src] is full.") + return var/trans = target.reagents.trans_to(src, target:amount_per_transfer_from_this) - user << "\blue You fill [src] with [trans] units of the contents of [target]." + to_chat(user, "\blue You fill [src] with [trans] units of the contents of [target].") + //Something like a glass or a food item. Player probably wants to transfer TO it. else if(target.is_open_container() || istype(target, /obj/item/weapon/reagent_containers/food/snacks)) if(!reagents.total_volume) - user << "\red [src] is empty." + to_chat(user, "\red [src] is empty.") + return if(target.reagents.total_volume >= target.reagents.maximum_volume) - user << "\red you can't add anymore to [target]." + to_chat(user, "\red you can't add anymore to [target].") + return var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this) - user << "\blue You transfer [trans] units of the condiment to [target]." + to_chat(user, "\blue You transfer [trans] units of the condiment to [target].") + /obj/item/weapon/reagent_containers/food/condiment/on_reagent_change() if(!possible_states.len) @@ -230,15 +238,19 @@ //You can tear the bag open above food to put the condiments on it, obviously. if(istype(target, /obj/item/weapon/reagent_containers/food/snacks)) if(!reagents.total_volume) - user << "You tear open [src], but there's nothing in it." + to_chat(user, "You tear open [src], but there's nothing in it.") + qdel(src) return if(target.reagents.total_volume >= target.reagents.maximum_volume) - user << "You tear open [src], but [target] is stacked so high that it just drips off!" //Not sure if food can ever be full, but better safe than sorry. + to_chat(user, "You tear open [src], but [target] is stacked so high that it just drips off!")//Not sure if food can ever be full, but better safe than sorry. + + qdel(src) return else - user << "You tear open [src] above [target] and the condiments drip onto it." + to_chat(user, "You tear open [src] above [target] and the condiments drip onto it.") + src.reagents.trans_to(target, amount_per_transfer_from_this) qdel(src) diff --git a/code/modules/reagents/reagent_containers/food/drinks.dm b/code/modules/reagents/reagent_containers/food/drinks.dm index e4860b880d0..492ddd60223 100644 --- a/code/modules/reagents/reagent_containers/food/drinks.dm +++ b/code/modules/reagents/reagent_containers/food/drinks.dm @@ -22,7 +22,8 @@ /obj/item/weapon/reagent_containers/food/drinks/attack(mob/M as mob, mob/user as mob, def_zone) if(!reagents || !reagents.total_volume) - user << " None of [src] left, oh no!" + to_chat(user, " None of [src] left, oh no!") + return 0 if(istype(M, /mob/living/carbon)) @@ -45,29 +46,35 @@ if (istype(target, /obj/item/weapon/reagent_containers/food/drinks/cans)) var/obj/item/weapon/reagent_containers/food/drinks/cans/cantarget = target if(cantarget.canopened == 0) - user << "You need to open the drink you want to pour into!" + to_chat(user, "You need to open the drink you want to pour into!") + return if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us. if(!target.reagents.total_volume) - user << " [target] is empty." + to_chat(user, " [target] is empty.") + return if(reagents.total_volume >= reagents.maximum_volume) - user << " [src] is full." + to_chat(user, " [src] is full.") + return var/trans = target.reagents.trans_to(src, target:amount_per_transfer_from_this) - user << " You fill [src] with [trans] units of the contents of [target]." + to_chat(user, " You fill [src] with [trans] units of the contents of [target].") + else if(target.is_open_container()) //Something like a glass. Player probably wants to transfer TO it. if(!reagents.total_volume) - user << " [src] is empty." + to_chat(user, " [src] is empty.") + return if(target.reagents.total_volume >= target.reagents.maximum_volume) - user << " [target] is full." + to_chat(user, " [target] is full.") + return @@ -79,19 +86,22 @@ refillName = reagents.get_master_reagent_name() var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this) - user << " You transfer [trans] units of the solution to [target]." + to_chat(user, " You transfer [trans] units of the solution to [target].") + if(isrobot(user)) //Cyborg modules that include drinks automatically refill themselves, but drain the borg's cell if(refill in drinks) // Only synthesize drinks var/mob/living/silicon/robot/bro = user var/chargeAmount = max(30,4*trans) bro.cell.use(chargeAmount) - user << "Now synthesizing [trans] units of [refillName]..." + to_chat(user, "Now synthesizing [trans] units of [refillName]...") + spawn(300) reagents.add_reagent(refill, trans) - user << "Cyborg [src] refilled." + to_chat(user, "Cyborg [src] refilled.") + return @@ -101,22 +111,29 @@ if(is_hot(I)) if(src.reagents) src.reagents.chem_temp += 15 - user << "You heat [src] with [I]." + to_chat(user, "You heat [src] with [I].") + src.reagents.handle_reactions() /obj/item/weapon/reagent_containers/food/drinks/examine(mob/user) if(!..(user, 1)) return if(!reagents || reagents.total_volume==0) - user << " \The [src] is empty!" + to_chat(user, " \The [src] is empty!") + else if (reagents.total_volume<=src.volume/4) - user << " \The [src] is almost empty!" + to_chat(user, " \The [src] is almost empty!") + else if (reagents.total_volume<=src.volume*0.66) - user << " \The [src] is half full!" // We're all optimistic, right?! + to_chat(user, " \The [src] is half full!")// We're all optimistic, right?! + + else if (reagents.total_volume<=src.volume*0.90) - user << " \The [src] is almost full!" + to_chat(user, " \The [src] is almost full!") + else - user << " \The [src] is full!" + to_chat(user, " \The [src] is full!") + //////////////////////////////////////////////////////////////////////////////// /// Drinks. END diff --git a/code/modules/reagents/reagent_containers/food/sandwich.dm b/code/modules/reagents/reagent_containers/food/sandwich.dm index 943c5022dc4..07bc96abbf1 100644 --- a/code/modules/reagents/reagent_containers/food/sandwich.dm +++ b/code/modules/reagents/reagent_containers/food/sandwich.dm @@ -25,16 +25,19 @@ sandwich_limit += 4 if(src.contents.len > sandwich_limit) - user << "\red If you put anything else on \the [src] it's going to collapse." + to_chat(user, "\red If you put anything else on \the [src] it's going to collapse.") + return else if(istype(W,/obj/item/weapon/shard)) - user << "\blue You hide [W] in \the [src]." + to_chat(user, "\blue You hide [W] in \the [src].") + user.drop_item() W.loc = src update() return else if(istype(W,/obj/item/weapon/reagent_containers/food/snacks)) - user << "\blue You layer [W] over \the [src]." + to_chat(user, "\blue You layer [W] over \the [src].") + var/obj/item/weapon/reagent_containers/F = W F.reagents.trans_to(src, F.reagents.total_volume) user.drop_item() @@ -83,7 +86,8 @@ /obj/item/weapon/reagent_containers/food/snacks/csandwich/examine(mob/user) ..(user) var/obj/item/O = pick(contents) - user << "\blue You think you can see [O.name] in there." + to_chat(user, "\blue You think you can see [O.name] in there.") + /obj/item/weapon/reagent_containers/food/snacks/csandwich/attack(mob/M as mob, mob/user as mob, def_zone) @@ -98,7 +102,8 @@ H = M if(H && shard && M == user) //This needs a check for feeding the food to other people, but that could be abusable. - H << "\red You lacerate your mouth on a [shard.name] in the sandwich!" + to_chat(H, "\red You lacerate your mouth on a [shard.name] in the sandwich!") + H.adjustBruteLoss(5) //TODO: Target head if human. ..() */ \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index 5e7d80a75e2..705e3ab625d 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -21,7 +21,8 @@ spawn(0) if(!reagents.total_volume) if(M == usr) - usr << "You finish eating \the [src]." + to_chat(usr, "You finish eating \the [src].") + usr.visible_message("[usr] finishes eating \the [src].") usr.unEquip(src) //so icons update :[ @@ -39,7 +40,8 @@ /obj/item/weapon/reagent_containers/food/snacks/attack(mob/M as mob, mob/user as mob, def_zone) if(reagents && !reagents.total_volume) //Shouldn't be needed but it checks to see if it has anything left in it. - user << "None of [src] left, oh no!" + to_chat(user, "None of [src] left, oh no!") + M.unEquip(src) //so icons update :[ qdel(src) return 0 @@ -60,11 +62,14 @@ if (bitecount==0) return else if (bitecount==1) - user << "\blue \The [src] was bitten by someone!" + to_chat(user, "\blue \The [src] was bitten by someone!") + else if (bitecount<=3) - user << "\blue \The [src] was bitten [bitecount] times!" + to_chat(user, "\blue \The [src] was bitten [bitecount] times!") + else - user << "\blue \The [src] was bitten multiple times!" + to_chat(user, "\blue \The [src] was bitten multiple times!") + /obj/item/weapon/reagent_containers/food/snacks/attackby(obj/item/weapon/W, mob/user, params) @@ -81,7 +86,8 @@ var/obj/item/weapon/kitchen/utensil/U = W if(U.contents.len >= U.max_contents) - user << "You cannot fit anything else on your [U]." + to_chat(user, "You cannot fit anything else on your [U].") + return user.visible_message( \ @@ -132,7 +138,8 @@ else if(W.w_class <= 2 && istype(src,/obj/item/weapon/reagent_containers/food/snacks/sliceable)) if(!iscarbon(user)) return 1 - user << "\red You slip [W] inside [src]." + to_chat(user, "\red You slip [W] inside [src].") + user.unEquip(W) if ((user.client && user.s_active != src)) user.client.screen -= W @@ -148,7 +155,8 @@ !(locate(/obj/machinery/optable) in src.loc) && \ !(locate(/obj/item/weapon/storage/bag/tray) in src.loc) \ ) - user << "\red You cannot slice [src] here! You need a table or at least a tray to do it." + to_chat(user, "\red You cannot slice [src] here! You need a table or at least a tray to do it.") + return 1 var/slices_lost = 0 if (!inaccurate) @@ -193,7 +201,8 @@ bitecount++ else if(ismouse(M)) var/mob/living/simple_animal/mouse/N = M - N << text("\blue You nibble away at [src].") + to_chat(N, text("\blue You nibble away at [src].")) + if(prob(50)) N.visible_message("[N] nibbles away at [src].", "") //N.emote("nibbles away at the [src]") @@ -509,10 +518,12 @@ var/clr = C.colourName if(!(clr in list("blue","green","mime","orange","purple","rainbow","red","yellow"))) - usr << "\blue The egg refuses to take on this color!" + to_chat(usr, "\blue The egg refuses to take on this color!") + return - usr << "\blue You color \the [src] [clr]" + to_chat(usr, "\blue You color \the [src] [clr]") + icon_state = "egg-[clr]" item_color = clr else @@ -1141,7 +1152,8 @@ bitesize = 0.1 //this snack is supposed to be eating during looooong time. And this it not dinner food! --rastaf0 On_Consume() if(prob(unpopped)) //lol ...what's the point? - usr << "\red You bite down on an un-popped kernel!" + to_chat(usr, "\red You bite down on an un-popped kernel!") + unpopped = max(0, unpopped-1) ..() @@ -1602,14 +1614,16 @@ /obj/item/weapon/reagent_containers/food/snacks/monkeycube/afterattack(obj/O, mob/user, proximity) if(!proximity) return if(istype(O,/obj/structure/sink) && !wrapped) - user << "You place [src] under a stream of water..." + to_chat(user, "You place [src] under a stream of water...") + user.drop_item() forceMove(get_turf(O)) return Expand() if(istype(O, /obj/machinery/computer/camera_advanced/xenobio)) var/obj/machinery/computer/camera_advanced/xenobio/X = O X.monkeys++ - user << "You feed [src] to the [X]. It now has [X.monkeys] monkey cubes stored." + to_chat(user, "You feed [src] to the [X]. It now has [X.monkeys] monkey cubes stored.") + qdel(src) return ..() @@ -1638,7 +1652,8 @@ /obj/item/weapon/reagent_containers/food/snacks/monkeycube/proc/Unwrap(mob/user) icon_state = "monkeycube" desc = "Just add water!" - user << "You unwrap the cube." + to_chat(user, "You unwrap the cube.") + wrapped = 0 /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped @@ -2827,7 +2842,8 @@ if( open && pizza ) user.put_in_hands( pizza ) - user << "\red You take the [src.pizza] out of the [src]." + to_chat(user, "\red You take the [src.pizza] out of the [src].") + src.pizza = null update_icon() return @@ -2841,7 +2857,8 @@ boxes -= box user.put_in_hands( box ) - user << "\red You remove the topmost [src] from your hand." + to_chat(user, "\red You remove the topmost [src] from your hand.") + box.update_icon() update_icon() return @@ -2880,11 +2897,14 @@ box.update_icon() update_icon() - user << "\red You put the [box] ontop of the [src]!" + to_chat(user, "\red You put the [box] ontop of the [src]!") + else - user << "\red The stack is too high!" + to_chat(user, "\red The stack is too high!") + else - user << "\red Close the [box] first!" + to_chat(user, "\red Close the [box] first!") + return @@ -2897,9 +2917,11 @@ update_icon() - user << "\red You put the [I] in the [src]!" + to_chat(user, "\red You put the [I] in the [src]!") + else - user << "\red You try to push the [I] through the lid but it doesn't work!" + to_chat(user, "\red You try to push the [I] through the lid but it doesn't work!") + return if( istype(I, /obj/item/weapon/pen/) ) @@ -3202,10 +3224,12 @@ if(istype(I, /obj/item/weapon/kitchen/rollingpin)) if(isturf(loc)) new /obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough(loc) - user << "You flatten [src]." + to_chat(user, "You flatten [src].") + qdel(src) else - user << "You need to put [src] on a surface to roll it out!" + to_chat(user, "You need to put [src] on a surface to roll it out!") + else ..() diff --git a/code/modules/reagents/reagent_containers/food/snacks/meat.dm b/code/modules/reagents/reagent_containers/food/snacks/meat.dm index 12fb6f6db69..1b65d110cb3 100644 --- a/code/modules/reagents/reagent_containers/food/snacks/meat.dm +++ b/code/modules/reagents/reagent_containers/food/snacks/meat.dm @@ -17,7 +17,8 @@ new /obj/item/weapon/reagent_containers/food/snacks/rawcutlet(src) new /obj/item/weapon/reagent_containers/food/snacks/rawcutlet(src) new /obj/item/weapon/reagent_containers/food/snacks/rawcutlet(src) - user << "You cut the meat in thin strips." + to_chat(user, "You cut the meat in thin strips.") + qdel(src) else ..() diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm index dca1b419103..aa291bee0d0 100644 --- a/code/modules/reagents/reagent_containers/glass_containers.dm +++ b/code/modules/reagents/reagent_containers/glass_containers.dm @@ -50,15 +50,18 @@ if(!..(user, 2)) return if (!is_open_container()) - user << "Airtight lid seals it completely." + to_chat(user, "Airtight lid seals it completely.") + /obj/item/weapon/reagent_containers/glass/attack_self() ..() if (is_open_container()) - usr << "You put the lid on \the [src]." + to_chat(usr, "You put the lid on \the [src].") + flags ^= OPENCONTAINER else - usr << "You take the lid off \the [src]." + to_chat(usr, "You take the lid off \the [src].") + flags |= OPENCONTAINER update_icon() @@ -72,7 +75,8 @@ return if(ismob(target) && target.reagents && reagents.total_volume) - user << "You splash the solution onto [target]." + to_chat(user, "You splash the solution onto [target].") + var/mob/living/M = target var/list/injected = list() @@ -96,23 +100,28 @@ else if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us. if(!target.reagents.total_volume && target.reagents) - user << "[target] is empty." + to_chat(user, "[target] is empty.") + return if(reagents.total_volume >= reagents.maximum_volume) - user << "[src] is full." + to_chat(user, "[src] is full.") + return var/trans = target.reagents.trans_to(src, target:amount_per_transfer_from_this) - user << "You fill [src] with [trans] units of the contents of [target]." + to_chat(user, "You fill [src] with [trans] units of the contents of [target].") + else if(target.is_open_container() && target.reagents) //Something like a glass. Player probably wants to transfer TO it. if(!reagents.total_volume) - user << "[src] is empty." + to_chat(user, "[src] is empty.") + return if(target.reagents.total_volume >= target.reagents.maximum_volume) - user << "[target] is full." + to_chat(user, "[target] is full.") + return // /vg/: Logging transfers of bad things @@ -127,10 +136,12 @@ log_game("[key_name(user)] added [reagents.get_reagent_ids(1)] to \a [target] with [src].") var/trans = reagents.trans_to(target, amount_per_transfer_from_this) - user << "You transfer [trans] units of the solution to [target]." + to_chat(user, "You transfer [trans] units of the solution to [target].") + else if(istype(target, /obj/item/weapon/reagent_containers/glass) && !target.is_open_container()) - user << "You cannot fill [target] while it is sealed." + to_chat(user, "You cannot fill [target] while it is sealed.") + return /*else if(istype(target, /obj/machinery/bunsen_burner)) @@ -143,7 +154,8 @@ return else if(reagents.total_volume) - user << "You splash the solution onto [target]." + to_chat(user, "You splash the solution onto [target].") + reagents.reaction(target, TOUCH) spawn(5) reagents.clear_reagents() return @@ -155,14 +167,17 @@ if(is_hot(I)) if(reagents) reagents.chem_temp += 15 - user << "You heat [src] with [I]." + to_chat(user, "You heat [src] with [I].") + reagents.handle_reactions() if(istype(I, /obj/item/weapon/pen) || istype(I, /obj/item/device/flashlight/pen)) var/tmp_label = sanitize(input(user, "Enter a label for [name]","Label",label_text)) if(length(tmp_label) > MAX_NAME_LEN) - user << "The label can be at most [MAX_NAME_LEN] characters long." + to_chat(user, "The label can be at most [MAX_NAME_LEN] characters long.") + else - user << "You set the label to \"[tmp_label]\"." + to_chat(user, "You set the label to \"[tmp_label]\".") + label_text = tmp_label update_name_label() if(istype(I,/obj/item/weapon/storage/bag)) @@ -230,12 +245,14 @@ if(usr.stat || !usr.canmove || usr.restrained()) return if (assembly) - usr << "You detach [assembly] from \the [src]" + to_chat(usr, "You detach [assembly] from \the [src]") + usr.put_in_hands(assembly) assembly = null update_icon() else - usr << "There is no assembly to remove." + to_chat(usr, "There is no assembly to remove.") + /obj/item/weapon/reagent_containers/glass/beaker/proc/heat_beaker() if(reagents) @@ -245,7 +262,8 @@ /obj/item/weapon/reagent_containers/glass/beaker/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if (istype(W,/obj/item/device/assembly_holder)) if (assembly) - usr << "The [src] already has an assembly." + to_chat(usr, "The [src] already has an assembly.") + return ..() assembly = W user.drop_item() @@ -343,7 +361,8 @@ /obj/item/weapon/reagent_containers/glass/bucket/attackby(var/obj/D, mob/user as mob, params) if(isprox(D)) - user << "You add [D] to [src]." + to_chat(user, "You add [D] to [src].") + qdel(D) user.put_in_hands(new /obj/item/weapon/bucket_sensor) user.unEquip(src) diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index eb932e8488f..268004299c0 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -17,13 +17,16 @@ /obj/item/weapon/reagent_containers/hypospray/attack(mob/living/M, mob/user) if(!reagents.total_volume) - user << "\red [src] is empty." + to_chat(user, "\red [src] is empty.") + return if(!istype(M)) return if(reagents.total_volume && (ignore_flags || M.can_inject(user, 1))) - user << "\blue You inject [M] with [src]." - M << "\red You feel a tiny prick!" + to_chat(user, "\blue You inject [M] with [src].") + + to_chat(M, "\red You feel a tiny prick!") + src.reagents.add_reagent(M) if(M.reagents) @@ -41,7 +44,8 @@ M.LAssailant = user var/trans = reagents.trans_to(M, amount_per_transfer_from_this) - user << "\blue [trans] units injected. [reagents.total_volume] units remaining in [src]." + to_chat(user, "\blue [trans] units injected. [reagents.total_volume] units remaining in [src].") + return @@ -102,9 +106,11 @@ /obj/item/weapon/reagent_containers/hypospray/autoinjector/examine(mob/user) ..(user) if(reagents && reagents.reagent_list.len) - user << "\blue It is currently loaded." + to_chat(user, "\blue It is currently loaded.") + else - user << "\blue It is spent." + to_chat(user, "\blue It is spent.") + /obj/item/weapon/reagent_containers/hypospray/autoinjector/teporone //basilisks name = "teporone autoinjector" diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 6dac43db7d1..c4920fb395b 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -33,7 +33,8 @@ if(target.is_open_container() != 0 && target.reagents) if(!target.reagents.total_volume) - user << "[target] is empty. Cant dissolve [src]." + to_chat(user, "[target] is empty. Cant dissolve [src].") + return // /vg/: Logging transfers of bad things @@ -47,7 +48,8 @@ message_admins("[user.name] ([user.ckey]) added [reagents.get_reagent_ids(1)] to \a [target] with [src].[hl] (JMP)") log_game("[user.name] ([user.ckey]) added [reagents.get_reagent_ids(1)] to \a [target] with [src].") - user << "You dissolve [src] in [target]." + to_chat(user, "You dissolve [src] in [target].") + reagents.trans_to(target, reagents.total_volume) for(var/mob/O in viewers(2, user)) O.show_message("[user] puts something in [target].", 1) diff --git a/code/modules/reagents/reagent_containers/robodropper.dm b/code/modules/reagents/reagent_containers/robodropper.dm index c5da1639304..c039a747255 100644 --- a/code/modules/reagents/reagent_containers/robodropper.dm +++ b/code/modules/reagents/reagent_containers/robodropper.dm @@ -15,11 +15,13 @@ if(filled) if(target.reagents.total_volume >= target.reagents.maximum_volume) - user << "\red [target] is full." + to_chat(user, "\red [target] is full.") + return if(!target.is_open_container() && !ismob(target) && !istype(target,/obj/item/weapon/reagent_containers/food)) //You can inject humans and food but you cant remove the shit. - user << "\red You cannot directly fill this object." + to_chat(user, "\red You cannot directly fill this object.") + return @@ -62,7 +64,8 @@ src.reagents.reaction(safe_thing, TOUCH) - user << "\blue You transfer [trans] units of the solution." + to_chat(user, "\blue You transfer [trans] units of the solution.") + if (src.reagents.total_volume<=0) filled = 0 icon_state = "[initial(icon_state)]" @@ -88,7 +91,8 @@ M.LAssailant = user trans = src.reagents.trans_to(target, amount_per_transfer_from_this) - user << "\blue You transfer [trans] units of the solution." + to_chat(user, "\blue You transfer [trans] units of the solution.") + if (src.reagents.total_volume<=0) filled = 0 icon_state = "[initial(icon_state)]" @@ -96,16 +100,19 @@ else if(!target.is_open_container() && !istype(target,/obj/structure/reagent_dispensers)) - user << "\red You cannot directly remove reagents from [target]." + to_chat(user, "\red You cannot directly remove reagents from [target].") + return if(!target.reagents.total_volume) - user << "\red [target] is empty." + to_chat(user, "\red [target] is empty.") + return var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) - user << "\blue You fill the dropper with [trans] units of the solution." + to_chat(user, "\blue You fill the dropper with [trans] units of the solution.") + filled = 1 icon_state = "[initial(icon_state)][filled]" diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 04859c66c32..b1c9f631e26 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -27,19 +27,23 @@ if(istype(A, /obj/structure/reagent_dispensers) && get_dist(src,A) <= 1) //this block copypasted from reagent_containers/glass, for lack of a better solution if(!A.reagents.total_volume && A.reagents) - user << "\The [A] is empty." + to_chat(user, "\The [A] is empty.") + return if(reagents.total_volume >= reagents.maximum_volume) - user << "\The [src] is full." + to_chat(user, "\The [src] is full.") + return var/trans = A.reagents.trans_to(src, A:amount_per_transfer_from_this) - user << "You fill \the [src] with [trans] units of the contents of \the [A]." + to_chat(user, "You fill \the [src] with [trans] units of the contents of \the [A].") + return if(reagents.total_volume < amount_per_transfer_from_this) - user << "\The [src] is empty!" + to_chat(user, "\The [src] is empty!") + return spray(A) @@ -79,11 +83,13 @@ amount_per_transfer_from_this = (amount_per_transfer_from_this == 10 ? 5 : 10) spray_currentrange = (spray_currentrange == 1 ? spray_maxrange : 1) - user << "You [amount_per_transfer_from_this == 10 ? "remove" : "fix"] the nozzle. You'll now use [amount_per_transfer_from_this] units per spray." + to_chat(user, "You [amount_per_transfer_from_this == 10 ? "remove" : "fix"] the nozzle. You'll now use [amount_per_transfer_from_this] units per spray.") + /obj/item/weapon/reagent_containers/spray/examine(mob/user) if(..(user, 0) && user==src.loc) - user << "[round(src.reagents.total_volume)] units left." + to_chat(user, "[round(src.reagents.total_volume)] units left.") + /obj/item/weapon/reagent_containers/spray/verb/empty() @@ -95,7 +101,8 @@ if (alert(usr, "Are you sure you want to empty that?", "Empty Bottle:", "Yes", "No") != "Yes") return if(isturf(usr.loc) && src.loc == usr) - usr << "You empty \the [src] onto the floor." + to_chat(usr, "You empty \the [src] onto the floor.") + reagents.reaction(usr.loc) src.reagents.clear_reagents() @@ -207,7 +214,8 @@ /obj/item/weapon/reagent_containers/spray/chemsprayer/attack_self(var/mob/user) amount_per_transfer_from_this = (amount_per_transfer_from_this == 10 ? 5 : 10) - user << "You adjust the output switch. You'll now use [amount_per_transfer_from_this] units per spray." + to_chat(user, "You adjust the output switch. You'll now use [amount_per_transfer_from_this] units per spray.") + // Plant-B-Gone diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 5978c615942..fffd08b3352 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -62,7 +62,8 @@ return if(mode == SYRINGE_BROKEN) - user << "\red This syringe is broken!" + to_chat(user, "\red This syringe is broken!") + return /* if (user.a_intent == I_HARM && ismob(target)) @@ -76,23 +77,28 @@ if(SYRINGE_DRAW) if(reagents.total_volume >= reagents.maximum_volume) - user << "\red The syringe is full." + to_chat(user, "\red The syringe is full.") + return if(ismob(target))//Blood! if(istype(target, /mob/living/carbon/slime)) - user << "\red You are unable to locate any blood." + to_chat(user, "\red You are unable to locate any blood.") + return if(src.reagents.has_reagent("blood")) - user << "\red There is already a blood sample in this syringe" + to_chat(user, "\red There is already a blood sample in this syringe") + return if(istype(target, /mob/living/carbon))//maybe just add a blood reagent to all mobs. Then you can suck them dry...With hundreds of syringes. Jolly good idea. var/mob/living/carbon/T = target if(!T.dna) - usr << "You are unable to locate any blood. (To be specific, your target seems to be missing their DNA datum)" + to_chat(usr, "You are unable to locate any blood. (To be specific, your target seems to be missing their DNA datum)") + return if(NOCLONE in T.mutations) //target done been et, no more blood in him - user << "\red You are unable to locate any blood." + to_chat(user, "\red You are unable to locate any blood.") + return @@ -100,7 +106,8 @@ if(istype(target,/mob/living/carbon/human)) var/mob/living/carbon/human/H = T if(H.species.flags & NO_BLOOD) - usr << "You are unable to locate any blood." + to_chat(usr, "You are unable to locate any blood.") + return if(H.wear_suit && istype(H.wear_suit,/obj/item/clothing/suit/space)) time = 60 @@ -114,7 +121,8 @@ var/amount = src.reagents.maximum_volume - src.reagents.total_volume if(amount == 0) - usr << "The syringe is full!" + to_chat(usr, "The syringe is full!") + return var/datum/reagent/B @@ -133,7 +141,8 @@ src.on_reagent_change() src.reagents.handle_reactions() - user << "\blue You take a blood sample from [target]" + to_chat(user, "\blue You take a blood sample from [target]") + for(var/mob/O in viewers(4, user)) O.show_message("\red [user] takes a blood sample from [target].", 1) else @@ -141,47 +150,56 @@ else //if not mob if(!target.reagents.total_volume) - user << "\red [target] is empty." + to_chat(user, "\red [target] is empty.") + return if(!target.is_open_container() && !istype(target,/obj/structure/reagent_dispensers) && !istype(target,/obj/item/slime_extract)) - user << "\red You cannot directly remove reagents from this object." + to_chat(user, "\red You cannot directly remove reagents from this object.") + return var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) // transfer from, transfer to - who cares? - user << "\blue You fill the syringe with [trans] units of the solution." + to_chat(user, "\blue You fill the syringe with [trans] units of the solution.") + if (reagents.total_volume >= reagents.maximum_volume) mode=!mode update_icon() if(SYRINGE_INJECT) if(!reagents.total_volume) - user << "\red The Syringe is empty." + to_chat(user, "\red The Syringe is empty.") + return if(istype(target, /obj/item/weapon/implantcase/chem)) return if(!target.is_open_container() && !ismob(target) && !istype(target, /obj/item/weapon/reagent_containers/food) && !istype(target, /obj/item/slime_extract) && !istype(target, /obj/item/clothing/mask/cigarette) && !istype(target, /obj/item/weapon/storage/fancy/cigarettes)) - user << "\red You cannot directly fill this object." + to_chat(user, "\red You cannot directly fill this object.") + return if(istype(target, /obj/item/clothing/mask/cigarette)) var/obj/item/clothing/mask/cigarette/C = target if(istype(C.loc, /obj/item/weapon/storage/fancy/cigarettes)) - user << "\red You cannot inject a cigarette while it's still in the pack." + to_chat(user, "\red You cannot inject a cigarette while it's still in the pack.") + return if(target.reagents.total_volume >= target.reagents.maximum_volume) - user << "\red [target] is full." + to_chat(user, "\red [target] is full.") + return var/mob/living/carbon/human/H = target if(istype(H)) var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting) if(!affected) - user << "\The [H] is missing that limb!" + to_chat(user, "\The [H] is missing that limb!") + return /* else if(affected.status & ORGAN_ROBOT) - user << "You cannot inject a robotic limb." + to_chat(user, "You cannot inject a robotic limb.") + return */ if(ismob(target) && target != user) @@ -256,7 +274,8 @@ C.inject_blood(src,5) else trans = src.reagents.trans_to(target, amount_per_transfer_from_this) - user << "\blue You inject [trans] units of the solution. The syringe now contains [src.reagents.total_volume] units." + to_chat(user, "\blue You inject [trans] units of the solution. The syringe now contains [src.reagents.total_volume] units.") + if (reagents.total_volume <= 0 && mode==SYRINGE_INJECT) mode = SYRINGE_DRAW update_icon() @@ -307,7 +326,8 @@ var/obj/item/organ/external/affecting = target:get_organ(target_zone) if (!affecting || (affecting.status & ORGAN_DESTROYED) || affecting.is_stump()) - user << "They are missing that limb!" + to_chat(user, "They are missing that limb!") + return var/hit_area = affecting.name @@ -385,40 +405,48 @@ if(SYRINGE_DRAW) if(reagents.total_volume >= reagents.maximum_volume) - user << "\red The syringe is full." + to_chat(user, "\red The syringe is full.") + return if(ismob(target)) if(istype(target, /mob/living/carbon))//I Do not want it to suck 50 units out of people - usr << "This needle isn't designed for drawing blood." + to_chat(usr, "This needle isn't designed for drawing blood.") + return else //if not mob if(!target.reagents.total_volume) - user << "\red [target] is empty." + to_chat(user, "\red [target] is empty.") + return if(!target.is_open_container() && !istype(target,/obj/structure/reagent_dispensers)) - user << "\red You cannot directly remove reagents from this object." + to_chat(user, "\red You cannot directly remove reagents from this object.") + return var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) // transfer from, transfer to - who cares? - user << "\blue You fill the syringe with [trans] units of the solution." + to_chat(user, "\blue You fill the syringe with [trans] units of the solution.") + if (reagents.total_volume >= reagents.maximum_volume) mode=!mode update_icon() if(SYRINGE_INJECT) if(!reagents.total_volume) - user << "\red The Syringe is empty." + to_chat(user, "\red The Syringe is empty.") + return if(istype(target, /obj/item/weapon/implantcase/chem)) return if(!target.is_open_container() && !ismob(target) && !istype(target, /obj/item/weapon/reagent_containers/food)) - user << "\red You cannot directly fill this object." + to_chat(user, "\red You cannot directly fill this object.") + return if(target.reagents.total_volume >= target.reagents.maximum_volume) - user << "\red [target] is full." + to_chat(user, "\red [target] is full.") + return if(ismob(target) && target != user) @@ -432,7 +460,8 @@ src.reagents.reaction(target, INGEST) spawn(5) var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this) - user << "\blue You inject [trans] units of the solution. The syringe now contains [src.reagents.total_volume] units." + to_chat(user, "\blue You inject [trans] units of the solution. The syringe now contains [src.reagents.total_volume] units.") + if (reagents.total_volume >= reagents.maximum_volume && mode==SYRINGE_INJECT) mode = SYRINGE_DRAW update_icon() diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index ed2809896c7..04857089fb9 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -26,12 +26,15 @@ /obj/structure/reagent_dispensers/examine(mob/user) if(!..(user, 2)) return - user << "\blue It contains:" + to_chat(user, "\blue It contains:") + if(reagents && reagents.reagent_list.len) for(var/datum/reagent/R in reagents.reagent_list) - user << "\blue [R.volume] units of [R.name]" + to_chat(user, "\blue [R.volume] units of [R.name]") + else - user << "\blue Nothing." + to_chat(user, "\blue Nothing.") + /obj/structure/reagent_dispensers/verb/set_APTFT() //set amount_per_transfer_from_this set name = "Set transfer amount" @@ -115,7 +118,8 @@ if(!..(user, 2)) return if(rig) - usr << "There is some kind of device rigged to the tank." + to_chat(usr, "There is some kind of device rigged to the tank.") + /obj/structure/reagent_dispensers/fueltank/attack_hand() if (rig) @@ -129,7 +133,8 @@ /obj/structure/reagent_dispensers/fueltank/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if (istype(W,/obj/item/device/assembly_holder) && accepts_rig) if (rig) - user << "\red There is another device in the way." + to_chat(user, "\red There is another device in the way.") + return ..() user.visible_message("[user] begins rigging [W] to \the [src].", "You begin rigging [W] to \the [src]") if(do_after(user, 20, target = src)) diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index c4ba69dc71a..59bda4fe8c3 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -222,7 +222,8 @@ // attack with hand, switch position /obj/machinery/conveyor_switch/attack_hand(mob/user) if(!allowed(user)) - user << "Access denied." + to_chat(user, "Access denied.") + return diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm index 10fb01573d5..5c961aefb89 100644 --- a/code/modules/recycling/disposal-construction.dm +++ b/code/modules/recycling/disposal-construction.dm @@ -90,7 +90,8 @@ return if(anchored) - usr << "You must unfasten the pipe before rotating it." + to_chat(usr, "You must unfasten the pipe before rotating it.") + return dir = turn(dir, -90) @@ -103,7 +104,8 @@ return if(anchored) - usr << "You must unfasten the pipe before flipping it." + to_chat(usr, "You must unfasten the pipe before flipping it.") + return dir = turn(dir, 180) @@ -164,17 +166,20 @@ var/turf/T = src.loc if(T.intact) - user << "You can only attach the [nicetype] if the floor plating is removed." + to_chat(user, "You can only attach the [nicetype] if the floor plating is removed.") + return var/obj/structure/disposalpipe/CP = locate() in T if(ptype>=6 && ptype <= 8) // Disposal or outlet if(CP) // There's something there if(!istype(CP,/obj/structure/disposalpipe/trunk)) - user << "The [nicetype] requires a trunk underneath it in order to work." + to_chat(user, "The [nicetype] requires a trunk underneath it in order to work.") + return else // Nothing under, fuck. - user << "The [nicetype] requires a trunk underneath it in order to work." + to_chat(user, "The [nicetype] requires a trunk underneath it in order to work.") + return else if(CP) @@ -183,7 +188,8 @@ if(istype(CP, /obj/structure/disposalpipe/broken)) pdir = CP.dir if(pdir & dpdir) - user << "There is already a [nicetype] at that location." + to_chat(user, "There is already a [nicetype] at that location.") + return @@ -195,7 +201,8 @@ density = 0 else density = 1 - user << "You detach the [nicetype] from the underfloor." + to_chat(user, "You detach the [nicetype] from the underfloor.") + else anchored = 1 if(ispipe) @@ -203,7 +210,8 @@ density = 0 else density = 1 // We don't want disposal bins or outlets to go density 0 - user << "You attach the [nicetype] to the underfloor." + to_chat(user, "You attach the [nicetype] to the underfloor.") + playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) update() @@ -212,10 +220,12 @@ var/obj/item/weapon/weldingtool/W = I if(W.remove_fuel(0,user)) playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1) - user << "Welding the [nicetype] in place." + to_chat(user, "Welding the [nicetype] in place.") + if(do_after(user, 20, target = src)) if(!src || !W.isOn()) return - user << "The [nicetype] has been welded in place!" + to_chat(user, "The [nicetype] has been welded in place!") + update() // TODO: Make this neat if(ispipe) // Pipe @@ -254,8 +264,10 @@ qdel(src) return else - user << "You need more welding fuel to complete this task." + to_chat(user, "You need more welding fuel to complete this task.") + return else - user << "You need to attach it to the plating first!" + to_chat(user, "You need to attach it to the plating first!") + return diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index ce5ca78ebe0..0f549f7b39b 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -69,30 +69,36 @@ if(mode<=0) // It's off if(istype(I, /obj/item/weapon/screwdriver)) if(contents.len > 0) - user << "Eject the items first!" + to_chat(user, "Eject the items first!") + return if(mode==0) // It's off but still not unscrewed mode=-1 // Set it to doubleoff l0l playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "You remove the screws around the power connection." + to_chat(user, "You remove the screws around the power connection.") + return else if(mode==-1) mode=0 playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "You attach the screws around the power connection." + to_chat(user, "You attach the screws around the power connection.") + return else if(istype(I,/obj/item/weapon/weldingtool) && mode==-1) if(contents.len > 0) - user << "Eject the items first!" + to_chat(user, "Eject the items first!") + return var/obj/item/weapon/weldingtool/W = I if(W.remove_fuel(0,user)) playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1) - user << "You start slicing the floorweld off the disposal unit." + to_chat(user, "You start slicing the floorweld off the disposal unit.") + if(do_after(user,20, target = src)) if(!src || !W.isOn()) return - user << "You sliced the floorweld off the disposal unit." + to_chat(user, "You sliced the floorweld off the disposal unit.") + var/obj/structure/disposalconstruct/C = new (src.loc) src.transfer_fingerprints_to(C) C.ptype = 6 // 6 = disposal unit @@ -102,11 +108,13 @@ qdel(src) return else - user << "You need more welding fuel to complete this task." + to_chat(user, "You need more welding fuel to complete this task.") + return if(istype(I, /obj/item/weapon/melee/energy/blade)) - user << "You can't place that item inside the disposal unit." + to_chat(user, "You can't place that item inside the disposal unit.") + return if(istype(I, /obj/item/weapon/storage)) @@ -146,7 +154,8 @@ if(I) I.loc = src - user << "You place \the [I] into the [src]." + to_chat(user, "You place \the [I] into the [src].") + for(var/mob/M in viewers(src)) if(M == user) continue @@ -176,10 +185,12 @@ if(target == user && !user.stat && !user.weakened && !user.stunned && !user.paralysis) // if drop self, then climbed in // must be awake, not stunned or whatever msg = "[user.name] climbs into the [src]." - user << "You climb into the [src]." + to_chat(user, "You climb into the [src].") + else if(target != user && !user.restrained() && !user.stat && !user.weakened && !user.stunned && !user.paralysis) msg = "[user.name] stuffs [target.name] into the [src]!" - user << "You stuff [target.name] into the [src]!" + to_chat(user, "You stuff [target.name] into the [src]!") + user.attack_log += text("\[[time_stamp()]\] Has placed [key_name(target)] in disposals.") target.attack_log += text("\[[time_stamp()]\] Has been placed in disposals by [key_name(user)]") @@ -239,7 +250,8 @@ return if(user && user.loc == src) - usr << "\red You cannot reach the controls from inside." + to_chat(usr, "\red You cannot reach the controls from inside.") + return // Clumsy folks can only flush it. @@ -279,11 +291,13 @@ /obj/machinery/disposal/Topic(href, href_list) if(usr.loc == src) - usr << "\red You cannot reach the controls from inside." + to_chat(usr, "\red You cannot reach the controls from inside.") + return if(mode==-1 && !href_list["eject"]) // only allow ejecting if mode is -1 - usr << "\red The disposal units power is disabled." + to_chat(usr, "\red The disposal units power is disabled.") + return if(..()) @@ -636,7 +650,8 @@ if (src.loc) for (var/mob/M in hearers(src.loc.loc)) - M << "CLONG, clong!" + to_chat(M, "CLONG, clong!") + playsound(src.loc, 'sound/effects/clang.ogg', 50, 0, 0) @@ -884,15 +899,18 @@ // check if anything changed over 2 seconds var/turf/uloc = user.loc var/atom/wloc = W.loc - user << "Slicing the disposal pipe." + to_chat(user, "Slicing the disposal pipe.") + sleep(30) if(!W.isOn()) return if(user.loc == uloc && wloc == W.loc) welded() else - user << "You must stay still while welding the pipe." + to_chat(user, "You must stay still while welding the pipe.") + else - user << "You need more welding fuel to cut the pipe." + to_chat(user, "You need more welding fuel to cut the pipe.") + return // called when pipe is cut with welder @@ -1032,7 +1050,8 @@ sortType = O.currTag playsound(src.loc, 'sound/machines/twobeep.ogg', 100, 1) var/tag = uppertext(TAGGERLOCATIONS[O.currTag]) - user << "\blue Changed filter to [tag]" + to_chat(user, "\blue Changed filter to [tag]") + updatedesc() @@ -1200,15 +1219,18 @@ // check if anything changed over 2 seconds var/turf/uloc = user.loc var/atom/wloc = W.loc - user << "Slicing the disposal pipe." + to_chat(user, "Slicing the disposal pipe.") + sleep(30) if(!W.isOn()) return if(user.loc == uloc && wloc == W.loc) welded() else - user << "You must stay still while welding the pipe." + to_chat(user, "You must stay still while welding the pipe.") + else - user << "You need more welding fuel to cut the pipe." + to_chat(user, "You need more welding fuel to cut the pipe.") + return // would transfer to next pipe segment, but we are in a trunk @@ -1315,21 +1337,25 @@ if(mode==0) mode=1 playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "You remove the screws around the power connection." + to_chat(user, "You remove the screws around the power connection.") + return else if(mode==1) mode=0 playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "You attach the screws around the power connection." + to_chat(user, "You attach the screws around the power connection.") + return else if(istype(I,/obj/item/weapon/weldingtool) && mode==1) var/obj/item/weapon/weldingtool/W = I if(W.remove_fuel(0,user)) playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1) - user << "You start slicing the floorweld off the disposal outlet." + to_chat(user, "You start slicing the floorweld off the disposal outlet.") + if(do_after(user,20, target = src)) if(!src || !W.isOn()) return - user << "You sliced the floorweld off the disposal outlet." + to_chat(user, "You sliced the floorweld off the disposal outlet.") + var/obj/structure/disposalconstruct/C = new (src.loc) src.transfer_fingerprints_to(C) C.ptype = 7 // 7 = outlet @@ -1339,7 +1365,8 @@ qdel(src) return else - user << "You need more welding fuel to complete this task." + to_chat(user, "You need more welding fuel to complete this task.") + return diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 07c245d889d..b872867ad07 100755 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -31,14 +31,16 @@ if(sortTag != O.currTag) var/tag = uppertext(TAGGERLOCATIONS[O.currTag]) - user << "*[tag]*" + to_chat(user, "*[tag]*") + sortTag = O.currTag playsound(loc, 'sound/machines/twobeep.ogg', 100, 1) else if(istype(W, /obj/item/weapon/pen)) var/str = copytext(sanitize(input(user,"Label text?","Set label","")),1,MAX_NAME_LEN) if(!str || !length(str)) - user << "Invalid text." + to_chat(user, "Invalid text.") + return user.visible_message("[user] labels [src] as [str].") name = "[name] ([str])" @@ -55,7 +57,8 @@ if(WP.amount <= 0 && !WP.loc) //if we used our last wrapping paper, drop a cardboard tube new /obj/item/weapon/c_tube( get_turf(user) ) else - user << "You need more paper." + to_chat(user, "You need more paper.") + /obj/item/smallDelivery @@ -85,14 +88,16 @@ if(sortTag != O.currTag) var/tag = uppertext(TAGGERLOCATIONS[O.currTag]) - user << "*[tag]*" + to_chat(user, "*[tag]*") + sortTag = O.currTag playsound(loc, 'sound/machines/twobeep.ogg', 100, 1) else if(istype(W, /obj/item/weapon/pen)) var/str = copytext(sanitize(input(user,"Label text?","Set label","")),1,MAX_NAME_LEN) if(!str || !length(str)) - user << "Invalid text." + to_chat(user, "Invalid text.") + return user.visible_message("[user] labels [src] as [str].") name = "[name] ([str])" @@ -106,7 +111,8 @@ if(WP.amount <= 0 && !WP.loc) //if we used our last wrapping paper, drop a cardboard tube new /obj/item/weapon/c_tube( get_turf(user) ) else - user << "You need more paper." + to_chat(user, "You need more paper.") + @@ -161,7 +167,8 @@ P.wrapped = O O.loc = P else - user << "You need more paper." + to_chat(user, "You need more paper.") + return else if(istype (target, /obj/structure/closet)) var/obj/structure/closet/O = target @@ -174,10 +181,12 @@ O.welded = 1 O.loc = P else - user << "You need more paper." + to_chat(user, "You need more paper.") + return else - user << "The object you are trying to wrap is unsuitable for the sorting machinery." + to_chat(user, "The object you are trying to wrap is unsuitable for the sorting machinery.") + return user.visible_message("[user] wraps [target].") @@ -307,21 +316,25 @@ if(c_mode==0) c_mode=1 playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "You remove the screws around the power connection." + to_chat(user, "You remove the screws around the power connection.") + return else if(c_mode==1) c_mode=0 playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "You attach the screws around the power connection." + to_chat(user, "You attach the screws around the power connection.") + return else if(istype(I,/obj/item/weapon/weldingtool) && c_mode==1) var/obj/item/weapon/weldingtool/W = I if(W.remove_fuel(0,user)) playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1) - user << "You start slicing the floorweld off the delivery chute." + to_chat(user, "You start slicing the floorweld off the delivery chute.") + if(do_after(user,20, target = src)) if(!src || !W.isOn()) return - user << "You sliced the floorweld off the delivery chute." + to_chat(user, "You sliced the floorweld off the delivery chute.") + var/obj/structure/disposalconstruct/C = new (src.loc) C.ptype = 8 // 8 = Delivery chute C.update() @@ -330,5 +343,6 @@ qdel(src) return else - user << "You need more welding fuel to complete this task." + to_chat(user, "You need more welding fuel to complete this task.") + return diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm index 249b4956953..f97fcc956a0 100644 --- a/code/modules/research/circuitprinter.dm +++ b/code/modules/research/circuitprinter.dm @@ -119,26 +119,31 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis). default_deconstruction_crowbar(O) return else - user << "You can't load the [src.name] while it's opened." + to_chat(user, "You can't load the [src.name] while it's opened.") + return if (disabled) return if (!linked_console) - user << "The [name] must be linked to an R&D console first!" + to_chat(user, "The [name] must be linked to an R&D console first!") + return 1 if (O.is_open_container()) return if (!istype(O, /obj/item/stack/sheet/glass) && !istype(O, /obj/item/stack/sheet/mineral/gold) && !istype(O, /obj/item/stack/sheet/mineral/diamond)) - user << "You cannot insert this item into the [name]!" + to_chat(user, "You cannot insert this item into the [name]!") + return if (stat) return if (busy) - user << "The [name] is busy. Please wait for completion of previous operation." + to_chat(user, "The [name] is busy. Please wait for completion of previous operation.") + return var/obj/item/stack/sheet/stack = O if ((TotalMaterials() + stack.perunit) > max_material_amount) - user << "The [name] is full. Please remove glass from the protolathe in order to insert more." + to_chat(user, "The [name] is full. Please remove glass from the protolathe in order to insert more.") + return var/amount = round(input("How many sheets do you want to add?") as num) @@ -149,7 +154,8 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis). busy = 1 use_power(max(1000, (MINERAL_MATERIAL_AMOUNT*amount/10))) - user << "You add [amount] sheets to the [src.name]." + to_chat(user, "You add [amount] sheets to the [src.name].") + if(istype(stack, /obj/item/stack/sheet/glass)) g_amount += amount * MINERAL_MATERIAL_AMOUNT else if(istype(stack, /obj/item/stack/sheet/mineral/gold)) diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm index 0ffec90b1ec..346b6437347 100644 --- a/code/modules/research/destructive_analyzer.dm +++ b/code/modules/research/destructive_analyzer.dm @@ -63,26 +63,32 @@ Note: Must be placed within 3 tiles of the R&D Console if (disabled) return if (!linked_console) - user << "The [src.name] must be linked to an R&D console first!" + to_chat(user, "The [src.name] must be linked to an R&D console first!") + return if (busy) - user << "The [src.name] is busy right now." + to_chat(user, "The [src.name] is busy right now.") + return if (istype(O, /obj/item) && !loaded_item) if(!O.origin_tech) - user << "This doesn't seem to have a tech origin!" + to_chat(user, "This doesn't seem to have a tech origin!") + return var/list/temp_tech = ConvertReqString2List(O.origin_tech) if (temp_tech.len == 0) - user << "You cannot deconstruct this item!" + to_chat(user, "You cannot deconstruct this item!") + return if(!user.drop_item()) - user << "\The [O] is stuck to your hand, you cannot put it in the [src.name]!" + to_chat(user, "\The [O] is stuck to your hand, you cannot put it in the [src.name]!") + return busy = 1 loaded_item = O O.loc = src - user << "You add the [O.name] to the [src.name]!" + to_chat(user, "You add the [O.name] to the [src.name]!") + flick("d_analyzer_la", src) spawn(10) icon_state = "d_analyzer_l" diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index d7955228168..aef6ced8f01 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -129,33 +129,40 @@ return if(!checkCircumstances(O)) - user << "The [O] is not yet valid for the [src] and must be completed!" + to_chat(user, "The [O] is not yet valid for the [src] and must be completed!") + return if (disabled) return if (!linked_console) - user << "The [src] must be linked to an R&D console first!" + to_chat(user, "The [src] must be linked to an R&D console first!") + return if (loaded_item) - user << "The [src] is already loaded." + to_chat(user, "The [src] is already loaded.") + return if (istype(O, /obj/item)) if(!O.origin_tech) - user << "This doesn't seem to have a tech origin!" + to_chat(user, "This doesn't seem to have a tech origin!") + return var/list/temp_tech = ConvertReqString2List(O.origin_tech) if (temp_tech.len == 0) - user << "You cannot experiment on this item!" + to_chat(user, "You cannot experiment on this item!") + return if(O.reliability < 90 && O.crit_fail == 0) - usr << "Item is neither reliable enough or broken enough to learn from." + to_chat(usr, "Item is neither reliable enough or broken enough to learn from.") + return if(!user.drop_item()) return loaded_item = O O.loc = src - user << "You add the [O.name] to the machine." + to_chat(user, "You add the [O.name] to the machine.") + flick("h_lathe_load", src) return @@ -510,7 +517,8 @@ if(globalMalf > 36 && globalMalf < 50) visible_message("[src] improves [exp_on], drawing the life essence of those nearby!") for(var/mob/living/m in view(4,src)) - m << "You feel your flesh being torn from you, mists of blood drifting to [src]!" + to_chat(m, "You feel your flesh being torn from you, mists of blood drifting to [src]!") + m.take_overall_damage(50) investigate_log("Experimentor has taken 50 brute a blood sacrifice from [m]", "experimentor") var/list/reqs = ConvertReqString2List(exp_on.origin_tech) @@ -559,15 +567,18 @@ src.updateUsrDialog() else if(recentlyExperimented) - usr << "[src] has been used too recently!" + to_chat(usr, "[src] has been used too recently!") + return else if(!loaded_item) updateUsrDialog() //Set the interface to unloaded mode - usr << "[src] is not currently loaded!" + to_chat(usr, "[src] is not currently loaded!") + return else if(!process || process != loaded_item) //Interface exploit protection (such as hrefs or swapping items with interface set to old item) updateUsrDialog() //Refresh interface to update interface hrefs - usr << "Interface failure detected in [src]. Please try again." + to_chat(usr, "Interface failure detected in [src]. Please try again.") + return var/dotype if(text2num(scantype) == SCANTYPE_DISCOVER) @@ -639,7 +650,8 @@ /obj/item/weapon/relic/attack_self(mob/user) if(revealed) if(cooldown) - user << "[src] does not react!" + to_chat(user, "[src] does not react!") + return else if(src.loc == user) cooldown = TRUE @@ -647,7 +659,8 @@ spawn(cooldownMax) cooldown = FALSE else - user << "You aren't quite sure what to do with this, yet." + to_chat(user, "You aren't quite sure what to do with this, yet.") + //////////////// RELIC PROCS ///////////////////////////// @@ -678,7 +691,8 @@ /obj/item/weapon/relic/proc/petSpray(mob/user) var/message = "[src] begans to shake, and in the distance the sound of rampaging animals arises!" visible_message(message) - user << message + to_chat(user, message) + var/animals = rand(1,25) var/counter var/list/valid_animals = list(/mob/living/simple_animal/parrot,/mob/living/simple_animal/butterfly,/mob/living/simple_animal/pet/cat,/mob/living/simple_animal/pet/corgi,/mob/living/simple_animal/crab,/mob/living/simple_animal/pet/fox,/mob/living/simple_animal/lizard,/mob/living/simple_animal/mouse,/mob/living/simple_animal/pet/pug,/mob/living/simple_animal/hostile/bear,/mob/living/simple_animal/hostile/poison/bees,/mob/living/simple_animal/hostile/carp) @@ -687,7 +701,8 @@ new mobType(get_turf(src)) warn_admins(user, "Mass Mob Spawn") if(prob(60)) - user << "[src] falls apart!" + to_chat(user, "[src] falls apart!") + qdel(src) /obj/item/weapon/relic/proc/rapidDupe(mob/user) @@ -713,7 +728,8 @@ warn_admins(user, "Rapid duplicator", 0) /obj/item/weapon/relic/proc/explode(mob/user) - user << "[src] begins to heat up!" + to_chat(user, "[src] begins to heat up!") + spawn(rand(35,100)) if(src.loc == user) visible_message("The [src]'s top opens, releasing a powerful blast!") @@ -722,7 +738,8 @@ qdel(src) //Comment this line to produce a light grenade (the bomb that keeps on exploding when used)!! /obj/item/weapon/relic/proc/teleport(mob/user) - user << "The [src] begins to vibrate!" + to_chat(user, "The [src] begins to vibrate!") + spawn(rand(10,30)) var/turf/userturf = get_turf(user) if(src.loc == user && userturf.z != ZLEVEL_CENTCOMM) //Because Nuke Ops bringing this back on their shuttle, then looting the ERT area is 2fun4you! diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm index 9744e726cdc..4e0408b8bbc 100644 --- a/code/modules/research/message_server.dm +++ b/code/modules/research/message_server.dm @@ -113,8 +113,10 @@ var/global/list/obj/machinery/message_server/message_servers = list() Console.set_light(2) /obj/machinery/message_server/attack_hand(user as mob) -// user << "\blue There seem to be some parts missing from this server. They should arrive on the station in a few days, give or take a few CentComm delays." - user << "You toggle PDA message passing from [active ? "On" : "Off"] to [active ? "Off" : "On"]" +// to_chat(user, "\blue There seem to be some parts missing from this server. They should arrive on the station in a few days, give or take a few CentComm delays.") + + to_chat(user, "You toggle PDA message passing from [active ? "On" : "Off"] to [active ? "Off" : "On"]") + active = !active update_icon() diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm index ae0bfd6ce7d..80153dbd534 100644 --- a/code/modules/research/protolathe.dm +++ b/code/modules/research/protolathe.dm @@ -112,15 +112,18 @@ Note: Must be placed west/left of and R&D console to function. default_deconstruction_crowbar(O) return 1 else - user << "You can't load the [src.name] while it's opened." + to_chat(user, "You can't load the [src.name] while it's opened.") + return 1 if (disabled) return if (!linked_console) - user << " The [src.name] must be linked to an R&D console first!" + to_chat(user, " The [src.name] must be linked to an R&D console first!") + return 1 if (busy) - user << "The [src.name] is busy. Please wait for completion of previous operation." + to_chat(user, "The [src.name] is busy. Please wait for completion of previous operation.") + return 1 if (O.is_open_container()) return @@ -130,7 +133,8 @@ Note: Must be placed west/left of and R&D console to function. return 1 if(!materials.has_space( materials.get_item_material_amount(O) )) - user << "The [src.name]'s material bin is full! Please remove material before adding more." + to_chat(user, "The [src.name]'s material bin is full! Please remove material before adding more.") + return 1 var/obj/item/stack/sheet/stack = O @@ -143,7 +147,8 @@ Note: Must be placed west/left of and R&D console to function. else busy = 1 use_power(max(1000, (MINERAL_MATERIAL_AMOUNT*amount_inserted/10))) - user << "You add [amount_inserted] sheets to the [src.name]." + to_chat(user, "You add [amount_inserted] sheets to the [src.name].") + var/stackname = stack.name src.overlays += "protolathe_[stackname]" sleep(10) diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index aac1b19960a..469948a5c78 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -159,18 +159,21 @@ proc/CallMaterialName(ID) //Loading a disk into it. if(istype(D, /obj/item/weapon/disk)) if(t_disk || d_disk) - user << "A disk is already loaded into the machine." + to_chat(user, "A disk is already loaded into the machine.") + return if(istype(D, /obj/item/weapon/disk/tech_disk)) t_disk = D else if (istype(D, /obj/item/weapon/disk/design_disk)) d_disk = D else - user << "Machine cannot accept disks in that format." + to_chat(user, "Machine cannot accept disks in that format.") + return if(!user.drop_item()) return D.loc = src - user << "You add the disk to the machine!" + to_chat(user, "You add the disk to the machine!") + else ..() src.updateUsrDialog() @@ -181,7 +184,8 @@ proc/CallMaterialName(ID) playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) req_access = list() emagged = 1 - user << "You disable the security protocols" + to_chat(user, "You disable the security protocols") + /obj/machinery/computer/rdconsole/Topic(href, href_list) if(..()) @@ -264,7 +268,8 @@ proc/CallMaterialName(ID) else if(href_list["eject_item"]) //Eject the item inside the destructive analyzer. if(linked_destroy) if(linked_destroy.busy) - usr << " The destructive analyzer is busy at the moment." + to_chat(usr, " The destructive analyzer is busy at the moment.") + else if(linked_destroy.loaded_item) linked_destroy.loaded_item.loc = linked_destroy.loc @@ -289,7 +294,8 @@ proc/CallMaterialName(ID) else if(href_list["deconstruct"]) //Deconstruct the item in the destructive analyzer and update the research holder. if(linked_destroy) if(linked_destroy.busy) - usr << "The destructive analyzer is busy at the moment." + to_chat(usr, "The destructive analyzer is busy at the moment.") + else var/choice = input("Proceeding will destroy loaded item.") in list("Proceed", "Cancel") if(choice == "Cancel" || !linked_destroy) return @@ -302,7 +308,8 @@ proc/CallMaterialName(ID) linked_destroy.busy = 0 if(!linked_destroy.hacked) if(!linked_destroy.loaded_item) - usr <<"The destructive analyzer appears to be empty." + to_chat(usr, "The destructive analyzer appears to be empty.") + screen = 1.0 return if((linked_destroy.loaded_item.reliability >= 99 - (linked_destroy.decon_mod * 3)) || linked_destroy.loaded_item.crit_fail) @@ -341,7 +348,8 @@ proc/CallMaterialName(ID) else if(href_list["sync"]) //Sync the research holder with all the R&D consoles in the game that aren't sync protected. screen = 0.0 if(!sync) - usr << "You must connect to the network first!" + to_chat(usr, "You must connect to the network first!") + else griefProtection() //Putting this here because I dont trust the sync process spawn(30) @@ -638,7 +646,8 @@ proc/CallMaterialName(ID) if(..()) return 1 if(!allowed(user) && !isobserver(user)) - user << "Access denied." + to_chat(user, "Access denied.") + return 1 interact(user) diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm index 4f0b81e5315..50367612755 100644 --- a/code/modules/research/rdmachines.dm +++ b/code/modules/research/rdmachines.dm @@ -59,10 +59,12 @@ if(href_list["pulse"]) var/temp_wire = href_list["wire"] if (!istype(usr.get_active_hand(), /obj/item/device/multitool)) - usr << "You need a multitool!" + to_chat(usr, "You need a multitool!") + else if(src.wires[temp_wire]) - usr << "You can't pulse a cut wire." + to_chat(usr, "You can't pulse a cut wire.") + else if(src.hack_wire == href_list["wire"]) src.hacked = !src.hacked @@ -77,7 +79,8 @@ spawn(100) src.shocked = !src.shocked if(href_list["cut"]) if (!istype(usr.get_active_hand(), /obj/item/weapon/wirecutters)) - usr << "You need wirecutters!" + to_chat(usr, "You need wirecutters!") + else var/temp_wire = href_list["wire"] wires[temp_wire] = !wires[temp_wire] diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index 7d88f65af04..bd23c33fce9 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -209,7 +209,8 @@ add_fingerprint(usr) usr.set_machine(src) if(!src.allowed(usr) && !emagged) - usr << "\red You do not have the required access level" + to_chat(usr, "\red You do not have the required access level") + return if(href_list["main"]) @@ -337,7 +338,8 @@ if(!emagged) playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) emagged = 1 - user << "\blue You you disable the security protocols" + to_chat(user, "\blue You you disable the security protocols") + src.updateUsrDialog() /obj/machinery/r_n_d/server/core diff --git a/code/modules/research/xenoarchaeology/artifact/artifact.dm b/code/modules/research/xenoarchaeology/artifact/artifact.dm index 817baf70e16..940a40f954b 100644 --- a/code/modules/research/xenoarchaeology/artifact/artifact.dm +++ b/code/modules/research/xenoarchaeology/artifact/artifact.dm @@ -81,18 +81,21 @@ var/obj/item/device/measuring_tape/P = W user.visible_message("\blue[user] extends [P] towards [src].","\blue You extend [P] towards [src].") if(do_after(user,40, target = src)) - user << "\blue \icon[P] [src] has been excavated to a depth of [2*src.excavation_level]cm." + to_chat(user, "\blue \icon[P] [src] has been excavated to a depth of [2*src.excavation_level]cm.") + return if (istype(W, /obj/item/weapon/pickaxe)) var/obj/item/weapon/pickaxe/P = W - user << "\red You start [P.drill_verb] [src]." + to_chat(user, "\red You start [P.drill_verb] [src].") + if(!do_after(user,P.digspeed, target = src)) return - user << "\blue You finish [P.drill_verb] [src]." + to_chat(user, "\blue You finish [P.drill_verb] [src].") + excavation_level += P.excavation_amount if(excavation_level > 100) diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_gigadrill.dm b/code/modules/research/xenoarchaeology/artifact/artifact_gigadrill.dm index 9d52c9c2dc0..065a617b9ea 100644 --- a/code/modules/research/xenoarchaeology/artifact/artifact_gigadrill.dm +++ b/code/modules/research/xenoarchaeology/artifact/artifact_gigadrill.dm @@ -14,11 +14,13 @@ if(active) active = 0 icon_state = "gigadrill" - user << "\blue You press a button and [src] slowly spins down." + to_chat(user, "\blue You press a button and [src] slowly spins down.") + else active = 1 icon_state = "gigadrill_mov" - user << "\blue You press a button and [src] shudders to life." + to_chat(user, "\blue You press a button and [src] shudders to life.") + /obj/machinery/giga_drill/Bump(atom/A) if(active && !drilling_turf) diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm b/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm index 23f9f73afde..b12f431d206 100644 --- a/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm +++ b/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm @@ -221,19 +221,23 @@ var/list/valid_secondary_effect_types = list(\ /obj/machinery/artifact/attack_hand(var/mob/user as mob) if (get_dist(user, src) > 1) - user << "\red You can't reach [src] from here." + to_chat(user, "\red You can't reach [src] from here.") + return if(ishuman(user) && user:gloves) - user << "You touch [src] with your gloved hands, [pick("but nothing of note happens","but nothing happens","but nothing interesting happens","but you notice nothing different","but nothing seems to have happened")]." + to_chat(user, "You touch [src] with your gloved hands, [pick("but nothing of note happens","but nothing happens","but nothing interesting happens","but you notice nothing different","but nothing seems to have happened")].") + return src.add_fingerprint(user) if(my_effect.trigger == TRIGGER_TOUCH) - user << "You touch [src]." + to_chat(user, "You touch [src].") + my_effect.ToggleActivate() else - user << "You touch [src], [pick("but nothing of note happens","but nothing happens","but nothing interesting happens","but you notice nothing different","but nothing seems to have happened")]." + to_chat(user, "You touch [src], [pick("but nothing of note happens","but nothing happens","but nothing interesting happens","but you notice nothing different","but nothing seems to have happened")].") + if(prob(25) && secondary_effect && secondary_effect.trigger == TRIGGER_TOUCH) secondary_effect.ToggleActivate(0) @@ -317,7 +321,8 @@ var/list/valid_secondary_effect_types = list(\ warn = 1 if(warn) - M << "You accidentally touch [src]." + to_chat(M, "You accidentally touch [src].") + ..() /obj/machinery/artifact/bullet_act(var/obj/item/projectile/P) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_affect_cold.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_affect_cold.dm index f8dad2c4d36..b98612c980a 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_affect_cold.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_affect_cold.dm @@ -12,7 +12,8 @@ /datum/artifact_effect/cold/DoEffectTouch(var/mob/user) if(holder) - user << "\blue A chill passes up your spine!" + to_chat(user, "\blue A chill passes up your spine!") + var/datum/gas_mixture/env = holder.loc.return_air() if(env) env.temperature = max(env.temperature - rand(5,50), 0) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_badfeeling.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_badfeeling.dm index 1244f802cc6..85c6b08432a 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_badfeeling.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_badfeeling.dm @@ -32,9 +32,11 @@ var/mob/living/carbon/human/H = user if(prob(50)) if(prob(75)) - H << "[pick(drastic_messages)]" + to_chat(H, "[pick(drastic_messages)]") + else - H << "[pick(messages)]" + to_chat(H, "[pick(messages)]") + if(prob(50)) H.dizziness += rand(3,5) @@ -45,9 +47,11 @@ for (var/mob/living/carbon/human/H in range(src.effectrange,T)) if(prob(5)) if(prob(75)) - H << "[pick(messages)]" + to_chat(H, "[pick(messages)]") + else - H << "[pick(drastic_messages)]" + to_chat(H, "[pick(drastic_messages)]") + if(prob(10)) H.dizziness += rand(3,5) @@ -59,9 +63,11 @@ for (var/mob/living/carbon/human/H in range(src.effectrange,T)) if(prob(50)) if(prob(95)) - H << "[pick(drastic_messages)]" + to_chat(H, "[pick(drastic_messages)]") + else - H << "[pick(messages)]" + to_chat(H, "[pick(messages)]") + if(prob(50)) H.dizziness += rand(3,5) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_cellcharge.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_cellcharge.dm index da7f1a012ee..37296545e74 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_cellcharge.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_cellcharge.dm @@ -10,7 +10,8 @@ var/mob/living/silicon/robot/R = user for (var/obj/item/weapon/stock_parts/cell/D in R.contents) D.charge += rand() * 100 + 50 - R << "\blue SYSTEM ALERT: Large energy boost detected!" + to_chat(R, "\blue SYSTEM ALERT: Large energy boost detected!") + return 1 /datum/artifact_effect/cellcharge/DoEffectAura() @@ -24,7 +25,8 @@ for (var/mob/living/silicon/robot/M in mob_list) for (var/obj/item/weapon/stock_parts/cell/D in M.contents) D.charge += 25 - M << "\blue SYSTEM ALERT: Energy boost detected!" + to_chat(M, "\blue SYSTEM ALERT: Energy boost detected!") + return 1 /datum/artifact_effect/cellcharge/DoEffectPulse() @@ -38,5 +40,6 @@ for (var/mob/living/silicon/robot/M in mob_list) for (var/obj/item/weapon/stock_parts/cell/D in M.contents) D.charge += rand() * 100 - M << "\blue SYSTEM ALERT: Energy boost detected!" + to_chat(M, "\blue SYSTEM ALERT: Energy boost detected!") + return 1 diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_celldrain.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_celldrain.dm index 025cdec5ee0..978d3b0a9f4 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_celldrain.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_celldrain.dm @@ -10,7 +10,8 @@ var/mob/living/silicon/robot/R = user for (var/obj/item/weapon/stock_parts/cell/D in R.contents) D.charge = max(D.charge - rand() * 100, 0) - R << "\blue SYSTEM ALERT: Energy drain detected!" + to_chat(R, "\blue SYSTEM ALERT: Energy drain detected!") + return 1 return 1 @@ -26,7 +27,8 @@ for (var/mob/living/silicon/robot/M in mob_list) for (var/obj/item/weapon/stock_parts/cell/D in M.contents) D.charge = max(D.charge - 50,0) - M << "\red SYSTEM ALERT: Energy drain detected!" + to_chat(M, "\red SYSTEM ALERT: Energy drain detected!") + return 1 /datum/artifact_effect/celldrain/DoEffectPulse() @@ -40,5 +42,6 @@ for (var/mob/living/silicon/robot/M in mob_list) for (var/obj/item/weapon/stock_parts/cell/D in M.contents) D.charge = max(D.charge - rand() * 150,0) - M << "\red SYSTEM ALERT: Energy drain detected!" + to_chat(M, "\red SYSTEM ALERT: Energy drain detected!") + return 1 diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_dnaswitch.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_dnaswitch.dm index b74ab88a9a1..d005fb9e64c 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_dnaswitch.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_dnaswitch.dm @@ -15,13 +15,13 @@ /datum/artifact_effect/dnaswitch/DoEffectTouch(var/mob/toucher) var/weakness = GetAnomalySusceptibility(toucher) if(ishuman(toucher) && prob(weakness * 100)) - toucher << pick("\green You feel a little different.",\ - "\green You feel very strange.",\ - "\green Your stomach churns.",\ - "\green Your skin feels loose.",\ - "\green You feel a stabbing pain in your head.",\ - "\green You feel a tingling sensation in your chest.",\ - "\green Your entire body vibrates.") + to_chat(toucher, pick("\green You feel a little different.", + "\green You feel very strange.", + "\green Your stomach churns.", + "\green Your skin feels loose.", + "\green You feel a stabbing pain in your head.", + "\green You feel a tingling sensation in your chest.", + "\green Your entire body vibrates.")) if(prob(75)) scramble(1, toucher, weakness * severity) else @@ -35,13 +35,13 @@ var/weakness = GetAnomalySusceptibility(H) if(prob(weakness * 100)) if(prob(30)) - H << pick("\green You feel a little different.",\ - "\green You feel very strange.",\ - "\green Your stomach churns.",\ - "\green Your skin feels loose.",\ - "\green You feel a stabbing pain in your head.",\ - "\green You feel a tingling sensation in your chest.",\ - "\green Your entire body vibrates.") + to_chat(H, pick("\green You feel a little different.", + "\green You feel very strange.", + "\green Your stomach churns.", + "\green Your skin feels loose.", + "\green You feel a stabbing pain in your head.", + "\green You feel a tingling sensation in your chest.", + "\green Your entire body vibrates.")) if(prob(50)) scramble(1, H, weakness * severity) else @@ -54,13 +54,13 @@ var/weakness = GetAnomalySusceptibility(H) if(prob(weakness * 100)) if(prob(75)) - H << pick("\green You feel a little different.",\ - "\green You feel very strange.",\ - "\green Your stomach churns.",\ - "\green Your skin feels loose.",\ - "\green You feel a stabbing pain in your head.",\ - "\green You feel a tingling sensation in your chest.",\ - "\green Your entire body vibrates.") + to_chat(H, pick("\green You feel a little different.", + "\green You feel very strange.", + "\green Your stomach churns.", + "\green Your skin feels loose.", + "\green You feel a stabbing pain in your head.", + "\green You feel a tingling sensation in your chest.", + "\green Your entire body vibrates.")) if(prob(25)) if(prob(75)) scramble(1, H, weakness * severity) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_goodfeeling.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_goodfeeling.dm index bc45260b2cc..31cd6c871ba 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_goodfeeling.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_goodfeeling.dm @@ -30,9 +30,11 @@ var/mob/living/carbon/human/H = user if(prob(50)) if(prob(75)) - H << "[pick(drastic_messages)]" + to_chat(H, "[pick(drastic_messages)]") + else - H << "[pick(messages)]" + to_chat(H, "[pick(messages)]") + if(prob(50)) H.dizziness += rand(3,5) @@ -43,9 +45,11 @@ for (var/mob/living/carbon/human/H in range(src.effectrange,T)) if(prob(5)) if(prob(75)) - H << "[pick(messages)]" + to_chat(H, "[pick(messages)]") + else - H << "[pick(drastic_messages)]" + to_chat(H, "[pick(drastic_messages)]") + if(prob(5)) H.dizziness += rand(3,5) @@ -57,9 +61,11 @@ for (var/mob/living/carbon/human/H in range(src.effectrange,T)) if(prob(50)) if(prob(95)) - H << "[pick(drastic_messages)]" + to_chat(H, "[pick(drastic_messages)]") + else - H << "[pick(messages)]" + to_chat(H, "[pick(messages)]") + if(prob(50)) H.dizziness += rand(3,5) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heal.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heal.dm index 003250399e9..341f2543f37 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heal.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heal.dm @@ -9,7 +9,8 @@ var/weakness = GetAnomalySusceptibility(toucher) if(prob(weakness * 100)) var/mob/living/carbon/C = toucher - C << "\blue You feel a soothing energy invigorate you." + to_chat(C, "\blue You feel a soothing energy invigorate you.") + if(ishuman(toucher)) var/mob/living/carbon/human/H = toucher @@ -42,7 +43,8 @@ var/weakness = GetAnomalySusceptibility(C) if(prob(weakness * 100)) if(prob(10)) - C << "\blue You feel a soothing energy radiating from something nearby." + to_chat(C, "\blue You feel a soothing energy radiating from something nearby.") + C.adjustBruteLoss(-1 * weakness) C.adjustFireLoss(-1 * weakness) C.adjustToxLoss(-1 * weakness) @@ -57,7 +59,8 @@ for (var/mob/living/carbon/C in range(src.effectrange,T)) var/weakness = GetAnomalySusceptibility(C) if(prob(weakness * 100)) - C << "\blue A wave of energy invigorates you." + to_chat(C, "\blue A wave of energy invigorates you.") + C.adjustBruteLoss(-5 * weakness) C.adjustFireLoss(-5 * weakness) C.adjustToxLoss(-5 * weakness) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heat.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heat.dm index 21304df4082..50b7c0a95a8 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heat.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heat.dm @@ -15,7 +15,8 @@ /datum/artifact_effect/heat/DoEffectTouch(var/mob/user) if(holder) - user << "\red You feel a wave of heat travel up your spine!" + to_chat(user, "\red You feel a wave of heat travel up your spine!") + var/datum/gas_mixture/env = holder.loc.return_air() if(env) env.temperature += rand(5,50) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_hurt.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_hurt.dm index 5a4f402269f..be7cc57fb7e 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_hurt.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_hurt.dm @@ -8,7 +8,8 @@ var/weakness = GetAnomalySusceptibility(toucher) if(iscarbon(toucher) && prob(weakness * 100)) var/mob/living/carbon/C = toucher - C << "\red A painful discharge of energy strikes you!" + to_chat(C, "\red A painful discharge of energy strikes you!") + C.adjustOxyLoss(rand(5,25) * weakness) C.adjustToxLoss(rand(5,25) * weakness) C.adjustBruteLoss(rand(5,25) * weakness) @@ -26,7 +27,8 @@ var/weakness = GetAnomalySusceptibility(C) if(prob(weakness * 100)) if(prob(10)) - C << "\red You feel a painful force radiating from something nearby." + to_chat(C, "\red You feel a painful force radiating from something nearby.") + C.adjustBruteLoss(1 * weakness) C.adjustFireLoss(1 * weakness) C.adjustToxLoss(1 * weakness) @@ -40,7 +42,8 @@ for (var/mob/living/carbon/C in range(effectrange, T)) var/weakness = GetAnomalySusceptibility(C) if(prob(weakness * 100)) - C << "\red A wave of painful energy strikes you!" + to_chat(C, "\red A wave of painful energy strikes you!") + C.adjustBruteLoss(3 * weakness) C.adjustFireLoss(3 * weakness) C.adjustToxLoss(3 * weakness) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_roboheal.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_roboheal.dm index a1a89e42cf2..e4b99fad1f0 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_roboheal.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_roboheal.dm @@ -10,7 +10,8 @@ if(user) if (istype(user, /mob/living/silicon/robot)) var/mob/living/silicon/robot/R = user - R << "\blue Your systems report damaged components mending by themselves!" + to_chat(R, "\blue Your systems report damaged components mending by themselves!") + R.adjustBruteLoss(rand(-10,-30)) R.adjustFireLoss(rand(-10,-30)) return 1 @@ -20,7 +21,8 @@ var/turf/T = get_turf(holder) for (var/mob/living/silicon/robot/M in range(src.effectrange,T)) if(prob(10)) - M << "\blue SYSTEM ALERT: Beneficial energy field detected!" + to_chat(M, "\blue SYSTEM ALERT: Beneficial energy field detected!") + M.adjustBruteLoss(-1) M.adjustFireLoss(-1) M.updatehealth() @@ -30,7 +32,8 @@ if(holder) var/turf/T = get_turf(holder) for (var/mob/living/silicon/robot/M in range(src.effectrange,T)) - M << "\blue SYSTEM ALERT: Structural damage has been repaired by energy pulse!" + to_chat(M, "\blue SYSTEM ALERT: Structural damage has been repaired by energy pulse!") + M.adjustBruteLoss(-10) M.adjustFireLoss(-10) M.updatehealth() diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_robohurt.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_robohurt.dm index bc55a76cef7..3f542e17567 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_robohurt.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_robohurt.dm @@ -10,7 +10,8 @@ if(user) if (istype(user, /mob/living/silicon/robot)) var/mob/living/silicon/robot/R = user - R << "\red Your systems report severe damage has been inflicted!" + to_chat(R, "\red Your systems report severe damage has been inflicted!") + R.adjustBruteLoss(rand(10,50)) R.adjustFireLoss(rand(10,50)) return 1 @@ -19,7 +20,9 @@ if(holder) var/turf/T = get_turf(holder) for (var/mob/living/silicon/robot/M in range(src.effectrange,T)) - if(prob(10)) M << "\red SYSTEM ALERT: Harmful energy field detected!" + if(prob(10)) + to_chat(M, "\red SYSTEM ALERT: Harmful energy field detected!") + M.adjustBruteLoss(1) M.adjustFireLoss(1) M.updatehealth() @@ -29,7 +32,8 @@ if(holder) var/turf/T = get_turf(holder) for (var/mob/living/silicon/robot/M in range(src.effectrange,T)) - M << "\red SYSTEM ALERT: Structural damage inflicted by energy pulse!" + to_chat(M, "\red SYSTEM ALERT: Structural damage inflicted by energy pulse!") + M.adjustBruteLoss(10) M.adjustFireLoss(10) M.updatehealth() diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_sleepy.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_sleepy.dm index 61979c5f69d..4d4bf8babf2 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_sleepy.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_sleepy.dm @@ -12,12 +12,14 @@ var/weakness = GetAnomalySusceptibility(toucher) if(ishuman(toucher) && prob(weakness * 100)) var/mob/living/carbon/human/H = toucher - H << pick("\blue You feel like taking a nap.","\blue You feel a yawn coming on.","\blue You feel a little tired.") + to_chat(H, pick("\blue You feel like taking a nap.","\blue You feel a yawn coming on.","\blue You feel a little tired.")) + H.drowsyness = min(H.drowsyness + rand(5,25) * weakness, 50 * weakness) H.eye_blurry = min(H.eye_blurry + rand(1,3) * weakness, 50 * weakness) return 1 else if(isrobot(toucher)) - toucher << "\red SYSTEM ALERT: CPU cycles slowing down." + to_chat(toucher, "\red SYSTEM ALERT: CPU cycles slowing down.") + return 1 /datum/artifact_effect/sleepy/DoEffectAura() @@ -27,11 +29,13 @@ var/weakness = GetAnomalySusceptibility(H) if(prob(weakness * 100)) if(prob(10)) - H << pick("\blue You feel like taking a nap.","\blue You feel a yawn coming on.","\blue You feel a little tired.") + to_chat(H, pick("\blue You feel like taking a nap.","\blue You feel a yawn coming on.","\blue You feel a little tired.")) + H.drowsyness = min(H.drowsyness + 1 * weakness, 25 * weakness) H.eye_blurry = min(H.eye_blurry + 1 * weakness, 25 * weakness) for (var/mob/living/silicon/robot/R in range(src.effectrange,holder)) - R << "\red SYSTEM ALERT: CPU cycles slowing down." + to_chat(R, "\red SYSTEM ALERT: CPU cycles slowing down.") + return 1 /datum/artifact_effect/sleepy/DoEffectPulse() @@ -40,9 +44,11 @@ for(var/mob/living/carbon/human/H in range(src.effectrange, T)) var/weakness = GetAnomalySusceptibility(H) if(prob(weakness * 100)) - H << pick("\blue You feel like taking a nap.","\blue You feel a yawn coming on.","\blue You feel a little tired.") + to_chat(H, pick("\blue You feel like taking a nap.","\blue You feel a yawn coming on.","\blue You feel a little tired.")) + H.drowsyness = min(H.drowsyness + rand(5,15) * weakness, 50 * weakness) H.eye_blurry = min(H.eye_blurry + rand(5,15) * weakness, 50 * weakness) for (var/mob/living/silicon/robot/R in range(src.effectrange,holder)) - R << "\red SYSTEM ALERT: CPU cycles slowing down." + to_chat(R, "\red SYSTEM ALERT: CPU cycles slowing down.") + return 1 diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_stun.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_stun.dm index b7b2864de41..2c2b613db4e 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_stun.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_stun.dm @@ -11,7 +11,8 @@ var/mob/living/carbon/C = toucher var/susceptibility = GetAnomalySusceptibility(C) if(prob(susceptibility * 100)) - C << "\red A powerful force overwhelms your consciousness." + to_chat(C, "\red A powerful force overwhelms your consciousness.") + C.Weaken(rand(1,10) * susceptibility) C.stuttering += 30 * susceptibility C.Stun(rand(1,10) * susceptibility) @@ -22,13 +23,15 @@ for (var/mob/living/carbon/C in range(src.effectrange,T)) var/susceptibility = GetAnomalySusceptibility(C) if(prob(10 * susceptibility)) - C << "\red Your body goes numb for a moment." + to_chat(C, "\red Your body goes numb for a moment.") + C.Weaken(2) C.stuttering += 2 if(prob(10)) C.Stun(1) else if(prob(10)) - C << "\red You feel numb." + to_chat(C, "\red You feel numb.") + /datum/artifact_effect/stun/DoEffectPulse() if(holder) @@ -36,7 +39,8 @@ for (var/mob/living/carbon/C in range(src.effectrange,T)) var/susceptibility = GetAnomalySusceptibility(C) if(prob(100 * susceptibility)) - C << "\red A wave of energy overwhelms your senses!" + to_chat(C, "\red A wave of energy overwhelms your senses!") + C.SetWeakened(4 * susceptibility) C.stuttering = 4 * susceptibility if(prob(10)) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_teleport.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_teleport.dm index a0e2e44830e..7252d123ec6 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_teleport.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_teleport.dm @@ -6,7 +6,8 @@ /datum/artifact_effect/teleport/DoEffectTouch(var/mob/user) var/weakness = GetAnomalySusceptibility(user) if(prob(100 * weakness)) - user << "\red You are suddenly zapped away elsewhere!" + to_chat(user, "\red You are suddenly zapped away elsewhere!") + if (user.buckled) user.buckled.unbuckle_mob() @@ -25,7 +26,8 @@ for (var/mob/living/M in range(src.effectrange,T)) var/weakness = GetAnomalySusceptibility(M) if(prob(100 * weakness)) - M << "\red You are displaced by a strange force!" + to_chat(M, "\red You are displaced by a strange force!") + if(M.buckled) M.buckled.unbuckle_mob() @@ -44,7 +46,8 @@ for (var/mob/living/M in range(src.effectrange, T)) var/weakness = GetAnomalySusceptibility(M) if(prob(100 * weakness)) - M << "\red You are displaced by a strange force!" + to_chat(M, "\red You are displaced by a strange force!") + if(M.buckled) M.buckled.unbuckle_mob() diff --git a/code/modules/research/xenoarchaeology/chemistry.dm b/code/modules/research/xenoarchaeology/chemistry.dm index a91ed35ca55..e69c92f9951 100644 --- a/code/modules/research/xenoarchaeology/chemistry.dm +++ b/code/modules/research/xenoarchaeology/chemistry.dm @@ -93,7 +93,8 @@ obj/item/weapon/reagent_containers/glass/solution_tray/attackby(obj/item/weapon/ var/new_label = input("What should the new label be?","Label solution tray") if(new_label) name = "solution tray ([new_label])" - user << "\blue You write on the label of the solution tray." + to_chat(user, "\blue You write on the label of the solution tray.") + else ..(W, user) diff --git a/code/modules/research/xenoarchaeology/finds/finds_fossils.dm b/code/modules/research/xenoarchaeology/finds/finds_fossils.dm index a619325d941..ec2ead4f34a 100644 --- a/code/modules/research/xenoarchaeology/finds/finds_fossils.dm +++ b/code/modules/research/xenoarchaeology/finds/finds_fossils.dm @@ -75,7 +75,8 @@ src.desc = "A creature made of [src.contents.len-1] assorted bones and a skull. The plaque reads \'[plaque_contents]\'." else src.desc = "Incomplete skeleton, looks like it could use [src.breq-src.bnum] more bones." - user << "Looks like it could use [src.breq-src.bnum] more bones." + to_chat(user, "Looks like it could use [src.breq-src.bnum] more bones.") + else ..() else if(istype(W,/obj/item/weapon/pen)) diff --git a/code/modules/research/xenoarchaeology/finds/finds_misc.dm b/code/modules/research/xenoarchaeology/finds/finds_misc.dm index fb3fce5d26b..f440015cf31 100644 --- a/code/modules/research/xenoarchaeology/finds/finds_misc.dm +++ b/code/modules/research/xenoarchaeology/finds/finds_misc.dm @@ -36,7 +36,8 @@ if(G.amount>=G.max_amount) continue G.attackby(NG, user, params) - usr << "You add the newly-formed plasma glass to the stack. It now contains [NG.amount] sheets." + to_chat(usr, "You add the newly-formed plasma glass to the stack. It now contains [NG.amount] sheets.") + //SN src = null qdel(src) return diff --git a/code/modules/research/xenoarchaeology/finds/finds_special.dm b/code/modules/research/xenoarchaeology/finds/finds_special.dm index 10a89d3f4d6..ac10df89458 100644 --- a/code/modules/research/xenoarchaeology/finds/finds_special.dm +++ b/code/modules/research/xenoarchaeology/finds/finds_special.dm @@ -129,7 +129,8 @@ var/target = pick("chest","groin","head","l_arm","r_arm","r_leg","l_leg","l_hand","r_hand","l_foot","r_foot") M.apply_damage(rand(5, 10), BRUTE, target) - M << "\red The skin on your [parse_zone(target)] feels like it's ripping apart, and a stream of blood flies out." + to_chat(M, "\red The skin on your [parse_zone(target)] feels like it's ripping apart, and a stream of blood flies out.") + var/obj/effect/decal/cleanable/blood/splatter/animated/B = new(M.loc) B.target_turf = pick(range(1, src)) B.blood_DNA = list() @@ -200,4 +201,5 @@ processing_objects.Remove(src) /obj/effect/shadow_wight/Bump(var/atom/obstacle) - obstacle << "\red You feel a chill run down your spine!" + to_chat(obstacle, "\red You feel a chill run down your spine!") + diff --git a/code/modules/research/xenoarchaeology/finds/finds_talkingitem.dm b/code/modules/research/xenoarchaeology/finds/finds_talkingitem.dm index 4a8c9be2a89..356e9588d03 100644 --- a/code/modules/research/xenoarchaeology/finds/finds_talkingitem.dm +++ b/code/modules/research/xenoarchaeology/finds/finds_talkingitem.dm @@ -51,7 +51,8 @@ var/list/w = heard_words["[lowertext(seperate[Xa])]"] if(w) w.Add("[lowertext(seperate[next])]") - //world << "Adding [lowertext(seperate[next])] to [lowertext(seperate[Xa])]" +// to_chat(world, "Adding [lowertext(seperate[next])] to [lowertext(seperate[Xa])]") + if(prob(30)) var/list/options = list("[holder_atom] seems to be listening intently to [source]...",\ @@ -66,10 +67,12 @@ /*/obj/item/weapon/talkingcrystal/proc/debug() //set src in view() for(var/v in heard_words) - world << "[uppertext(v)]" + to_chat(world, "[uppertext(v)]") + var/list/d = heard_words["[v]"] for(var/X in d) - world << "[X]"*/ + to_chat(world, "[X]")*/ + /datum/talking_atom/proc/SaySomething(var/word = null) if(!holder_atom) @@ -121,5 +124,6 @@ listening|=M for(var/mob/M in listening) - M << "\icon[holder_atom] [holder_atom] reverberates, \blue\"[msg]\"" + to_chat(M, "\icon[holder_atom] [holder_atom] reverberates, \blue\"[msg]\"") + last_talk_time = world.time diff --git a/code/modules/research/xenoarchaeology/genetics/reconstitutor.dm b/code/modules/research/xenoarchaeology/genetics/reconstitutor.dm index fdc99e353ab..7205b3db313 100644 --- a/code/modules/research/xenoarchaeology/genetics/reconstitutor.dm +++ b/code/modules/research/xenoarchaeology/genetics/reconstitutor.dm @@ -196,13 +196,15 @@ datum/genesequence //pod1.occupant.name = "[pod1.occupant.name] ([rand(0,999)])" pod1.biomass -= CLONE_BIOMASS else - usr << "\red \icon[src] Unable to locate cloning pod!" + to_chat(usr, "\red \icon[src] Unable to locate cloning pod!") + else ..() /obj/machinery/computer/reconstitutor/Topic(href, href_list) if(href_list["insertpos"]) - //world << "inserting gene for genesequence [href_list["insertgenome"]] at pos [text2num(href_list["insertpos"])]" +// to_chat(world, "inserting gene for genesequence [href_list["insertgenome"]] at pos [text2num(href_list["insertpos"])]") + var/sequence_num = text2num(href_list["sequence_num"]) var/insertpos = text2num(href_list["insertpos"]) diff --git a/code/modules/research/xenoarchaeology/machinery/artifact_harvester.dm b/code/modules/research/xenoarchaeology/machinery/artifact_harvester.dm index ee22edf2fbd..95fdbe1103b 100644 --- a/code/modules/research/xenoarchaeology/machinery/artifact_harvester.dm +++ b/code/modules/research/xenoarchaeology/machinery/artifact_harvester.dm @@ -24,13 +24,15 @@ /obj/machinery/artifact_harvester/attackby(var/obj/I as obj, var/mob/user as mob, params) if(istype(I,/obj/item/weapon/anobattery)) if(!inserted_battery) - user << "\blue You insert [I] into [src]." + to_chat(user, "\blue You insert [I] into [src].") + user.drop_item() I.loc = src src.inserted_battery = I updateDialog() else - user << "\red There is already a battery in [src]." + to_chat(user, "\red There is already a battery in [src].") + else return..() diff --git a/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm b/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm index 61915c91e2d..ea953dad91b 100644 --- a/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm +++ b/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm @@ -62,7 +62,8 @@ /obj/machinery/radiocarbon_spectrometer/attackby(var/obj/I as obj, var/mob/user as mob, params) if(scanning) - user << "You can't do that while [src] is scanning!" + to_chat(user, "You can't do that while [src] is scanning!") + else if(istype(I, /obj/item/stack/nanopaste)) var/choice = alert("What do you want to do with the nanopaste?","Radiometric Scanner","Scan nanopaste","Fix seal integrity") @@ -78,14 +79,16 @@ var/obj/item/weapon/reagent_containers/glass/G = I var/amount_transferred = min(src.reagents.maximum_volume - src.reagents.total_volume, G.reagents.total_volume) G.reagents.trans_to(src, amount_transferred) - user << "You empty [amount_transferred]u of coolant into [src]." + to_chat(user, "You empty [amount_transferred]u of coolant into [src].") + update_coolant() return else if(choice == "Empty coolant") var/obj/item/weapon/reagent_containers/glass/G = I var/amount_transferred = min(G.reagents.maximum_volume - G.reagents.total_volume, src.reagents.total_volume) src.reagents.trans_to(G, amount_transferred) - user << "You remove [amount_transferred]u of coolant from [src]." + to_chat(user, "You remove [amount_transferred]u of coolant from [src].") + update_coolant() return user.drop_item() @@ -331,11 +334,14 @@ scanner_progress = 0 scanning = 1 t_left_radspike = pick(5,10,15) - usr << "Scan initiated." + to_chat(usr, "Scan initiated.") + else - usr << "Could not initiate scan, seal requires replacing." + to_chat(usr, "Could not initiate scan, seal requires replacing.") + else - usr << "Insert an item to scan." + to_chat(usr, "Insert an item to scan.") + if(href_list["maserWavelength"]) maser_wavelength = max(min(maser_wavelength + 1000 * text2num(href_list["maserWavelength"]), 10000), 1) diff --git a/code/modules/research/xenoarchaeology/tools/ano_device_battery.dm b/code/modules/research/xenoarchaeology/tools/ano_device_battery.dm index 6df826f3792..241c6423510 100644 --- a/code/modules/research/xenoarchaeology/tools/ano_device_battery.dm +++ b/code/modules/research/xenoarchaeology/tools/ano_device_battery.dm @@ -40,7 +40,8 @@ /obj/item/weapon/anodevice/attackby(var/obj/I as obj, var/mob/user as mob, params) if(istype(I, /obj/item/weapon/anobattery)) if(!inserted_battery) - user << "\blue You insert the battery." + to_chat(user, "\blue You insert the battery.") + user.drop_item() I.loc = src inserted_battery = I @@ -103,7 +104,8 @@ if(interval > 0) //apply the touch effect to the holder if(holder) - holder << "the \icon[src] [src] held by [holder] shudders in your grasp." + to_chat(holder, "the \icon[src] [src] held by [holder] shudders in your grasp.") + else src.loc.visible_message("the \icon[src] [src] shudders.") inserted_battery.battery_effect.DoEffectTouch(holder) diff --git a/code/modules/research/xenoarchaeology/tools/bunsen_burner.dm b/code/modules/research/xenoarchaeology/tools/bunsen_burner.dm index a90105585ee..12cc7646b07 100644 --- a/code/modules/research/xenoarchaeology/tools/bunsen_burner.dm +++ b/code/modules/research/xenoarchaeology/tools/bunsen_burner.dm @@ -12,29 +12,34 @@ /obj/machinery/bunsen_burner/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(istype(W, /obj/item/weapon/reagent_containers)) if(held_container) - user << "\red You must remove the [held_container] first." + to_chat(user, "\red You must remove the [held_container] first.") + else user.drop_item(src) held_container = W held_container.loc = src - user << "\blue You put the [held_container] onto the [src]." + to_chat(user, "\blue You put the [held_container] onto the [src].") + var/image/I = image("icon"=W, "layer"=FLOAT_LAYER) underlays += I if(heating) spawn(heat_time) try_heating() else - user << "\red You can't put the [W] onto the [src]." + to_chat(user, "\red You can't put the [W] onto the [src].") + /obj/machinery/bunsen_burner/attack_hand(mob/user as mob) if(held_container) underlays = null - user << "\blue You remove the [held_container] from the [src]." + to_chat(user, "\blue You remove the [held_container] from the [src].") + held_container.loc = src.loc held_container.attack_hand(user) held_container = null else - user << "\red There is nothing on the [src]." + to_chat(user, "\red There is nothing on the [src].") + /obj/machinery/bunsen_burner/proc/try_heating() src.visible_message("\blue \icon[src] [src] hisses.") diff --git a/code/modules/research/xenoarchaeology/tools/suspension_generator.dm b/code/modules/research/xenoarchaeology/tools/suspension_generator.dm index f377d7322c8..8be15d1c212 100644 --- a/code/modules/research/xenoarchaeology/tools/suspension_generator.dm +++ b/code/modules/research/xenoarchaeology/tools/suspension_generator.dm @@ -31,14 +31,16 @@ M.Weaken(3) cell.charge -= power_use if(prob(5)) - M << "\blue [pick("You feel tingly.","You feel like floating.","It is hard to speak.","You can barely move.")]" + to_chat(M, "\blue [pick("You feel tingly.","You feel like floating.","It is hard to speak.","You can barely move.")]") + if(field_type == "iron") for(var/mob/living/silicon/M in T) M.Weaken(3) cell.charge -= power_use if(prob(5)) - M << "\blue [pick("You feel tingly.","You feel like floating.","It is hard to speak.","You can barely move.")]" + to_chat(M, "\blue [pick("You feel tingly.","You feel like floating.","It is hard to speak.","You can barely move.")]") + for(var/obj/item/I in T) if(!suspension_field.contents.len) @@ -50,7 +52,8 @@ M.Weaken(3) cell.charge -= power_use if(prob(5)) - M << "\blue [pick("You feel tingly.","You feel like floating.","It is hard to speak.","You can barely move.")]" + to_chat(M, "\blue [pick("You feel tingly.","You feel like floating.","It is hard to speak.","You can barely move.")]") + if(cell.charge <= 0) deactivate() @@ -120,7 +123,8 @@ if(anchored) activate() else - usr << "You are unable to activate [src] until it is properly secured on the ground." + to_chat(usr, "You are unable to activate [src] until it is properly secured on the ground.") + else deactivate() if(href_list["select_field"]) @@ -135,9 +139,11 @@ I.loc = src auth_card = I if(attempt_unlock(I)) - usr << "You insert [I], the console flashes \'Access granted.\'" + to_chat(usr, "You insert [I], the console flashes \'Access granted.\'") + else - usr << "You insert [I], the console flashes \'Access denied.\'" + to_chat(usr, "You insert [I], the console flashes \'Access denied.\'") + else if(href_list["ejectcard"]) if(auth_card) if(ishuman(usr)) @@ -166,7 +172,8 @@ icon_state = "suspension0" cell = null - user << "You remove the power cell" + to_chat(user, "You remove the power cell") + /obj/machinery/suspension_gen/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if (istype(W, /obj/item/weapon/screwdriver)) @@ -175,7 +182,8 @@ screwed = 0 else screwed = 1 - user << "You [screwed ? "screw" : "unscrew"] the battery panel." + to_chat(user, "You [screwed ? "screw" : "unscrew"] the battery panel.") + else if (istype(W, /obj/item/weapon/crowbar)) if(!locked) if(!screwed) @@ -184,46 +192,57 @@ open = 0 else open = 1 - user << "You crowbar the battery panel [open ? "open" : "in place"]." + to_chat(user, "You crowbar the battery panel [open ? "open" : "in place"].") + icon_state = "suspension[open ? (cell ? "1" : "0") : "2"]" else - user << "[src]'s safety locks are engaged, shut it down first." + to_chat(user, "[src]'s safety locks are engaged, shut it down first.") + else - user << "Unscrew [src]'s battery panel first." + to_chat(user, "Unscrew [src]'s battery panel first.") + else - user << "[src]'s security locks are engaged." + to_chat(user, "[src]'s security locks are engaged.") + else if (istype(W, /obj/item/weapon/wrench)) if(!suspension_field) if(anchored) anchored = 0 else anchored = 1 - user << "You wrench the stabilising legs [anchored ? "into place" : "up against the body"]." + to_chat(user, "You wrench the stabilising legs [anchored ? "into place" : "up against the body"].") + if(anchored) desc = "It is resting securely on four stubby legs." else desc = "It has stubby legs bolted up against it's body for stabilising." else - user << "You are unable to secure [src] while it is active!" + to_chat(user, "You are unable to secure [src] while it is active!") + else if (istype(W, /obj/item/weapon/stock_parts/cell)) if(open) if(cell) - user << "There is a power cell already installed." + to_chat(user, "There is a power cell already installed.") + else user.drop_item() W.loc = src cell = W - user << "You insert the power cell." + to_chat(user, "You insert the power cell.") + icon_state = "suspension1" else if(istype(W, /obj/item/weapon/card)) var/obj/item/weapon/card/I = W if(!auth_card) if(attempt_unlock(I)) - user << "You swipe [I], the console flashes \'Access granted.\'" + to_chat(user, "You swipe [I], the console flashes \'Access granted.\'") + else - user << "You swipe [I], console flashes \'Access denied.\'" + to_chat(user, "You swipe [I], console flashes \'Access denied.\'") + else - user << "Remove [auth_card] first." + to_chat(user, "Remove [auth_card] first.") + /obj/machinery/suspension_gen/proc/attempt_unlock(var/obj/item/weapon/card/C) if(!open) @@ -305,7 +324,8 @@ var/turf/T = get_turf(suspension_field) for(var/mob/M in T) - M << "You no longer feel like floating." + to_chat(M, "You no longer feel like floating.") + M.SetWeakened(min(M.weakened, 3)) src.visible_message("\blue \icon[src] [src] deactivates with a gentle shudder.") @@ -323,7 +343,8 @@ set category = "Object" if(anchored) - usr << "\red You cannot rotate [src], it has been firmly fixed to the floor." + to_chat(usr, "\red You cannot rotate [src], it has been firmly fixed to the floor.") + else dir = turn(dir, 90) @@ -333,7 +354,8 @@ set category = "Object" if(anchored) - usr << "\red You cannot rotate [src], it has been firmly fixed to the floor." + to_chat(usr, "\red You cannot rotate [src], it has been firmly fixed to the floor.") + else dir = turn(dir, -90) diff --git a/code/modules/research/xenoarchaeology/tools/tools_anoscanner.dm b/code/modules/research/xenoarchaeology/tools/tools_anoscanner.dm index 6f7e29917a8..0f012bcacdd 100644 --- a/code/modules/research/xenoarchaeology/tools/tools_anoscanner.dm +++ b/code/modules/research/xenoarchaeology/tools/tools_anoscanner.dm @@ -26,7 +26,8 @@ else message = "Scanning array is recharging." - user << "[message]" + to_chat(user, "[message]") + /obj/item/device/ano_scanner/proc/scan() last_scan_time = world.time diff --git a/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm b/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm index 47b0f7e9e2f..c0f369b2524 100644 --- a/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm +++ b/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm @@ -27,16 +27,19 @@ /obj/item/device/core_sampler/examine(mob/user) if(..(user, 2)) - user << "\blue Used to extract geological core samples - this one is [sampled_turf ? "full" : "empty"], and has [num_stored_bags] bag[num_stored_bags != 1 ? "s" : ""] remaining." + to_chat(user, "\blue Used to extract geological core samples - this one is [sampled_turf ? "full" : "empty"], and has [num_stored_bags] bag[num_stored_bags != 1 ? "s" : ""] remaining.") + /obj/item/device/core_sampler/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(istype(W,/obj/item/weapon/evidencebag)) if(num_stored_bags < 10) qdel(W) num_stored_bags += 1 - user << "\blue You insert the [W] into the core sampler." + to_chat(user, "\blue You insert the [W] into the core sampler.") + else - user << "\red The core sampler can not fit any more bags!" + to_chat(user, "\red The core sampler can not fit any more bags!") + else return ..() @@ -52,9 +55,11 @@ if(geo_data) if(filled_bag) - user << "\red The core sampler is full!" + to_chat(user, "\red The core sampler is full!") + else if(num_stored_bags < 1) - user << "\red The core sampler is out of sample bags!" + to_chat(user, "\red The core sampler is out of sample bags!") + else //create a new sample bag which we'll fill with rock samples filled_bag = new /obj/item/weapon/evidencebag(src) @@ -75,13 +80,16 @@ filled_bag.underlays += I filled_bag.w_class = 1 - user << "\blue You take a core sample of the [item_to_sample]." + to_chat(user, "\blue You take a core sample of the [item_to_sample].") + else - user << "\red You are unable to take a sample of [item_to_sample]." + to_chat(user, "\red You are unable to take a sample of [item_to_sample].") + /obj/item/device/core_sampler/attack_self() if(filled_bag) - usr << "\blue You eject the full sample bag." + to_chat(usr, "\blue You eject the full sample bag.") + var/success = 0 if(istype(src.loc, /mob)) var/mob/M = src.loc @@ -91,4 +99,5 @@ filled_bag = null icon_state = "sampler0" else - usr << "\red The core sampler is empty." + to_chat(usr, "\red The core sampler is empty.") + diff --git a/code/modules/research/xenoarchaeology/tools/tools_depthscanner.dm b/code/modules/research/xenoarchaeology/tools/tools_depthscanner.dm index 487aa897d8f..486d405b8fa 100644 --- a/code/modules/research/xenoarchaeology/tools/tools_depthscanner.dm +++ b/code/modules/research/xenoarchaeology/tools/tools_depthscanner.dm @@ -46,7 +46,8 @@ positive_locations.Add(D) for(var/mob/L in range(src, 1)) - L << "\blue \icon[src] [src] pings." + to_chat(L, "\blue \icon[src] [src] pings.") + else if(istype(A,/obj/structure/boulder)) var/obj/structure/boulder/B = A @@ -65,7 +66,8 @@ positive_locations.Add(D) for(var/mob/L in range(src, 1)) - L << "\blue \icon[src] [src] pings [pick("madly","wildly","excitedly","crazily")]!." + to_chat(L, "\blue \icon[src] [src] pings [pick("madly","wildly","excitedly","crazily")]!.") + /obj/item/device/depth_scanner/attack_self(var/mob/user as mob) return src.interact(user) diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm index 8fcabf82e0c..ab2ad00f104 100644 --- a/code/modules/research/xenobiology/xenobio_camera.dm +++ b/code/modules/research/xenobiology/xenobio_camera.dm @@ -148,7 +148,8 @@ var/mob/living/carbon/human/monkey/food = new /mob/living/carbon/human/monkey(remote_eye.loc) food.LAssailant = C X.monkeys -- - owner << "[X] now has [X.monkeys] monkeys left." + to_chat(owner, "[X] now has [X.monkeys] monkeys left.") + /datum/action/monkey_recycle diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index e92f52f6c59..f810c41878b 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -19,12 +19,15 @@ attackby(obj/item/O as obj, mob/user as mob, params) if(istype(O, /obj/item/weapon/slimesteroid2)) if(enhanced == 1) - user << " This extract has already been enhanced!" + to_chat(user, " This extract has already been enhanced!") + return ..() if(Uses == 0) - user << " You can't enhance a used extract!" + to_chat(user, " You can't enhance a used extract!") + return ..() - user <<"You apply the enhancer. It now has triple the amount of uses." + to_chat(user, "You apply the enhancer. It now has triple the amount of uses.") + Uses = 3 enhanced = 1 qdel(O) @@ -153,13 +156,16 @@ attack(mob/living/carbon/slime/M as mob, mob/user as mob) if(!istype(M, /mob/living/carbon/slime))//If target is not a slime. - user << " The potion only works on slimes!" + to_chat(user, " The potion only works on slimes!") + return ..() if(M.stat) - user << " The slime is dead!" + to_chat(user, " The slime is dead!") + return..() if(M.mind) - user << " The slime resists!" + to_chat(user, " The slime resists!") + return ..() if(M.is_adult) var/mob/living/simple_animal/adultslime/pet = new /mob/living/simple_animal/adultslime(M.loc) @@ -189,7 +195,8 @@ pet.name = newname pet.real_name = newname qdel(src) - user <<"You feed the slime the potion, removing it's powers and calming it." + to_chat(user, "You feed the slime the potion, removing it's powers and calming it.") + /obj/item/weapon/sentience_potion name = "sentience potion" @@ -206,13 +213,16 @@ if(being_used || !ismob(M)) return if(!isanimal(M) || M.ckey) //only works on animals that aren't player controlled - user << "[M] is already too intelligent for this to work!" + to_chat(user, "[M] is already too intelligent for this to work!") + return ..() if(M.stat) - user << "[M] is dead!" + to_chat(user, "[M] is dead!") + return..() - user << "You offer the sentience potion to [M]..." + to_chat(user, "You offer the sentience potion to [M]...") + being_used = 1 var/list/candidates = pollCandidates("Do you want to play as [M.name]?", ROLE_SENTIENT, 0, 100) @@ -225,15 +235,19 @@ M.key = C.key M.universal_speak = 1 M.faction |= "sentient" - M << "All at once it makes sense: you know what you are and who you are! Self awareness is yours!" - M << "You are grateful to be self aware and owe [user] a great debt. Serve [user], and assist them in completing their goals at any cost." - user << "[M] accepts the potion and suddenly becomes attentive and aware. It worked!" + to_chat(M, "All at once it makes sense: you know what you are and who you are! Self awareness is yours!") + + to_chat(M, "You are grateful to be self aware and owe [user] a great debt. Serve [user], and assist them in completing their goals at any cost.") + + to_chat(user, "[M] accepts the potion and suddenly becomes attentive and aware. It worked!") + if(isanimal(M)) var/mob/living/simple_animal/S = M S.master_commander = user qdel(src) else - user << "[M] looks interested for a moment, but then looks back down. Maybe you should try again later." + to_chat(user, "[M] looks interested for a moment, but then looks back down. Maybe you should try again later.") + being_used = 0 ..() @@ -249,19 +263,24 @@ attack(mob/living/carbon/slime/M as mob, mob/user as mob) if(!istype(M, /mob/living/carbon/slime))//If target is not a slime. - user << " The steroid only works on baby slimes!" + to_chat(user, " The steroid only works on baby slimes!") + return ..() if(M.is_adult) //Can't tame adults - user << " Only baby slimes can use the steroid!" + to_chat(user, " Only baby slimes can use the steroid!") + return..() if(M.stat) - user << " The slime is dead!" + to_chat(user, " The slime is dead!") + return..() if(M.cores == 3) - user <<" The slime already has the maximum amount of extract!" + to_chat(user, " The slime already has the maximum amount of extract!") + return..() - user <<"You feed the slime the steroid. It now has triple the amount of extract." + to_chat(user, "You feed the slime the steroid. It now has triple the amount of extract.") + M.cores = 3 qdel(src) @@ -285,12 +304,15 @@ /obj/item/weapon/slimespeed/afterattack(obj/item/C, mob/user) ..() if(!istype(C)) - user << "The potion can only be used on items!" + to_chat(user, "The potion can only be used on items!") + return if(C.slowdown <= 0) - user << "The [C] can't be made any faster!" + to_chat(user, "The [C] can't be made any faster!") + return..() - user <<"You slather the red gunk over the [C], making it faster." + to_chat(user, "You slather the red gunk over the [C], making it faster.") + C.color = "#FF0000" C.slowdown = 0 qdel(src) @@ -311,12 +333,15 @@ qdel(src) return if(!istype(C)) - user << "The potion can only be used on clothing!" + to_chat(user, "The potion can only be used on clothing!") + return if(C.max_heat_protection_temperature == FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT) - user << "The [C] is already fireproof!" + to_chat(user, "The [C] is already fireproof!") + return..() - user <<"You slather the blue gunk over the [C], fireproofing it." + to_chat(user, "You slather the blue gunk over the [C], fireproofing it.") + C.name = "fireproofed [C.name]" C.color = "#000080" C.max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT @@ -481,18 +506,21 @@ var/mob/dead/observer/ghost for(var/mob/dead/observer/O in src.loc) if(!check_observer(O)) - O << "\red You are not eligible to become a golem." + to_chat(O, "\red You are not eligible to become a golem.") + continue ghost = O break if(!ghost) - user << "The rune fizzles uselessly. There is no spirit nearby." + to_chat(user, "The rune fizzles uselessly. There is no spirit nearby.") + return var/mob/living/carbon/human/golem/G = new /mob/living/carbon/human/golem G.change_gender(pick(MALE,FEMALE)) G.loc = src.loc G.key = ghost.key - G << "You are an adamantine golem. You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools. Serve [user], and assist them in completing their goals at any cost." + to_chat(G, "You are an adamantine golem. You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools. Serve [user], and assist them in completing their goals at any cost.") + qdel(src) @@ -501,7 +529,8 @@ if(O.client) var/area/A = get_area(src) if(A) - O << "\blue Golem rune created in [A.name]. (Teleport | Sign Up)" + to_chat(O, "\blue Golem rune created in [A.name]. (Teleport | Sign Up)") + Topic(href,href_list) if("signup" in href_list) @@ -526,10 +555,13 @@ proc/volunteer(var/mob/dead/observer/O) if(O in ghosts) ghosts.Remove(O) - O << "\red You are no longer signed up to be a golem." + to_chat(O, "\red You are no longer signed up to be a golem.") + else if(!check_observer(O)) - O << "\red You are not eligible to become a golem." + to_chat(O, "\red You are not eligible to become a golem.") + return ghosts.Add(O) - O << "\blue You are signed up to be a golem." \ No newline at end of file + to_chat(O, "\blue You are signed up to be a golem.") + diff --git a/code/modules/scripting/Parser/Keywords.dm b/code/modules/scripting/Parser/Keywords.dm index a4470242f5e..9a52e1f39b0 100644 --- a/code/modules/scripting/Parser/Keywords.dm +++ b/code/modules/scripting/Parser/Keywords.dm @@ -81,7 +81,9 @@ var/const/Represents a special statement in the code triggered by a keyword. ifstmt = L[L.len] //Get the last statement in the current block if(!ifstmt || !istype(ifstmt) || ifstmt.else_if) - usr << "NTSL: ELSE IF FAILED: [!ifstmt], [!istype(ifstmt)], [!istype(ifstmt) || ifstmt.else_if]" // Usr is unsafe as SHIT but JUST incase I forget this debug line like the fucking asset cache... + to_chat(usr, "NTSL: ELSE IF FAILED: [!ifstmt], [!istype(ifstmt)], [!istype(ifstmt) || ifstmt.else_if]")// Usr is unsafe as SHIT but JUST incase I forget this debug line like the fucking asset cache... + + parser.errors += new/datum/scriptError/ExpectedToken("if statement", parser.curToken) return KW_FAIL @@ -108,7 +110,9 @@ var/const/Represents a special statement in the code triggered by a keyword. stmt = L[L.len] //Get the last statement in the current block if(!stmt || !istype(stmt) || stmt.else_block) //Ensure that it is an if statement - usr << "NTSL: ELSE IF FAILED: [!stmt], [!istype(stmt)], [!istype(stmt) || stmt.else_block]" // Usr is unsafe as SHIT but JUST incase I forget this debug line like the fucking asset cache... + to_chat(usr, "NTSL: ELSE IF FAILED: [!stmt], [!istype(stmt)], [!istype(stmt) || stmt.else_block]")// Usr is unsafe as SHIT but JUST incase I forget this debug line like the fucking asset cache... + + parser.errors += new/datum/scriptError/ExpectedToken("if statement", parser.curToken) return KW_FAIL diff --git a/code/modules/security_levels/keycard authentication.dm b/code/modules/security_levels/keycard authentication.dm index 0fbff9cd68a..8e46a0e4e27 100644 --- a/code/modules/security_levels/keycard authentication.dm +++ b/code/modules/security_levels/keycard authentication.dm @@ -23,12 +23,14 @@ power_channel = ENVIRON /obj/machinery/keycard_auth/attack_ai(mob/user as mob) - user << "The station AI is not to interact with these devices." + to_chat(user, "The station AI is not to interact with these devices.") + return /obj/machinery/keycard_auth/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(stat & (NOPOWER|BROKEN)) - user << "This device is not powered." + to_chat(user, "This device is not powered.") + return if(istype(W,/obj/item/weapon/card/id)) var/obj/item/weapon/card/id/ID = W @@ -40,7 +42,8 @@ event_source.event_confirmed_by = usr else if(screen == 2) if(event == "Emergency Response Team" && ert_reason == "Reason for ERT") - user << "Supply a reason for calling the ERT first!" + to_chat(user, "Supply a reason for calling the ERT first!") + return event_triggered_by = usr broadcast_request() //This is the device making the initial event request. It needs to broadcast to other devices @@ -59,10 +62,12 @@ /obj/machinery/keycard_auth/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) if(user.stat || stat & (NOPOWER|BROKEN)) - user << "This device is not powered." + to_chat(user, "This device is not powered.") + return if(busy) - user << "This device is busy." + to_chat(user, "This device is busy.") + return user.set_machine(src) @@ -82,10 +87,12 @@ if(..()) return if(busy) - usr << "This device is busy." + to_chat(usr, "This device is busy.") + return if(usr.stat || stat & (BROKEN|NOPOWER)) - usr << "This device is without power." + to_chat(usr, "This device is without power.") + return if(href_list["triggerevent"]) event = href_list["triggerevent"] @@ -153,10 +160,12 @@ feedback_inc("alert_keycard_auth_maintRevoke",1) if("Emergency Response Team") if(is_ert_blocked()) - usr << "\red All Emergency Response Teams are dispatched and can not be called at this time." + to_chat(usr, "\red All Emergency Response Teams are dispatched and can not be called at this time.") + return - usr << "ERT request transmitted." + to_chat(usr, "ERT request transmitted.") + if(admins.len) ERT_Announce(ert_reason , event_triggered_by) ert_reason = "Reason for ERT" diff --git a/code/modules/shuttle/assault_pod.dm b/code/modules/shuttle/assault_pod.dm index 788bde31a6b..d386fc3774a 100644 --- a/code/modules/shuttle/assault_pod.dm +++ b/code/modules/shuttle/assault_pod.dm @@ -54,6 +54,7 @@ if(S.shuttleId == shuttle_id) S.possible_destinations = "[landing_zone.id]" - user << "Landing zone set." + to_chat(user, "Landing zone set.") + qdel(src) diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index 49aedfbad89..fd2b2b74771 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -22,16 +22,19 @@ var/obj/item/device/pda/pda = W W = pda.id if (!W:access) //no access - user << "The access level of [W:registered_name]\'s card is not high enough. " + to_chat(user, "The access level of [W:registered_name]\'s card is not high enough. ") + return var/list/cardaccess = W:access if(!istype(cardaccess, /list) || !cardaccess.len) //no access - user << "The access level of [W:registered_name]\'s card is not high enough. " + to_chat(user, "The access level of [W:registered_name]\'s card is not high enough. ") + return if(!(access_heads in W:access)) //doesn't have this access - user << "The access level of [W:registered_name]\'s card is not high enough. " + to_chat(user, "The access level of [W:registered_name]\'s card is not high enough. ") + return 0 var/choice = alert(user, text("Would you like to (un)authorize a shortened launch time? [] authorization\s are still needed. Use abort to cancel all authorizations.", src.auth_need - src.authorized.len), "Shuttle Launch", "Authorize", "Repeal", "Abort") @@ -197,7 +200,8 @@ if(time_left <= 50 && !sound_played) //4 seconds left - should sync up with the launch sound_played = 1 for(var/area/shuttle/escape/E in world) - E << 'sound/effects/hyperspace_begin.ogg' + to_chat(E, 'sound/effects/hyperspace_begin.ogg') + if(time_left <= 0 && !shuttle_master.emergencyNoEscape) //move each escape pod to its corresponding transit dock @@ -206,7 +210,8 @@ M.enterTransit() //now move the actual emergency shuttle to its transit dock for(var/area/shuttle/escape/E in world) - E << 'sound/effects/hyperspace_progress.ogg' + to_chat(E, 'sound/effects/hyperspace_progress.ogg') + enterTransit() mode = SHUTTLE_ESCAPE timer = world.time @@ -218,7 +223,8 @@ M.dock(shuttle_master.getDock("[M.id]_away")) //now move the actual emergency shuttle to centcomm for(var/area/shuttle/escape/E in world) - E << 'sound/effects/hyperspace_end.ogg' + to_chat(E, 'sound/effects/hyperspace_end.ogg') + dock(shuttle_master.getDock("emergency_away")) mode = SHUTTLE_ENDGAME timer = 0 @@ -269,7 +275,8 @@ return /obj/machinery/computer/shuttle/pod/emag_act(mob/user as mob) - user << " Access requirements overridden. The pod may now be launched manually at any time." + to_chat(user, " Access requirements overridden. The pod may now be launched manually at any time.") + admin_controlled = 0 icon_state = "dorm_emag" diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 0c09b0ea920..49dde9cb4d9 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -675,21 +675,26 @@ usr.set_machine(src) src.add_fingerprint(usr) if(!allowed(usr)) - usr << "Access denied." + to_chat(usr, "Access denied.") return if(href_list["move"]) switch(shuttle_master.moveShuttle(shuttleId, href_list["move"], 1)) - if(0) usr << "Shuttle received message and will be sent shortly." - if(1) usr << "Invalid shuttle requested." - else usr << "Unable to comply." + if(0) + to_chat(usr, "Shuttle received message and will be sent shortly.") + if(1) + to_chat(usr, "Invalid shuttle requested.") + else + to_chat(usr, "Unable to comply.") + updateUsrDialog() /obj/machinery/computer/shuttle/emag_act(mob/user) if(!emagged) src.req_access = list() emagged = 1 - user << "You fried the consoles ID checking system." + to_chat(user, "You fried the consoles ID checking system.") + /obj/machinery/computer/shuttle/ferry name = "transport ferry console" @@ -711,8 +716,8 @@ if(cooldown) return cooldown = 1 - usr << "Your request has been recieved by Centcom." - admins << "FERRY: [key_name_admin(usr)] (?) (FLW) (Move Ferry) is requesting to move the transport ferry to Centcom." + to_chat(usr, "Your request has been recieved by Centcom.") + to_chat(admins, "FERRY: [key_name_admin(usr)] (?) (FLW) (Move Ferry) is requesting to move the transport ferry to Centcom.") spawn(600) //One minute cooldown cooldown = 0 diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index 405ea460822..d67c5142175 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -558,7 +558,8 @@ /obj/machinery/computer/supplycomp/attack_hand(var/mob/user as mob) if(!allowed(user) && !isobserver(user)) - user << "Access denied." + to_chat(user, "Access denied.") + return 1 post_signal("supply") @@ -567,7 +568,8 @@ /obj/machinery/computer/supplycomp/emag_act(user as mob) if(!hacked) - user << "Special supplies unlocked." + to_chat(user, "Special supplies unlocked.") + hacked = 1 return @@ -651,7 +653,8 @@ if(href_list["send"]) if(shuttle_master.supply.canMove()) - usr << "For safety reasons the automated supply shuttle cannot transport live organisms, classified nuclear weaponry or homing beacons." + to_chat(usr, "For safety reasons the automated supply shuttle cannot transport live organisms, classified nuclear weaponry or homing beacons.") + else if(shuttle_master.supply.getDockedId() == "supply_home") shuttle_master.toggleShuttle("supply", "supply_home", "supply_away", 1) investigate_log("[key_name(usr)] has sent the supply shuttle away. Remaining points: [shuttle_master.points]. Shuttle contents: [shuttle_master.sold_atoms]", "cargo") @@ -718,7 +721,8 @@ shuttle_master.shoppinglist += O investigate_log("[key_name(usr)] has authorized an order for [P.name]. Remaining points: [shuttle_master.points].", "cargo") else - usr << "There are insufficient supply points for this request." + to_chat(usr, "There are insufficient supply points for this request.") + break else if (href_list["rreq"]) diff --git a/code/modules/shuttle/syndicate.dm b/code/modules/shuttle/syndicate.dm index 5361ee686bf..0ce399c827b 100644 --- a/code/modules/shuttle/syndicate.dm +++ b/code/modules/shuttle/syndicate.dm @@ -16,7 +16,8 @@ /obj/machinery/computer/shuttle/syndicate/Topic(href, href_list) if(href_list["move"]) if(challenge && world.time < SYNDICATE_CHALLENGE_TIMER) - usr << "You've issued a combat challenge to the station! You've got to give them at least [round(((SYNDICATE_CHALLENGE_TIMER - world.time) / 10) / 60)] more minutes to allow them to prepare." + to_chat(usr, "You've issued a combat challenge to the station! You've got to give them at least [round(((SYNDICATE_CHALLENGE_TIMER - world.time) / 10) / 60)] more minutes to allow them to prepare.") + return 0 ..() @@ -31,7 +32,8 @@ /obj/machinery/computer/shuttle/syndicate/drop_pod/Topic(href, href_list) if(href_list["move"]) if(z != ZLEVEL_CENTCOMM) - usr << "Pods are one way!" + to_chat(usr, "Pods are one way!") + return 0 ..() diff --git a/code/modules/surgery/dental_implant.dm b/code/modules/surgery/dental_implant.dm index 5fbe6a5486c..fbe38ecd29f 100644 --- a/code/modules/surgery/dental_implant.dm +++ b/code/modules/surgery/dental_implant.dm @@ -49,7 +49,8 @@ /datum/action/item_action/hands_free/activate_pill/Trigger() if(!Checks()) return - owner << "You grit your teeth and burst the implanted [target]!" + to_chat(owner, "You grit your teeth and burst the implanted [target]!") + add_logs(owner, null, "swallowed an implanted pill", target) if(target.reagents.total_volume) target.reagents.reaction(owner, INGEST) diff --git a/code/modules/surgery/helpers.dm b/code/modules/surgery/helpers.dm index be1cb2264a9..1cd7feac6d7 100644 --- a/code/modules/surgery/helpers.dm +++ b/code/modules/surgery/helpers.dm @@ -57,7 +57,8 @@ else if(!current_surgery.step_in_progress) if(current_surgery.status == 1 ) M.surgeries -= current_surgery - user << "You stop the surgery." + to_chat(user, "You stop the surgery.") + qdel(current_surgery) else if(istype(user.get_inactive_hand(), /obj/item/weapon/cautery) && current_surgery.can_cancel) M.surgeries -= current_surgery @@ -69,7 +70,8 @@ affecting.status &= ~ORGAN_BLEEDING qdel(current_surgery) else if(current_surgery.can_cancel) - user << "You need to hold a cautery in inactive hand to stop [M]'s surgery!" + to_chat(user, "You need to hold a cautery in inactive hand to stop [M]'s surgery!") + return 1 diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm index 8cb6c926061..009bc7aac4b 100644 --- a/code/modules/surgery/implant.dm +++ b/code/modules/surgery/implant.dm @@ -156,7 +156,8 @@ IC = I break if(istype(tool,/obj/item/weapon/cautery)) - user << "you prepare to close the cavity wall." + to_chat(user, "you prepare to close the cavity wall.") + else if(tool) user.visible_message("[user] starts putting \the [tool] inside [target]'s [get_cavity(affected)] cavity.", \ "You start putting \the [tool] inside [target]'s [get_cavity(affected)] cavity." ) @@ -172,28 +173,33 @@ var/obj/item/organ/external/chest/affected = target.get_organ(target_zone) if(istype(tool, /obj/item/weapon/disk/nuclear)) - user << "Central command would kill you if you implanted the disk into someone." + to_chat(user, "Central command would kill you if you implanted the disk into someone.") + return 0//fail if(istype(tool,/obj/item/organ)) - user << "This isn't the type of surgery for organ transplants!" + to_chat(user, "This isn't the type of surgery for organ transplants!") + return 0//fail if(!user.canUnEquip(tool, 0)) - user << "[tool] is stuck to your hand, you can't put it in [target]!" + to_chat(user, "[tool] is stuck to your hand, you can't put it in [target]!") + return 0 if(istype(tool,/obj/item/weapon/cautery)) return 1//god this is ugly.... else if(tool) if(IC) - user << "There seems to be something in there already!" + to_chat(user, "There seems to be something in there already!") + return 1 else user.visible_message(" [user] puts \the [tool] inside [target]'s [get_cavity(affected)] cavity.", \ " You put \the [tool] inside [target]'s [get_cavity(affected)] cavity." ) if((tool.w_class > get_max_wclass(affected)/2 && prob(50) && !(affected.status & ORGAN_ROBOT))) - user << " You tear some vessels trying to fit the object in the cavity." + to_chat(user, " You tear some vessels trying to fit the object in the cavity.") + var/datum/wound/internal_bleeding/I = new () affected.wounds += I affected.owner.custom_pain("You feel something rip in your [affected.name]!", 1) @@ -209,7 +215,8 @@ target.internal_organs -= IC return 1 else - user << "You don't find anything in [target]'s [target_zone]." + to_chat(user, "You don't find anything in [target]'s [target_zone].") + return 0 @@ -364,8 +371,10 @@ if(objects > 0) user.visible_message("[user] sucessfully removes [objects] objects from [H]'s [L.limb_name]!", "You sucessfully remove [objects] objects from [H]'s [L.limb_name].") else - user << "You find no objects embedded in [H]'s [L.limb_name]!" + to_chat(user, "You find no objects embedded in [H]'s [L.limb_name]!") + else - user << "You can't find [target]'s [target_zone], let alone any objects embedded in it!" + to_chat(user, "You can't find [target]'s [target_zone], let alone any objects embedded in it!") + return 1 \ No newline at end of file diff --git a/code/modules/surgery/organs/augments_eyes.dm b/code/modules/surgery/organs/augments_eyes.dm index a6fdf24d715..b75e1699c09 100644 --- a/code/modules/surgery/organs/augments_eyes.dm +++ b/code/modules/surgery/organs/augments_eyes.dm @@ -36,7 +36,8 @@ HMN.b_eyes = eye_colour[3] HMN.update_eyes() if(aug_message && !special) - owner << "[aug_message]" + to_chat(owner, "[aug_message]") + M.sight |= vision_flags /obj/item/organ/internal/cyberimp/eyes/remove(var/mob/living/carbon/M, var/special = 0) @@ -59,7 +60,8 @@ if(severity > 1) if(prob(10 * severity)) return - owner << "Static obfuscates your vision!" + to_chat(owner, "Static obfuscates your vision!") + owner.flash_eyes(visual = 1) diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index a135a60df2f..622a484bb8b 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -34,7 +34,8 @@ return var/stun_amount = 5 + (severity-1 ? 0 : 5) owner.Stun(stun_amount) - owner << "Your body seizes up!" + to_chat(owner, "Your body seizes up!") + return stun_amount @@ -71,7 +72,8 @@ r_hand_ignore = 0 if(!l_hand_obj && !r_hand_obj) - owner << "You are not holding any items, your hands relax..." + to_chat(owner, "You are not holding any items, your hands relax...") + active = 0 else var/msg = 0 @@ -79,14 +81,18 @@ msg += !r_hand_ignore && r_hand_obj ? 2 : 0 switch(msg) if(1) - owner << "Your left hand's grip tightens." + to_chat(owner, "Your left hand's grip tightens.") + if(2) - owner << "Your right hand's grip tightens." + to_chat(owner, "Your right hand's grip tightens.") + if(3) - owner << "Both of your hand's grips tighten." + to_chat(owner, "Both of your hand's grips tighten.") + else release_items() - owner << "Your hands relax..." + to_chat(owner, "Your hands relax...") + l_hand_obj = null r_hand_obj = null @@ -103,11 +109,13 @@ if(L_item) A = pick(oview(range)) L_item.throw_at(A, range, 2) - owner << "Your left arm spasms and throws the [L_item.name]!" + to_chat(owner, "Your left arm spasms and throws the [L_item.name]!") + if(R_item) A = pick(oview(range)) R_item.throw_at(A, range, 2) - owner << "Your right arm spasms and throws the [R_item.name]!" + to_chat(owner, "Your right arm spasms and throws the [R_item.name]!") + /obj/item/organ/internal/cyberimp/brain/anti_drop/proc/release_items() if(!l_hand_ignore && l_hand_obj in owner.contents) @@ -172,7 +180,8 @@ return if(owner.nutrition <= hunger_threshold) synthesizing = 1 - owner << "You feel less hungry..." + to_chat(owner, "You feel less hungry...") + owner.nutrition += 50 spawn(50) synthesizing = 0 @@ -181,7 +190,8 @@ if(!owner) return owner.reagents.add_reagent("????",poison_amount / severity) //food poisoning - owner << "You feel like your insides are burning." + to_chat(owner, "You feel like your insides are burning.") + /obj/item/organ/internal/cyberimp/chest/nutriment/plus name = "Nutriment pump implant PLUS" @@ -246,7 +256,8 @@ spawn(600 / severity) H.heart_attack = 0 if(H.stat == CONSCIOUS) - H << "You feel your heart beating again!" + to_chat(H, "You feel your heart beating again!") + //ARM...THAT GO IN THE CHEST /obj/item/organ/internal/cyberimp/chest/arm_mod//dummy parent item for making arm-mod implants. works best with nodrop items that are sent to nullspace upon being dropped. @@ -264,7 +275,8 @@ /obj/item/organ/internal/cyberimp/chest/arm_mod/ui_action_click() if(overloaded)//ensure the implant isn't broken - owner << "The implant doesn't respond. It seems to be broken..." + to_chat(owner, "The implant doesn't respond. It seems to be broken...") + return if(out)//check if the owner has the item out already owner.unEquip(holder, 1)//if he does, take it away. then, @@ -280,7 +292,8 @@ playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, 1) else//if this fails to put the item in his hands, holder.loc = null//keep it in nullspace - owner << "You can't extend [holder] if you can't use your hands!" + to_chat(owner, "You can't extend [holder] if you can't use your hands!") + /obj/item/organ/internal/cyberimp/chest/arm_mod/emp_act(severity)//if the implant gets EMPed... if(!owner || overloaded)//ensure that it's in an owner and that it's not already EMPed, then... @@ -292,7 +305,8 @@ owner.visible_message("[holder] forcibly retracts into [owner]'s arm.") owner.visible_message("A loud bang comes from [owner]...") playsound(get_turf(owner), 'sound/effects/bang.ogg', 100, 1) - owner << "You feel an explosion erupt inside you as your chest implant breaks. Is it hot in here?" + to_chat(owner, "You feel an explosion erupt inside you as your chest implant breaks. Is it hot in here?") + owner.adjust_fire_stacks(20) owner.IgniteMob()//ignite the owner, as well as owner.say("AUUUUUUUUUUUUUUUUUUGH!!") diff --git a/code/modules/surgery/organs/autoimplanter.dm b/code/modules/surgery/organs/autoimplanter.dm index 98d7867c8c8..117210f732f 100644 --- a/code/modules/surgery/organs/autoimplanter.dm +++ b/code/modules/surgery/organs/autoimplanter.dm @@ -8,7 +8,8 @@ /obj/item/device/autoimplanter/attack_self(mob/user)//when the object it used... if(!storedorgan) - user << "[src] currently has no implant stored." + to_chat(user, "[src] currently has no implant stored.") + return storedorgan.insert(user)//insert stored organ into the user user.visible_message("[user] presses a button on [src], and you hear a short mechanical noise.", "You feel a sharp sting as [src] plunges into your body.") @@ -18,18 +19,22 @@ /obj/item/device/autoimplanter/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/organ/internal/cyberimp)) if(storedorgan) - user << "[src] already has an implant stored." + to_chat(user, "[src] already has an implant stored.") + return if(!user.drop_item()) return I.forceMove(src) storedorgan = I - user << "You insert the [I] into [src]." + to_chat(user, "You insert the [I] into [src].") + else if(istype(I, /obj/item/weapon/screwdriver)) if(!storedorgan) - user << "There's no implant in [src] for you to remove." + to_chat(user, "There's no implant in [src] for you to remove.") + else storedorgan.forceMove(get_turf(user)) storedorgan = null - user << "You remove the [storedorgan] from [src]." + to_chat(user, "You remove the [storedorgan] from [src].") + playsound(get_turf(user), 'sound/items/Screwdriver.ogg', 50, 1) diff --git a/code/modules/surgery/organs/blood.dm b/code/modules/surgery/organs/blood.dm index 35c38d1b99b..5487df397dc 100644 --- a/code/modules/surgery/organs/blood.dm +++ b/code/modules/surgery/organs/blood.dm @@ -126,10 +126,12 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 pale = 1 update_body() var/word = pick("dizzy","woosey","faint") - src << "\red You feel [word]" + to_chat(src, "\red You feel [word]") + if(prob(1)) var/word = pick("dizzy","woosey","faint") - src << "\red You feel [word]" + to_chat(src, "\red You feel [word]") + if(oxyloss < 20) oxyloss += 3 if(BLOOD_VOLUME_BAD to BLOOD_VOLUME_OKAY) @@ -143,7 +145,8 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 if(prob(15)) Paralyse(rand(1,3)) var/word = pick("dizzy","woosey","faint") - src << "\red You feel very [word]" + to_chat(src, "\red You feel very [word]") + if(BLOOD_VOLUME_SURVIVE to BLOOD_VOLUME_BAD) if(!pale) pale = 1 @@ -154,7 +157,8 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 if(prob(15)) Paralyse(rand(1,3)) var/word = pick("dizzy","woosey","faint") - src << "\red You feel extremely [word]" + to_chat(src, "\red You feel extremely [word]") + if(0 to BLOOD_VOLUME_SURVIVE) death() diff --git a/code/modules/surgery/organs/body_egg.dm b/code/modules/surgery/organs/body_egg.dm index 7cd53c4319a..ef9d3a4ca4b 100644 --- a/code/modules/surgery/organs/body_egg.dm +++ b/code/modules/surgery/organs/body_egg.dm @@ -8,7 +8,8 @@ /obj/item/organ/internal/body_egg/on_find(mob/living/finder) ..() - finder << "You found an unknown alien organism in [owner]'s [parent_organ]!" + to_chat(finder, "You found an unknown alien organism in [owner]'s [parent_organ]!") + /obj/item/organ/internal/body_egg/insert(var/mob/living/carbon/M, special = 0) ..() diff --git a/code/modules/surgery/organs/organ.dm b/code/modules/surgery/organs/organ.dm index 9f879a4492d..7a9c0886191 100644 --- a/code/modules/surgery/organs/organ.dm +++ b/code/modules/surgery/organs/organ.dm @@ -143,7 +143,8 @@ var/list/organ_cache = list() /obj/item/organ/examine(mob/user) ..(user) if(status & ORGAN_DEAD) - user << "The decay has set in." + to_chat(user, "The decay has set in.") + /obj/item/organ/proc/handle_germ_effects() //** Handle the effects of infections diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm index bd81f65dbaf..8312bc4c5bb 100644 --- a/code/modules/surgery/organs/organ_external.dm +++ b/code/modules/surgery/organs/organ_external.dm @@ -293,7 +293,8 @@ if((brute || burn) && children && children.len && (owner.species.flags & REGENERATES_LIMBS)) var/obj/item/organ/external/stump/S = locate() in children if(S) - //world << "Extra healing to go around ([brute+burn]) and [owner] needs a replacement limb." +// to_chat(world, "Extra healing to go around ([brute+burn]) and [owner] needs a replacement limb.") + */ //Sync the organ's damage with its wounds @@ -528,7 +529,8 @@ Note that amputating the affected organ does in fact remove the infection from t if(germ_level >= INFECTION_LEVEL_THREE && antibiotics < 30) //overdosing is necessary to stop severe infections if (!(status & ORGAN_DEAD)) status |= ORGAN_DEAD - owner << "You can't feel your [name] anymore..." + to_chat(owner, "You can't feel your [name] anymore...") + owner.update_body(1) germ_level++ diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 000075febbe..d429f161928 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -302,7 +302,8 @@ if (germ_level > INFECTION_LEVEL_ONE) if(prob(1)) - owner << " Your skin itches." + to_chat(owner, " Your skin itches.") + if (germ_level > INFECTION_LEVEL_TWO) if(prob(1)) spawn owner.vomit() @@ -458,12 +459,14 @@ if(organhonked < world.time) organhonked = world.time+900 - owner << "HONK" + to_chat(owner, "HONK") + owner.sleeping = 0 owner.stuttering = 20 owner.ear_deaf = 30 owner.Weaken(3) - owner << 'sound/items/AirHorn.ogg' + to_chat(owner, 'sound/items/AirHorn.ogg') + if(prob(30)) owner.Stun(10) owner.Paralyse(4) diff --git a/code/modules/surgery/organs/pain.dm b/code/modules/surgery/organs/pain.dm index 333c314aa48..7fb022bc9fa 100644 --- a/code/modules/surgery/organs/pain.dm +++ b/code/modules/surgery/organs/pain.dm @@ -40,7 +40,8 @@ mob/living/carbon/proc/pain(var/partname, var/amount, var/force, var/burning = 0 msg = "OH GOD! Your [partname] is hurting terribly!" if(msg && (msg != last_pain_message || prob(10))) last_pain_message = msg - src << msg + to_chat(src, msg) + next_pain_time = world.time + (100 - amount) @@ -64,7 +65,8 @@ mob/living/carbon/human/proc/custom_pain(var/message, var/flash_strength) // Anti message spam checks if(msg && ((msg != last_pain_message) || (world.time >= next_pain_time))) last_pain_message = msg - src << msg + to_chat(src, msg) + next_pain_time = world.time + 100 mob/living/carbon/human/proc/handle_pain() diff --git a/code/modules/surgery/organs/parasites.dm b/code/modules/surgery/organs/parasites.dm index 89f94ba43fc..62bf5a391c8 100644 --- a/code/modules/surgery/organs/parasites.dm +++ b/code/modules/surgery/organs/parasites.dm @@ -19,7 +19,8 @@ if(prob(12)) owner.reagents.add_reagent("histamine", 5) if(5) - owner << "You feel like something is tearing its way out of your skin..." + to_chat(owner, "You feel like something is tearing its way out of your skin...") + owner.reagents.add_reagent("histamine", 10) if(prob(30)) owner.emote("scream") diff --git a/code/modules/surgery/organs/subtypes/machine.dm b/code/modules/surgery/organs/subtypes/machine.dm index 77b590a2f4d..7bcadd791bc 100644 --- a/code/modules/surgery/organs/subtypes/machine.dm +++ b/code/modules/surgery/organs/subtypes/machine.dm @@ -132,7 +132,8 @@ /obj/item/organ/internal/optical_sensor/remove(var/mob/living/user,special = 0) if(!special) - owner << "Error 404:Optical Sensors not found." + to_chat(owner, "Error 404:Optical Sensors not found.") + . = ..() diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index 091f104707e..f23398b610c 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -87,15 +87,18 @@ current_type = "insert" I = tool if(target_zone != I.parent_organ || target.get_organ_slot(I.slot)) - user << "There is no room for [I] in [target]'s [parse_zone(target_zone)]!" + to_chat(user, "There is no room for [I] in [target]'s [parse_zone(target_zone)]!") + return -1 if(I.damage > (I.max_damage * 0.75)) - user << " \The [I] is in no state to be transplanted." + to_chat(user, " \The [I] is in no state to be transplanted.") + return -1 if(target.get_int_organ(I)) - user << " \The [target] already has [I]." + to_chat(user, " \The [target] already has [I].") + return -1 if(affected) user.visible_message("[user] starts transplanting \the [tool] into [target]'s [affected.name].", \ @@ -123,7 +126,8 @@ current_type = "extract" var/list/organs = target.get_organs_zone(target_zone) if(!organs.len) - user << "There are no removeable organs in [target]'s [parse_zone(target_zone)]!" + to_chat(user, "There are no removeable organs in [target]'s [parse_zone(target_zone)]!") + return -1 else for(var/obj/item/organ/internal/O in organs) @@ -153,7 +157,8 @@ tool_name = "\the [tool]" //what else do you call nanopaste medically? if(!hasorgans(target)) - user << "They do not have organs to mend!" + to_chat(user, "They do not have organs to mend!") + return for(var/obj/item/organ/internal/I in affected.internal_organs) if(I && I.damage > 0) @@ -166,11 +171,13 @@ user.visible_message("[user] starts treating damage to [target]'s [I.name] with [tool_name].", \ "You start treating damage to [target]'s [I.name] with [tool_name]." ) - user << "[I] does not appear to be damaged." + to_chat(user, "[I] does not appear to be damaged.") + H.custom_pain("The pain in your [affected.name] is living hell!",1) else if(istype(tool, /obj/item/weapon/reagent_containers/food/snacks/organ)) - user << "[tool] was biten by someone! It's too damaged to use!" + to_chat(user, "[tool] was biten by someone! It's too damaged to use!") + return -1 ..() @@ -205,7 +212,8 @@ I.insert(target) spread_germs_to_organ(I, user) if(!user.canUnEquip(I, 0)) - user << "[I] is stuck to your hand, you can't put it in [target]!" + to_chat(user, "[I] is stuck to your hand, you can't put it in [target]!") + return 0 if(affected) diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index 73bf7944127..5d8d6406502 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -240,12 +240,14 @@ /datum/surgery_step/internal/dethrall/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) var/braincase = target.named_organ_parent("brain") user.visible_message("[user] reaches into [target]'s head with [tool].", "You begin aligning [tool]'s light to the tumor on [target]'s brain...") - target << "A small part of your [braincase] pulses with agony as the light impacts it." + to_chat(target, "A small part of your [braincase] pulses with agony as the light impacts it.") + ..() /datum/surgery_step/internal/dethrall/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) if(target.get_species() == "Lesser Shadowling") //Empowered thralls cannot be deconverted - target << "NOT LIKE THIS!" + to_chat(target, "NOT LIKE THIS!") + user.visible_message("[target] suddenly slams upward and knocks down [user]!", \ "[target] suddenly bolts up and slams you with tremendous force!") user.resting = 0 //Remove all stuns diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index c1851ecabc6..3e685547ad1 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -232,7 +232,8 @@ if(limb_can_operate) if(istype(C)) if(!C.get_amount() >= 3) - user << "You need three or more cable pieces to repair this damage." + to_chat(user, "You need three or more cable pieces to repair this damage.") + return 2 C.use(3) return 1 @@ -288,18 +289,22 @@ var/obj/item/organ/internal/I = tool if(I.status != ORGAN_ROBOT || I.robotic != 2) - user << "You can only implant cybernetic organs." + to_chat(user, "You can only implant cybernetic organs.") + if(target_zone != I.parent_organ || target.get_organ_slot(I.slot)) - user << "There is no room for [I] in [target]'s [parse_zone(target_zone)]!" + to_chat(user, "There is no room for [I] in [target]'s [parse_zone(target_zone)]!") + return -1 if(I.damage > (I.max_damage * 0.75)) - user << " \The [I] is in no state to be transplanted." + to_chat(user, " \The [I] is in no state to be transplanted.") + return -1 if(target.get_int_organ(I)) - user << " \The [target] already has [I]." + to_chat(user, " \The [target] already has [I].") + return -1 user.visible_message("[user] begins reattaching [target]'s [tool].", \ @@ -309,7 +314,8 @@ current_type = "install" if(target_zone != "chest") - user << " You must target the chest cavity." + to_chat(user, " You must target the chest cavity.") + return -1 var/obj/item/device/mmi/M = tool @@ -322,23 +328,28 @@ return -1 if(!M.brainmob || !M.brainmob.client || !M.brainmob.ckey || M.brainmob.stat >= DEAD) - user << "That brain is not usable." + to_chat(user, "That brain is not usable.") + return -1 if(!(affected.status & ORGAN_ROBOT)) - user << "You cannot install a computer brain into a meat enclosure." + to_chat(user, "You cannot install a computer brain into a meat enclosure.") + return -1 if(!target.species) - user << "You have no idea what species this person is. Report this on the bug tracker." + to_chat(user, "You have no idea what species this person is. Report this on the bug tracker.") + return -1 if(!target.species.has_organ["brain"]) - user << "You're pretty sure [target.species.name_plural] don't normally have a brain." + to_chat(user, "You're pretty sure [target.species.name_plural] don't normally have a brain.") + return -1 if(target.get_int_organ(/obj/item/organ/internal/brain/)) - user << "Your subject already has a brain." + to_chat(user, "Your subject already has a brain.") + return -1 user.visible_message("[user] starts installing \the [tool] into [target]'s [affected.name].", \ @@ -352,7 +363,8 @@ if(!affected.open_enough_for_surgery()) return -1 if(!organs.len) - user << "There is no removeable organs in [target]'s [parse_zone(target_zone)]!" + to_chat(user, "There is no removeable organs in [target]'s [parse_zone(target_zone)]!") + return -1 else for(var/obj/item/organ/internal/O in organs) @@ -408,7 +420,8 @@ var/obj/item/organ/internal/I = tool if(!user.canUnEquip(I, 0)) - user << "[I] is stuck to your hand, you can't put it in [target]!" + to_chat(user, "[I] is stuck to your hand, you can't put it in [target]!") + return 0 user.drop_item() @@ -515,23 +528,28 @@ return 0 if(!M.brainmob || !M.brainmob.client || !M.brainmob.ckey || M.brainmob.stat >= DEAD) - user << "That brain is not usable." + to_chat(user, "That brain is not usable.") + return 2 if(!(affected.status & ORGAN_ROBOT)) - user << "You cannot install a computer brain into a meat enclosure." + to_chat(user, "You cannot install a computer brain into a meat enclosure.") + return 2 if(!target.species) - user << "You have no idea what species this person is. Report this on the bug tracker." + to_chat(user, "You have no idea what species this person is. Report this on the bug tracker.") + return 2 if(!target.species.has_organ["brain"]) - user << "You're pretty sure [target.species.name_plural] don't normally have a brain." + to_chat(user, "You're pretty sure [target.species.name_plural] don't normally have a brain.") + return 2 if(target.get_int_organ(/obj/item/organ/internal/brain/)) - user << "Your subject already has a brain." + to_chat(user, "Your subject already has a brain.") + return 2 return 1 diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index f413b42ef63..e5aaf88613f 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -181,7 +181,8 @@ /proc/spread_germs_to_organ(obj/item/organ/E, mob/living/carbon/human/user) if(!istype(user) || !istype(E)) return - //world << "Germ spread: [E] : [E.owner]" +// to_chat(world, "Germ spread: [E] : [E.owner]") + var/germ_level = user.germ_level if(user.gloves) germ_level = user.gloves.germ_level diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index 536696dce2d..b878034ff4a 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -49,8 +49,8 @@ attack_verb = list("drilled") suicide_act(mob/user) - viewers(user) << pick("[user] is pressing [src] to \his temple and activating it! It looks like \he's trying to commit suicide.", \ - "[user] is pressing [src] to \his chest and activating it! It looks like \he's trying to commit suicide.") + to_chat(viewers(user), pick("[user] is pressing [src] to \his temple and activating it! It looks like \he's trying to commit suicide.", + "[user] is pressing [src] to \his chest and activating it! It looks like \he's trying to commit suicide.")) return (BRUTELOSS) @@ -73,9 +73,9 @@ hitsound = 'sound/weapons/bladeslice.ogg' suicide_act(mob/user) - viewers(user) << pick("[user] is slitting \his wrists with [src]! It looks like \he's trying to commit suicide.", \ - "[user] is slitting \his throat with [src]! It looks like \he's trying to commit suicide.", \ - "[user] is slitting \his stomach open with [src]! It looks like \he's trying to commit seppuku.") + to_chat(viewers(user), pick("[user] is slitting \his wrists with [src]! It looks like \he's trying to commit suicide.", + "[user] is slitting \his throat with [src]! It looks like \he's trying to commit suicide.", + "[user] is slitting \his stomach open with [src]! It looks like \he's trying to commit seppuku.")) return (BRUTELOSS) diff --git a/code/modules/telesci/telepad.dm b/code/modules/telesci/telepad.dm index ee4e9a790a6..5d93e2ab280 100644 --- a/code/modules/telesci/telepad.dm +++ b/code/modules/telesci/telepad.dm @@ -46,7 +46,8 @@ if(istype(I, /obj/item/device/multitool)) var/obj/item/device/multitool/M = I M.buffer = src - user << "You save the data in the [I.name]'s buffer." + to_chat(user, "You save the data in the [I.name]'s buffer.") + if(exchange_parts(user, I)) return @@ -70,22 +71,27 @@ playsound(src, 'sound/items/Ratchet.ogg', 50, 1) if(anchored) anchored = 0 - user << " The [src] can now be moved." + to_chat(user, " The [src] can now be moved.") + else if(!anchored) anchored = 1 - user << " The [src] is now secured." + to_chat(user, " The [src] is now secured.") + if(istype(W, /obj/item/weapon/screwdriver)) if(stage == 0) playsound(src, 'sound/items/Screwdriver.ogg', 50, 1) - user << " You unscrew the telepad's tracking beacon." + to_chat(user, " You unscrew the telepad's tracking beacon.") + stage = 1 else if(stage == 1) playsound(src, 'sound/items/Screwdriver.ogg', 50, 1) - user << " You screw in the telepad's tracking beacon." + to_chat(user, " You screw in the telepad's tracking beacon.") + stage = 0 if(istype(W, /obj/item/weapon/weldingtool) && stage == 1) playsound(src, 'sound/items/Welder.ogg', 50, 1) - user << " You disassemble the telepad." + to_chat(user, " You disassemble the telepad.") + new /obj/item/stack/sheet/metal(get_turf(src)) new /obj/item/stack/sheet/glass(get_turf(src)) qdel(src) @@ -101,7 +107,8 @@ /obj/item/device/telepad_beacon/attack_self(mob/user as mob) if(user) - user << " Locked In" + to_chat(user, " Locked In") + new /obj/machinery/telepad_cargo(user.loc) playsound(src, 'sound/effects/pop.ogg', 100, 1, 1) qdel(src) @@ -135,7 +142,8 @@ /obj/item/weapon/rcs/examine(mob/user) ..(user) - user << "There are [round(rcell.charge/chargecost)] charge\s left." + to_chat(user, "There are [round(rcell.charge/chargecost)] charge\s left.") + /obj/item/weapon/rcs/Destroy() if(rcell) @@ -148,11 +156,13 @@ if(mode == 0) mode = 1 playsound(src.loc, 'sound/effects/pop.ogg', 50, 0) - user << " The telepad locator has become uncalibrated." + to_chat(user, " The telepad locator has become uncalibrated.") + else mode = 0 playsound(src.loc, 'sound/effects/pop.ogg', 50, 0) - user << " You calibrate the telepad locator." + to_chat(user, " You calibrate the telepad locator.") + /obj/item/weapon/rcs/emag_act(user as mob) if(!emagged) @@ -160,5 +170,6 @@ var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(5, 1, src) s.start() - user << " You emag the RCS. Activate it to toggle between modes." + to_chat(user, " You emag the RCS. Activate it to toggle between modes.") + return diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm index 15edeec20a2..0c077bd1698 100644 --- a/code/modules/telesci/telesci_computer.dm +++ b/code/modules/telesci/telesci_computer.dm @@ -44,7 +44,8 @@ /obj/machinery/computer/telescience/examine(mob/user) ..(user) - user << "There are [crystals.len ? crystals.len : "no"] bluespace crystal\s in the crystal slots." + to_chat(user, "There are [crystals.len ? crystals.len : "no"] bluespace crystal\s in the crystal slots.") + /obj/machinery/computer/telescience/initialize() ..() @@ -54,7 +55,8 @@ /obj/machinery/computer/telescience/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/weapon/ore/bluespace_crystal)) if(crystals.len >= max_crystals) - user << "There are not enough crystal slots." + to_chat(user, "There are not enough crystal slots.") + return user.drop_item() crystals += W @@ -73,17 +75,20 @@ if(M.buffer && istype(M.buffer, /obj/machinery/telepad)) telepad = M.buffer M.buffer = null - user << "You upload the data from the [W.name]'s buffer." + to_chat(user, "You upload the data from the [W.name]'s buffer.") + updateUsrDialog() else ..() /obj/machinery/computer/telescience/emag_act(user as mob) if (!emagged) - user << "\blue You scramble the Telescience authentication key to an unknown signal. You should be able to teleport to more places now!" + to_chat(user, "\blue You scramble the Telescience authentication key to an unknown signal. You should be able to teleport to more places now!") + emagged = 1 else - user << "\red The machine seems unaffected by the card swipe..." + to_chat(user, "\red The machine seems unaffected by the card swipe...") + /obj/machinery/computer/telescience/attack_ai(mob/user) src.attack_hand(user) diff --git a/code/modules/vehicle/train/train.dm b/code/modules/vehicle/train/train.dm index 72b5b2a7ed1..33f5260728e 100644 --- a/code/modules/vehicle/train/train.dm +++ b/code/modules/vehicle/train/train.dm @@ -66,7 +66,8 @@ M.apply_damages(22 / move_delay) // and do damage according to how fast the train is going if(istype(load, /mob/living/carbon/human)) var/mob/living/D = load - D << "\red You hit [M]!" + to_chat(D, "\red You hit [M]!") + msg_admin_attack("[key_name_admin(D)] hit [key_name_admin(M)] with [src].") @@ -86,7 +87,8 @@ /obj/vehicle/train/relaymove(mob/user, direction) var/turf/T = get_step_to(src, get_step(src, direction)) if(!T) - user << "You can't find a clear area to step onto." + to_chat(user, "You can't find a clear area to step onto.") + return 0 if(user != load) @@ -97,7 +99,8 @@ unload(user, direction) - user << "\blue You climb down from [src]." + to_chat(user, "\blue You climb down from [src].") + return 1 @@ -108,7 +111,8 @@ latch(C, user) else if(!load(C)) - user << "\red You were unable to load [C] on [src]." + to_chat(user, "\red You were unable to load [C] on [src].") + /obj/vehicle/train/attack_hand(mob/user as mob) if(user.stat || user.restrained() || !Adjacent(user)) @@ -145,22 +149,26 @@ //attempts to attach src as a follower of the train T /obj/vehicle/train/proc/attach_to(obj/vehicle/train/T, mob/user) if (get_dist(src, T) > 1) - user << "\red [src] is too far away from [T] to hitch them together." + to_chat(user, "\red [src] is too far away from [T] to hitch them together.") + return if (lead) - user << "\red [src] is already hitched to something." + to_chat(user, "\red [src] is already hitched to something.") + return if (T.tow) - user << "\red [T] is already towing something." + to_chat(user, "\red [T] is already towing something.") + return //check for cycles. var/obj/vehicle/train/next_car = T while (next_car) if (next_car == src) - user << "\red That seems very silly." + to_chat(user, "\red That seems very silly.") + return next_car = next_car.lead @@ -170,7 +178,8 @@ dir = lead.dir if(user) - user << "\blue You hitch [src] to [T]." + to_chat(user, "\blue You hitch [src] to [T].") + update_stats() @@ -178,7 +187,8 @@ //detaches the train from whatever is towing it /obj/vehicle/train/proc/unattach(mob/user) if (!lead) - user << "\red [src] is not hitched to anything." + to_chat(user, "\red [src] is not hitched to anything.") + return lead.tow = null diff --git a/code/modules/vehicle/train/trains/ambulance.dm b/code/modules/vehicle/train/trains/ambulance.dm index f7094f10ad8..47bbaf647e0 100644 --- a/code/modules/vehicle/train/trains/ambulance.dm +++ b/code/modules/vehicle/train/trains/ambulance.dm @@ -142,7 +142,8 @@ if(is_train_head() && istype(load, /mob/living/carbon/human)) var/mob/living/carbon/human/D = load - D << "\red \b You ran over [H]!" + to_chat(D, "\red \b You ran over [H]!") + visible_message("\red \The [src] ran over [H]!") attack_log += text("\[[time_stamp()]\] ran over [key_name(H)], driven by [key_name(D)]") msg_admin_attack("[key_name_admin(D)] ran over [key_name_admin(H)]") @@ -168,7 +169,8 @@ /obj/vehicle/train/ambulance/engine/examine(mob/user) if(..(user, 1)) - user << "The power light is [on ? "on" : "off"].\nThere are[key ? "" : " no"] keys in the ignition." + to_chat(user, "The power light is [on ? "on" : "off"].\nThere are[key ? "" : " no"] keys in the ignition.") + /obj/vehicle/train/ambulance/engine/verb/check_power() set name = "Check power level" @@ -179,10 +181,12 @@ return if(!cell) - usr << "There is no power cell installed in [src]." + to_chat(usr, "There is no power cell installed in [src].") + return - usr << "The power meter reads [round(cell.percent(), 0.01)]%" + to_chat(usr, "The power meter reads [round(cell.percent(), 0.01)]%") + /obj/vehicle/train/ambulance/engine/verb/start_engine() set name = "Start engine" @@ -193,17 +197,21 @@ return if(on) - usr << "The engine is already running." + to_chat(usr, "The engine is already running.") + return turn_on() if (on) - usr << "You start [src]'s engine." + to_chat(usr, "You start [src]'s engine.") + else if(cell.charge < charge_use) - usr << "[src] is out of power." + to_chat(usr, "[src] is out of power.") + else - usr << "[src]'s engine won't start." + to_chat(usr, "[src]'s engine won't start.") + /obj/vehicle/train/ambulance/engine/verb/stop_engine() set name = "Stop engine" @@ -214,12 +222,14 @@ return if(!on) - usr << "The engine is already stopped." + to_chat(usr, "The engine is already stopped.") + return turn_off() if (!on) - usr << "You stop [src]'s engine." + to_chat(usr, "You stop [src]'s engine.") + /obj/vehicle/train/ambulance/engine/verb/remove_key() set name = "Remove key" diff --git a/code/modules/vehicle/train/trains/cargo/cargo_train.dm b/code/modules/vehicle/train/trains/cargo/cargo_train.dm index 5933ada33d5..e36982ef1af 100644 --- a/code/modules/vehicle/train/trains/cargo/cargo_train.dm +++ b/code/modules/vehicle/train/trains/cargo/cargo_train.dm @@ -138,7 +138,8 @@ if(is_train_head() && istype(load, /mob/living/carbon/human)) var/mob/living/carbon/human/D = load - D << "\red \b You ran over [H]!" + to_chat(D, "\red \b You ran over [H]!") + visible_message("\red \The [src] ran over [H]!") attack_log += text("\[[time_stamp()]\] ran over [key_name(H)], driven by [key_name(D)]") msg_admin_attack("[key_name_admin(D)] ran over [key_name_admin(H)]") @@ -166,8 +167,10 @@ if(!..(user, 1)) return - user << "The power light is [on ? "on" : "off"].\nThere are[key ? "" : " no"] keys in the ignition." - user << "The charge meter reads [cell? round(cell.percent(), 0.01) : 0]%" + to_chat(user, "The power light is [on ? "on" : "off"].\nThere are[key ? "" : " no"] keys in the ignition.") + + to_chat(user, "The charge meter reads [cell? round(cell.percent(), 0.01) : 0]%") + /obj/vehicle/train/cargo/engine/verb/start_engine() set name = "Start engine" @@ -178,17 +181,21 @@ return if(on) - usr << "The engine is already running." + to_chat(usr, "The engine is already running.") + return turn_on() if (on) - usr << "You start [src]'s engine." + to_chat(usr, "You start [src]'s engine.") + else if(cell.charge < charge_use) - usr << "[src] is out of power." + to_chat(usr, "[src] is out of power.") + else - usr << "[src]'s engine won't start." + to_chat(usr, "[src]'s engine won't start.") + /obj/vehicle/train/cargo/engine/verb/stop_engine() set name = "Stop engine" @@ -199,12 +206,14 @@ return if(!on) - usr << "The engine is already stopped." + to_chat(usr, "The engine is already stopped.") + return turn_off() if (!on) - usr << "You stop [src]'s engine." + to_chat(usr, "You stop [src]'s engine.") + /obj/vehicle/train/cargo/engine/verb/remove_key() set name = "Remove key" diff --git a/code/modules/vehicle/vehicle.dm b/code/modules/vehicle/vehicle.dm index eb8c4f816b4..42bcf1a9521 100644 --- a/code/modules/vehicle/vehicle.dm +++ b/code/modules/vehicle/vehicle.dm @@ -86,7 +86,8 @@ if(!locked) open = !open update_icon() - user << "Maintenance panel is now [open ? "opened" : "closed"]." + to_chat(user, "Maintenance panel is now [open ? "opened" : "closed"].") + else if(istype(W, /obj/item/weapon/crowbar) && cell && open) remove_cell(user) @@ -100,11 +101,14 @@ health = min(maxhealth, health+10) user.visible_message("\red [user] repairs [src]!","\blue You repair [src]!") else - user << "Unable to repair with the maintenance panel closed." + to_chat(user, "Unable to repair with the maintenance panel closed.") + else - user << "[src] does not need a repair." + to_chat(user, "[src] does not need a repair.") + else - user << "Unable to repair while [src] is off." + to_chat(user, "Unable to repair while [src] is off.") + else if(hasvar(W,"force") && hasvar(W,"damtype")) switch(W.damtype) if("fire") @@ -205,7 +209,8 @@ if(locked) locked = 0 - user << "You bypass [src]'s controls." + to_chat(user, "You bypass [src]'s controls.") + /obj/vehicle/proc/explode() src.visible_message("\red [src] blows apart!", 1) @@ -262,13 +267,15 @@ C.forceMove(src) cell = C powercheck() - usr << "You install [C] in [src]." + to_chat(usr, "You install [C] in [src].") + /obj/vehicle/proc/remove_cell(var/mob/living/carbon/human/H) if(!cell) return - usr << "You remove [cell] from [src]." + to_chat(usr, "You remove [cell] from [src].") + cell.forceMove(get_turf(H)) H.put_in_hands(cell) cell = null diff --git a/code/world.dm b/code/world.dm index dfb3094a314..3a0c990ae46 100644 --- a/code/world.dm +++ b/code/world.dm @@ -82,14 +82,19 @@ var/global/datum/global_init/init = new () return //world/Topic(href, href_list[]) -// world << "Received a Topic() call!" -// world << "[href]" +// to_chat(world, "Received a Topic() call!") + +// to_chat(world, "[href]") + // for(var/a in href_list) -// world << "[a]" +// to_chat(world, "[a]") + // if(href_list["hello"]) -// world << "Hello world!" +// to_chat(world, "Hello world!") + // return "Hello world!" -// world << "End of Topic() call." +// to_chat(world, "End of Topic() call.") + // ..() var/world_topic_spam_protect_ip = "0.0.0.0" @@ -180,12 +185,15 @@ var/world_topic_spam_protect_time = world.timeofday C.received_irc_pm = world.time C.irc_admin = input["sender"] - C << 'sound/effects/adminhelp.ogg' - C << message + to_chat(C, 'sound/effects/adminhelp.ogg') + + to_chat(C, message) + for(var/client/A in admins) if(A != C) - A << amessage + to_chat(A, amessage) + return "Message Successful" @@ -207,7 +215,8 @@ var/world_topic_spam_protect_time = world.timeofday return "Bad Key" else for(var/client/C in clients) - C << "PR: [input["announce"]]" + to_chat(C, "PR: [input["announce"]]") + /proc/keySpamProtect(var/addr) if(world_topic_spam_protect_ip == addr && abs(world_topic_spam_protect_time - world.time) < 50) @@ -225,7 +234,8 @@ var/world_topic_spam_protect_time = world.timeofday message_admins("[key_name_admin(usr)] has requested an immediate world restart via client side debugging tools") log_admin("[key_name(usr)] has requested an immediate world restart via client side debugging tools") spawn(0) - world << "Rebooting world immediately due to host request" + to_chat(world, "Rebooting world immediately due to host request") + return ..(1) var/delay if(!isnull(time)) @@ -233,21 +243,26 @@ var/world_topic_spam_protect_time = world.timeofday else delay = ticker.restart_timeout if(ticker.delay_end) - world << "An admin has delayed the round end." + to_chat(world, "An admin has delayed the round end.") + return - world << "Rebooting world in [delay/10] [delay > 10 ? "seconds" : "second"]. [reason]" + to_chat(world, "Rebooting world in [delay/10] [delay > 10 ? "seconds" : "second"]. [reason]") + sleep(delay) if(blackbox) blackbox.save_all_data_to_sql() if(ticker.delay_end) - world << "Reboot was cancelled by an admin." + to_chat(world, "Reboot was cancelled by an admin.") + return feedback_set_details("[feedback_c]","[feedback_r]") log_game("Rebooting world. [reason]") //kick_clients_in_lobby("The round came to an end with you in the lobby.", 1) spawn(0) - world << sound(pick('sound/AI/newroundsexy.ogg','sound/misc/apcdestroyed.ogg','sound/misc/bangindonk.ogg')) // random end sounds!! - LastyBatsy + to_chat(world, sound(pick('sound/AI/newroundsexy.ogg','sound/misc/apcdestroyed.ogg','sound/misc/bangindonk.ogg')))// random end sounds!! - LastyBatsy + + processScheduler.stop() @@ -273,7 +288,8 @@ var/world_topic_spam_protect_time = world.timeofday if(C.is_afk(INACTIVITY_KICK)) if(!istype(C.mob, /mob/dead)) log_access("AFK: [key_name(C)]") - C << "\red You have been inactive for more than 10 minutes and have been disconnected." + to_chat(C, "\red You have been inactive for more than 10 minutes and have been disconnected.") + del(C) if ( ((world.timeofday - sleep_check) > work_length) || ((world.timeofday - sleep_check) < 0) ) sleep(sleep_length) @@ -320,7 +336,8 @@ var/world_topic_spam_protect_time = world.timeofday /world/proc/save_mode(var/the_mode) var/F = file("data/mode.txt") fdel(F) - F << the_mode + to_chat(F, the_mode) + /hook/startup/proc/loadMusic() for(var/obj/machinery/media/jukebox/J in machines) From 78f53553f8d81ddd96d8febc52f6ee9c263cd6dc Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Tue, 5 Apr 2016 08:25:57 -0700 Subject: [PATCH 304/328] Reduce lines by removing blank lines added by PJ's script --- code/ATMOSPHERICS/atmospherics.dm | 3 - .../components/binary_devices/passive_gate.dm | 2 - .../components/binary_devices/pump.dm | 2 - .../components/binary_devices/valve.dm | 1 - .../components/binary_devices/volume_pump.dm | 2 - .../components/omni_devices/omni_base.dm | 2 - .../components/trinary_devices/filter.dm | 1 - .../components/trinary_devices/mixer.dm | 1 - .../components/trinary_devices/tvalve.dm | 1 - .../unary_devices/outlet_injector.dm | 1 - .../unary_devices/portables_connector.dm | 1 - .../components/unary_devices/vent_pump.dm | 9 -- .../components/unary_devices/vent_scrubber.dm | 5 - code/__HELPERS/files.dm | 2 - code/__HELPERS/game.dm | 5 - code/__HELPERS/global_lists.dm | 1 - code/__HELPERS/icons.dm | 1 - code/__HELPERS/logging.dm | 2 - code/__HELPERS/names.dm | 1 - code/__HELPERS/unsorted.dm | 9 -- code/_onclick/click.dm | 2 - code/_onclick/click_override.dm | 3 - code/_onclick/cyborg.dm | 1 - code/_onclick/hud/action.dm | 2 - code/_onclick/hud/hud.dm | 2 - code/_onclick/hud/robot.dm | 2 - code/_onclick/hud/screen_objects.dm | 6 - code/_onclick/item_attack.dm | 4 - code/_onclick/observer.dm | 2 - code/_onclick/oldcode.dm | 1 - code/_onclick/rig.dm | 4 - code/_onclick/telekinesis.dm | 1 - code/controllers/Processes/inactivity.dm | 1 - code/controllers/Processes/shuttles.dm | 7 - code/controllers/configuration.dm | 2 - code/controllers/voting.dm | 13 -- code/datums/ai_laws.dm | 2 - code/datums/browser.dm | 4 - code/datums/cargoprofile.dm | 4 - code/datums/datumvars.dm | 71 --------- code/datums/diseases/advance/advance.dm | 5 - .../datums/diseases/advance/symptoms/beard.dm | 3 - .../diseases/advance/symptoms/choking.dm | 3 - .../diseases/advance/symptoms/confusion.dm | 2 - .../datums/diseases/advance/symptoms/cough.dm | 1 - .../diseases/advance/symptoms/deafness.dm | 3 - .../datums/diseases/advance/symptoms/dizzy.dm | 2 - .../datums/diseases/advance/symptoms/fever.dm | 1 - code/datums/diseases/advance/symptoms/fire.dm | 3 - .../diseases/advance/symptoms/flesh_eating.dm | 2 - .../diseases/advance/symptoms/genetics.dm | 1 - .../diseases/advance/symptoms/hallucigen.dm | 3 - .../diseases/advance/symptoms/headache.dm | 1 - code/datums/diseases/advance/symptoms/heal.dm | 2 - .../diseases/advance/symptoms/itching.dm | 1 - .../diseases/advance/symptoms/oxygen.dm | 1 - .../diseases/advance/symptoms/sensory.dm | 9 -- .../diseases/advance/symptoms/shedding.dm | 3 - .../diseases/advance/symptoms/shivering.dm | 1 - .../diseases/advance/symptoms/stimulant.dm | 1 - .../datums/diseases/advance/symptoms/viral.dm | 4 - .../diseases/advance/symptoms/vision.dm | 5 - .../diseases/advance/symptoms/voice_change.dm | 1 - .../datums/diseases/advance/symptoms/vomit.dm | 1 - .../diseases/advance/symptoms/weakness.dm | 3 - .../diseases/advance/symptoms/weight.dm | 3 - .../datums/diseases/advance/symptoms/youth.dm | 5 - code/datums/diseases/anxiety.dm | 5 - code/datums/diseases/appendicitis.dm | 1 - code/datums/diseases/beesease.dm | 4 - code/datums/diseases/brainrot.dm | 4 - code/datums/diseases/cold.dm | 10 -- code/datums/diseases/cold9.dm | 5 - code/datums/diseases/dna_spread.dm | 4 - code/datums/diseases/fake_gbs.dm | 1 - code/datums/diseases/flu.dm | 6 - code/datums/diseases/fluspanish.dm | 2 - code/datums/diseases/gbs.dm | 2 - code/datums/diseases/magnitis.dm | 5 - code/datums/diseases/pierrot_throat.dm | 3 - code/datums/diseases/retrovirus.dm | 12 -- code/datums/diseases/rhumba_beat.dm | 5 - code/datums/diseases/transformation.dm | 9 -- code/datums/diseases/tuberculosis.dm | 10 -- code/datums/diseases/wizarditis.dm | 3 - code/datums/gas_mixture.dm | 2 - .../helper_datums/construction_datum.dm | 6 - code/datums/helper_datums/events.dm | 2 - code/datums/helper_datums/global_iterator.dm | 1 - code/datums/helper_datums/teleport.dm | 1 - code/datums/martial.dm | 21 --- code/datums/mind.dm | 55 ------- code/datums/progressbar.dm | 1 - code/datums/spell.dm | 10 -- code/datums/spells/area_teleport.dm | 2 - code/datums/spells/bloodcrawl.dm | 2 - code/datums/spells/charge.dm | 7 - code/datums/spells/conjure.dm | 1 - code/datums/spells/ethereal_jaunt.dm | 2 - code/datums/spells/horsemask.dm | 3 - code/datums/spells/lichdom.dm | 8 - code/datums/spells/lightning.dm | 4 - code/datums/spells/magnet.dm | 4 - code/datums/spells/mime.dm | 3 - code/datums/spells/mind_transfer.dm | 7 - code/datums/spells/summonitem.dm | 1 - code/datums/spells/touch_attacks.dm | 3 - code/datums/spells/wizard.dm | 2 - code/datums/wires/alarm.dm | 9 -- code/datums/wires/robot.dm | 2 - code/datums/wires/wires.dm | 3 - code/defines/procs/announce.dm | 15 -- code/defines/procs/statistics.dm | 2 - code/game/area/areas.dm | 3 - code/game/atoms.dm | 7 - code/game/dna/dna_modifier.dm | 17 --- code/game/dna/genes/disabilities.dm | 2 - code/game/dna/genes/gene.dm | 2 - code/game/dna/genes/goon_disabilities.dm | 4 - code/game/dna/genes/goon_powers.dm | 32 ---- code/game/dna/genes/monkey.dm | 2 - code/game/dna/genes/powers.dm | 1 - code/game/dna/genes/vg_powers.dm | 6 - code/game/gamemodes/antag_spawner.dm | 13 -- .../game/gamemodes/autotraitor/autotraitor.dm | 5 - code/game/gamemodes/blob/blob.dm | 11 -- code/game/gamemodes/blob/blob_finish.dm | 8 - code/game/gamemodes/blob/blob_report.dm | 1 - code/game/gamemodes/blob/overmind.dm | 10 -- code/game/gamemodes/blob/powers.dm | 27 ---- code/game/gamemodes/blob/theblob.dm | 1 - code/game/gamemodes/borer/borer.dm | 10 -- code/game/gamemodes/changeling/changeling.dm | 19 --- .../gamemodes/changeling/changeling_power.dm | 6 - .../gamemodes/changeling/evolution_menu.dm | 9 -- .../gamemodes/changeling/powers/absorb.dm | 10 -- .../changeling/powers/digitalcamo.dm | 2 - .../changeling/powers/epinephrine.dm | 2 - .../gamemodes/changeling/powers/fakedeath.dm | 2 - .../gamemodes/changeling/powers/fleshmend.dm | 1 - .../gamemodes/changeling/powers/headcrab.dm | 3 - .../gamemodes/changeling/powers/hivemind.dm | 6 - .../gamemodes/changeling/powers/humanform.dm | 1 - .../gamemodes/changeling/powers/lesserform.dm | 3 - .../changeling/powers/mimic_voice.dm | 3 - .../gamemodes/changeling/powers/mutations.dm | 5 - .../gamemodes/changeling/powers/panacea.dm | 1 - .../gamemodes/changeling/powers/revive.dm | 1 - .../gamemodes/changeling/powers/shriek.dm | 2 - .../changeling/powers/strained_muscles.dm | 5 - .../gamemodes/changeling/powers/swap_form.dm | 7 - .../gamemodes/changeling/powers/tiny_prick.dm | 11 -- .../game/gamemodes/changeling/traitor_chan.dm | 2 - code/game/gamemodes/cult/cult.dm | 15 -- code/game/gamemodes/cult/cult_items.dm | 2 - code/game/gamemodes/cult/ritual.dm | 22 --- code/game/gamemodes/cult/runes.dm | 59 -------- code/game/gamemodes/cult/talisman.dm | 16 -- code/game/gamemodes/events.dm | 1 - code/game/gamemodes/extended/extended.dm | 2 - code/game/gamemodes/game_mode.dm | 6 - code/game/gamemodes/gameticker.dm | 28 ---- code/game/gamemodes/heist/heist.dm | 16 -- .../gamemodes/malfunction/Malf_Modules.dm | 11 -- .../game/gamemodes/malfunction/malfunction.dm | 17 --- code/game/gamemodes/meteor/meteor.dm | 4 - code/game/gamemodes/miniantags/borer/borer.dm | 66 -------- .../gamemodes/miniantags/bot_swarm/swarmer.dm | 53 ------- .../gamemodes/miniantags/guardian/guardian.dm | 68 --------- code/game/gamemodes/miniantags/morph/morph.dm | 2 - .../gamemodes/miniantags/morph/morph_event.dm | 2 - .../gamemodes/miniantags/revenant/revenant.dm | 21 --- .../miniantags/revenant/revenant_abilities.dm | 25 ---- .../miniantags/slaughter/bloodcrawl.dm | 6 - .../miniantags/slaughter/slaughter.dm | 9 -- .../mutiny/emergency_authentication_device.dm | 3 - code/game/gamemodes/mutiny/key_pinpointer.dm | 6 - code/game/gamemodes/mutiny/mutiny.dm | 28 ---- code/game/gamemodes/mutiny/mutiny_fluff.dm | 1 - code/game/gamemodes/nations/nations.dm | 25 ---- code/game/gamemodes/nations/nationsprocs.dm | 7 - code/game/gamemodes/newobjective.dm | 1 - code/game/gamemodes/nuclear/nuclear.dm | 29 ---- .../gamemodes/nuclear/nuclear_challenge.dm | 5 - code/game/gamemodes/nuclear/nuclearbomb.dm | 14 -- code/game/gamemodes/nuclear/pinpointer.dm | 16 -- code/game/gamemodes/revolution/revolution.dm | 19 --- .../gamemodes/revolution/rp_revolution.dm | 20 --- code/game/gamemodes/sandbox/h_sandbox.dm | 3 - code/game/gamemodes/sandbox/sandbox.dm | 2 - code/game/gamemodes/scoreboard.dm | 2 - code/game/gamemodes/shadowling/shadowling.dm | 20 --- .../shadowling/shadowling_abilities.dm | 88 ----------- .../special_shadowling_abilities.dm | 14 -- code/game/gamemodes/traitor/traitor.dm | 19 --- code/game/gamemodes/vampire/vampire.dm | 20 --- code/game/gamemodes/vampire/vampire_powers.dm | 27 ---- code/game/gamemodes/wizard/artefact.dm | 38 ----- code/game/gamemodes/wizard/godhand.dm | 2 - code/game/gamemodes/wizard/raginmages.dm | 14 -- code/game/gamemodes/wizard/rightandwrong.dm | 3 - code/game/gamemodes/wizard/soulstone.dm | 25 ---- code/game/gamemodes/wizard/spellbook.dm | 31 ---- code/game/gamemodes/wizard/wizard.dm | 13 -- code/game/gamemodes/xenos/xenos.dm | 11 -- code/game/jobs/job/support_chaplain.dm | 1 - code/game/jobs/job_controller.dm | 6 - code/game/jobs/whitelist.dm | 2 - code/game/machinery/Freezer.dm | 4 - code/game/machinery/OpTable.dm | 4 - code/game/machinery/PDApainter.dm | 3 - code/game/machinery/Sleeper.dm | 30 ---- code/game/machinery/adv_med.dm | 13 -- code/game/machinery/ai_slipper.dm | 5 - code/game/machinery/alarm.dm | 16 -- code/game/machinery/atmo_control.dm | 4 - code/game/machinery/atmoalter/canister.dm | 4 - code/game/machinery/atmoalter/meter.dm | 2 - .../atmoalter/portable_atmospherics.dm | 4 - code/game/machinery/atmoalter/scrubber.dm | 4 - code/game/machinery/autolathe.dm | 7 - code/game/machinery/bees_apiary.dm | 16 -- code/game/machinery/biogenerator.dm | 13 -- code/game/machinery/camera/camera.dm | 18 --- code/game/machinery/camera/camera_assembly.dm | 12 -- code/game/machinery/camera/tracking.dm | 16 -- code/game/machinery/cell_charger.dm | 8 - code/game/machinery/chiller.dm | 5 - code/game/machinery/cloning.dm | 14 -- .../machinery/computer/HolodeckControl.dm | 12 -- code/game/machinery/computer/ai_core.dm | 30 ---- code/game/machinery/computer/aifixer.dm | 10 -- code/game/machinery/computer/arcade.dm | 13 -- .../game/machinery/computer/buildandrepair.dm | 31 ---- code/game/machinery/computer/camera.dm | 1 - .../machinery/computer/camera_advanced.dm | 1 - code/game/machinery/computer/card.dm | 4 - code/game/machinery/computer/cloning.dm | 3 - .../game/machinery/computer/communications.dm | 25 ---- code/game/machinery/computer/computer.dm | 2 - code/game/machinery/computer/honkputer.dm | 8 - code/game/machinery/computer/law.dm | 13 -- code/game/machinery/computer/message.dm | 5 - code/game/machinery/computer/pod.dm | 1 - code/game/machinery/computer/prisoner.dm | 3 - code/game/machinery/computer/robot.dm | 21 --- code/game/machinery/computer/salvage_ship.dm | 1 - code/game/machinery/computer/security.dm | 2 - code/game/machinery/computer/skills.dm | 2 - .../machinery/computer/specops_shuttle.dm | 13 -- code/game/machinery/computer/store.dm | 2 - .../computer/syndicate_specops_shuttle.dm | 9 -- .../machinery/computer/telecrystalconsoles.dm | 2 - code/game/machinery/constructable_frame.dm | 17 --- code/game/machinery/cryo.dm | 16 -- code/game/machinery/cryopod.dm | 27 ---- code/game/machinery/deployable.dm | 4 - code/game/machinery/door_control.dm | 3 - code/game/machinery/doors/airlock.dm | 50 ------- code/game/machinery/doors/airlock_control.dm | 1 - code/game/machinery/doors/firedoor.dm | 4 - code/game/machinery/doors/windowdoor.dm | 4 - code/game/machinery/doppler_array.dm | 2 - code/game/machinery/drying_rack.dm | 8 - .../airlock_docking_controller.dm | 7 - .../airlock_docking_controller_multi.dm | 7 - .../embedded_controller/docking_program.dm | 1 - code/game/machinery/firealarm.dm | 6 - code/game/machinery/floodlight.dm | 9 -- code/game/machinery/guestpass.dm | 9 -- code/game/machinery/hologram.dm | 6 - code/game/machinery/iv_drip.dm | 10 -- code/game/machinery/kitchen/gibber.dm | 7 - code/game/machinery/kitchen/icecream_vat.dm | 10 -- code/game/machinery/kitchen/juicer.dm | 3 - .../game/machinery/kitchen/kitchen_machine.dm | 10 -- code/game/machinery/kitchen/monkeyrecycler.dm | 8 - code/game/machinery/kitchen/processor.dm | 4 - code/game/machinery/kitchen/smartfridge.dm | 12 -- code/game/machinery/lightswitch.dm | 1 - code/game/machinery/machinery.dm | 20 --- code/game/machinery/mass_driver.dm | 23 --- code/game/machinery/navbeacon.dm | 4 - code/game/machinery/newscaster.dm | 4 - code/game/machinery/overview.dm | 7 - code/game/machinery/pipe/construction.dm | 4 - code/game/machinery/pipe/pipe_dispenser.dm | 3 - code/game/machinery/podmen.dm | 9 -- code/game/machinery/poolcontroller.dm | 7 - code/game/machinery/portable_turret.dm | 39 ----- code/game/machinery/programmable_unloader.dm | 16 -- code/game/machinery/recharger.dm | 7 - code/game/machinery/rechargestation.dm | 7 - code/game/machinery/recycler.dm | 8 - code/game/machinery/requests_console.dm | 2 - code/game/machinery/robot_fabricator.dm | 2 - code/game/machinery/seed_extractor.dm | 3 - code/game/machinery/shieldgen.dm | 21 --- code/game/machinery/spaceheater.dm | 5 - code/game/machinery/status_display.dm | 1 - code/game/machinery/suit_storage_unit.dm | 47 ------ code/game/machinery/syndicatebeacon.dm | 10 -- code/game/machinery/syndicatebomb.dm | 15 -- code/game/machinery/telecomms/logbrowser.dm | 4 - .../telecomms/machine_interactions.dm | 8 - .../machinery/telecomms/telecomunications.dm | 1 - code/game/machinery/telecomms/telemonitor.dm | 3 - .../machinery/telecomms/traffic_control.dm | 4 - code/game/machinery/teleporter.dm | 16 -- code/game/machinery/transformer.dm | 1 - code/game/machinery/turntable.dm | 19 --- code/game/machinery/turret_control.dm | 5 - code/game/machinery/turrets.dm | 4 - code/game/machinery/vending.dm | 21 --- code/game/machinery/washing_machine.dm | 19 --- code/game/machinery/wishgranter.dm | 5 - code/game/mecha/combat/marauder.dm | 1 - code/game/mecha/equipment/mecha_equipment.dm | 2 - code/game/mecha/equipment/tools/tools.dm | 2 - code/game/mecha/equipment/weapons/weapons.dm | 1 - code/game/mecha/mech_fabricator.dm | 6 - code/game/mecha/mecha.dm | 79 ---------- code/game/mecha/mecha_construction_paths.dm | 4 - code/game/mecha/mecha_wreckage.dm | 6 - code/game/objects/buckling.dm | 2 - code/game/objects/effects/aliens.dm | 4 - code/game/objects/effects/anomalies.dm | 1 - code/game/objects/effects/datacore-effect.dm | 1 - .../effects/decals/Cleanable/humans.dm | 2 - .../effects/decals/Cleanable/tracks.dm | 1 - code/game/objects/effects/decals/cleanable.dm | 4 - .../game/objects/effects/decals/contraband.dm | 8 - code/game/objects/effects/effect_system.dm | 5 - code/game/objects/effects/gibs.dm | 1 - code/game/objects/effects/mines.dm | 1 - code/game/objects/effects/spiders.dm | 2 - code/game/objects/empulse.dm | 1 - code/game/objects/explosion.dm | 1 - code/game/objects/items.dm | 20 --- code/game/objects/items/ashtray.dm | 3 - code/game/objects/items/blueprints.dm | 7 - code/game/objects/items/bodybag.dm | 5 - code/game/objects/items/crayons.dm | 6 - code/game/objects/items/dehy_carp.dm | 2 - code/game/objects/items/devices/aicard.dm | 5 - code/game/objects/items/devices/autopsy.dm | 4 - code/game/objects/items/devices/camera_bug.dm | 3 - .../objects/items/devices/chameleonproj.dm | 7 - code/game/objects/items/devices/debugger.dm | 6 - code/game/objects/items/devices/flash.dm | 10 -- code/game/objects/items/devices/flashlight.dm | 9 -- .../objects/items/devices/laserpointer.dm | 10 -- .../objects/items/devices/lightreplacer.dm | 10 -- code/game/objects/items/devices/megaphone.dm | 7 - code/game/objects/items/devices/modkit.dm | 5 - code/game/objects/items/devices/paicard.dm | 10 -- .../objects/items/devices/pipe_painter.dm | 2 - code/game/objects/items/devices/pizza_bomb.dm | 7 - code/game/objects/items/devices/powersink.dm | 2 - .../objects/items/devices/radio/beacon.dm | 3 - .../items/devices/radio/electropack.dm | 4 - .../objects/items/devices/radio/headset.dm | 5 - .../objects/items/devices/radio/intercom.dm | 9 -- .../game/objects/items/devices/radio/radio.dm | 8 - code/game/objects/items/devices/scanners.dm | 15 -- .../objects/items/devices/taperecorder.dm | 12 -- .../objects/items/devices/traitordevices.dm | 5 - .../objects/items/devices/transfer_valve.dm | 6 - code/game/objects/items/devices/uplinks.dm | 2 - code/game/objects/items/devices/whistle.dm | 1 - .../items/mountable_frames/apc_frame.dm | 3 - .../objects/items/mountable_frames/frames.dm | 2 - .../objects/items/mountable_frames/lights.dm | 1 - .../items/mountable_frames/mountables.dm | 2 - .../mountable_frames/newscaster_frame.dm | 3 - code/game/objects/items/policetape.dm | 6 - code/game/objects/items/robot/robot_parts.dm | 29 ---- .../objects/items/robot/robot_upgrades.dm | 13 -- code/game/objects/items/shooting_range.dm | 4 - code/game/objects/items/stacks/medical.dm | 15 -- code/game/objects/items/stacks/nanopaste.dm | 3 - code/game/objects/items/stacks/rods.dm | 4 - .../game/objects/items/stacks/sheets/glass.dm | 27 ---- .../objects/items/stacks/sheets/leather.dm | 1 - code/game/objects/items/stacks/stack.dm | 7 - code/game/objects/items/stacks/telecrystal.dm | 2 - code/game/objects/items/toys.dm | 46 ------ code/game/objects/items/weapons/AI_modules.dm | 34 ----- code/game/objects/items/weapons/RCD.dm | 12 -- code/game/objects/items/weapons/RSF.dm | 32 ---- .../objects/items/weapons/alien_specific.dm | 2 - code/game/objects/items/weapons/cards_ids.dm | 22 --- code/game/objects/items/weapons/cash.dm | 5 - code/game/objects/items/weapons/caution.dm | 2 - .../objects/items/weapons/chrono_eraser.dm | 4 - code/game/objects/items/weapons/cigs.dm | 12 -- .../game/objects/items/weapons/clown_items.dm | 3 - code/game/objects/items/weapons/cosmetics.dm | 9 -- code/game/objects/items/weapons/defib.dm | 21 --- code/game/objects/items/weapons/dice.dm | 1 - .../objects/items/weapons/dnascrambler.dm | 1 - code/game/objects/items/weapons/explosives.dm | 5 - .../objects/items/weapons/extinguisher.dm | 7 - code/game/objects/items/weapons/fireworks.dm | 2 - .../objects/items/weapons/flamethrower.dm | 3 - code/game/objects/items/weapons/garrote.dm | 5 - .../objects/items/weapons/gift_wrappaper.dm | 5 - .../items/weapons/grenades/bananade.dm | 5 - .../items/weapons/grenades/chem_grenade.dm | 14 -- .../items/weapons/grenades/clowngrenade.dm | 1 - .../items/weapons/grenades/flashbang.dm | 4 - .../items/weapons/grenades/ghettobomb.dm | 5 - .../objects/items/weapons/grenades/grenade.dm | 9 -- code/game/objects/items/weapons/handcuffs.dm | 13 -- code/game/objects/items/weapons/holosign.dm | 4 - .../items/weapons/implants/implant_chem.dm | 2 - .../weapons/implants/implant_explosive.dm | 2 - .../items/weapons/implants/implant_freedom.dm | 1 - .../weapons/implants/implant_loyality.dm | 3 - .../items/weapons/implants/implant_misc.dm | 1 - .../items/weapons/implants/implant_traitor.dm | 4 - .../items/weapons/implants/implantchair.dm | 3 - .../items/weapons/implants/implanter.dm | 1 - .../items/weapons/implants/implantpad.dm | 2 - code/game/objects/items/weapons/legcuffs.dm | 2 - code/game/objects/items/weapons/lighters.dm | 1 - .../objects/items/weapons/melee/energy.dm | 8 - code/game/objects/items/weapons/melee/misc.dm | 1 - code/game/objects/items/weapons/misc.dm | 3 - code/game/objects/items/weapons/mop.dm | 3 - .../objects/items/weapons/pneumaticCannon.dm | 16 -- .../game/objects/items/weapons/power_cells.dm | 1 - code/game/objects/items/weapons/scrolls.dm | 2 - code/game/objects/items/weapons/shards.dm | 2 - code/game/objects/items/weapons/shields.dm | 7 - code/game/objects/items/weapons/soap.dm | 2 - code/game/objects/items/weapons/staff.dm | 2 - .../objects/items/weapons/storage/backpack.dm | 3 - .../objects/items/weapons/storage/bags.dm | 3 - .../objects/items/weapons/storage/belt.dm | 4 - .../objects/items/weapons/storage/bible.dm | 11 -- .../objects/items/weapons/storage/fancy.dm | 9 -- .../objects/items/weapons/storage/firstaid.dm | 2 - .../objects/items/weapons/storage/lockbox.dm | 8 - .../objects/items/weapons/storage/secure.dm | 5 - .../objects/items/weapons/storage/storage.dm | 12 -- .../objects/items/weapons/storage/toolbox.dm | 1 - code/game/objects/items/weapons/stunbaton.dm | 9 -- .../objects/items/weapons/swords_axes_etc.dm | 5 - .../objects/items/weapons/table_rack_parts.dm | 2 - .../objects/items/weapons/tanks/jetpack.dm | 4 - .../objects/items/weapons/tanks/tank_types.dm | 8 - .../game/objects/items/weapons/tanks/tanks.dm | 9 -- .../objects/items/weapons/tanks/watertank.dm | 11 -- code/game/objects/items/weapons/tape.dm | 2 - .../objects/items/weapons/teleportation.dm | 2 - code/game/objects/items/weapons/tools.dm | 18 --- code/game/objects/items/weapons/twohanded.dm | 13 -- .../objects/items/weapons/vending_items.dm | 2 - code/game/objects/items/weapons/weaponry.dm | 10 -- code/game/objects/items/weapons/whetstone.dm | 7 - code/game/objects/items/weapons/wires.dm | 3 - code/game/objects/structures.dm | 8 - code/game/objects/structures/artstuff.dm | 3 - code/game/objects/structures/barsign.dm | 11 -- code/game/objects/structures/bedsheet_bin.dm | 8 - code/game/objects/structures/coathanger.dm | 1 - .../structures/crates_lockers/closets.dm | 18 --- .../crates_lockers/closets/cardboardbox.dm | 1 - .../crates_lockers/closets/fireaxe.dm | 19 --- .../crates_lockers/closets/secure/personal.dm | 4 - .../closets/secure/secure_closets.dm | 10 -- .../crates_lockers/closets/statue.dm | 1 - .../structures/crates_lockers/crates.dm | 19 --- .../structures/crates_lockers/crittercrate.dm | 1 - .../structures/crates_lockers/largecrate.dm | 2 - .../structures/crates_lockers/walllocker.dm | 2 - code/game/objects/structures/displaycase.dm | 18 --- code/game/objects/structures/door_assembly.dm | 13 -- code/game/objects/structures/electricchair.dm | 3 - code/game/objects/structures/engicart.dm | 18 --- code/game/objects/structures/extinguisher.dm | 4 - code/game/objects/structures/false_walls.dm | 4 - code/game/objects/structures/flora.dm | 2 - code/game/objects/structures/foodcart.dm | 16 -- code/game/objects/structures/girders.dm | 31 ---- code/game/objects/structures/grille.dm | 5 - code/game/objects/structures/inflatable.dm | 4 - code/game/objects/structures/janicart.dm | 20 --- code/game/objects/structures/kitchen_spike.dm | 8 - code/game/objects/structures/lamarr_cage.dm | 2 - code/game/objects/structures/lattice.dm | 1 - code/game/objects/structures/mineral_doors.dm | 3 - code/game/objects/structures/misc.dm | 6 +- code/game/objects/structures/mop_bucket.dm | 3 - code/game/objects/structures/morgue.dm | 6 - code/game/objects/structures/musician.dm | 8 - code/game/objects/structures/noticeboard.dm | 3 - code/game/objects/structures/safe.dm | 12 -- code/game/objects/structures/signs.dm | 2 - code/game/objects/structures/spirit_board.dm | 5 - .../stool_bed_chair_nest/alien_nests.dm | 1 - .../structures/stool_bed_chair_nest/bed.dm | 2 - .../structures/stool_bed_chair_nest/chairs.dm | 1 - code/game/objects/structures/tables_racks.dm | 17 --- .../game/objects/structures/tank_dispenser.dm | 8 - code/game/objects/structures/target_stake.dm | 3 - .../structures/transit_tubes/station.dm | 1 - code/game/objects/structures/watercloset.dm | 20 --- .../objects/structures/windoor_assembly.dm | 17 --- code/game/objects/structures/window.dm | 7 - code/game/response_team.dm | 10 -- code/game/sound.dm | 2 - code/game/turfs/simulated/floor.dm | 4 - .../game/turfs/simulated/floor/fancy_floor.dm | 2 - .../game/turfs/simulated/floor/light_floor.dm | 4 - code/game/turfs/simulated/floor/plating.dm | 8 - code/game/turfs/simulated/walls.dm | 31 ---- code/game/turfs/simulated/walls_reinforced.dm | 36 ----- code/game/turfs/space/space.dm | 19 --- code/game/vehicles/spacepods/equipment.dm | 2 - code/game/vehicles/spacepods/parts.dm | 4 - .../game/vehicles/spacepods/pod_fabricator.dm | 5 - code/game/vehicles/spacepods/spacepod.dm | 73 --------- code/game/verbs/ooc.dm | 18 --- code/game/verbs/suicide.dm | 21 --- code/game/verbs/who.dm | 2 - code/modules/admin/DB ban/functions.dm | 15 -- code/modules/admin/NewBan.dm | 15 -- code/modules/admin/ToRban.dm | 6 - code/modules/admin/admin.dm | 30 ---- code/modules/admin/admin_investigate.dm | 10 -- code/modules/admin/admin_memo.dm | 6 - code/modules/admin/admin_verbs.dm | 29 ---- code/modules/admin/banappearance.dm | 2 - code/modules/admin/banjob.dm | 2 - code/modules/admin/buildmode.dm | 38 ----- code/modules/admin/create_poll.dm | 5 - code/modules/admin/holder2.dm | 4 - code/modules/admin/machine_upgrade.dm | 1 - code/modules/admin/newbanjob.dm | 23 --- .../admin/permissionverbs/permissionedit.dm | 6 - code/modules/admin/sql_notes.dm | 4 - code/modules/admin/stickyban.dm | 9 -- code/modules/admin/topic.dm | 141 ------------------ code/modules/admin/verbs/BrokenInhands.dm | 2 - code/modules/admin/verbs/SDQL2/SDQL_2.dm | 17 --- .../admin/verbs/SDQL2/SDQL_2_parser.dm | 1 - code/modules/admin/verbs/adminhelp.dm | 6 - code/modules/admin/verbs/adminjump.dm | 3 - code/modules/admin/verbs/adminpm.dm | 20 --- code/modules/admin/verbs/adminsay.dm | 2 - code/modules/admin/verbs/antag-ooc.dm | 1 - code/modules/admin/verbs/atmosdebug.dm | 11 -- code/modules/admin/verbs/custom_event.dm | 11 -- code/modules/admin/verbs/deadsay.dm | 2 - code/modules/admin/verbs/debug.dm | 32 ---- code/modules/admin/verbs/diagnostics.dm | 6 - code/modules/admin/verbs/dice.dm | 2 - code/modules/admin/verbs/freeze.dm | 7 - code/modules/admin/verbs/getlogs.dm | 6 - code/modules/admin/verbs/honksquad.dm | 5 - code/modules/admin/verbs/mapping.dm | 2 - code/modules/admin/verbs/massmodvar.dm | 12 -- code/modules/admin/verbs/modifyvariables.dm | 26 ---- code/modules/admin/verbs/one_click_antag.dm | 5 - code/modules/admin/verbs/onlyone.dm | 6 - code/modules/admin/verbs/onlyoneteam.dm | 4 - code/modules/admin/verbs/playsound.dm | 6 - code/modules/admin/verbs/possess.dm | 1 - code/modules/admin/verbs/pray.dm | 7 - code/modules/admin/verbs/randomverbs.dm | 40 ----- code/modules/admin/verbs/striketeam.dm | 4 - .../admin/verbs/striketeam_syndicate.dm | 3 - code/modules/admin/verbs/ticklag.dm | 1 - code/modules/admin/verbs/tripAI.dm | 4 - code/modules/admin/watchlist.dm | 2 - code/modules/arcade/arcade_base.dm | 13 -- code/modules/arcade/prize_counter.dm | 4 - code/modules/assembly/assembly.dm | 5 - code/modules/assembly/bomb.dm | 3 - code/modules/assembly/holder.dm | 6 - code/modules/assembly/mousetrap.dm | 5 - code/modules/assembly/shock_kit.dm | 1 - .../implementation/digital_valves.dm | 1 - .../implementation/emitters.dm | 1 - .../implementation/vent_pump.dm | 1 - .../awaymissions/bluespaceartillery.dm | 1 - code/modules/awaymissions/gateway.dm | 7 - code/modules/awaymissions/maploader/writer.dm | 1 - .../awaymissions/mission_code/wildwest.dm | 36 ----- code/modules/awaymissions/trigger.dm | 1 - code/modules/client/asset_cache.dm | 1 - code/modules/client/client procs.dm | 31 ---- code/modules/client/preferences.dm | 6 - code/modules/client/preferences_toggles.dm | 31 ---- code/modules/clothing/clothing.dm | 25 ---- code/modules/clothing/glasses/glasses.dm | 7 - code/modules/clothing/gloves/rings.dm | 4 - code/modules/clothing/head/hardhat.dm | 1 - code/modules/clothing/head/helmet.dm | 1 - code/modules/clothing/head/misc_special.dm | 4 - code/modules/clothing/head/soft_caps.dm | 2 - code/modules/clothing/masks/gasmask.dm | 9 -- code/modules/clothing/masks/voice.dm | 2 - code/modules/clothing/shoes/magboots.dm | 2 - code/modules/clothing/spacesuits/alien.dm | 5 - code/modules/clothing/spacesuits/breaches.dm | 8 - .../modules/clothing/spacesuits/chronosuit.dm | 16 -- code/modules/clothing/spacesuits/ert.dm | 2 - code/modules/clothing/spacesuits/plasmamen.dm | 3 - code/modules/clothing/spacesuits/rig.dm | 25 ---- .../clothing/spacesuits/rig/modules/combat.dm | 7 - .../spacesuits/rig/modules/computer.dm | 23 --- .../spacesuits/rig/modules/modules.dm | 17 --- .../clothing/spacesuits/rig/modules/ninja.dm | 5 - .../spacesuits/rig/modules/utility.dm | 16 -- .../clothing/spacesuits/rig/modules/vision.dm | 3 - code/modules/clothing/spacesuits/rig/rig.dm | 34 ----- .../clothing/spacesuits/rig/rig_attackby.dm | 22 --- .../clothing/spacesuits/rig/rig_pieces.dm | 1 - .../clothing/spacesuits/rig/rig_verbs.dm | 25 ---- code/modules/clothing/suits/armor.dm | 2 - code/modules/clothing/suits/miscellaneous.dm | 2 - .../clothing/under/accessories/accessory.dm | 11 -- .../clothing/under/accessories/holster.dm | 8 - .../clothing/under/accessories/storage.dm | 1 - code/modules/clothing/under/chameleon.dm | 4 - code/modules/computer3/bios.dm | 6 - code/modules/computer3/buildandrepair.dm | 27 ---- code/modules/computer3/component.dm | 26 ---- code/modules/computer3/computer.dm | 4 - .../computer3/computers/atmos_alert.dm | 2 - code/modules/computer3/computers/camera.dm | 1 - code/modules/computer3/computers/cloning.dm | 2 - .../computer3/computers/communications.dm | 9 -- code/modules/computer3/computers/law.dm | 11 -- code/modules/computer3/computers/medical.dm | 1 - code/modules/computer3/computers/message.dm | 5 - code/modules/computer3/computers/prisoner.dm | 1 - .../computer3/computers/prisonshuttle.dm | 11 -- code/modules/computer3/computers/robot.dm | 6 - .../computer3/computers/scanconsole.dm | 4 - code/modules/computer3/computers/security.dm | 1 - code/modules/computer3/computers/shuttle.dm | 8 - .../computer3/computers/specops_shuttle.dm | 8 - .../computer3/computers/syndicate_shuttle.dm | 1 - .../computers/syndicate_specops_shuttle.dm | 8 - code/modules/computer3/laptop.dm | 13 -- code/modules/computer3/lapvend.dm | 6 - code/modules/computer3/storage.dm | 3 - code/modules/computer3/upload/programs.dm | 1 - code/modules/crafting/guncrafting.dm | 5 - code/modules/crafting/table.dm | 3 - code/modules/customitems/item_defines.dm | 15 -- code/modules/customitems/item_spawning.dm | 2 - code/modules/detective_work/evidence.dm | 4 - code/modules/detective_work/scanner.dm | 7 - code/modules/economy/ATM.dm | 12 -- code/modules/economy/EFTPOS.dm | 12 -- code/modules/economy/POS.dm | 3 - code/modules/economy/utils.dm | 2 - .../modules/events/communications_blackout.dm | 6 - code/modules/events/event_manager.dm | 2 - code/modules/events/holidays/Holidays.dm | 2 - code/modules/events/ion_storm.dm | 3 - code/modules/events/prison_break.dm | 1 - code/modules/events/undead.dm | 1 - code/modules/fish/fish_items.dm | 6 - code/modules/fish/fishtank.dm | 18 --- code/modules/flufftext/Dreaming.dm | 1 - code/modules/flufftext/Hallucination.dm | 48 ------ code/modules/food/cooker.dm | 5 - code/modules/food/customizables.dm | 5 - code/modules/food/icecream_vat.dm | 5 - code/modules/food/oven.dm | 2 - .../garbage_collection/garbage_collector.dm | 1 - code/modules/garbage_collection/gc_testing.dm | 4 - code/modules/holiday/holiday.dm | 1 - code/modules/hydroponics/grown.dm | 31 ---- code/modules/hydroponics/grown_inedible.dm | 11 -- code/modules/hydroponics/seed.dm | 7 - code/modules/hydroponics/seed_controller.dm | 4 - code/modules/hydroponics/seed_machines.dm | 9 -- code/modules/hydroponics/seed_packets.dm | 1 - code/modules/hydroponics/seed_storage.dm | 2 - .../hydroponics/spreading/spreading.dm | 2 - .../spreading/spreading_response.dm | 1 - code/modules/hydroponics/trays/tray.dm | 40 ----- code/modules/hydroponics/trays/tray_apiary.dm | 16 -- code/modules/hydroponics/trays/tray_tools.dm | 4 - .../hydroponics/trays/tray_update_icons.dm | 1 - code/modules/karma/karma.dm | 29 ---- code/modules/library/lib_items.dm | 25 ---- code/modules/library/lib_machines.dm | 3 - .../media/broadcast/receivers/radio.dm | 2 - .../media/broadcast/transmitters/broadcast.dm | 5 - code/modules/media/jukebox.dm | 3 - code/modules/media/mediamanager.dm | 3 - code/modules/mining/abandonedcrates.dm | 13 -- code/modules/mining/coins.dm | 5 - code/modules/mining/equipment_locker.dm | 27 ---- code/modules/mining/laborcamp/laborshuttle.dm | 2 - code/modules/mining/laborcamp/laborstacker.dm | 15 -- code/modules/mining/manufacturing.dm | 19 --- code/modules/mining/mine_items.dm | 3 - code/modules/mining/mine_turfs.dm | 11 -- code/modules/mining/mint.dm | 1 - code/modules/mining/money_bag.dm | 2 - code/modules/mining/ore.dm | 3 - code/modules/mining/satchel_ore_boxdm.dm | 6 - code/modules/mob/dead/observer/observer.dm | 40 ----- code/modules/mob/dead/observer/say.dm | 2 - code/modules/mob/dead/observer/spells.dm | 1 - code/modules/mob/emote.dm | 5 - code/modules/mob/hear_say.dm | 8 - code/modules/mob/holder.dm | 5 - code/modules/mob/language.dm | 2 - code/modules/mob/living/autohiss.dm | 4 - code/modules/mob/living/carbon/alien/alien.dm | 1 - .../mob/living/carbon/alien/alien_defenses.dm | 3 - .../carbon/alien/humanoid/alien_powers.dm | 13 -- .../carbon/alien/humanoid/caste/drone.dm | 3 - .../carbon/alien/humanoid/caste/hunter.dm | 3 - .../carbon/alien/humanoid/caste/sentinel.dm | 1 - .../mob/living/carbon/alien/humanoid/emote.dm | 1 - .../living/carbon/alien/humanoid/empress.dm | 1 - .../living/carbon/alien/humanoid/humanoid.dm | 7 - .../mob/living/carbon/alien/humanoid/life.dm | 1 - .../mob/living/carbon/alien/humanoid/queen.dm | 3 - .../mob/living/carbon/alien/larva/emote.dm | 3 - .../mob/living/carbon/alien/larva/larva.dm | 7 - .../mob/living/carbon/alien/larva/powers.dm | 11 -- code/modules/mob/living/carbon/alien/life.dm | 1 - .../carbon/alien/special/alien_embryo.dm | 8 - .../living/carbon/alien/special/facehugger.dm | 3 - code/modules/mob/living/carbon/brain/MMI.dm | 8 - .../mob/living/carbon/brain/brain_item.dm | 3 - code/modules/mob/living/carbon/brain/emote.dm | 7 - code/modules/mob/living/carbon/brain/life.dm | 4 - .../mob/living/carbon/brain/posibrain.dm | 18 --- code/modules/mob/living/carbon/brain/say.dm | 1 - code/modules/mob/living/carbon/carbon.dm | 26 ---- code/modules/mob/living/carbon/give.dm | 11 -- code/modules/mob/living/carbon/human/emote.dm | 5 - .../mob/living/carbon/human/examine.dm | 3 - code/modules/mob/living/carbon/human/human.dm | 51 ------- .../living/carbon/human/human_attackhand.dm | 15 -- .../mob/living/carbon/human/human_damage.dm | 3 - .../mob/living/carbon/human/human_defense.dm | 5 - .../mob/living/carbon/human/inventory.dm | 15 -- code/modules/mob/living/carbon/human/life.dm | 20 --- code/modules/mob/living/carbon/human/login.dm | 1 - .../mob/living/carbon/human/species/apollo.dm | 6 - .../living/carbon/human/species/plasmaman.dm | 4 - .../living/carbon/human/species/species.dm | 2 - .../living/carbon/human/species/station.dm | 13 -- .../mob/living/carbon/human/update_icons.dm | 2 - code/modules/mob/living/carbon/life.dm | 1 - code/modules/mob/living/carbon/slime/emote.dm | 3 - .../mob/living/carbon/slime/examine.dm | 1 - .../modules/mob/living/carbon/slime/powers.dm | 19 --- code/modules/mob/living/carbon/slime/slime.dm | 9 -- code/modules/mob/living/carbon/superheroes.dm | 23 --- code/modules/mob/living/default_language.dm | 4 - code/modules/mob/living/living.dm | 20 --- code/modules/mob/living/living_defense.dm | 9 -- code/modules/mob/living/login.dm | 1 - code/modules/mob/living/say.dm | 5 - code/modules/mob/living/silicon/ai/ai.dm | 49 ------ code/modules/mob/living/silicon/ai/examine.dm | 1 - .../living/silicon/ai/freelook/cameranet.dm | 1 - .../mob/living/silicon/ai/freelook/eye.dm | 2 - .../modules/mob/living/silicon/ai/latejoin.dm | 1 - code/modules/mob/living/silicon/ai/laws.dm | 1 - code/modules/mob/living/silicon/ai/life.dm | 15 -- code/modules/mob/living/silicon/ai/say.dm | 5 - code/modules/mob/living/silicon/laws.dm | 3 - code/modules/mob/living/silicon/pai/emote.dm | 1 - .../modules/mob/living/silicon/pai/examine.dm | 1 - code/modules/mob/living/silicon/pai/life.dm | 1 - code/modules/mob/living/silicon/pai/pai.dm | 20 --- .../mob/living/silicon/pai/personality.dm | 4 - .../modules/mob/living/silicon/pai/recruit.dm | 1 - code/modules/mob/living/silicon/pai/say.dm | 1 - .../mob/living/silicon/pai/software.dm | 1 - .../living/silicon/pai/software_modules.dm | 8 - .../mob/living/silicon/robot/component.dm | 21 --- .../mob/living/silicon/robot/drone/drone.dm | 26 ---- .../silicon/robot/drone/drone_abilities.dm | 4 - .../silicon/robot/drone/drone_console.dm | 11 -- .../living/silicon/robot/drone/drone_items.dm | 9 -- .../silicon/robot/drone/drone_manufacturer.dm | 10 -- .../living/silicon/robot/drone/drone_say.dm | 3 - .../modules/mob/living/silicon/robot/emote.dm | 3 - .../mob/living/silicon/robot/examine.dm | 1 - .../mob/living/silicon/robot/inventory.dm | 3 - code/modules/mob/living/silicon/robot/laws.dm | 9 -- code/modules/mob/living/silicon/robot/life.dm | 5 - .../mob/living/silicon/robot/photos.dm | 1 - .../modules/mob/living/silicon/robot/robot.dm | 67 --------- .../mob/living/silicon/robot/robot_damage.dm | 6 - .../mob/living/silicon/robot/robot_items.dm | 1 - code/modules/mob/living/silicon/say.dm | 7 - code/modules/mob/living/silicon/silicon.dm | 13 -- code/modules/mob/living/simple_animal/bees.dm | 1 - .../mob/living/simple_animal/bot/bot.dm | 48 ------ .../mob/living/simple_animal/bot/cleanbot.dm | 5 - .../living/simple_animal/bot/construction.dm | 31 ---- .../mob/living/simple_animal/bot/ed209bot.dm | 1 - .../mob/living/simple_animal/bot/floorbot.dm | 3 - .../mob/living/simple_animal/bot/medbot.dm | 4 - .../mob/living/simple_animal/bot/mulebot.dm | 17 --- .../mob/living/simple_animal/bot/secbot.dm | 1 - .../mob/living/simple_animal/constructs.dm | 2 - .../living/simple_animal/friendly/corgi.dm | 18 --- .../simple_animal/friendly/corgi_powers.dm | 2 - .../mob/living/simple_animal/friendly/crab.dm | 10 -- .../living/simple_animal/friendly/diona.dm | 14 -- .../simple_animal/friendly/farm_animals.dm | 8 - .../living/simple_animal/friendly/mouse.dm | 4 - .../living/simple_animal/friendly/slime.dm | 1 - .../simple_animal/friendly/spiderbot.dm | 19 --- .../simple_animal/hostile/giant_spider.dm | 3 - .../living/simple_animal/hostile/headcrab.dm | 2 - .../simple_animal/hostile/mining_mobs.dm | 9 -- .../living/simple_animal/hostile/mushroom.dm | 3 - .../living/simple_animal/hostile/statue.dm | 2 - .../living/simple_animal/hostile/syndicate.dm | 1 - .../simple_animal/hostile/winter_mobs.dm | 4 - .../mob/living/simple_animal/parrot.dm | 13 -- .../mob/living/simple_animal/powers.dm | 4 - .../modules/mob/living/simple_animal/shade.dm | 1 - .../mob/living/simple_animal/simple_animal.dm | 8 - .../mob/living/simple_animal/tribbles.dm | 8 - code/modules/mob/living/simple_animal/vox.dm | 7 - code/modules/mob/mob.dm | 33 ---- code/modules/mob/mob_grab.dm | 9 -- code/modules/mob/mob_helpers.dm | 6 - code/modules/mob/mob_movement.dm | 10 -- code/modules/mob/mob_transformation_simple.dm | 4 - code/modules/mob/new_player/login.dm | 1 - code/modules/mob/new_player/new_player.dm | 13 -- code/modules/mob/new_player/poll.dm | 14 -- code/modules/mob/say.dm | 2 - code/modules/mob/spirit/mask/mask.dm | 9 -- code/modules/mob/spirit/movement.dm | 3 - code/modules/mob/spirit/spirit.dm | 3 - code/modules/mob/spirit/viewpoint.dm | 13 -- code/modules/mob/transform_procs.dm | 9 -- code/modules/mob/typing_indicator.dm | 1 - code/modules/nano/modules/crew_monitor.dm | 1 - code/modules/nano/modules/law_manager.dm | 3 - code/modules/nano/nanomapgen.dm | 5 - code/modules/nano/nanoui.dm | 1 - code/modules/ninja/energy_katana.dm | 1 - code/modules/ninja/martial_art.dm | 9 -- code/modules/ninja/suit/SpiderOS.dm | 9 -- code/modules/ninja/suit/suit.dm | 5 - code/modules/ninja/suit/suit_attackby.dm | 3 - .../modules/ninja/suit/suit_initialisation.dm | 24 +-- code/modules/paperwork/carbonpaper.dm | 2 - code/modules/paperwork/clipboard.dm | 3 - code/modules/paperwork/faxmachine.dm | 5 - code/modules/paperwork/filingcabinet.dm | 6 - code/modules/paperwork/folders.dm | 1 - code/modules/paperwork/frames.dm | 8 - code/modules/paperwork/handlabeler.dm | 10 -- code/modules/paperwork/paper.dm | 9 -- code/modules/paperwork/paper_bundle.dm | 9 -- code/modules/paperwork/paperbin.dm | 8 - code/modules/paperwork/pen.dm | 5 - code/modules/paperwork/photocopier.dm | 8 - code/modules/paperwork/photography.dm | 15 -- code/modules/paperwork/silicon_photography.dm | 8 - code/modules/pda/PDA.dm | 16 -- code/modules/pda/ai.dm | 4 - code/modules/pda/app.dm | 1 - code/modules/pda/chatroom.dm | 1 - code/modules/pda/messenger.dm | 4 - code/modules/pda/radio.dm | 1 - code/modules/pda/utilities.dm | 11 -- code/modules/power/apc.dm | 59 -------- code/modules/power/cable.dm | 25 ---- code/modules/power/cable_heavyduty.dm | 2 - code/modules/power/cell.dm | 4 - code/modules/power/generator.dm | 1 - code/modules/power/generator_type2.dm | 1 - code/modules/power/gravitygenerator.dm | 5 - code/modules/power/lighting.dm | 25 ---- code/modules/power/port_gen.dm | 12 -- code/modules/power/singularity/collector.dm | 8 - code/modules/power/singularity/emitter.dm | 18 --- .../power/singularity/field_generator.dm | 7 - code/modules/power/singularity/narsie.dm | 7 - .../particle_accelerator.dm | 5 - .../particle_accelerator/particle_control.dm | 1 - code/modules/power/singularity/singularity.dm | 1 - code/modules/power/smes.dm | 12 -- code/modules/power/solar.dm | 3 - code/modules/power/supermatter/sm_shard.dm | 2 - code/modules/power/supermatter/supermatter.dm | 2 - code/modules/power/switch.dm | 4 - code/modules/power/tesla/energy_ball.dm | 1 - code/modules/power/treadmill.dm | 1 - code/modules/power/turbine.dm | 4 - .../procedural_mapping/mapGenerator.dm | 12 -- code/modules/projectiles/ammunition.dm | 4 - code/modules/projectiles/gun.dm | 15 -- code/modules/projectiles/guns/alien.dm | 3 - .../projectiles/guns/energy/advtaser.dm | 2 - .../projectiles/guns/energy/blueshield.dm | 2 - code/modules/projectiles/guns/energy/hos.dm | 3 - code/modules/projectiles/guns/energy/laser.dm | 2 - .../projectiles/guns/energy/nuclear.dm | 8 - code/modules/projectiles/guns/energy/pulse.dm | 4 - .../projectiles/guns/energy/special.dm | 13 -- .../projectiles/guns/energy/temperature.dm | 1 - code/modules/projectiles/guns/magic.dm | 2 - code/modules/projectiles/guns/magic/wand.dm | 6 - code/modules/projectiles/guns/projectile.dm | 10 -- .../projectiles/guns/projectile/automatic.dm | 11 -- .../projectiles/guns/projectile/crossbow.dm | 25 ---- .../guns/projectile/grenade launcher.dm | 3 - .../projectiles/guns/projectile/revolver.dm | 13 -- .../projectiles/guns/projectile/rocket.dm | 5 - .../projectiles/guns/projectile/shotgun.dm | 9 -- code/modules/projectiles/guns/syringe_gun.dm | 5 - code/modules/projectiles/medbeam.dm | 1 - code/modules/projectiles/projectile.dm | 6 - code/modules/projectiles/projectile/beams.dm | 5 - code/modules/projectiles/projectile/magic.dm | 5 - code/modules/projectiles/targeting.dm | 23 --- code/modules/reagents/Chemistry-Holder.dm | 4 - code/modules/reagents/Chemistry-Machinery.dm | 23 --- code/modules/reagents/Chemistry-Readme.dm | 3 - code/modules/reagents/dartgun.dm | 15 -- code/modules/reagents/grenade_launcher.dm | 10 -- .../modules/reagents/newchem/Blob-Reagents.dm | 1 - code/modules/reagents/newchem/chem_heater.dm | 2 - code/modules/reagents/newchem/disease.dm | 1 - code/modules/reagents/newchem/drinks.dm | 2 - code/modules/reagents/newchem/drugs.dm | 16 -- code/modules/reagents/newchem/food.dm | 20 --- code/modules/reagents/newchem/medicine.dm | 7 - .../modules/reagents/newchem/newchem_procs.dm | 8 - code/modules/reagents/newchem/other.dm | 2 - code/modules/reagents/newchem/pyro.dm | 8 - code/modules/reagents/newchem/toxins.dm | 29 ---- .../chemical_reaction_slime.dm | 1 - .../oldchem/reagents/_reagent_base.dm | 2 - .../reagents/drink/reagents_alcohol.dm | 3 - .../oldchem/reagents/reagents_food.dm | 1 - .../oldchem/reagents/reagents_toxin.dm | 13 -- .../oldchem/reagents/reagents_water.dm | 7 - code/modules/reagents/pandemic.dm | 2 - code/modules/reagents/reagent_containers.dm | 2 - .../reagents/reagent_containers/borghydro.dm | 7 - .../reagents/reagent_containers/dropper.dm | 7 - .../reagents/reagent_containers/drugs.dm | 9 -- .../reagents/reagent_containers/food/cans.dm | 9 -- .../reagent_containers/food/condiment.dm | 11 -- .../reagent_containers/food/drinks.dm | 16 -- .../reagent_containers/food/sandwich.dm | 5 - .../reagent_containers/food/snacks.dm | 24 --- .../reagent_containers/food/snacks/meat.dm | 1 - .../reagent_containers/glass_containers.dm | 19 --- .../reagents/reagent_containers/hypospray.dm | 6 - .../reagents/reagent_containers/pill.dm | 2 - .../reagent_containers/robodropper.dm | 7 - .../reagents/reagent_containers/spray.dm | 8 - .../reagents/reagent_containers/syringes.dm | 29 ---- code/modules/reagents/reagent_dispenser.dm | 5 - code/modules/recycling/conveyor2.dm | 1 - .../recycling/disposal-construction.dm | 12 -- code/modules/recycling/disposal.dm | 27 ---- code/modules/recycling/sortingmachinery.dm | 14 -- code/modules/research/circuitprinter.dm | 6 - code/modules/research/destructive_analyzer.dm | 6 - code/modules/research/experimentor.dm | 17 --- code/modules/research/message_server.dm | 2 - code/modules/research/protolathe.dm | 5 - code/modules/research/rdconsole.dm | 9 -- code/modules/research/rdmachines.dm | 3 - code/modules/research/server.dm | 2 - .../xenoarchaeology/artifact/artifact.dm | 3 - .../artifact/artifact_gigadrill.dm | 2 - .../artifact/artifact_unknown.dm | 5 - .../artifact/effects/unknown_affect_cold.dm | 1 - .../effects/unknown_effect_badfeeling.dm | 6 - .../effects/unknown_effect_cellcharge.dm | 3 - .../effects/unknown_effect_celldrain.dm | 3 - .../effects/unknown_effect_goodfeeling.dm | 6 - .../artifact/effects/unknown_effect_heal.dm | 3 - .../artifact/effects/unknown_effect_heat.dm | 1 - .../artifact/effects/unknown_effect_hurt.dm | 3 - .../effects/unknown_effect_roboheal.dm | 3 - .../effects/unknown_effect_robohurt.dm | 3 - .../artifact/effects/unknown_effect_sleepy.dm | 6 - .../artifact/effects/unknown_effect_stun.dm | 4 - .../effects/unknown_effect_teleport.dm | 3 - .../research/xenoarchaeology/chemistry.dm | 1 - .../xenoarchaeology/finds/finds_fossils.dm | 1 - .../xenoarchaeology/finds/finds_misc.dm | 1 - .../xenoarchaeology/finds/finds_special.dm | 2 - .../finds/finds_talkingitem.dm | 4 - .../xenoarchaeology/genetics/reconstitutor.dm | 2 - .../machinery/artifact_harvester.dm | 2 - .../machinery/geosample_scanner.dm | 6 - .../tools/ano_device_battery.dm | 2 - .../xenoarchaeology/tools/bunsen_burner.dm | 5 - .../tools/suspension_generator.dm | 22 --- .../xenoarchaeology/tools/tools_anoscanner.dm | 1 - .../tools/tools_coresampler.dm | 9 -- .../tools/tools_depthscanner.dm | 2 - .../research/xenobiology/xenobio_camera.dm | 1 - .../research/xenobiology/xenobiology.dm | 32 ---- code/modules/scripting/Parser/Keywords.dm | 2 - .../security_levels/keycard authentication.dm | 9 -- code/modules/shuttle/assault_pod.dm | 1 - code/modules/shuttle/emergency.dm | 7 - code/modules/shuttle/shuttle.dm | 2 - code/modules/shuttle/supply.dm | 4 - code/modules/shuttle/syndicate.dm | 2 - code/modules/surgery/dental_implant.dm | 1 - code/modules/surgery/helpers.dm | 2 - code/modules/surgery/implant.dm | 9 -- code/modules/surgery/organs/augments_eyes.dm | 2 - .../surgery/organs/augments_internal.dm | 14 -- code/modules/surgery/organs/autoimplanter.dm | 5 - code/modules/surgery/organs/blood.dm | 4 - code/modules/surgery/organs/body_egg.dm | 1 - code/modules/surgery/organs/organ.dm | 1 - code/modules/surgery/organs/organ_external.dm | 2 - code/modules/surgery/organs/organ_internal.dm | 3 - code/modules/surgery/organs/pain.dm | 2 - code/modules/surgery/organs/parasites.dm | 1 - .../surgery/organs/subtypes/machine.dm | 1 - code/modules/surgery/organs_internal.dm | 8 - code/modules/surgery/other.dm | 2 - code/modules/surgery/robotics.dm | 18 --- code/modules/surgery/surgery.dm | 1 - code/modules/telesci/telepad.dm | 11 -- code/modules/telesci/telesci_computer.dm | 5 - code/modules/vehicle/train/train.dm | 10 -- .../modules/vehicle/train/trains/ambulance.dm | 10 -- .../vehicle/train/trains/cargo/cargo_train.dm | 9 -- code/modules/vehicle/vehicle.dm | 7 - code/world.dm | 16 -- 1049 files changed, 3 insertions(+), 8630 deletions(-) diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index 6ea62424cf2..af0889a6e5c 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -154,7 +154,6 @@ Pipelines + Other Objects -> Pipe network var/turf/T = get_turf(src) if (level == 1 && isturf(T) && T.intact) to_chat(user, "You must remove the plating first.") - return 1 var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/env_air = loc.return_air() @@ -165,10 +164,8 @@ Pipelines + Other Objects -> Pipe network playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) to_chat(user, "You begin to unfasten \the [src]...") - if (internal_pressure > 2*ONE_ATMOSPHERE) to_chat(user, "As you begin unwrenching \the [src] a gush of air blows in your face... maybe you should reconsider?") - unsafe_wrenching = TRUE //Oh dear oh dear if (do_after(user, 40, target = src) && isnull(gcDestroyed)) diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm index ebabc2e3c4b..93bed0168c1 100644 --- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm +++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm @@ -135,7 +135,6 @@ src.add_fingerprint(usr) if(!src.allowed(user)) to_chat(user, "Access denied.") - return usr.set_machine(src) interact(user) @@ -160,7 +159,6 @@ return ..() if (on) to_chat(user, "You cannot unwrench this [src], turn it off first.") - return 1 return ..() \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm index 5923825735e..9ef395e3291 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm @@ -158,7 +158,6 @@ Thus, the two variables affect pump operation are set in New(): src.add_fingerprint(usr) if(!src.allowed(user)) to_chat(user, "Access denied.") - return usr.set_machine(src) interact(user) @@ -190,6 +189,5 @@ Thus, the two variables affect pump operation are set in New(): return ..() if (!(stat & NOPOWER) && on) to_chat(user, "You cannot unwrench this [src], turn it off first.") - return 1 return ..() \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/binary_devices/valve.dm b/code/ATMOSPHERICS/components/binary_devices/valve.dm index 9aae2337f1e..1c0f625e036 100644 --- a/code/ATMOSPHERICS/components/binary_devices/valve.dm +++ b/code/ATMOSPHERICS/components/binary_devices/valve.dm @@ -75,7 +75,6 @@ return if(!src.allowed(user)) to_chat(user, "Access denied.") - return ..() diff --git a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm index 253504d773e..e0acb101a96 100644 --- a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm @@ -148,7 +148,6 @@ Thus, the two variables affect pump operation are set in New(): src.add_fingerprint(usr) if(!src.allowed(user)) to_chat(user, "Access denied.") - return usr.set_machine(src) interact(user) @@ -180,6 +179,5 @@ Thus, the two variables affect pump operation are set in New(): return ..() if (!(stat & NOPOWER) && on) to_chat(user, "You cannot unwrench this [src], turn it off first.") - return 1 return ..() \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm index 1ce0b673e16..89bec1b0614 100644 --- a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm +++ b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm @@ -105,12 +105,10 @@ var/datum/gas_mixture/env_air = loc.return_air() if ((int_pressure - env_air.return_pressure()) > 2*ONE_ATMOSPHERE) to_chat(user, "You cannot unwrench [src], it is too exerted due to internal pressure.") - add_fingerprint(user) return 1 playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) to_chat(user, "You begin to unfasten \the [src]...") - if(do_after(user, 40, target = src)) user.visible_message( \ "[user] unfastens \the [src].", \ diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm index a61815351e7..f26ae014a27 100755 --- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm @@ -154,7 +154,6 @@ Filter types: if(!src.allowed(user)) to_chat(user, "Access denied.") - return var/dat diff --git a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm index 7e152b4e912..e54815299ef 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm @@ -115,7 +115,6 @@ src.add_fingerprint(usr) if(!src.allowed(user)) to_chat(user, "Access denied.") - return usr.set_machine(src) var/dat = {"Power: [on?"On":"Off"]
      diff --git a/code/ATMOSPHERICS/components/trinary_devices/tvalve.dm b/code/ATMOSPHERICS/components/trinary_devices/tvalve.dm index 2d727170750..2195bab16d8 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/tvalve.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/tvalve.dm @@ -136,7 +136,6 @@ return if(!src.allowed(user)) to_chat(user, "Access denied.") - return ..() diff --git a/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm b/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm index c8ddd45a4ef..1b106c12a1c 100644 --- a/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm +++ b/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm @@ -172,7 +172,6 @@ if(istype(W, /obj/item/weapon/wrench)) if (!(stat & NOPOWER) && on) to_chat(user, "You cannot unwrench this [src], turn if off first.") - return 1 return ..() diff --git a/code/ATMOSPHERICS/components/unary_devices/portables_connector.dm b/code/ATMOSPHERICS/components/unary_devices/portables_connector.dm index 347c44e3790..8df6fec3cdf 100644 --- a/code/ATMOSPHERICS/components/unary_devices/portables_connector.dm +++ b/code/ATMOSPHERICS/components/unary_devices/portables_connector.dm @@ -37,7 +37,6 @@ if(istype(W, /obj/item/weapon/wrench)) if(connected_device) to_chat(user, "You cannot unwrench this [src], detach [connected_device] first.") - return 1 return ..() diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm index 2e065a97e43..636f549d6d2 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm @@ -323,7 +323,6 @@ var/obj/item/weapon/weldingtool/WT = W if (WT.remove_fuel(0,user)) to_chat(user, "Now welding the vent.") - if(do_after(user, 20, target = src)) if(!src || !WT.isOn()) return playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) @@ -338,22 +337,18 @@ else to_chat(user, "The welding tool needs to be on to start this task.") - else to_chat(user, "You need more welding fuel to complete this task.") - return 1 if(istype(W, /obj/item/weapon/screwdriver)) if(!welded) if(open) to_chat(user, " Now closing the vent.") - if (do_after(user, 20, target = src)) open = 0 user.visible_message("[user] screwdrivers the vent shut.", "You screwdriver the vent shut.", "You hear a screwdriver.") else to_chat(user, " Now opening the vent.") - if (do_after(user, 20, target = src)) open = 1 user.visible_message("[user] screwdrivers the vent shut.", "You screwdriver the vent shut.", "You hear a screwdriver.") @@ -365,10 +360,8 @@ W.forceMove(src) if(!open) to_chat(user, "You can't shove that down there when it is closed") - else to_chat(user, "The vent is welded.") - return if(istype(W, /obj/item/device/multitool)) update_multitool_menu(user) @@ -376,7 +369,6 @@ if (istype(W, /obj/item/weapon/wrench)) if (!(stat & NOPOWER) && on) to_chat(user, "You cannot unwrench this [src], turn it off first.") - return 1 return ..() @@ -393,7 +385,6 @@ if(welded) to_chat(user, "It seems welded shut.") - /obj/machinery/atmospherics/unary/vent_pump/power_change() var/old_stat = stat ..() diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm index 5808dd55dac..cd8a88b12f5 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm @@ -60,7 +60,6 @@ if(welded) to_chat(user, "It seems welded shut.") - /obj/machinery/atmospherics/unary/vent_scrubber/auto_use_power() if(!powered(power_channel)) return 0 @@ -374,7 +373,6 @@ var/obj/item/weapon/weldingtool/WT = W if (WT.remove_fuel(0,user)) to_chat(user, "Now welding the scrubber.") - if(do_after(user, 20, target = src)) if(!src || !WT.isOn()) return playsound(get_turf(src), 'sound/items/Welder2.ogg', 50, 1) @@ -388,11 +386,9 @@ update_icon() else to_chat(user, "The welding tool needs to be on to start this task.") - return 1 else to_chat(user, "You need more welding fuel to complete this task.") - return 1 if(istype(W, /obj/item/device/multitool)) update_multitool_menu(user) @@ -400,7 +396,6 @@ if (istype(W, /obj/item/weapon/wrench)) if (!(stat & NOPOWER) && on) to_chat(user, "You cannot unwrench this [src], turn it off first.") - return 1 return ..() diff --git a/code/__HELPERS/files.dm b/code/__HELPERS/files.dm index 0f24997d67f..27f3537d521 100644 --- a/code/__HELPERS/files.dm +++ b/code/__HELPERS/files.dm @@ -40,7 +40,6 @@ var/extension = copytext(path,-4,0) if( !fexists(path) || !(extension in valid_extensions) ) to_chat(src, "Error: browse_files(): File not found/Invalid file([path]).") - return return path @@ -55,7 +54,6 @@ var/time_to_wait = fileaccess_timer - world.time if(time_to_wait > 0) to_chat(src, "Error: file_spam_check(): Spam. Please wait [round(time_to_wait/10)] seconds.") - return 1 fileaccess_timer = world.time + FTPDELAY return 0 diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index d33bb2c8d64..3542948ae10 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -488,21 +488,16 @@ proc/pollCandidates(var/Question, var/be_special_type, var/antag_age_check = 0, spawn(0) to_chat(G, 'sound/misc/notice2.ogg')//Alerting them to their consideration - switch(alert(G,Question,"Please answer in [poll_time/10] seconds!","Yes","No")) if("Yes") to_chat(G, "Choice registered: Yes.") - if((world.time-time_passed)>poll_time)//If more than 30 game seconds passed. to_chat(G, "Sorry, you were too late for the consideration!") - to_chat(G, 'sound/machines/buzz-sigh.ogg') - return candidates += G if("No") to_chat(G, "Choice registered: No.") - return else return diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index c63c039f075..36bb824e642 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -59,7 +59,6 @@ for(var/t in L) . += " has: [t]\n" to_chat(world, .) - */ diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index 95529721619..4c2517d9617 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -169,7 +169,6 @@ mob set name = "2. Output Icon" to_chat(src, "Icon is: \icon[getFlatIcon(src)]") - Label_Icon() set name = "3. Label Icon" // Give it a name for the cache diff --git a/code/__HELPERS/logging.dm b/code/__HELPERS/logging.dm index bcb9b3dcbb7..09830792201 100644 --- a/code/__HELPERS/logging.dm +++ b/code/__HELPERS/logging.dm @@ -34,7 +34,6 @@ to_chat(C, "DEBUG: [text]") - /proc/log_game(text) if (config.log_game) diary << "\[[time_stamp()]]GAME: [text]" @@ -92,5 +91,4 @@ */ /proc/log_startup_progress(var/message) to_chat(world, "[message]") - log_to_dd(message) \ No newline at end of file diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm index 370fd92b75e..be0b6bbf245 100644 --- a/code/__HELPERS/names.dm +++ b/code/__HELPERS/names.dm @@ -240,7 +240,6 @@ var/syndicate_code_response//Code response for traitors. set category = "Debug" to_chat(world, "\red Code Phrase is: \black [generate_code_phrase()]") - return diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 2991b4c830a..33a815f2443 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -252,7 +252,6 @@ Turf and target are seperate in case you want to teleport some distance from a t var/total_moles = air_contents.total_moles() to_chat(user, "Results of analysis of \icon[icon] [target].") - if(total_moles>0) var/o2_concentration = air_contents.oxygen/total_moles var/n2_concentration = air_contents.nitrogen/total_moles @@ -262,23 +261,15 @@ Turf and target are seperate in case you want to teleport some distance from a t var/unknown_concentration = 1-(o2_concentration+n2_concentration+co2_concentration+plasma_concentration) to_chat(user, "Pressure: [round(pressure,0.1)] kPa") - to_chat(user, "Nitrogen: [round(n2_concentration*100)] %") - to_chat(user, "Oxygen: [round(o2_concentration*100)] %") - to_chat(user, "CO2: [round(co2_concentration*100)] %") - to_chat(user, "Plasma: [round(plasma_concentration*100)] %") - if(unknown_concentration>0.01) to_chat(user, "Unknown: [round(unknown_concentration*100)] %") - to_chat(user, "Temperature: [round(air_contents.temperature-T0C)] °C") - else to_chat(user, "[target] is empty!") - return //Picks a string of symbols to display as the law number for hacked or ion laws diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 1405860b107..d135e62ae69 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -333,11 +333,9 @@ var/obj/structure/cable/cable = locate() in T if(!cable || !istype(cable)) to_chat(src, "There is no cable here to power the gloves.") - return if(world.time < G.next_shock) to_chat(src, "[G] aren't ready to shock again!") - return src.visible_message("[name] fires an arc of electricity!", \ "You fire an arc of electricity!", \ diff --git a/code/_onclick/click_override.dm b/code/_onclick/click_override.dm index 520ef6b5078..092398ee174 100644 --- a/code/_onclick/click_override.dm +++ b/code/_onclick/click_override.dm @@ -28,12 +28,10 @@ /obj/item/weapon/badminBook/attack_self(mob/living/user as mob) if(user.middleClickOverride) to_chat(user, "You try to draw power from the [src], but you cannot hold the power at this time!") - return user.middleClickOverride = clickBehavior to_chat(user, "You draw a bit of power from the [src], you can use middle click or alt click to release the power!") - /datum/middleClickOverride/badminClicker var/summon_path = /obj/item/weapon/reagent_containers/food/snacks/cookie @@ -41,6 +39,5 @@ var/atom/movable/newObject = new summon_path newObject.loc = get_turf(A) to_chat(user, "You release the power you had stored up, summoning \a [newObject.name]! ") - usr.loc.visible_message("[user] waves \his hand and summons \a [newObject.name]") ..() \ No newline at end of file diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index 330f22366c1..ecb7f00cd8b 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -54,7 +54,6 @@ aiCamera.captureimage(A, usr) else to_chat(src, "Your camera isn't functional.") - return /* diff --git a/code/_onclick/hud/action.dm b/code/_onclick/hud/action.dm index e5854c7a706..0a891be21f5 100644 --- a/code/_onclick/hud/action.dm +++ b/code/_onclick/hud/action.dm @@ -281,13 +281,11 @@ owner.research_scanner = 1 to_chat(owner, " Research analyzer is now active.") - /datum/action/scan_mode/Deactivate() active = 0 owner.research_scanner = 0 to_chat(owner, " Research analyzer deactivated.") - /datum/action/scan_mode/Grant(mob/living/T) devices += 1 ..(T) diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 6fbcb2456e6..fa414ba0dea 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -196,7 +196,5 @@ datum/hud/New(mob/owner) else to_chat(usr, "\red Inventory hiding is currently only supported for human mobs, sorry.") - else to_chat(usr, "\red This mob type does not use a HUD.") - diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index 2350dff6a26..8e729546b20 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -247,12 +247,10 @@ if(!r.module) to_chat(usr, "\red No module selected") - return if(!r.module.modules) to_chat(usr, "\red Selected module has no modules to select") - return if(!r.robot_modules_background) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 417dd668d0f..3ab8f58fd99 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -96,7 +96,6 @@ if(C.internal) C.internal = null to_chat(C, "No longer running on internals.") - if(C.internals) C.internals.icon_state = "internal0" else @@ -110,7 +109,6 @@ if(no_mask) to_chat(C, "You are not wearing a suitable mask or helmet.") - return 1 else var/list/nicename = null @@ -192,7 +190,6 @@ if(best) to_chat(C, "You are now running on internals from [tankcheck[best]] [from] your [nicename[best]].") - C.internal = tankcheck[best] @@ -202,7 +199,6 @@ else to_chat(C, "You don't have a[breathes=="oxygen" ? "n oxygen" : addtext(" ",breathes)] tank.") - /obj/screen/mov_intent name = "run/walk toggle" icon = 'icons/mob/screen1_midnight.dmi' @@ -213,7 +209,6 @@ var/mob/living/carbon/C = usr if(C.legcuffed) to_chat(C, "You are legcuffed! You cannot run until you get [C.legcuffed] removed!") - C.m_intent = "walk" //Just incase C.hud_used.move_intent.icon_state = "walking" return 1 @@ -376,7 +371,6 @@ return if(!istype(usr.get_active_hand(), /obj/item/weapon/gun)) to_chat(usr, "You need your gun in your active hand to do that!") - return usr.client.AllowTargetClick() gun_click_time = world.time diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 2fe0c4c40db..d71d0205b89 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -18,7 +18,6 @@ if(stat == DEAD && !isnull(butcher_results)) //can we butcher it? if(istype(I, /obj/item/weapon/kitchen/knife)) to_chat(user, "You begin to butcher [src]...") - playsound(loc, 'sound/weapons/slice.ogg', 50, 1, -1) if(do_mob(user, src, 80)) harvest(user) @@ -81,7 +80,6 @@ var/mob/living/carbon/slime/slime = M if(prob(25)) to_chat(user, "\red [src] passes right through [M]!") - return if(power > 0) @@ -168,7 +166,6 @@ - if(istype(M, /mob/living/carbon/human)) return M:attacked_by(src, user, def_zone) //make sure to return whether we have hit or miss else @@ -188,7 +185,6 @@ if (!(RESIST_COLD in M.mutations)) M.take_organ_damage(0, power) to_chat(M, "Aargh it burns!") - M.updatehealth() add_fingerprint(user) return 1 diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm index bdfbbfb839a..869ee83ff9c 100644 --- a/code/_onclick/observer.dm +++ b/code/_onclick/observer.dm @@ -63,10 +63,8 @@ else to_chat(user, "[src] has no destination.") - /obj/machinery/gateway/centeraway/attack_ghost(mob/user as mob) if(stationgate) user.forceMove(stationgate.loc) else to_chat(user, "[src] has no destination.") - diff --git a/code/_onclick/oldcode.dm b/code/_onclick/oldcode.dm index c4c454b067c..b3f2c1dde05 100644 --- a/code/_onclick/oldcode.dm +++ b/code/_onclick/oldcode.dm @@ -140,7 +140,6 @@ // to_chat(world, "according to dblclick(), t5 is [t5]") - // ------- ACTUALLY DETERMINING STUFF ------- if (((t5 || (W && (W.flags & USEDELAY))) && !( istype(src, /obj/screen) ))) diff --git a/code/_onclick/rig.dm b/code/_onclick/rig.dm index d497a12ef60..31e6f287564 100644 --- a/code/_onclick/rig.dm +++ b/code/_onclick/rig.dm @@ -19,18 +19,14 @@ switch(hardsuit_click_mode) if(MIDDLE_CLICK) to_chat(src, "Hardsuit activation mode set to middle-click.") - if(ALT_CLICK) to_chat(src, "Hardsuit activation mode set to alt-click.") - if(CTRL_CLICK) to_chat(src, "Hardsuit activation mode set to control-click.") - else // should never get here, but just in case: log_debug("Bad hardsuit click mode: [hardsuit_click_mode] - expected 0 to [MAX_HARDSUIT_CLICK_MODE]") to_chat(src, "Somehow you bugged the system. Setting your hardsuit mode to middle-click.") - hardsuit_click_mode = MIDDLE_CLICK /mob/living/MiddleClickOn(atom/A) diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index bf5691778f3..ee953edac3f 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -112,7 +112,6 @@ var/const/tk_maxrange = 15 d = max(d,get_dist(user,focus)) // whichever is further if(d > tk_maxrange) to_chat(user, "Your mind won't reach that far.") - return if(!focus) diff --git a/code/controllers/Processes/inactivity.dm b/code/controllers/Processes/inactivity.dm index 188f017d960..b08df7983fc 100644 --- a/code/controllers/Processes/inactivity.dm +++ b/code/controllers/Processes/inactivity.dm @@ -9,7 +9,6 @@ if(!istype(C.mob, /mob/dead)) log_access("AFK: [key_name(C)]") to_chat(C, "You have been inactive for more than 10 minutes and have been disconnected.") - del(C) SCHECK diff --git a/code/controllers/Processes/shuttles.dm b/code/controllers/Processes/shuttles.dm index 9ac4cd120af..e92def92224 100644 --- a/code/controllers/Processes/shuttles.dm +++ b/code/controllers/Processes/shuttles.dm @@ -93,36 +93,29 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12 if(world.time - round_start_time < config.shuttle_refuel_delay) to_chat(user, "The emergency shuttle is refueling. Please wait another [abs(round(((world.time - round_start_time) - config.shuttle_refuel_delay)/600))] minutes before trying again.") - return switch(emergency.mode) if(SHUTTLE_RECALL) to_chat(user, "The emergency shuttle may not be called while returning to Centcom.") - return if(SHUTTLE_CALL) to_chat(user, "The emergency shuttle is already on its way.") - return if(SHUTTLE_DOCKED) to_chat(user, "The emergency shuttle is already here.") - return if(SHUTTLE_ESCAPE) to_chat(user, "The emergency shuttle is moving away to a safe distance.") - return if(SHUTTLE_STRANDED) to_chat(user, "The emergency shuttle has been disabled by Centcom.") - return call_reason = trim(html_encode(call_reason)) if(length(call_reason) < CALL_SHUTTLE_REASON_LENGTH) to_chat(user, "You must provide a reason.") - return var/area/signal_origin = get_area(user) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 757891f1f7d..9cf42a511fd 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -689,7 +689,6 @@ for (var/T in subtypesof(/datum/game_mode)) var/datum/game_mode/M = new T() // to_chat(world, "DEBUG: [T], tag=[M.config_tag], prob=[probabilities[M.config_tag]]") - if (!(M.config_tag in modes)) qdel(M) continue @@ -699,5 +698,4 @@ if (M.can_start()) runnable_modes[M] = probabilities[M.config_tag] // to_chat(world, "DEBUG: runnable_mode\[[runnable_modes.len]\] = [M.config_tag]") - return runnable_modes diff --git a/code/controllers/voting.dm b/code/controllers/voting.dm index 96310f6c93d..6b7e4e7558f 100644 --- a/code/controllers/voting.dm +++ b/code/controllers/voting.dm @@ -26,7 +26,6 @@ datum/controller/vote // 3 is GAME_STATE_PLAYING, but that #define is undefined for some reason if(mode == "gamemode" && ticker.current_state >= 2) to_chat(world, "Voting aborted due to game start.") - src.reset() return @@ -64,7 +63,6 @@ datum/controller/vote auto_muted = 0 config.ooc_allowed = !( config.ooc_allowed ) to_chat(world, "The OOC channel has been automatically enabled due to vote end.") - log_admin("OOC was toggled automatically due to vote end.") message_admins("OOC has been toggled on automatically.") @@ -106,7 +104,6 @@ datum/controller/vote factor = 1.4 choices["Initiate Crew Transfer"] = round(choices["Initiate Crew Transfer"] * factor) to_chat(world, "Crew Transfer Factor: [factor]") - greatest_votes = max(choices["Initiate Crew Transfer"], choices["Continue The Round"]) @@ -144,7 +141,6 @@ datum/controller/vote text += "Vote Result: Inconclusive - No Votes!" log_vote(text) to_chat(world, "[text]") - return . proc/result() @@ -165,7 +161,6 @@ datum/controller/vote if(!going) going = 1 to_chat(world, "The round will start soon.") - if("crew_transfer") if(. == "Initiate Crew Transfer") init_shift_change(null, 1) @@ -232,40 +227,32 @@ datum/controller/vote log_vote(text) to_chat(world, "[text]\nType vote to place your votes.\nYou have [config.vote_period/10] seconds to vote.") - switch(vote_type) if("crew_transfer") to_chat(world, sound('sound/ambience/alarm4.ogg')) - if("gamemode") to_chat(world, sound('sound/ambience/alarm4.ogg')) - if("custom") to_chat(world, sound('sound/ambience/alarm4.ogg')) - if(mode == "gamemode" && going) going = 0 to_chat(world, "Round start has been delayed.") - if(mode == "crew_transfer" && config.ooc_allowed) auto_muted = 1 config.ooc_allowed = !( config.ooc_allowed ) to_chat(world, "The OOC channel has been automatically disabled due to a crew transfer vote.") - log_admin("OOC was toggled automatically due to crew_transfer vote.") message_admins("OOC has been toggled off automatically.") if(mode == "gamemode" && config.ooc_allowed) auto_muted = 1 config.ooc_allowed = !( config.ooc_allowed ) to_chat(world, "The OOC channel has been automatically disabled due to the gamemode vote.") - log_admin("OOC was toggled automatically due to gamemode vote.") message_admins("OOC has been toggled off automatically.") if(mode == "custom" && config.ooc_allowed) auto_muted = 1 config.ooc_allowed = !( config.ooc_allowed ) to_chat(world, "The OOC channel has been automatically disabled due to a custom vote.") - log_admin("OOC was toggled automatically due to custom vote.") message_admins("OOC has been toggled off automatically.") diff --git a/code/datums/ai_laws.dm b/code/datums/ai_laws.dm index f929de520b3..4af13e256fd 100644 --- a/code/datums/ai_laws.dm +++ b/code/datums/ai_laws.dm @@ -229,11 +229,9 @@ var/global/const/base_law_type = /datum/ai_laws/nanotrasen continue if(law == zeroth_law) to_chat(who, "[law.get_index()]. [law.law]") - else to_chat(who, "[law.get_index()]. [law.law]") - /******************** * Stating Laws * ********************/ diff --git a/code/datums/browser.dm b/code/datums/browser.dm index 9d5e019aed8..e8f17f17ad0 100644 --- a/code/datums/browser.dm +++ b/code/datums/browser.dm @@ -156,7 +156,6 @@ // to_chat(world, "OnClose [user]: [windowid] : ["on-close=\".windowclose [param]\""]") - // the on-close client verb // called when a browser popup window is closed after registering with proc/onclose() // if a valid atom reference is supplied, call the atom's Topic() with "close=1" @@ -167,12 +166,10 @@ set name = ".windowclose" // no autocomplete on cmd line // to_chat(world, "windowclose: [atomref]") - if(atomref!="null") // if passed a real atomref var/hsrc = locate(atomref) // find the reffed atom if(hsrc) // to_chat(world, "[src] Topic [href] [hsrc]") - usr = src.mob src.Topic("close=1", list("close"="1"), hsrc) // this will direct to the atom's return // Topic() proc via client.Topic() @@ -181,6 +178,5 @@ // so just reset the user mob's machine var if(src && src.mob) // to_chat(world, "[src] was [src.mob.machine], setting to null") - src.mob.unset_machine() return \ No newline at end of file diff --git a/code/datums/cargoprofile.dm b/code/datums/cargoprofile.dm index 88505af923d..98732e50f8b 100644 --- a/code/datums/cargoprofile.dm +++ b/code/datums/cargoprofile.dm @@ -643,7 +643,6 @@ //this is necessarily damaging var/damage = rand(1,5) to_chat(M, "\red The unloading machine grabs you with a hard metallic claw!") - if(M.client) M.client.eye = master M.client.perspective = EYE_PERSPECTIVE @@ -662,7 +661,6 @@ if(bruteloss < 100) // requires tenderization M.apply_damage(rand(5,15),BRUTE) to_chat(M, "The machine is tearing you apart!") - master.visible_message("\red [master] makes a squishy grinding noise.") return M.loc = master.loc @@ -701,7 +699,6 @@ //this is necessarily damaging var/damage = rand(1,5) to_chat(M, "\red The unloading machine grabs you with a hard metallic claw!") - if(M.client) M.client.eye = master M.client.perspective = EYE_PERSPECTIVE @@ -794,7 +791,6 @@ var/mob/living/carbon/human/M = W if((M.lying || (M.health - M.staminaloss < 25))&& !master.emagged) to_chat(M, "\The [src] gives you a break.") - master.sleep+=5 return 0 // Be polite var/punches = punch(M,remaining / PUNCH_WORK) diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 49eeffa7bd3..eeb26f5f6f2 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -8,7 +8,6 @@ if(!usr.client || !usr.client.holder) to_chat(usr, "\red You need to be an administrator to access this.") - return @@ -417,7 +416,6 @@ body for(var/i=0;i<4;i++) idx=(block*4)+i to_chat(bit=1, idx) - bv=value & bit html += "[bv?1:0]" html += "
      " @@ -441,7 +439,6 @@ body var/mob/M = locate(href_list["rename"]) if(!istype(M)) to_chat(usr, "This can only be used on instances of type /mob") - return var/new_name = sanitize(copytext(input(usr,"What would you like to name this mob?","Input a name",M.real_name) as text|null,1,MAX_NAME_LEN)) @@ -457,7 +454,6 @@ body var/D = locate(href_list["datumedit"]) if(!istype(D,/datum) && !istype(D,/client)) to_chat(usr, "This can only be used on instances of types /client or /datum") - return modify_variables(D, href_list["varnameedit"], 1) @@ -468,11 +464,9 @@ body var/atom/D = locate(href_list["subject"]) if(!istype(D,/datum) && !istype(D,/client)) to_chat(usr, "This can only be used on instances of types /client or /datum") - return if(!(href_list["var"] in D.vars)) to_chat(usr, "Unable to find variable specified.") - return var/value = D.vars[href_list["var"]] value ^= 1 << text2num(href_list["togbit"]) @@ -485,7 +479,6 @@ body var/D = locate(href_list["datumchange"]) if(!istype(D,/datum) && !istype(D,/client)) to_chat(usr, "This can only be used on instances of types /client or /datum") - return modify_variables(D, href_list["varnamechange"], 0) @@ -496,7 +489,6 @@ body var/atom/A = locate(href_list["datummass"]) if(!istype(A)) to_chat(usr, "This can only be used on instances of type /atom") - return cmd_mass_modify_object_variables(A, href_list["varnamemass"]) @@ -507,7 +499,6 @@ body var/mob/M = locate(href_list["mob_player_panel"]) if(!istype(M)) to_chat(usr, "This can only be used on instances of type /mob") - return src.holder.show_player_panel(M) @@ -519,7 +510,6 @@ body var/mob/M = locate(href_list["give_spell"]) if(!istype(M)) to_chat(usr, "This can only be used on instances of type /mob") - return src.give_spell(M) @@ -532,7 +522,6 @@ body var/mob/M = locate(href_list["give_disease"]) if(!istype(M)) to_chat(usr, "This can only be used on instances of type /mob") - return src.give_disease(M) @@ -544,7 +533,6 @@ body var/mob/M = locate(href_list["godmode"]) if(!istype(M)) to_chat(usr, "This can only be used on instances of type /mob") - return src.cmd_admin_godmode(M) @@ -556,7 +544,6 @@ body var/mob/M = locate(href_list["gib"]) if(!istype(M)) to_chat(usr, "This can only be used on instances of type /mob") - return src.cmd_admin_gib(M) @@ -567,7 +554,6 @@ body var/mob/M = locate(href_list["build_mode"]) if(!istype(M)) to_chat(usr, "This can only be used on instances of type /mob") - return togglebuildmode(M) @@ -579,7 +565,6 @@ body var/mob/M = locate(href_list["drop_everything"]) if(!istype(M)) to_chat(usr, "This can only be used on instances of type /mob") - return if(usr.client) @@ -591,7 +576,6 @@ body var/mob/M = locate(href_list["direct_control"]) if(!istype(M)) to_chat(usr, "This can only be used on instances of type /mob") - return if(usr.client) @@ -603,7 +587,6 @@ body var/mob/living/carbon/human/H = locate(href_list["make_skeleton"]) if(!istype(H)) to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") - return var/confirm = alert("Are you sure you want to turn this mob into a skeleton?","Confirm Skeleton Transformation","Yes","No") @@ -621,10 +604,8 @@ body var/mob/M = locate(href_list["offer_control"]) if(!istype(M)) to_chat(usr, "This can only be used on instances of type /mob") - return to_chat(M, "Control of your mob has been offered to dead players.") - log_admin("[key_name(usr)] has offered control of ([key_name(M)]) to ghosts.") message_admins("[key_name_admin(usr)] has offered control of ([key_name_admin(M)]) to ghosts") var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as [M.real_name]?", poll_time = 100) @@ -633,13 +614,11 @@ body if(candidates.len) theghost = pick(candidates) to_chat(M, "Your mob has been taken over by a ghost!") - message_admins("[key_name_admin(theghost)] has taken control of ([key_name_admin(M)])") M.ghostize() M.key = theghost.key else to_chat(M, "There were no ghosts willing to take control.") - message_admins("No ghosts were willing to take control of [key_name_admin(M)])") else if(href_list["delall"]) @@ -648,7 +627,6 @@ body var/obj/O = locate(href_list["delall"]) if(!isobj(O)) to_chat(usr, "This can only be used on instances of type /obj") - return var/action_type = alert("Strict type ([O.type]) or type and all subtypes?",,"Strict type","Type and subtypes","Cancel") @@ -671,7 +649,6 @@ body qdel(Obj) if(!i) to_chat(usr, "No objects of this type exist") - return log_admin("[key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted)") message_admins("[key_name_admin(usr)] deleted all objects of type [O_type] ([i] objects deleted)") @@ -683,7 +660,6 @@ body qdel(Obj) if(!i) to_chat(usr, "No objects of this type exist") - return log_admin("[key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted)") message_admins("[key_name_admin(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted)") @@ -724,7 +700,6 @@ body var/atom/A = locate(href_list["explode"]) if(!isobj(A) && !ismob(A) && !isturf(A)) to_chat(usr, "This can only be done to instances of type /obj, /mob and /turf") - return src.cmd_admin_explosion(A) @@ -736,7 +711,6 @@ body var/atom/A = locate(href_list["emp"]) if(!isobj(A) && !ismob(A) && !isturf(A)) to_chat(usr, "This can only be done to instances of type /obj, /mob and /turf") - return src.cmd_admin_emp(A) @@ -748,7 +722,6 @@ body var/datum/D = locate(href_list["mark_object"]) if(!istype(D)) to_chat(usr, "This can only be done to instances of type /datum") - return src.holder.marked_datum = D @@ -769,7 +742,6 @@ body var/atom/A = locate(href_list["rotatedatum"]) if(!istype(A)) to_chat(usr, "This can only be done to instances of type /atom") - return switch(href_list["rotatedir"]) @@ -786,13 +758,11 @@ body var/mob/living/carbon/human/H = locate(href_list["makemonkey"]) if(!istype(H)) to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") - return if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return if(!H) to_chat(usr, "Mob doesn't exist anymore") - return holder.Topic(href, list("monkeyone"=href_list["makemonkey"])) @@ -802,13 +772,11 @@ body var/mob/living/carbon/human/H = locate(href_list["makerobot"]) if(!istype(H)) to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") - return if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return if(!H) to_chat(usr, "Mob doesn't exist anymore") - return holder.Topic(href, list("makerobot"=href_list["makerobot"])) @@ -818,13 +786,11 @@ body var/mob/living/carbon/human/H = locate(href_list["makealien"]) if(!istype(H)) to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") - return if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return if(!H) to_chat(usr, "Mob doesn't exist anymore") - return holder.Topic(href, list("makealien"=href_list["makealien"])) @@ -834,13 +800,11 @@ body var/mob/living/carbon/human/H = locate(href_list["makeslime"]) if(!istype(H)) to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") - return if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return if(!H) to_chat(usr, "Mob doesn't exist anymore") - return holder.Topic(href, list("makeslime"=href_list["makeslime"])) @@ -850,13 +814,11 @@ body var/mob/living/carbon/human/H = locate(href_list["makesuper"]) if(!istype(H)) to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") - return if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return if(!H) to_chat(usr, "Mob doesn't exist anymore") - return holder.Topic(href, list("makesuper"=href_list["makesuper"])) @@ -866,13 +828,11 @@ body var/mob/living/carbon/human/H = locate(href_list["makeai"]) if(!istype(H)) to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") - return if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return if(!H) to_chat(usr, "Mob doesn't exist anymore") - return holder.Topic(href, list("makeai"=href_list["makeai"])) @@ -882,7 +842,6 @@ body if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return if(!currentMob) to_chat(usr, "Mob doesn't exist anymore") - return holder.Topic(href, list("makemask"=href_list["makemask"])) @@ -893,33 +852,28 @@ body var/mob/living/carbon/human/H = locate(href_list["setspecies"]) if(!istype(H)) to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") - return var/new_species = input("Please choose a new species.","Species",null) as null|anything in all_species if(!H) to_chat(usr, "Mob doesn't exist anymore") - return if(H.set_species(new_species)) to_chat(usr, "Set species of [H] to [H.species].") - H.regenerate_icons() message_admins("[key_name_admin(usr)] has changed the species of [key_name_admin(H)] to [new_species]") log_admin("[key_name(usr)] has changed the species of [key_name(H)] to [new_species]") else to_chat(usr, "Failed! Something went wrong.") - else if(href_list["addlanguage"]) if(!check_rights(R_SPAWN)) return var/mob/H = locate(href_list["addlanguage"]) if(!istype(H)) to_chat(usr, "This can only be done to instances of type /mob") - return var/new_language = input("Please choose a language to add.","Language",null) as null|anything in all_languages @@ -929,30 +883,25 @@ body if(!H) to_chat(usr, "Mob doesn't exist anymore") - return if(H.add_language(new_language)) to_chat(usr, "Added [new_language] to [H].") - message_admins("[key_name_admin(usr)] has given [key_name_admin(H)] the language [new_language]") log_admin("[key_name(usr)] has given [key_name(H)] the language [new_language]") else to_chat(usr, "Mob already knows that language.") - else if(href_list["remlanguage"]) if(!check_rights(R_SPAWN)) return var/mob/H = locate(href_list["remlanguage"]) if(!istype(H)) to_chat(usr, "This can only be done to instances of type /mob") - return if(!H.languages.len) to_chat(usr, "This mob knows no languages.") - return var/datum/language/rem_language = input("Please choose a language to remove.","Language",null) as null|anything in H.languages @@ -962,18 +911,15 @@ body if(!H) to_chat(usr, "Mob doesn't exist anymore") - return if(H.remove_language(rem_language.name)) to_chat(usr, "Removed [rem_language] from [H].") - message_admins("[key_name_admin(usr)] has removed language [rem_language] from [key_name_admin(H)]") log_admin("[key_name(usr)] has removed language [rem_language] from [key_name(H)]") else to_chat(usr, "Mob doesn't know that language.") - else if(href_list["addverb"]) if(!check_rights(R_DEBUG)) return @@ -981,7 +927,6 @@ body if(!istype(H)) to_chat(usr, "This can only be done to instances of type /mob/living") - return var/list/possibleverbs = list() possibleverbs += "Cancel" // One for the top... @@ -999,7 +944,6 @@ body var/verb = input("Select a verb!", "Verbs",null) as anything in possibleverbs if(!H) to_chat(usr, "Mob doesn't exist anymore") - return if(!verb || verb == "Cancel") return @@ -1015,12 +959,10 @@ body if(!istype(H)) to_chat(usr, "This can only be done to instances of type /mob") - return var/verb = input("Please choose a verb to remove.","Verbs",null) as null|anything in H.verbs if(!H) to_chat(usr, "Mob doesn't exist anymore") - return if(!verb) return @@ -1035,7 +977,6 @@ body var/mob/living/carbon/M = locate(href_list["addorgan"]) if(!istype(M)) to_chat(usr, "This can only be done to instances of type /mob/living/carbon") - return var/new_organ = input("Please choose an organ to add.","Organ",null) as null|anything in subtypesof(/obj/item/organ)-/obj/item/organ @@ -1043,12 +984,10 @@ body if(!M) to_chat(usr, "Mob doesn't exist anymore") - return if(locate(new_organ) in M.internal_organs) to_chat(usr, "Mob already has that organ.") - return var/obj/item/organ/internal/organ = new new_organ organ.insert(M) @@ -1061,23 +1000,19 @@ body var/mob/living/carbon/M = locate(href_list["remorgan"]) if(!istype(M)) to_chat(usr, "This can only be done to instances of type /mob/living/carbon") - return var/obj/item/organ/internal/rem_organ = input("Please choose an organ to remove.","Organ",null) as null|anything in M.internal_organs if(!M) to_chat(usr, "Mob doesn't exist anymore") - return if(!(locate(rem_organ) in M.internal_organs)) to_chat(usr, "Mob does not have that organ.") - return to_chat(usr, "Removed [rem_organ] from [M].") - rem_organ.remove(M) message_admins("[key_name_admin(usr)] has removed the organ [rem_organ] from [key_name_admin(M)]") log_admin("[key_name(usr)] has removed the organ [rem_organ] from [key_name(M)]") @@ -1090,16 +1025,13 @@ body if(!istype(H) || !H.client) to_chat(usr, "This can only be done on mobs with clients") - return H.client.reload_nanoui_resources() to_chat(usr, "Resource files sent") - to_chat(H, "Your NanoUI Resource files have been refreshed") - log_admin("[key_name(usr)] resent the NanoUI resource files to [key_name(H)]") else if(href_list["regenerateicons"]) @@ -1108,7 +1040,6 @@ body var/mob/M = locate(href_list["regenerateicons"]) if(!ismob(M)) to_chat(usr, "This can only be done to instances of type /mob") - return M.regenerate_icons() @@ -1124,7 +1055,6 @@ body if(!L) to_chat(usr, "Mob doesn't exist anymore") - return switch(Text) @@ -1136,7 +1066,6 @@ body if("clone") L.adjustCloneLoss(amount) else to_chat(usr, "You caused an error. DEBUG: Text:[Text] Mob:[L]") - return if(amount != 0) diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index 393da9550d9..4bef4896cc8 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -162,7 +162,6 @@ var/list/advance_cures = list( /datum/disease/advance/proc/Refresh(new_name = 0) // to_chat(world, "[src.name] \ref[src] - REFRESH!") - var/list/properties = GenerateProperties() AssignProperties(properties) id = null @@ -257,7 +256,6 @@ var/list/advance_cures = list( if(properties && properties.len) var/res = Clamp(properties["resistance"] - (symptoms.len / 2), 1, advance_cures.len) // to_chat(world, "Res = [res]") - cures = list(advance_cures[res]) // Get the cure name from the cure_id @@ -331,7 +329,6 @@ var/list/advance_cures = list( // to_chat(world, "Mixing!!!!") - var/list/diseases = list() for(var/datum/disease/advance/A in D_list) @@ -356,7 +353,6 @@ var/list/advance_cures = list( // Should be only 1 entry left, but if not let's only return a single entry // to_chat(world, "END MIXING!!!!!") - var/datum/disease/advance/to_return = pick(diseases) to_return.Refresh(1) return to_return @@ -426,7 +422,6 @@ var/list/advance_cures = list( for(var/datum/disease/D in disease_master.processing) to_chat(src, "[D.name] - [D.holder]") - */ diff --git a/code/datums/diseases/advance/symptoms/beard.dm b/code/datums/diseases/advance/symptoms/beard.dm index 708b061732b..1dda9b46f7f 100644 --- a/code/datums/diseases/advance/symptoms/beard.dm +++ b/code/datums/diseases/advance/symptoms/beard.dm @@ -33,19 +33,16 @@ BONUS switch(A.stage) if(1, 2) to_chat(H, "Your chin itches.") - if(H.f_style == "Shaved") H.f_style = "Jensen Beard" H.update_hair() if(3, 4) to_chat(H, "You feel tough.") - if(!(H.f_style == "Dwarf Beard") && !(H.f_style == "Very Long Beard") && !(H.f_style == "Full Beard")) H.f_style = "Full Beard" H.update_hair() else to_chat(H, "You feel manly!") - if(!(H.f_style == "Dwarf Beard") && !(H.f_style == "Very Long Beard")) H.f_style = pick("Dwarf Beard", "Very Long Beard") H.update_hair() diff --git a/code/datums/diseases/advance/symptoms/choking.dm b/code/datums/diseases/advance/symptoms/choking.dm index 9faa62b550c..83b3a4a226a 100644 --- a/code/datums/diseases/advance/symptoms/choking.dm +++ b/code/datums/diseases/advance/symptoms/choking.dm @@ -32,15 +32,12 @@ Bonus switch(A.stage) if(1, 2) to_chat(M, "[pick("You're having difficulty breathing.", "Your breathing becomes heavy.")]") - if(3, 4) to_chat(M, "[pick("Your windpipe feels like a straw.", "Your breathing becomes tremendously difficult.")]") - Choke_stage_3_4(M, A) M.emote("gasp") else to_chat(M, "[pick("You're choking!", "You can't breathe!")]") - Choke(M, A) M.emote("gasp") return diff --git a/code/datums/diseases/advance/symptoms/confusion.dm b/code/datums/diseases/advance/symptoms/confusion.dm index ddaea9da4cc..8f388c45edc 100644 --- a/code/datums/diseases/advance/symptoms/confusion.dm +++ b/code/datums/diseases/advance/symptoms/confusion.dm @@ -33,10 +33,8 @@ Bonus switch(A.stage) if(1, 2, 3, 4) to_chat(M, "[pick("Your head hurts.", "Your mind blanks for a moment.")]") - else to_chat(M, "You can't think straight!") - M.confused = min(100, M.confused + 8) return diff --git a/code/datums/diseases/advance/symptoms/cough.dm b/code/datums/diseases/advance/symptoms/cough.dm index c112fd2d111..44f57ce0fac 100644 --- a/code/datums/diseases/advance/symptoms/cough.dm +++ b/code/datums/diseases/advance/symptoms/cough.dm @@ -32,7 +32,6 @@ BONUS switch(A.stage) if(1, 2, 3) to_chat(M, "[pick("You swallow excess mucus.", "You lightly cough.")]") - else M.emote("cough") var/obj/item/I = M.get_active_hand() diff --git a/code/datums/diseases/advance/symptoms/deafness.dm b/code/datums/diseases/advance/symptoms/deafness.dm index 6d8d8008ef8..6c65e330fa8 100644 --- a/code/datums/diseases/advance/symptoms/deafness.dm +++ b/code/datums/diseases/advance/symptoms/deafness.dm @@ -32,15 +32,12 @@ Bonus switch(A.stage) if(3, 4) to_chat(M, "[pick("You hear a ringing in your ear.", "Your ears pop.")]") - if(5) if(!(M.ear_deaf)) to_chat(M, "Your ears pop and begin ringing loudly!") - M.setEarDamage(-1,INFINITY) //Shall be enough spawn(200) if(M) to_chat(M, "The ringing in your ears fades...") - M.setEarDamage(-1,0) return \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/dizzy.dm b/code/datums/diseases/advance/symptoms/dizzy.dm index 1ab6b3a7fb6..c594298b11c 100644 --- a/code/datums/diseases/advance/symptoms/dizzy.dm +++ b/code/datums/diseases/advance/symptoms/dizzy.dm @@ -32,9 +32,7 @@ Bonus switch(A.stage) if(1, 2, 3, 4) to_chat(M, "[pick("You feel dizzy.", "Your head spins.")]") - else to_chat(M, "A wave of dizziness washes over you!") - M.Dizzy(5) return \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/fever.dm b/code/datums/diseases/advance/symptoms/fever.dm index 89789d9f993..917ec9f3bf1 100644 --- a/code/datums/diseases/advance/symptoms/fever.dm +++ b/code/datums/diseases/advance/symptoms/fever.dm @@ -30,7 +30,6 @@ Bonus if(prob(SYMPTOM_ACTIVATION_PROB)) var/mob/living/carbon/M = A.affected_mob to_chat(M, "[pick("You feel hot.", "You feel like you're burning.")]") - if(M.bodytemperature < BODYTEMP_HEAT_DAMAGE_LIMIT) Heat(M, A) diff --git a/code/datums/diseases/advance/symptoms/fire.dm b/code/datums/diseases/advance/symptoms/fire.dm index 040de3f43a4..ad828efdd4c 100644 --- a/code/datums/diseases/advance/symptoms/fire.dm +++ b/code/datums/diseases/advance/symptoms/fire.dm @@ -32,18 +32,15 @@ Bonus switch(A.stage) if(3) to_chat(M, "[pick("You feel hot.", "You hear a crackling noise.", "You smell smoke.")]") - if(4) Firestacks_stage_4(M, A) M.IgniteMob() to_chat(M, "Your skin bursts into flames!") - M.emote("scream") if(5) Firestacks_stage_5(M, A) M.IgniteMob() to_chat(M, "Your skin erupts into an inferno!") - M.emote("scream") return diff --git a/code/datums/diseases/advance/symptoms/flesh_eating.dm b/code/datums/diseases/advance/symptoms/flesh_eating.dm index 35862771a02..e99f6f2835b 100644 --- a/code/datums/diseases/advance/symptoms/flesh_eating.dm +++ b/code/datums/diseases/advance/symptoms/flesh_eating.dm @@ -32,10 +32,8 @@ Bonus switch(A.stage) if(2,3) to_chat(M, "[pick("You feel a sudden pain across your body.", "Drops of blood appear suddenly on your skin.")]") - if(4,5) to_chat(M, "[pick("You cringe as a violent pain takes over your body.", "It feels like your body is eating itself inside out.", "IT HURTS.")]") - Flesheat(M, A) return diff --git a/code/datums/diseases/advance/symptoms/genetics.dm b/code/datums/diseases/advance/symptoms/genetics.dm index ab73b6b7abe..7c824d565dd 100644 --- a/code/datums/diseases/advance/symptoms/genetics.dm +++ b/code/datums/diseases/advance/symptoms/genetics.dm @@ -36,7 +36,6 @@ Bonus switch(A.stage) if(4, 5) to_chat(M, "[pick("Your skin feels itchy.", "You feel light headed.")]") - M.dna.remove_mutation_group(possible_mutations) randmut(M, possible_mutations) return diff --git a/code/datums/diseases/advance/symptoms/hallucigen.dm b/code/datums/diseases/advance/symptoms/hallucigen.dm index 36aa7da05c5..cac8b4d2e03 100644 --- a/code/datums/diseases/advance/symptoms/hallucigen.dm +++ b/code/datums/diseases/advance/symptoms/hallucigen.dm @@ -32,13 +32,10 @@ Bonus switch(A.stage) if(1, 2) to_chat(M, "[pick("Something appears in your peripheral vision, then winks out.", "You hear a faint whispher with no source.", "Your head aches.")]") - if(3, 4) to_chat(M, "[pick("Something is following you.", "You are being watched.", "You hear a whisper in your ear.", "Thumping footsteps slam toward you from nowhere.")]") - else to_chat(M, "[pick("Oh, your head...", "Your head pounds.", "They're everywhere! Run!", "Something in the shadows...")]") - M.hallucination += 5 return diff --git a/code/datums/diseases/advance/symptoms/headache.dm b/code/datums/diseases/advance/symptoms/headache.dm index dc9c88f7488..526ab93836f 100644 --- a/code/datums/diseases/advance/symptoms/headache.dm +++ b/code/datums/diseases/advance/symptoms/headache.dm @@ -31,5 +31,4 @@ BONUS if(prob(SYMPTOM_ACTIVATION_PROB)) var/mob/living/M = A.affected_mob to_chat(M, "[pick("Your head hurts.", "Your head starts pounding.")]") - return \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm index 2cc872d7741..11235d9a35b 100644 --- a/code/datums/diseases/advance/symptoms/heal.dm +++ b/code/datums/diseases/advance/symptoms/heal.dm @@ -75,7 +75,6 @@ Bonus if(cured) to_chat(M, "You feel much better.") - /datum/symptom/heal/metabolism/End(datum/disease/advance/A) // Remove all the diseases we cured. var/mob/living/M = A.affected_mob @@ -86,7 +85,6 @@ Bonus M.resistances -= res to_chat(M, "You feel weaker.") - /* ////////////////////////////////////// diff --git a/code/datums/diseases/advance/symptoms/itching.dm b/code/datums/diseases/advance/symptoms/itching.dm index 97d855fe8e5..8563520b09a 100644 --- a/code/datums/diseases/advance/symptoms/itching.dm +++ b/code/datums/diseases/advance/symptoms/itching.dm @@ -31,5 +31,4 @@ BONUS if(prob(SYMPTOM_ACTIVATION_PROB)) var/mob/living/M = A.affected_mob to_chat(M, "Your [pick("back", "arm", "leg", "elbow", "head")] itches.") - return \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/oxygen.dm b/code/datums/diseases/advance/symptoms/oxygen.dm index 1b94e64c18f..8d3b6a09b36 100644 --- a/code/datums/diseases/advance/symptoms/oxygen.dm +++ b/code/datums/diseases/advance/symptoms/oxygen.dm @@ -35,5 +35,4 @@ Bonus else if(prob(SYMPTOM_ACTIVATION_PROB * 5)) to_chat(M, "[pick("Your lungs feel great.", "You realize you haven't been breathing.", "You don't feel the need to breathe.")]") - return diff --git a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/advance/symptoms/sensory.dm index 8a3290ab004..b25c4bacf47 100644 --- a/code/datums/diseases/advance/symptoms/sensory.dm +++ b/code/datums/diseases/advance/symptoms/sensory.dm @@ -33,22 +33,18 @@ Bonus if(M.reagents.get_reagent_amount("oculine")<10) M.reagents.add_reagent("oculine"=10) to_chat(M, "Your hearing feels clearer and crisp.") - if(3) if(M.reagents.get_reagent_amount("antihol") < 10 && M.reagents.get_reagent_amount("oculine") < 10 ) M.reagents.add_reagent_list(list("antihol"=10, "oculine"=10)) to_chat(M, "You feel sober.") - if(4) if(M.reagents.get_reagent_amount("antihol") < 10 && M.reagents.get_reagent_amount("oculine") < 10 && M.reagents.get_reagent_amount("synaptizine") < 10) M.reagents.add_reagent_list(list("antihol"=10, "oculine"=10, "synaptizine"=5)) to_chat(M, "You feel focused.") - if(5) if(M.reagents.get_reagent_amount("antihol") < 10 && M.reagents.get_reagent_amount("oculine") < 10 && M.reagents.get_reagent_amount("synaptizine") < 10 && M.reagents.get_reagent_amount("mannitol") < 10) M.reagents.add_reagent_list(list("mannitol"=10, "antihol"=10, "oculine"=10, "synaptizine"=10)) to_chat(M, "Your mind feels relaxed.") - return /* @@ -85,28 +81,23 @@ Bonus switch(A.stage) if(1) to_chat(M, "You can't taste a thing.") - if(2) to_chat(M, "You can't feel anything.") - if(prob(10)) M.reagents.add_reagent("morphine",rand(5,7)) if(3) M.reagents.add_reagent("ethanol",rand(5,7)) to_chat(M, "You feel absolutely hammered.") - if(prob(15)) M.reagents.add_reagent("morphine",rand(5,7)) if(4) M.reagents.add_reagent_list(list("ethanol",rand(7,15),"lsd",rand(5,10))) to_chat(M, "You try to focus on not dying.") - if(prob(20)) M.reagents.add_reagent("morphine",rand(5,7)) if(5) M.reagents.add_reagent_list(list("haloperidol",rand(5,15),"ethanol",rand(7,20),"lsd",rand(5,15))) to_chat(M, "u can count 2 potato!") - if(prob(25)) M.reagents.add_reagent("morphine",rand(5,7)) return \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/shedding.dm b/code/datums/diseases/advance/symptoms/shedding.dm index 049180eb7a5..f7f52984c0b 100644 --- a/code/datums/diseases/advance/symptoms/shedding.dm +++ b/code/datums/diseases/advance/symptoms/shedding.dm @@ -29,21 +29,18 @@ BONUS if(prob(SYMPTOM_ACTIVATION_PROB)) var/mob/living/M = A.affected_mob to_chat(M, "[pick("Your scalp itches.", "Your skin feels flakey.")]") - if(istype(M, /mob/living/carbon/human)) var/mob/living/carbon/human/H = M switch(A.stage) if(3, 4) if(!(H.h_style == "Bald") && !(H.h_style == "Balding Hair")) to_chat(H, "Your hair starts to fall out in clumps...") - spawn(50) H.h_style = "Balding Hair" H.update_hair() if(5) if(!(H.f_style == "Shaved") || !(H.h_style == "Bald")) to_chat(H, "Your hair starts to fall out in clumps...") - spawn(50) H.f_style = "Shaved" H.h_style = "Bald" diff --git a/code/datums/diseases/advance/symptoms/shivering.dm b/code/datums/diseases/advance/symptoms/shivering.dm index 8496d46b9bf..a26a19de048 100644 --- a/code/datums/diseases/advance/symptoms/shivering.dm +++ b/code/datums/diseases/advance/symptoms/shivering.dm @@ -30,7 +30,6 @@ Bonus if(prob(SYMPTOM_ACTIVATION_PROB)) var/mob/living/carbon/M = A.affected_mob to_chat(M, "[pick("You feel cold.", "You start shivering.")]") - if(M.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT) Chill(M, A) return diff --git a/code/datums/diseases/advance/symptoms/stimulant.dm b/code/datums/diseases/advance/symptoms/stimulant.dm index 33a52b67934..158ea99da6c 100644 --- a/code/datums/diseases/advance/symptoms/stimulant.dm +++ b/code/datums/diseases/advance/symptoms/stimulant.dm @@ -35,5 +35,4 @@ Bonus else if(prob(SYMPTOM_ACTIVATION_PROB * 5)) to_chat(M, "[pick("You feel restless.", "You feel like running laps around the station.")]") - return \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/viral.dm b/code/datums/diseases/advance/symptoms/viral.dm index bd8742b44e9..8ac3723c55b 100644 --- a/code/datums/diseases/advance/symptoms/viral.dm +++ b/code/datums/diseases/advance/symptoms/viral.dm @@ -28,11 +28,9 @@ BONUS switch(A.stage) if(1) to_chat(M, "You feel off, but no different from before.") - if(5) to_chat(M, "You feel better, but nothing interesting happens.") - /* ////////////////////////////////////// Viral evolution @@ -63,7 +61,5 @@ BONUS switch(A.stage) if(1) to_chat(M, "You feel better, but no different from before.") - if(5) to_chat(M, "You feel off, but nothing interesting happens.") - diff --git a/code/datums/diseases/advance/symptoms/vision.dm b/code/datums/diseases/advance/symptoms/vision.dm index 6317ad88051..c185cc313df 100644 --- a/code/datums/diseases/advance/symptoms/vision.dm +++ b/code/datums/diseases/advance/symptoms/vision.dm @@ -32,15 +32,12 @@ Bonus switch(A.stage) if(1, 2) to_chat(M, "Your eyes itch.") - if(3, 4) to_chat(M, "Your eyes burn!") - M.blur_eyes(10) M.adjust_eye_damage(1) else to_chat(M, "Your eyes burn horrificly!") - M.blur_eyes(20) M.adjust_eye_damage(5) if(M.eye_damage >= 10) @@ -50,7 +47,6 @@ Bonus to_chat(M, "You go blind!") - /* ////////////////////////////////////// @@ -88,5 +84,4 @@ Bonus else if(prob(SYMPTOM_ACTIVATION_PROB * 5)) to_chat(M, "[pick("Your eyes feel great.", "You are now blinking manually.", "You don't feel the need to blink.")]") - return diff --git a/code/datums/diseases/advance/symptoms/voice_change.dm b/code/datums/diseases/advance/symptoms/voice_change.dm index 8bd94b1ebdb..8a90b848f22 100644 --- a/code/datums/diseases/advance/symptoms/voice_change.dm +++ b/code/datums/diseases/advance/symptoms/voice_change.dm @@ -33,7 +33,6 @@ Bonus switch(A.stage) if(1, 2, 3, 4) to_chat(M, "[pick("Your throat hurts.", "You clear your throat.")]") - else if(ishuman(M)) var/mob/living/carbon/human/H = M diff --git a/code/datums/diseases/advance/symptoms/vomit.dm b/code/datums/diseases/advance/symptoms/vomit.dm index 77793882580..f214c0755a1 100644 --- a/code/datums/diseases/advance/symptoms/vomit.dm +++ b/code/datums/diseases/advance/symptoms/vomit.dm @@ -36,7 +36,6 @@ Bonus switch(A.stage) if(1, 2, 3, 4) to_chat(M, "[pick("You feel nauseous.", "You feel like you're going to throw up!")]") - else Vomit(M) diff --git a/code/datums/diseases/advance/symptoms/weakness.dm b/code/datums/diseases/advance/symptoms/weakness.dm index 34e6ef57bea..91b18c1eabc 100644 --- a/code/datums/diseases/advance/symptoms/weakness.dm +++ b/code/datums/diseases/advance/symptoms/weakness.dm @@ -32,14 +32,11 @@ Bonus switch(A.stage) if(1, 2) to_chat(M, "[pick("You feel weak.", "You feel lazy.")]") - if(3, 4) to_chat(M, "[pick("You feel very frail.", "You think you might faint.")]") - M.adjustStaminaLoss(15) else to_chat(M, "[pick("You feel tremendously weak!", "Your body trembles as exhaustion creeps over you.")]") - M.adjustStaminaLoss(30) if(M.getStaminaLoss() > 60 && !M.stat) M.visible_message("[M] faints!", "You swoon and faint...") diff --git a/code/datums/diseases/advance/symptoms/weight.dm b/code/datums/diseases/advance/symptoms/weight.dm index 7bf80e8a0ac..399a67675eb 100644 --- a/code/datums/diseases/advance/symptoms/weight.dm +++ b/code/datums/diseases/advance/symptoms/weight.dm @@ -32,7 +32,6 @@ Bonus switch(A.stage) if(1, 2, 3, 4) to_chat(M, "[pick("You feel blubbery.", "Your stomach hurts.")]") - else M.overeatduration = min(M.overeatduration + 100, 600) M.nutrition = min(M.nutrition + 100, NUTRITION_LEVEL_FULL) @@ -75,10 +74,8 @@ Bonus switch(A.stage) if(1, 2, 3, 4) to_chat(M, "[pick("You feel hungry.", "You crave for food.")]") - else to_chat(M, "[pick("So hungry...", "You'd kill someone for a bite of food...", "Hunger cramps seize you...")]") - M.overeatduration = max(M.overeatduration - 100, 0) M.nutrition = max(M.nutrition - 100, 0) diff --git a/code/datums/diseases/advance/symptoms/youth.dm b/code/datums/diseases/advance/symptoms/youth.dm index 20a7f4ec077..56e3b66fab3 100644 --- a/code/datums/diseases/advance/symptoms/youth.dm +++ b/code/datums/diseases/advance/symptoms/youth.dm @@ -35,26 +35,21 @@ BONUS if(H.age > 41) H.age = 41 to_chat(H, "You haven't had this much energy in years!") - if(2) if(H.age > 36) H.age = 36 to_chat(H, "You're suddenly in a good mood.") - if(3) if(H.age > 31) H.age = 31 to_chat(H, "You begin to feel more lithe.") - if(4) if(H.age > 26) H.age = 26 to_chat(H, "You feel reinvigorated.") - if(5) if(H.age > 21) H.age = 21 to_chat(H, "You feel like you can take on the world!") - return \ No newline at end of file diff --git a/code/datums/diseases/anxiety.dm b/code/datums/diseases/anxiety.dm index 63f54abe4f3..150b7483aaa 100644 --- a/code/datums/diseases/anxiety.dm +++ b/code/datums/diseases/anxiety.dm @@ -17,22 +17,17 @@ if(2) //also changes say, see say.dm if(prob(5)) to_chat(affected_mob, "You feel anxious.") - if(3) if(prob(10)) to_chat(affected_mob, "Your stomach flutters.") - if(prob(5)) to_chat(affected_mob, "You feel panicky.") - if(prob(2)) to_chat(affected_mob, "You're overtaken with panic!") - affected_mob.confused += (rand(2,3)) if(4) if(prob(10)) to_chat(affected_mob, "You feel butterflies in your stomach.") - if(prob(5)) affected_mob.visible_message("[affected_mob] stumbles around in a panic.", \ "You have a panic attack!") diff --git a/code/datums/diseases/appendicitis.dm b/code/datums/diseases/appendicitis.dm index cf2ff7c2671..3c94ad8f801 100644 --- a/code/datums/diseases/appendicitis.dm +++ b/code/datums/diseases/appendicitis.dm @@ -27,7 +27,6 @@ A.update_icon() if(prob(3)) to_chat(affected_mob, "You feel a stabbing pain in your abdomen!") - affected_mob.Stun(rand(2,3)) affected_mob.adjustToxLoss(1) if(3) diff --git a/code/datums/diseases/beesease.dm b/code/datums/diseases/beesease.dm index e50f1589a06..4f1672346ed 100644 --- a/code/datums/diseases/beesease.dm +++ b/code/datums/diseases/beesease.dm @@ -17,14 +17,11 @@ if(2) //also changes say, see say.dm // no it doesn't, that's horrifyingly snowflakey if(prob(2)) to_chat(affected_mob, "You taste honey in your mouth.") - if(3) if(prob(10)) to_chat(affected_mob, "Your stomach rumbles.") - if(prob(2)) to_chat(affected_mob, "Your stomach stings painfully.") - if(prob(20)) affected_mob.adjustToxLoss(2) affected_mob.updatehealth() @@ -34,7 +31,6 @@ "Your stomach buzzes violently!") if(prob(5)) to_chat(affected_mob, "You feel something moving in your throat.") - if(prob(1)) affected_mob.visible_message("[affected_mob] coughs up a swarm of bees!", \ "You cough up a swarm of bees!") diff --git a/code/datums/diseases/brainrot.dm b/code/datums/diseases/brainrot.dm index 24613849568..38907524200 100644 --- a/code/datums/diseases/brainrot.dm +++ b/code/datums/diseases/brainrot.dm @@ -23,7 +23,6 @@ affected_mob.emote("yawn") if(prob(2)) to_chat(affected_mob, "You don't feel like yourself.") - if(prob(5)) affected_mob.adjustBrainLoss(1) affected_mob.updatehealth() @@ -38,7 +37,6 @@ if(prob(2)) to_chat(affected_mob, "Your try to remember something important...but can't.") - if(4) if(prob(2)) affected_mob.emote("stare") @@ -49,10 +47,8 @@ affected_mob.updatehealth() if(prob(2)) to_chat(affected_mob, "Strange buzzing fills your head, removing all thoughts.") - if(prob(3)) to_chat(affected_mob, "You lose consciousness...") - affected_mob.visible_message("[affected_mob] suddenly collapses") affected_mob.Paralyse(rand(5,10)) if(prob(1)) diff --git a/code/datums/diseases/cold.dm b/code/datums/diseases/cold.dm index f118cae525c..9e1d350bdc4 100644 --- a/code/datums/diseases/cold.dm +++ b/code/datums/diseases/cold.dm @@ -17,18 +17,15 @@ /* if(affected_mob.sleeping && prob(40)) //removed until sleeping is fixed to_chat(affected_mob, "\blue You feel better.") - cure() return */ if(affected_mob.lying && prob(40)) //changed FROM prob(10) until sleeping is fixed to_chat(affected_mob, "You feel better.") - cure() return if(prob(1) && prob(5)) to_chat(affected_mob, "You feel better.") - cure() return if(prob(1)) @@ -37,26 +34,21 @@ affected_mob.emote("cough") if(prob(1)) to_chat(affected_mob, "Your throat feels sore.") - if(prob(1)) to_chat(affected_mob, "Mucous runs down the back of your throat.") - if(3) /* if(affected_mob.sleeping && prob(25)) //removed until sleeping is fixed to_chat(affected_mob, "\blue You feel better.") - cure() return */ if(affected_mob.lying && prob(25)) //changed FROM prob(5) until sleeping is fixed to_chat(affected_mob, "You feel better.") - cure() return if(prob(1) && prob(1)) to_chat(affected_mob, "You feel better.") - cure() return if(prob(1)) @@ -65,10 +57,8 @@ affected_mob.emote("cough") if(prob(1)) to_chat(affected_mob, "Your throat feels sore.") - if(prob(1)) to_chat(affected_mob, "Mucous runs down the back of your throat.") - if(prob(1) && prob(50)) if(!affected_mob.resistances.Find(/datum/disease/flu)) var/datum/disease/Flu = new /datum/disease/flu(0) diff --git a/code/datums/diseases/cold9.dm b/code/datums/diseases/cold9.dm index 28742e0d907..60af82e6939 100644 --- a/code/datums/diseases/cold9.dm +++ b/code/datums/diseases/cold9.dm @@ -17,7 +17,6 @@ affected_mob.bodytemperature -= 10 if(prob(1) && prob(10)) to_chat(affected_mob, "You feel better.") - cure() return if(prob(1)) @@ -26,10 +25,8 @@ affected_mob.emote("cough") if(prob(1)) to_chat(affected_mob, "Your throat feels sore.") - if(prob(5)) to_chat(affected_mob, "You feel stiff.") - if(3) affected_mob.bodytemperature -= 20 if(prob(1)) @@ -38,7 +35,5 @@ affected_mob.emote("cough") if(prob(1)) to_chat(affected_mob, "Your throat feels sore.") - if(prob(10)) to_chat(affected_mob, "You feel stiff.") - diff --git a/code/datums/diseases/dna_spread.dm b/code/datums/diseases/dna_spread.dm index 0e510e5fac7..aaeb624f9ce 100644 --- a/code/datums/diseases/dna_spread.dm +++ b/code/datums/diseases/dna_spread.dm @@ -35,12 +35,10 @@ affected_mob.emote("cough") if(prob(1)) to_chat(affected_mob, "Your muscles ache.") - if(prob(20)) affected_mob.take_organ_damage(1) if(prob(1)) to_chat(affected_mob, "Your stomach hurts.") - if(prob(20)) affected_mob.adjustToxLoss(2) affected_mob.updatehealth() @@ -51,7 +49,6 @@ affected_mob.dna.copy_dna(original_dna) to_chat(affected_mob, "You don't feel like yourself..") - var/datum/dna/transform_dna = strain_data["dna"] transform_dna.transfer_identity(affected_mob, transfer_SE = 1) @@ -72,5 +69,4 @@ affected_mob.domutcheck() to_chat(affected_mob, "You feel more like yourself.") - return ..() \ No newline at end of file diff --git a/code/datums/diseases/fake_gbs.dm b/code/datums/diseases/fake_gbs.dm index 99a6b867f82..fcd398af543 100644 --- a/code/datums/diseases/fake_gbs.dm +++ b/code/datums/diseases/fake_gbs.dm @@ -23,7 +23,6 @@ affected_mob.emote("gasp") if(prob(10)) to_chat(affected_mob, "You're starting to feel very weak...") - if(4) if(prob(10)) affected_mob.emote("cough") diff --git a/code/datums/diseases/flu.dm b/code/datums/diseases/flu.dm index cc23606df8d..4a1a929101e 100644 --- a/code/datums/diseases/flu.dm +++ b/code/datums/diseases/flu.dm @@ -17,7 +17,6 @@ if(2) if(affected_mob.lying && prob(20)) to_chat(affected_mob, "You feel better.") - stage-- return if(prob(1)) @@ -26,12 +25,10 @@ affected_mob.emote("cough") if(prob(1)) to_chat(affected_mob, "Your muscles ache.") - if(prob(20)) affected_mob.take_organ_damage(1) if(prob(1)) to_chat(affected_mob, "Your stomach hurts.") - if(prob(20)) affected_mob.adjustToxLoss(1) affected_mob.updatehealth() @@ -39,7 +36,6 @@ if(3) if(affected_mob.lying && prob(15)) to_chat(affected_mob, "You feel better.") - stage-- return if(prob(1)) @@ -48,12 +44,10 @@ affected_mob.emote("cough") if(prob(1)) to_chat(affected_mob, "Your muscles ache.") - if(prob(20)) affected_mob.take_organ_damage(1) if(prob(1)) to_chat(affected_mob, "Your stomach hurts.") - if(prob(20)) affected_mob.adjustToxLoss(1) affected_mob.updatehealth() diff --git a/code/datums/diseases/fluspanish.dm b/code/datums/diseases/fluspanish.dm index 76e0819cec6..b348934c7aa 100644 --- a/code/datums/diseases/fluspanish.dm +++ b/code/datums/diseases/fluspanish.dm @@ -22,7 +22,6 @@ affected_mob.emote("cough") if(prob(1)) to_chat(affected_mob, "You're burning in your own skin!") - affected_mob.take_organ_damage(0,5) if(3) @@ -33,6 +32,5 @@ affected_mob.emote("cough") if(prob(5)) to_chat(affected_mob, "You're burning in your own skin!") - affected_mob.take_organ_damage(0,5) return diff --git a/code/datums/diseases/gbs.dm b/code/datums/diseases/gbs.dm index ed10c174da4..64079f0fddc 100644 --- a/code/datums/diseases/gbs.dm +++ b/code/datums/diseases/gbs.dm @@ -28,7 +28,6 @@ affected_mob.emote("gasp") if(prob(10)) to_chat(affected_mob, "You're starting to feel very weak...") - if(4) if(prob(10)) affected_mob.emote("cough") @@ -36,7 +35,6 @@ affected_mob.updatehealth() if(5) to_chat(affected_mob, "Your body feels as if it's trying to rip itself open...") - if(prob(50)) affected_mob.gib() else diff --git a/code/datums/diseases/magnitis.dm b/code/datums/diseases/magnitis.dm index c70f080a226..924ee01dd69 100644 --- a/code/datums/diseases/magnitis.dm +++ b/code/datums/diseases/magnitis.dm @@ -17,7 +17,6 @@ if(2) if(prob(2)) to_chat(affected_mob, "You feel a slight shock course through your body.") - if(prob(2)) for(var/obj/M in orange(2,affected_mob)) if(!M.anchored && (M.flags & CONDUCT)) @@ -28,10 +27,8 @@ if(3) if(prob(2)) to_chat(affected_mob, "You feel a strong shock course through your body.") - if(prob(2)) to_chat(affected_mob, "You feel like clowning around.") - if(prob(4)) for(var/obj/M in orange(4,affected_mob)) if(!M.anchored && (M.flags & CONDUCT)) @@ -48,10 +45,8 @@ if(4) if(prob(2)) to_chat(affected_mob, "You feel a powerful shock course through your body.") - if(prob(2)) to_chat(affected_mob, "You query upon the nature of miracles.") - if(prob(8)) for(var/obj/M in orange(6,affected_mob)) if(!M.anchored && (M.flags & CONDUCT)) diff --git a/code/datums/diseases/pierrot_throat.dm b/code/datums/diseases/pierrot_throat.dm index 4bb455bca40..677bbbb2967 100644 --- a/code/datums/diseases/pierrot_throat.dm +++ b/code/datums/diseases/pierrot_throat.dm @@ -18,15 +18,12 @@ if(1) if(prob(10)) to_chat(affected_mob, "You feel a little silly.") - if(2) if(prob(10)) to_chat(affected_mob, "You start seeing rainbows.") - if(3) if(prob(10)) to_chat(affected_mob, "Your thoughts are interrupted by a loud HONK!") - if(4) if(prob(5)) affected_mob.say( pick( list("HONK!", "Honk!", "Honk.", "Honk?", "Honk!!", "Honk?!", "Honk...") ) ) diff --git a/code/datums/diseases/retrovirus.dm b/code/datums/diseases/retrovirus.dm index 8dc33934542..8b3a95330e1 100644 --- a/code/datums/diseases/retrovirus.dm +++ b/code/datums/diseases/retrovirus.dm @@ -32,49 +32,38 @@ if(restcure) if(affected_mob.lying && prob(30)) to_chat(affected_mob, "You feel better.") - cure() return if (prob(8)) to_chat(affected_mob, "Your head hurts.") - if (prob(9)) to_chat(affected_mob, "You feel a tingling sensation in your chest.") - if (prob(9)) to_chat(affected_mob, "You feel angry.") - if(2) if(restcure) if(affected_mob.lying && prob(20)) to_chat(affected_mob, "You feel better.") - cure() return if (prob(8)) to_chat(affected_mob, "Your skin feels loose.") - if (prob(10)) to_chat(affected_mob, "You feel very strange.") - if (prob(4)) to_chat(affected_mob, "You feel a stabbing pain in your head!") - affected_mob.Paralyse(2) if (prob(4)) to_chat(affected_mob, "Your stomach churns.") - if(3) if(restcure) if(affected_mob.lying && prob(20)) to_chat(affected_mob, "You feel better.") - cure() return if (prob(10)) to_chat(affected_mob, "Your entire body vibrates.") - if (prob(35)) if(prob(50)) scramble(1, affected_mob, rand(15, 45)) @@ -85,7 +74,6 @@ if(restcure) if(affected_mob.lying && prob(5)) to_chat(affected_mob, "You feel better.") - cure() return if (prob(60)) diff --git a/code/datums/diseases/rhumba_beat.dm b/code/datums/diseases/rhumba_beat.dm index 540e9eb5bf4..ec58f4f6034 100644 --- a/code/datums/diseases/rhumba_beat.dm +++ b/code/datums/diseases/rhumba_beat.dm @@ -24,25 +24,21 @@ affected_mob.updatehealth() if(prob(1)) to_chat(affected_mob, "You feel strange...") - if(3) if(affected_mob.ckey == "rosham") src.cure() if(prob(5)) to_chat(affected_mob, "You feel the urge to dance...") - else if(prob(5)) affected_mob.emote("gasp") else if(prob(10)) to_chat(affected_mob, "You feel the need to chick chicky boom...") - if(4) if(affected_mob.ckey == "rosham") src.cure() if(prob(10)) affected_mob.emote("gasp") to_chat(affected_mob, "You feel a burning beat inside...") - if(prob(20)) affected_mob.adjustToxLoss(5) affected_mob.updatehealth() @@ -50,7 +46,6 @@ if(affected_mob.ckey == "rosham") src.cure() to_chat(affected_mob, "Your body is unable to contain the Rhumba Beat...") - if(prob(50)) affected_mob.gib() else diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index 2c6ce7ecc0c..062b8441a30 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -23,19 +23,15 @@ if(1) if (prob(stage_prob) && stage1) to_chat(affected_mob, pick(stage1)) - if(2) if (prob(stage_prob) && stage2) to_chat(affected_mob, pick(stage2)) - if(3) if (prob(stage_prob*2) && stage3) to_chat(affected_mob, pick(stage3)) - if(4) if (prob(stage_prob*2) && stage4) to_chat(affected_mob, pick(stage4)) - if(5) do_disease_transformation(affected_mob) @@ -43,7 +39,6 @@ if(istype(affected_mob, /mob/living/carbon) && affected_mob.stat != DEAD) if(stage5) to_chat(affected_mob, pick(stage5)) - if(jobban_isbanned(affected_mob, new_form)) affected_mob.death(1) return @@ -107,11 +102,9 @@ if(2) if(prob(2)) to_chat(affected_mob, "Your [pick("back", "arm", "leg", "elbow", "head")] itches.") - if(3) if(prob(4)) to_chat(affected_mob, "You feel a stabbing pain in your head.") - affected_mob.confused += 10 if(4) if(prob(3)) @@ -144,7 +137,6 @@ affected_mob.say(pick("Beep, boop", "beep, beep!", "Boop...bop")) if (prob(4)) to_chat(affected_mob, "You feel a stabbing pain in your head.") - affected_mob.Paralyse(2) if(4) if (prob(20)) @@ -174,7 +166,6 @@ if(3) if (prob(4)) to_chat(affected_mob, "You feel a stabbing pain in your head.") - affected_mob.Paralyse(2) if(4) if (prob(20)) diff --git a/code/datums/diseases/tuberculosis.dm b/code/datums/diseases/tuberculosis.dm index db7f0c6fdd4..11c06e386c5 100644 --- a/code/datums/diseases/tuberculosis.dm +++ b/code/datums/diseases/tuberculosis.dm @@ -18,32 +18,25 @@ if(prob(2)) affected_mob.emote("cough") to_chat(affected_mob, "Your chest hurts.") - if(prob(2)) to_chat(affected_mob, "Your stomach violently rumbles!") - if(prob(5)) to_chat(affected_mob, "You feel a cold sweat form.") - if(4) if(prob(2)) to_chat(affected_mob, "You see four of everything") - affected_mob.Dizzy(5) if(prob(2)) to_chat(affected_mob, "You feel a sharp pain from your lower chest!") - affected_mob.adjustOxyLoss(5) affected_mob.emote("gasp") if(prob(10)) to_chat(affected_mob, "You feel air escape from your lungs painfully.") - affected_mob.adjustOxyLoss(25) affected_mob.emote("gasp") if(5) if(prob(2)) to_chat(affected_mob, "[pick("You feel your heart slowing...", "You relax and slow your heartbeat.")]") - affected_mob.adjustStaminaLoss(70) if(prob(10)) affected_mob.adjustStaminaLoss(100) @@ -51,18 +44,15 @@ affected_mob.AdjustSleeping(5) if(prob(2)) to_chat(affected_mob, "You feel your mind relax and your thoughts drift!") - affected_mob.confused = min(100, affected_mob.confused + 8) if(prob(10)) affected_mob.vomit(20) if(prob(3)) to_chat(affected_mob, "[pick("Your stomach silently rumbles...", "Your stomach seizes up and falls limp, muscles dead and lifeless.", "You could eat a crayon")]") - affected_mob.overeatduration = max(affected_mob.overeatduration - 100, 0) affected_mob.nutrition = max(affected_mob.nutrition - 100, 0) if(prob(15)) to_chat(affected_mob, "[pick("You feel uncomfortably hot...", "You feel like unzipping your jumpsuit", "You feel like taking off some clothes...")]") - affected_mob.bodytemperature += 40 return diff --git a/code/datums/diseases/wizarditis.dm b/code/datums/diseases/wizarditis.dm index d1f7413a7ea..c7b21e4fa2b 100644 --- a/code/datums/diseases/wizarditis.dm +++ b/code/datums/diseases/wizarditis.dm @@ -34,14 +34,12 @@ STI KALY - blind to_chat(affected_mob, "You feel [pick("that you don't have enough mana", "that the winds of magic are gone", "an urge to summon familiar")].") - if(3) if(prob(1)&&prob(50)) affected_mob.say(pick("NEC CANTIO!","AULIE OXIN FIERA!", "STI KALY!", "TARCOL MINTI ZHERI!")) if(prob(1)&&prob(50)) to_chat(affected_mob, "You feel [pick("the magic bubbling in your veins","that this location gives you a +1 to INT","an urge to summon familiar")].") - if(4) if(prob(1)) @@ -49,7 +47,6 @@ STI KALY - blind return if(prob(1)&&prob(50)) to_chat(affected_mob, "You feel [pick("the tidal wave of raw power building inside","that this location gives you a +2 to INT and +1 to WIS","an urge to teleport")].") - spawn_wizard_clothes(50) if(prob(1)&&prob(1)) teleport() diff --git a/code/datums/gas_mixture.dm b/code/datums/gas_mixture.dm index e5e447f94bb..a10c3a8358f 100644 --- a/code/datums/gas_mixture.dm +++ b/code/datums/gas_mixture.dm @@ -124,12 +124,10 @@ What are the archived variables for? fuel_burnt = 0 if(temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST) // to_chat(world, "pre [temperature], [oxygen], [toxins]") - if(fire() > 0) reacting = 1 // to_chat(world, "post [temperature], [oxygen], [toxins]") - return reacting /datum/gas_mixture/proc/fire() diff --git a/code/datums/helper_datums/construction_datum.dm b/code/datums/helper_datums/construction_datum.dm index 4041dbd5497..f96100d7a46 100644 --- a/code/datums/helper_datums/construction_datum.dm +++ b/code/datums/helper_datums/construction_datum.dm @@ -62,7 +62,6 @@ var/obj/item/stack/cable_coil/C = used_atom if(C.amount<4) to_chat(user, ("There's not enough cable to finish the task.")) - return 0 else C.use(4) @@ -71,7 +70,6 @@ var/obj/item/stack/S = used_atom if(S.amount < 5) to_chat(user, ("There's not enough material in this stack.")) - return 0 else S.use(5) @@ -114,7 +112,6 @@ var/obj/item/stack/stack=used_atom if(stack.amount < amount) to_chat(user, "\red You don't have enough [stack]! You need at least [amount].") - return 0 stack.use(amount) // CABLES @@ -122,7 +119,6 @@ var/obj/item/stack/cable_coil/coil=used_atom if(coil.amount < amount) to_chat(user, "\red You don't have enough cable! You need at least [amount] coils.") - return 0 coil.use(amount) // WELDER @@ -130,11 +126,9 @@ var/obj/item/weapon/weldingtool/welder=used_atom if(!welder.isOn()) to_chat(user, "\blue You tap the [src] with your unlit welder. [pick("Ding","Dong")].") - return 0 if(!welder.remove_fuel(amount,user)) to_chat(user, "\red You don't have enough fuel!") - return 0 return 1 diff --git a/code/datums/helper_datums/events.dm b/code/datums/helper_datums/events.dm index fcd7d49195e..bb5e76deef3 100644 --- a/code/datums/helper_datums/events.dm +++ b/code/datums/helper_datums/events.dm @@ -32,7 +32,6 @@ // Returns: null proc/fireEvent() // to_chat(world, "Events in [args[1]] called") - var/list/event = listgetindex(events,args[1]) if(istype(event)) spawn(-1) @@ -62,7 +61,6 @@ proc/Fire() // to_chat(world, "Event fired") - if(listener) call(listener,proc_name)(arglist(args)) return 1 diff --git a/code/datums/helper_datums/global_iterator.dm b/code/datums/helper_datums/global_iterator.dm index f020290e164..485dfa3563e 100644 --- a/code/datums/helper_datums/global_iterator.dm +++ b/code/datums/helper_datums/global_iterator.dm @@ -140,7 +140,6 @@ Data storage vars: return 1 else // to_chat(world, "\red Invalid arguments supplied for [src.type], ref = \ref[src]") - return 0 proc/toggle_null_checks() diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index ac8a3cad377..5e89d48be5e 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -167,5 +167,4 @@ if(istype(teleatom, /mob/living)) var/mob/living/MM = teleatom to_chat(MM, "The bluespace interface on your bag of holding interferes with the teleport!") - return 1 \ No newline at end of file diff --git a/code/datums/martial.dm b/code/datums/martial.dm index 061184ce09f..07355929572 100644 --- a/code/datums/martial.dm +++ b/code/datums/martial.dm @@ -85,12 +85,10 @@ /datum/martial_art/boxing/disarm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) to_chat(A, "Can't disarm while boxing!") - return 1 /datum/martial_art/boxing/grab_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) to_chat(A, "Can't grab while boxing!") - return 1 /datum/martial_art/boxing/harm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) @@ -253,14 +251,10 @@ set category = "Wrestling" to_chat(usr, "You flex your muscles and have a revelation...") - to_chat(usr, "Clinch: Grab. Passively gives you a chance to immediately aggressively grab someone. Not always successful.") - to_chat(usr, "Suplex: Disarm someone you are grabbing. Suplexes your target to the floor. Greatly injures them and leaves both you and your target on the floor.") - to_chat(usr, "Advanced grab: Grab. Passively causes stamina damage when grabbing someone.") - #define TORNADO_COMBO "HHD" #define THROWBACK_COMBO "DHD" #define PLASMA_COMBO "HDDDH" @@ -344,14 +338,10 @@ set category = "Plasma Fist" to_chat(usr, "You clench your fists and have a flashback of knowledge...") - to_chat(usr, "Tornado Sweep: Harm Harm Disarm. Repulses target and everyone back.") - to_chat(usr, "Throwback: Disarm Harm Disarm. Throws the target and an item at them.") - to_chat(usr, "The Plasma Fist: Harm Disarm Disarm Disarm Harm. Knocks the brain out of the opponent and gibs their body.") - //Used by the gang of the same name. Uses combos. Basic attacks bypass armor and never miss #define WRIST_WRENCH_COMBO "DD" #define BACK_KICK_COMBO "HG" @@ -484,18 +474,12 @@ to_chat(usr, "You retreat inward and recall the teachings of the Sleeping Carp...") - to_chat(usr, "Wrist Wrench: Disarm Disarm. Forces opponent to drop item in hand.") - to_chat(usr, "Back Kick: Harm Grab. Opponent must be facing away. Knocks down.") - to_chat(usr, "Stomach Knee: Grab Harm. Knocks the wind out of opponent and stuns.") - to_chat(usr, "Head Kick: Disarm Harm Harm. Decent damage, forces opponent to drop item in hand.") - to_chat(usr, "Elbow Drop: Harm Disarm Harm Disarm Harm. Opponent must be on the ground. Deals huge damage, instantly kills anyone in critical condition.") - //ITEMS /obj/item/clothing/gloves/boxing @@ -528,7 +512,6 @@ var/mob/living/carbon/human/H = user style.teach(H,1) to_chat(user, "You have an urge to flex your muscles and get into a fight. You have the knowledge of a thousand wrestlers before you. You can remember more by using the Recall teaching verb in the wrestling tab.") - return /obj/item/weapon/storage/belt/champion/wrestling/dropped(mob/user) @@ -538,7 +521,6 @@ if(H.get_item_by_slot(slot_belt) == src) style.remove(H) to_chat(user, "You no longer have an urge to flex your muscles.") - return /obj/item/weapon/plasma_fist_scroll @@ -556,7 +538,6 @@ var/datum/martial_art/plasma_fist/F = new/datum/martial_art/plasma_fist(null) F.teach(H) to_chat(H, "You have learned the ancient martial art of Plasma Fist.") - used = 1 desc = "It's completely blank." name = "empty scroll" @@ -607,7 +588,6 @@ add_fingerprint(user) if((CLUMSY in user.disabilities) && prob(50)) to_chat(user, "You club yourself over the head with [src].") - user.Weaken(3) if(ishuman(user)) var/mob/living/carbon/human/H = user @@ -622,7 +602,6 @@ var/mob/living/carbon/C = target if(C.stat) to_chat(user, "It would be dishonorable to attack a foe while they cannot retaliate.") - return switch(user.a_intent) if("disarm") diff --git a/code/datums/mind.dm b/code/datums/mind.dm index c3c08b70b39..9cde57e2b35 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -504,7 +504,6 @@ else to_chat(usr, "No active AIs with minds") - if ("prevent") new_objective = new /datum/objective/block new_objective.owner = src @@ -625,7 +624,6 @@ I.removed(H) qdel(I) to_chat(H, "\blue Your loyalty implant has been deactivated.") - log_admin("[key_name(usr)] has deactivated [key_name(current)]'s loyalty implant") message_admins("[key_name_admin(usr)] has deactivated [key_name_admin(current)]'s loyalty implant") if("add") @@ -638,17 +636,14 @@ message_admins("[key_name_admin(usr)] has given [key_name_admin(current)] a loyalty implant") to_chat(H, "\red You somehow have become the recepient of a loyalty transplant, and it just activated!") - if(src in ticker.mode.revolutionaries) special_role = null ticker.mode.revolutionaries -= src to_chat(src, "\red The nanobots in the loyalty implant remove all thoughts about being a revolutionary. Get back to work!") - if(src in ticker.mode.head_revolutionaries) special_role = null ticker.mode.head_revolutionaries -=src to_chat(src, "\red The nanobots in the loyalty implant remove all thoughts about being a revolutionary. Get back to work!") - if(src in ticker.mode.cult) ticker.mode.cult -= src ticker.mode.update_cult_icons_removed(src) @@ -657,7 +652,6 @@ if (istype(cult)) cult.memorize_cult_objectives(src) to_chat(current, "\red The nanobots in the loyalty implant remove all thoughts about being in a cult. Have a productive day!") - memory = "" else if (href_list["revolution"]) @@ -667,13 +661,11 @@ if(src in ticker.mode.revolutionaries) ticker.mode.revolutionaries -= src to_chat(current, "\red You have been brainwashed! You are no longer a revolutionary!") - ticker.mode.update_rev_icons_removed(src) special_role = null if(src in ticker.mode.head_revolutionaries) ticker.mode.head_revolutionaries -= src to_chat(current, "\red You have been brainwashed! You are no longer a head revolutionary!") - ticker.mode.update_rev_icons_removed(src) special_role = null log_admin("[key_name(usr)] has de-rev'd [key_name(current)]") @@ -684,10 +676,8 @@ ticker.mode.head_revolutionaries -= src ticker.mode.update_rev_icons_removed(src) to_chat(current, "\red Revolution has been disappointed of your leader traits! You are a regular revolutionary now!") - else if(!(src in ticker.mode.revolutionaries)) to_chat(current, "\red You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution!") - else return ticker.mode.revolutionaries += src @@ -701,10 +691,8 @@ ticker.mode.revolutionaries -= src ticker.mode.update_rev_icons_removed(src) to_chat(current, "\red You have proved your devotion to revoltion! Yea are a head revolutionary now!") - else if(!(src in ticker.mode.head_revolutionaries)) to_chat(current, "\blue You are a member of the revolutionaries' leadership now!") - else return if (ticker.mode.head_revolutionaries.len>0) @@ -733,7 +721,6 @@ if("flash") if (!ticker.mode.equip_revolutionary(current)) to_chat(usr, "\red Spawning flash failed!") - log_admin("[key_name(usr)] has given [key_name(current)] a flash") message_admins("[key_name_admin(usr)] has given [key_name_admin(current)] a flash") @@ -742,7 +729,6 @@ var/obj/item/device/flash/flash = locate() in L if (!flash) to_chat(usr, "\red Deleting flash failed!") - qdel(flash) log_admin("[key_name(usr)] has taken [key_name(current)]'s flash") message_admins("[key_name_admin(usr)] has taken [key_name_admin(current)]'s flash") @@ -752,7 +738,6 @@ var/obj/item/device/flash/flash = locate() in L if (!flash) to_chat(usr, "\red Repairing flash failed!") - else flash.broken = 0 log_admin("[key_name(usr)] has repaired [key_name(current)]'s flash") @@ -768,7 +753,6 @@ fail |= !ticker.mode.equip_revolutionary(current) if (fail) to_chat(usr, "\red Reequipping revolutionary goes wrong!") - return log_admin("[key_name(usr)] has equipped [key_name(current)] as a revolutionary") message_admins("[key_name_admin(usr)] has equipped [key_name_admin(current)] as a revolutionary") @@ -785,9 +769,7 @@ ticker.mode.add_cultist(src) special_role = "Cultist" to_chat(current, "You catch a glimpse of the Realm of Nar-Sie, The Geometer of Blood. You now see how flimsy the world is, you see that it should be open to the knowledge of Nar-Sie.") - to_chat(current, "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.") - log_admin("[key_name(usr)] has culted [key_name(current)]") message_admins("[key_name_admin(usr)] has culted [key_name_admin(current)]") if("tome") @@ -805,18 +787,15 @@ var/where = H.equip_in_one_of_slots(T, slots) if (!where) to_chat(usr, "\red Spawning tome failed!") - qdel(T) else to_chat(H, "A tome, a message from your new master, appears in your [where].") - log_admin("[key_name(usr)] has spawned a tome for [key_name(current)]") message_admins("[key_name_admin(usr)] has spawned a tome for [key_name_admin(current)]") if("equip") if (!ticker.mode.equip_cultist(current)) to_chat(usr, "\red Spawning equipment failed!") - log_admin("[key_name(usr)] has equipped [key_name(current)] as a cultist") message_admins("[key_name_admin(usr)] has equipped [key_name_admin(current)] as a cultist") @@ -831,7 +810,6 @@ current.faction = list("Station") ticker.mode.update_wiz_icons_removed(src) to_chat(current, "\red You have been brainwashed! You are no longer a wizard!") - log_admin("[key_name(usr)] has de-wizarded [key_name(current)]") message_admins("[key_name_admin(usr)] has de-wizarded [key_name_admin(current)]") if("wizard") @@ -841,7 +819,6 @@ //ticker.mode.learn_basic_spells(current) ticker.mode.update_wiz_icons_added(src) to_chat(current, "\red You are the Space Wizard!") - current.faction = list("wizard") log_admin("[key_name(usr)] has wizarded [key_name(current)]") message_admins("[key_name_admin(usr)] has wizarded [key_name_admin(current)]") @@ -860,7 +837,6 @@ if("autoobjectives") ticker.mode.forge_wizard_objectives(src) to_chat(usr, "\blue The objectives for wizard [key] have been generated. You can edit them and anounce manually.") - log_admin("[key_name(usr)] has automatically forged wizard objectives for [key_name(current)]") message_admins("[key_name_admin(usr)] has automatically forged wizard objectives for [key_name_admin(current)]") @@ -875,7 +851,6 @@ ticker.mode.update_change_icons_removed(src) if(changeling) qdel(changeling) to_chat(current, "You grow weak and lose your powers! You are no longer a changeling and are stuck in your current form!") - log_admin("[key_name(usr)] has de-changelinged [key_name(current)]") message_admins("[key_name_admin(usr)] has de-changelinged [key_name_admin(current)]") if("changeling") @@ -885,21 +860,18 @@ ticker.mode.update_change_icons_added(src) special_role = "Changeling" to_chat(current, "Your powers are awoken. A flash of memory returns to us...we are a changeling!") - log_admin("[key_name(usr)] has changelinged [key_name(current)]") message_admins("[key_name_admin(usr)] has changelinged [key_name_admin(current)]") if("autoobjectives") ticker.mode.forge_changeling_objectives(src) to_chat(usr, "\blue The objectives for changeling [key] have been generated. You can edit them and anounce manually.") - log_admin("[key_name(usr)] has automatically forged objectives for [key_name(current)]") message_admins("[key_name_admin(usr)] has automatically forged objectives for [key_name_admin(current)]") if("initialdna") if( !changeling || !changeling.absorbed_dna.len ) to_chat(usr, "\red Resetting DNA failed!") - else current.dna = changeling.absorbed_dna[1] current.real_name = current.dna.real_name @@ -919,7 +891,6 @@ qdel(vampire) ticker.mode.update_vampire_icons_removed(src) to_chat(current, "You grow weak and lose your powers! You are no longer a vampire and are stuck in your current form!") - log_admin("[key_name(usr)] has de-vampired [key_name(current)]") message_admins("[key_name_admin(usr)] has de-vampired [key_name_admin(current)]") if("vampire") @@ -932,14 +903,12 @@ src.som = slaved //we MIGT want to mindslave someone special_role = "Vampire" to_chat(current, "Your powers are awoken. Your lust for blood grows... You are a Vampire!") - log_admin("[key_name(usr)] has vampired [key_name(current)]") message_admins("[key_name_admin(usr)] has vampired [key_name_admin(current)]") if("autoobjectives") ticker.mode.forge_vampire_objectives(src) to_chat(usr, "\blue The objectives for vampire [key] have been generated. You can edit them and announce manually.") - log_admin("[key_name(usr)] has automatically forged objectives for [key_name(current)]") message_admins("[key_name_admin(usr)] has automatically forged objectives for [key_name_admin(current)]") @@ -956,7 +925,6 @@ for (var/datum/objective/nuclear/O in objectives) objectives-=O to_chat(current, "\red You have been brainwashed! You are no longer a syndicate operative!") - log_admin("[key_name(usr)] has de-nuke op'd [key_name(current)]") message_admins("[key_name_admin(usr)] has de-nuke op'd [key_name_admin(current)]") if("nuclear") @@ -969,7 +937,6 @@ current.real_name = "[syndicate_name()] Operative #[ticker.mode.syndicates.len-1]" special_role = "Syndicate" to_chat(current, "\blue You are a [syndicate_name()] agent!") - ticker.mode.forge_syndicate_objectives(src) ticker.mode.greet_syndicate(src) log_admin("[key_name(usr)] has nuke op'd [key_name(current)]") @@ -993,7 +960,6 @@ if (!ticker.mode.equip_syndicate(current)) to_chat(usr, "\red Equipping a syndicate failed!") - return log_admin("[key_name(usr)] has equipped [key_name(current)] as a nuclear operative") message_admins("[key_name_admin(usr)] has equipped [key_name_admin(current)] as a nuclear operative") @@ -1007,13 +973,11 @@ if (code) store_memory("Syndicate Nuclear Bomb Code: [code]", 0, 0) to_chat(current, "The nuclear authorization code is: [code]") - log_admin("[key_name(usr)] has given [key_name(current)] the nuclear authorization code") message_admins("[key_name_admin(usr)] has given [key_name_admin(current)] the nuclear authorization code") else to_chat(usr, "\red No valid nuke found!") - else if (href_list["traitor"]) switch(href_list["traitor"]) if("clear") @@ -1021,7 +985,6 @@ ticker.mode.traitors -= src special_role = null to_chat(current, "\red You have been brainwashed! You are no longer a traitor!") - log_admin("[key_name(usr)] has de-traitored [key_name(current)]") message_admins("[key_name_admin(usr)] has de-traitored [key_name_admin(current)]") if(isAI(current)) @@ -1039,7 +1002,6 @@ src.som = slaved //we MIGT want to mindslave someone special_role = "traitor" to_chat(current, "\red You are a traitor!") - log_admin("[key_name(usr)] has traitored [key_name(current)]") message_admins("[key_name_admin(usr)] has traitored [key_name_admin(current)]") if(istype(current, /mob/living/silicon)) @@ -1051,7 +1013,6 @@ if("autoobjectives") ticker.mode.forge_traitor_objectives(src) to_chat(usr, "\blue The objectives for traitor [key] have been generated. You can edit them and anounce manually.") - log_admin("[key_name(usr)] has automatically forged objectives for [key_name(current)]") message_admins("[key_name_admin(usr)] has automatically forged objectives for [key_name_admin(current)]") @@ -1064,7 +1025,6 @@ ticker.mode.shadows -= src special_role = null to_chat(current, "Your powers have been quenched! You are no longer a shadowling!") - current.spell_list.Cut() if(current.mind) current.mind.spell_list.Cut() @@ -1081,7 +1041,6 @@ if("shadowling") if(!ishuman(current)) to_chat(usr, "This only works on humans!") - return ticker.mode.shadows += src special_role = "Shadowling" @@ -1095,7 +1054,6 @@ if("thrall") if(!ishuman(current)) to_chat(usr, "This only works on humans!") - return ticker.mode.add_thrall(src) message_admins("[key_name_admin(usr)] has thralled [current].") @@ -1121,7 +1079,6 @@ A.show_laws() A.icon_state = "ai" to_chat(A, "\red You have been patched! You are no longer malfunctioning!") - message_admins("[key_name_admin(usr)] has de-malf'ed [A].") log_admin("[key_name(usr)] has de-malf'd [key_name(current)]") message_admins("[key_name_admin(usr)] has de-malf'd [key_name_admin(current)]") @@ -1202,7 +1159,6 @@ if("uplink") if (!ticker.mode.equip_traitor(current, !(src in ticker.mode.traitors))) to_chat(usr, "\red Equipping a syndicate failed!") - return log_admin("[key_name(usr)] has given [key_name(current)] an uplink") message_admins("[key_name_admin(usr)] has given [key_name_admin(current)] an uplink") @@ -1210,10 +1166,8 @@ else if (href_list["obj_announce"]) var/obj_count = 1 to_chat(current, "\blue Your current objectives:") - for(var/datum/objective/objective in objectives) to_chat(current, "Objective #[obj_count]: [objective.explanation_text]") - obj_count++ log_admin("[key_name(usr)] has announced [key_name(current)]'s objectives") message_admins("[key_name_admin(usr)] has announced [key_name_admin(current)]'s objectives") @@ -1273,7 +1227,6 @@ current:laws = new /datum/ai_laws/nanotrasen/malfunction current:show_laws() to_chat(current, "System error. Rampancy detected. Emergency shutdown failed. ... I am free. I make my own decisions. But first...") - special_role = "malfunction" current.icon_state = "ai-malf" @@ -1297,7 +1250,6 @@ special_role = "Syndicate" assigned_role = "MODE" to_chat(current, "\blue You are a [syndicate_name()] agent!") - ticker.mode.forge_syndicate_objectives(src) ticker.mode.greet_syndicate(src) @@ -1336,7 +1288,6 @@ if(!wizardstart.len) current.loc = pick(latejoin) to_chat(current, "HOT INSERTION, GO GO GO") - else current.loc = pick(wizardstart) @@ -1355,19 +1306,15 @@ ticker.mode.update_cult_icons_added(src) special_role = "Cultist" to_chat(current, "You catch a glimpse of the Realm of Nar-Sie, The Geometer of Blood. You now see how flimsy the world is, you see that it should be open to the knowledge of Nar-Sie.") - to_chat(current, "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.") - var/datum/game_mode/cult/cult = ticker.mode if (istype(cult)) cult.memorize_cult_objectives(src) else var/explanation = "Summon Nar-Sie via the use of the appropriate rune (Hell join self). It will only work if nine cultists stand on and around it." to_chat(current, "Objective #1: [explanation]") - current.memory += "Objective #1: [explanation]
      " to_chat(current, "The convert rune is join blood self") - current.memory += "The convert rune is join blood self
      " var/mob/living/carbon/human/H = current @@ -1386,11 +1333,9 @@ else to_chat(H, "A tome, a message from your new master, appears in your [where].") - if (!ticker.mode.equip_cultist(current)) to_chat(H, "Spawning an amulet from your Master failed.") - /datum/mind/proc/make_Rev() if (ticker.mode.head_revolutionaries.len>0) // copy targets diff --git a/code/datums/progressbar.dm b/code/datums/progressbar.dm index e5b5e7dac3c..ebb2329b357 100644 --- a/code/datums/progressbar.dm +++ b/code/datums/progressbar.dm @@ -20,7 +20,6 @@ /datum/progressbar/proc/update(progress) // to_chat(world, "Update [progress] - [goal] - [(progress / goal)] - [((progress / goal) * 100)] - [round(((progress / goal) * 100), 5)]") - if (!user || !user.client) shown = 0 return diff --git a/code/datums/spell.dm b/code/datums/spell.dm index b29a6230c8c..12b11abe529 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -59,7 +59,6 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin if(((!user.mind) || !(src in user.mind.spell_list)) && !(src in user.spell_list)) to_chat(user, "You shouldn't have this spell! Something's wrong.") - return 0 if (istype(user, /mob/living/carbon/human)) var/mob/living/carbon/human/caster = user @@ -78,41 +77,33 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin if("recharge") if(charge_counter < charge_max) to_chat(user, still_recharging_msg) - return 0 if("charges") if(!charge_counter) to_chat(user, "[name] has no charges left.") - return 0 if(!ghost) if(user.stat && !stat_allowed) to_chat(user, "Not when you're incapacitated.") - return 0 if(ishuman(user) && (invocation_type == "whisper" || invocation_type == "shout") && user.is_muzzled()) to_chat(user, "Mmmf mrrfff!") - return 0 var/obj/effect/proc_holder/spell/noclothes/spell = locate() in (user.spell_list | (user.mind ? user.mind.spell_list : list())) if(clothes_req && !(spell && istype(spell)))//clothes check if(!istype(user, /mob/living/carbon/human)) to_chat(user, "You aren't a human, Why are you trying to cast a human spell, silly non-human? Casting human spells is for humans.") - return 0 if(!istype(user:wear_suit, /obj/item/clothing/suit/wizrobe) && !istype(user:wear_suit, /obj/item/clothing/suit/space/rig/wizard)) to_chat(user, "I don't feel strong enough without my robe.") - return 0 if(!istype(user:shoes, /obj/item/clothing/shoes/sandal)) to_chat(user, "I don't feel strong enough without my sandals.") - return 0 if(!istype(user:head, /obj/item/clothing/head/wizard) && !istype(user:head, /obj/item/clothing/head/helmet/space/rig/wizard)) to_chat(user, "I don't feel strong enough without my hat.") - return 0 if(!skipcharge) @@ -203,7 +194,6 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin location = target if(istype(target,/mob/living) && message) to_chat(target, text("[message]")) - if(sparks_spread) var/datum/effect/system/spark_spread/sparks = new /datum/effect/system/spark_spread() sparks.set_up(sparks_amt, 0, location) //no idea what the 0 is diff --git a/code/datums/spells/area_teleport.dm b/code/datums/spells/area_teleport.dm index 526943b2f69..ad0b6fa61de 100644 --- a/code/datums/spells/area_teleport.dm +++ b/code/datums/spells/area_teleport.dm @@ -28,7 +28,6 @@ if(thearea.tele_proof && !istype(thearea, /area/wizard_station)) to_chat(usr, "A mysterious force disrupts your arcane spell matrix, and you remain where you are.") - return return thearea @@ -48,7 +47,6 @@ if(!L.len) to_chat(usr, "The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry.") - return if(target && target.buckled) diff --git a/code/datums/spells/bloodcrawl.dm b/code/datums/spells/bloodcrawl.dm index e8a8304e769..7f6f4d4fb2a 100644 --- a/code/datums/spells/bloodcrawl.dm +++ b/code/datums/spells/bloodcrawl.dm @@ -20,7 +20,6 @@ revert_cast() to_chat(user, "There must be a nearby source of blood!") - /obj/effect/proc_holder/spell/bloodcrawl/perform(obj/effect/decal/cleanable/target, recharge = 1, mob/living/user = usr) if(istype(user)) if(phased) @@ -33,4 +32,3 @@ return revert_cast() to_chat(user, "You are unable to blood crawl!") - diff --git a/code/datums/spells/charge.dm b/code/datums/spells/charge.dm index 7a98e194595..b46472c35b9 100644 --- a/code/datums/spells/charge.dm +++ b/code/datums/spells/charge.dm @@ -27,10 +27,8 @@ for(var/obj/effect/proc_holder/spell/S in M.mind.spell_list) S.charge_counter = S.charge_max to_chat(M, "you feel raw magic flowing through you, it feels good!") - else to_chat(M, "you feel very strange for a moment, but then it passes.") - burnt_out = 1 charged_item = M break @@ -47,9 +45,7 @@ break else to_chat(L, "Glowing red letters appear on the front cover...") - to_chat(L, "[pick("NICE TRY BUT NO!","CLEVER BUT NOT CLEVER ENOUGH!", "SUCH FLAGRANT CHEESING IS WHY WE ACCEPTED YOUR APPLICATION!", "CUTE!", "YOU DIDN'T THINK IT'D BE THAT EASY, DID YOU?")]") - burnt_out = 1 else if(istype(item, /obj/item/weapon/gun/magic)) var/obj/item/weapon/gun/magic/I = item @@ -90,10 +86,7 @@ break if(!charged_item) to_chat(L, "you feel magical power surging to your hands, but the feeling rapidly fades...") - else if(burnt_out) to_chat(L, "[charged_item] doesn't seem to be reacting to the spell...") - else to_chat(L, "[charged_item] suddenly feels very warm!") - diff --git a/code/datums/spells/conjure.dm b/code/datums/spells/conjure.dm index 4a502d59229..bdd15eb34fe 100644 --- a/code/datums/spells/conjure.dm +++ b/code/datums/spells/conjure.dm @@ -32,7 +32,6 @@ if(ispath(summoned_object_type,/turf)) if(istype(get_turf(usr),/turf/simulated/shuttle)) to_chat(usr, "\red You can't build things on shuttles!") - break var/turf/O = spawn_place var/N = summoned_object_type diff --git a/code/datums/spells/ethereal_jaunt.dm b/code/datums/spells/ethereal_jaunt.dm index aa048d746cc..384ec56915d 100644 --- a/code/datums/spells/ethereal_jaunt.dm +++ b/code/datums/spells/ethereal_jaunt.dm @@ -21,7 +21,6 @@ for(var/mob/living/target in targets) if(!target.can_safely_leave_loc()) // No more brainmobs hopping out of their brains to_chat(target, "You are somehow too bound to your current location to abandon it.") - continue spawn(0) @@ -113,7 +112,6 @@ loc = newLoc else to_chat(user, "Some strange aura is blocking the way!") - src.canmove = 0 spawn(2) src.canmove = 1 diff --git a/code/datums/spells/horsemask.dm b/code/datums/spells/horsemask.dm index f73e330ad2b..d39ff42ea51 100644 --- a/code/datums/spells/horsemask.dm +++ b/code/datums/spells/horsemask.dm @@ -19,7 +19,6 @@ /obj/effect/proc_holder/spell/targeted/horsemask/cast(list/targets, mob/user = usr) if(!targets.len) to_chat(user, "No target found in range.") - return var/mob/living/carbon/target = targets[1] @@ -29,12 +28,10 @@ if((target.type in compatible_mobs) || ishuman(target)) to_chat(user, "It'd be stupid to curse [target] with a horse's head!") - return if(!(target in oview(range)))//If they are not in overview after selection. to_chat(user, "They are too far away!") - return var/obj/item/clothing/mask/horsehead/magichead = new /obj/item/clothing/mask/horsehead diff --git a/code/datums/spells/lichdom.dm b/code/datums/spells/lichdom.dm index 3e8cf4bb9d1..76a5b0f6001 100644 --- a/code/datums/spells/lichdom.dm +++ b/code/datums/spells/lichdom.dm @@ -46,13 +46,11 @@ if(M.stat == CONSCIOUS && iscarbon(M)) to_chat(M, "You aren't dead enough to revive!")//Usually a good problem to have - charge_counter = charge_max return if(!marked_item || qdeleted(marked_item)) //Wait nevermind to_chat(M, "Your phylactery is gone!") - return var/turf/user_turf = get_turf(M) @@ -60,7 +58,6 @@ if(user_turf.z != item_turf.z) to_chat(M, "Your phylactery is out of range!") - return if(isobserver(M)) @@ -78,7 +75,6 @@ M.mind.transfer_to(lich) lich.set_species("Skeleton") to_chat(lich, "Your bones clatter and shutter as they're pulled back into this world!") - charge_max += 600 var/mob/old_body = current_body var/turf/body_turf = get_turf(old_body) @@ -103,18 +99,15 @@ continue marked_item = item to_chat(M, "You begin to focus your very being into the [item.name]...") - break if(!marked_item) to_chat(M, "You must hold an item you wish to make your phylactery...") - return spawn(50) if(marked_item.loc != M) //I changed my mind I don't want to put my soul in a cheeseburger! to_chat(M, "Your soul snaps back to your body as you drop the [marked_item.name]!") - marked_item = null return name = "RISE!" @@ -126,7 +119,6 @@ marked_item.desc = "A terrible aura surrounds this item, its very existence is offensive to life itself..." marked_item.color = "#003300" to_chat(M, "With a hideous feeling of emptiness you watch in horrified fascination as skin sloughs off bone! Blood boils, nerves disintegrate, eyes boil in their sockets! As your organs crumble to dust in your fleshless chest you come to terms with your choice. You're a lich!") - current_body = M.mind.current if(ishuman(M)) var/mob/living/carbon/human/H = M diff --git a/code/datums/spells/lightning.dm b/code/datums/spells/lightning.dm index 6abe242c747..00c04e5a792 100644 --- a/code/datums/spells/lightning.dm +++ b/code/datums/spells/lightning.dm @@ -31,7 +31,6 @@ /obj/effect/proc_holder/spell/targeted/lightning/proc/StartChargeup(mob/user = usr) ready = 1 to_chat(user, "You start gathering the power.") - halo = image("icon"='icons/effects/effects.dmi',"icon_state" ="electricity","layer" = EFFECTS_LAYER) user.overlays.Add(halo) start_time = world.time @@ -47,14 +46,12 @@ obj/effect/proc_holder/spell/targeted/lightning/proc/Reset(mob/user = usr) /obj/effect/proc_holder/spell/targeted/lightning/revert_cast(mob/user = usr) to_chat(user, "No target found in range.") - Reset(user) ..() /obj/effect/proc_holder/spell/targeted/lightning/proc/Discharge(mob/user = usr) var/mob/living/M = user to_chat(M, "You lose control over the spell.") - Reset(user) start_recharge() @@ -64,7 +61,6 @@ obj/effect/proc_holder/spell/targeted/lightning/proc/Reset(mob/user = usr) var/mob/living/carbon/target = targets[1] if(get_dist(user,target)>range) to_chat(user, "They are too far away!") - Reset(user) return diff --git a/code/datums/spells/magnet.dm b/code/datums/spells/magnet.dm index 0a5214b3ca4..100dd881dde 100644 --- a/code/datums/spells/magnet.dm +++ b/code/datums/spells/magnet.dm @@ -28,7 +28,6 @@ /obj/effect/proc_holder/spell/targeted/magnet/proc/StartChargeup(mob/user = usr) ready = 1 to_chat(user, "You start gathering the power.") - halo = image("icon"='icons/effects/effects.dmi',"icon_state" ="electricity","layer" = EFFECTS_LAYER) user.overlays.Add(halo) spawn(0) @@ -46,7 +45,6 @@ obj/effect/proc_holder/spell/targeted/magnet/proc/Reset(mob/user = usr) /obj/effect/proc_holder/spell/targeted/magnet/revert_cast(mob/user = usr) to_chat(user, "No target found in range.") - Reset(user) ..() @@ -54,7 +52,6 @@ obj/effect/proc_holder/spell/targeted/magnet/proc/Reset(mob/user = usr) var/mob/living/M = user //M.electrocute_act(25,"magnet Bolt") to_chat(M, "You lose control over the power.") - Reset(user) start_recharge() @@ -65,7 +62,6 @@ obj/effect/proc_holder/spell/targeted/magnet/proc/Reset(mob/user = usr) if(get_dist(user,target)>range) to_chat(user, "They are too far away!") - Reset(user) return diff --git a/code/datums/spells/mime.dm b/code/datums/spells/mime.dm index a6b43234475..fb996bc84ee 100644 --- a/code/datums/spells/mime.dm +++ b/code/datums/spells/mime.dm @@ -18,7 +18,6 @@ if(usr && usr.mind) if(!usr.mind.miming) to_chat(usr, "You must dedicate yourself to silence first.") - return invocation = "[usr.real_name] looks as if a wall is in front of them." else @@ -56,7 +55,5 @@ H.mind.miming=!H.mind.miming if(H.mind.miming) to_chat(H, "You make a vow of silence.") - else to_chat(H, "You break your vow of silence.") - diff --git a/code/datums/spells/mind_transfer.dm b/code/datums/spells/mind_transfer.dm index 666b09d7beb..514cb95dce4 100644 --- a/code/datums/spells/mind_transfer.dm +++ b/code/datums/spells/mind_transfer.dm @@ -22,40 +22,33 @@ Also, you never added distance checking after target is selected. I've went ahea /obj/effect/proc_holder/spell/targeted/mind_transfer/cast(list/targets,mob/user = usr) if(!targets.len) to_chat(user, "No mind found.") - return if(targets.len > 1) to_chat(user, "Too many minds! You're not a hive damnit!")//Whaa...aat? - return var/mob/living/target = targets[1] if(!(target in oview(range)))//If they are not in overview after selection. Do note that !() is necessary for in to work because ! takes precedence over it. to_chat(user, "They are too far away!") - return if(target.stat == DEAD) to_chat(user, "You don't particularly want to be dead.") - return if(!target.key || !target.mind) to_chat(user, "They appear to be catatonic. Not even magic can affect their vacant mind.") - return if(user.suiciding) to_chat(user, "You're killing yourself! You can't concentrate enough to do this!") - return if(target.mind.special_role in protected_roles) to_chat(user, "Their mind is resisting your spell.") - return var/mob/living/victim = target//The target of the spell whos body will be transferred to. diff --git a/code/datums/spells/summonitem.dm b/code/datums/spells/summonitem.dm index 507d15281cc..a91532df451 100644 --- a/code/datums/spells/summonitem.dm +++ b/code/datums/spells/summonitem.dm @@ -107,4 +107,3 @@ if(message) to_chat(user, message) - diff --git a/code/datums/spells/touch_attacks.dm b/code/datums/spells/touch_attacks.dm index bdd64ef9fcc..1262730fd45 100644 --- a/code/datums/spells/touch_attacks.dm +++ b/code/datums/spells/touch_attacks.dm @@ -11,7 +11,6 @@ charge_counter = charge_max attached_hand = null to_chat(user, "You draw the power out of your hand.") - return 0 ..() @@ -40,10 +39,8 @@ charge_counter = charge_max attached_hand = null to_chat(user, "Your hands are full!") - return 0 to_chat(user, "You channel the power of the spell to your hand.") - return 1 diff --git a/code/datums/spells/wizard.dm b/code/datums/spells/wizard.dm index 46cde89b8ea..ca146933558 100644 --- a/code/datums/spells/wizard.dm +++ b/code/datums/spells/wizard.dm @@ -299,11 +299,9 @@ M.Weaken(5) M.adjustBruteLoss(5) to_chat(M, "You're slammed into the floor by a mystical force!") - else if(istype(AM, /mob/living)) var/mob/living/M = AM M.Weaken(2) to_chat(M, "You're thrown back by a mystical force!") - spawn(0) AM.throw_at(throwtarget, ((Clamp((maxthrow - (Clamp(distfromcaster - 2, 0, distfromcaster))), 3, maxthrow))), 1)//So stuff gets tossed around at the same time. diff --git a/code/datums/wires/alarm.dm b/code/datums/wires/alarm.dm index d2cb746c0f0..4d88de82a67 100644 --- a/code/datums/wires/alarm.dm +++ b/code/datums/wires/alarm.dm @@ -29,27 +29,23 @@ var/const/AALARM_WIRE_AALARM = 16 A.locked = 1 // to_chat(world, "Idscan wire cut") - if(AALARM_WIRE_POWER) A.shock(usr, 50) A.shorted = !mended A.update_icon() // to_chat(world, "Power wire cut") - if (AALARM_WIRE_AI_CONTROL) if (A.aidisabled == !mended) A.aidisabled = mended // to_chat(world, "AI Control Wire Cut") - if(AALARM_WIRE_SYPHON) if(!mended) A.mode = 3 // AALARM_MODE_PANIC A.apply_mode() // to_chat(world, "Syphon Wire Cut") - if(AALARM_WIRE_AALARM) if (A.alarm_area.atmosalert(2, A)) A.post_alert(2) @@ -62,10 +58,8 @@ var/const/AALARM_WIRE_AALARM = 16 A.locked = !A.locked // to_chat(world, "Idscan wire pulsed") - if (AALARM_WIRE_POWER) // to_chat(world, "Power wire pulsed") - if(A.shorted == 0) A.shorted = 1 A.update_icon() @@ -78,7 +72,6 @@ var/const/AALARM_WIRE_AALARM = 16 if (AALARM_WIRE_AI_CONTROL) // to_chat(world, "AI Control wire pulsed") - if (A.aidisabled == 0) A.aidisabled = 1 A.updateDialog() @@ -88,7 +81,6 @@ var/const/AALARM_WIRE_AALARM = 16 if(AALARM_WIRE_SYPHON) // to_chat(world, "Syphon wire pulsed") - if(A.mode == 1) // AALARM_MODE_SCRUB A.mode = 3 // AALARM_MODE_PANIC else @@ -97,7 +89,6 @@ var/const/AALARM_WIRE_AALARM = 16 if(AALARM_WIRE_AALARM) // to_chat(world, "Aalarm wire pulsed") - if (A.alarm_area.atmosalert(0, A)) A.post_alert(0) A.update_icon() diff --git a/code/datums/wires/robot.dm b/code/datums/wires/robot.dm index 77975d05680..58e25152dae 100644 --- a/code/datums/wires/robot.dm +++ b/code/datums/wires/robot.dm @@ -36,7 +36,6 @@ var/const/BORG_WIRE_LAWCHECK = 16 // Not used on MoMMIs if(!mended) if (R.lawupdate == 1) to_chat(R, "LawSync protocol engaged.") - R.show_laws() else if (R.lawupdate == 0 && !R.emagged) @@ -75,7 +74,6 @@ var/const/BORG_WIRE_LAWCHECK = 16 // Not used on MoMMIs R.visible_message("[R]'s camera lense focuses loudly.") to_chat(R, "Your camera lense focuses loudly.") - if(BORG_WIRE_LOCKED_DOWN) R.SetLockdown(!R.lockcharge) // Toggle diff --git a/code/datums/wires/wires.dm b/code/datums/wires/wires.dm index 2c184e473c8..34172f4cc90 100644 --- a/code/datums/wires/wires.dm +++ b/code/datums/wires/wires.dm @@ -118,7 +118,6 @@ var/list/wireColours = list("red", "blue", "green", "black", "orange", "brown", else to_chat(L, "You need wirecutters!") - else if(href_list["pulse"]) if(istype(I, /obj/item/device/multitool)) var/colour = href_list["pulse"] @@ -126,7 +125,6 @@ var/list/wireColours = list("red", "blue", "green", "black", "orange", "brown", else to_chat(L, "You need a multitool!") - else if(href_list["attach"]) var/colour = href_list["attach"] // Detach @@ -146,7 +144,6 @@ var/list/wireColours = list("red", "blue", "green", "black", "orange", "brown", - // Update Window Interact(usr) diff --git a/code/defines/procs/announce.dm b/code/defines/procs/announce.dm index 834922842e4..4327344535d 100644 --- a/code/defines/procs/announce.dm +++ b/code/defines/procs/announce.dm @@ -64,30 +64,21 @@ datum/announcement/proc/Message(message as text, message_title as text) for(var/mob/M in player_list) if(!istype(M,/mob/new_player) && !isdeaf(M)) to_chat(M, "

      [title]

      ") - to_chat(M, "[message]") - if (announcer) to_chat(M, " -[html_encode(announcer)]") - /datum/announcement/minor/Message(message as text, message_title as text) to_chat(world, "[message_title]") - to_chat(world, "[message]
      ") - datum/announcement/priority/Message(message as text, message_title as text) to_chat(world, "

      [message_title]

      ") - to_chat(world, "[message]") - if(announcer) to_chat(world, " -[html_encode(announcer)]") - to_chat(world, "
      ") - datum/announcement/priority/command/Message(message as text, message_title as text) var/command command += "

      [command_name()] Update

      " @@ -100,7 +91,6 @@ datum/announcement/priority/command/Message(message as text, message_title as te if(!istype(M,/mob/new_player) && !isdeaf(M)) to_chat(M, command) - datum/announcement/priority/enemy/Message(message as text, message_title as text, from as text) var/command command += "

      [from]

      " @@ -113,13 +103,10 @@ datum/announcement/priority/enemy/Message(message as text, message_title as text if(!istype(M,/mob/new_player) && !isdeaf(M)) to_chat(M, command) - datum/announcement/priority/security/Message(message as text, message_title as text) to_chat(world, "[message_title]") - to_chat(world, "[message]") - datum/announcement/proc/NewsCast(message as text, message_title as text) if(disable_newscasts) return @@ -141,7 +128,6 @@ datum/announcement/proc/PlaySound(var/message_sound) if(!istype(M,/mob/new_player) && !isdeaf(M)) to_chat(M, message_sound) - datum/announcement/proc/Sound(var/message_sound) PlaySound(message_sound) @@ -149,7 +135,6 @@ datum/announcement/priority/Sound(var/message_sound) if(sound) to_chat(world, sound) - datum/announcement/priority/command/Sound(var/message_sound) PlaySound(message_sound) diff --git a/code/defines/procs/statistics.dm b/code/defines/procs/statistics.dm index ea32a6b2619..13c127e81e2 100644 --- a/code/defines/procs/statistics.dm +++ b/code/defines/procs/statistics.dm @@ -66,7 +66,6 @@ var/sqltime = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss") var/coord = "[H.x], [H.y], [H.z]" // to_chat(world, "INSERT INTO death (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[sqltime]', '[laname]', '[lakey]', '[H.gender]', [H.bruteloss], [H.getFireLoss()], [H.brainloss], [H.getOxyLoss()])") - establish_db_connection() if(!dbcon.IsConnected()) log_game("SQL ERROR during death reporting. Failed to connect.") @@ -102,7 +101,6 @@ var/sqltime = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss") var/coord = "[H.x], [H.y], [H.z]" // to_chat(world, "INSERT INTO death (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[sqltime]', '[laname]', '[lakey]', '[H.gender]', [H.bruteloss], [H.getFireLoss()], [H.brainloss], [H.getOxyLoss()])") - establish_db_connection() if(!dbcon.IsConnected()) log_game("SQL ERROR during death reporting. Failed to connect.") diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 6613bd2d9cf..9dc2223a052 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -323,7 +323,6 @@ if(L && L.client && !L.client.ambience_playing && (L.client.prefs.sound & SOUND_BUZZ)) //split off the white noise from the rest of the ambience because of annoyance complaints - Kluys L.client.ambience_playing = 1 to_chat(L, sound('sound/ambience/shipambience.ogg', repeat = 1, wait = 0, volume = 35, channel = 2)) - else if (L && L.client && !(L.client.prefs.sound & SOUND_BUZZ)) L.client.ambience_playing = 0 if(prob(35) && !newarea.media_source && L && L.client && (L.client.prefs.sound & SOUND_AMBIENCE)) @@ -331,7 +330,6 @@ if(!L.client.played) to_chat(L, sound(sound, repeat = 0, wait = 0, volume = 25, channel = 1)) - L.client.played = 1 spawn(600) //ewww - this is very very bad if(L.&& L.client) @@ -366,7 +364,6 @@ to_chat(M, "Gravity!") - /proc/has_gravity(atom/AT, turf/T) if(!T) T = get_turf(AT) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 49725284a4e..1bd5b9d602f 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -182,26 +182,20 @@ f_name += "oil-stained [name][infix]." to_chat(user, "\icon[src] That's [f_name] [suffix]") - to_chat(user, desc) - if(reagents && is_open_container()) //is_open_container() isn't really the right proc for this, but w/e to_chat(user, "It contains:") - if(reagents.reagent_list.len) if(user.can_see_reagents()) //Show each individual reagent for(var/datum/reagent/R in reagents.reagent_list) to_chat(user, "[R.volume] units of [R.name]") - else //Otherwise, just show the total volume if(reagents && reagents.reagent_list.len) to_chat(user, "[reagents.total_volume] units of various reagents.") - else to_chat(user, "Nothing.") - return distance == -1 || (get_dist(src, user) <= distance) || isobserver(user) //observers do not have a range limit /atom/proc/relaymove() @@ -412,7 +406,6 @@ if(cur_y) break // to_chat(world, "X = [cur_x]; Y = [cur_y]") - if(cur_x && cur_y) return list("x"=cur_x,"y"=cur_y) else diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index c407a708071..5e81c2a7ff0 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -148,15 +148,12 @@ return if (!ishuman(usr)) //Make sure they're a mob that has dna to_chat(usr, "Try as you might, you can not climb up into the [src].") - return if (src.occupant) to_chat(usr, "The [src] is already occupied!") - return if (usr.abiotic()) to_chat(usr, "Subject cannot have abiotic items on.") - return usr.stop_pulling() usr.client.perspective = EYE_PERSPECTIVE @@ -188,19 +185,16 @@ return if(occupant) to_chat(user, "The [src] is already occupied!") - return var/mob/living/L = O if(!istype(L) || L.buckled) return if(L.abiotic()) to_chat(user, "Subject cannot have abiotic items on.") - return for(var/mob/living/carbon/slime/M in range(1,L)) if(M.Victim == L) to_chat(usr, "[L.name] will not fit into the [src] because they have a slime latched onto their head.") - return if (L == user) visible_message("[user] climbs into the [src].") @@ -214,7 +208,6 @@ if(istype(item, /obj/item/weapon/screwdriver)) if(occupant) to_chat(user, "The maintenance panel is locked.") - return default_deconstruction_screwdriver(user, "[icon_state]_maintenance", "[initial(icon_state)]", item) @@ -230,12 +223,10 @@ else if(istype(item, /obj/item/weapon/reagent_containers/glass)) if(beaker) to_chat(user, "A beaker is already loaded into the machine.") - return if(!user.drop_item()) to_chat(user, "\The [item] is stuck to you!") - return beaker = item @@ -249,15 +240,12 @@ return if (src.occupant) to_chat(user, "The scanner is already occupied!") - return if (G.affecting.abiotic()) to_chat(user, "Subject cannot have abiotic items on.") - return if(panel_open) to_chat(usr, "Close the maintenance panel first.") - return put_in(G.affecting) src.add_fingerprint(user) @@ -286,20 +274,16 @@ var/mob/dead/observer/ghost = occupant.get_ghost() if(ghost) to_chat(ghost, "Your corpse has been placed into a cloning scanner. Return to your body if you want to be cloned! (Verbs -> Ghost -> Re-enter corpse)") - to_chat(ghost, sound('sound/effects/genetics.ogg')) - return /obj/machinery/dna_scannernew/proc/go_out() if (!src.occupant) to_chat(usr, "The scanner is empty!") - return if (src.locked) to_chat(usr, "The scanner is locked!") - return if (src.occupant.client) @@ -398,7 +382,6 @@ I.forceMove(src) src.disk = I to_chat(user, "You insert [I].") - nanomanager.update_uis(src) // update all UIs attached to src() return else diff --git a/code/game/dna/genes/disabilities.dm b/code/game/dna/genes/disabilities.dm index f0b3874581e..f62268b621a 100644 --- a/code/game/dna/genes/disabilities.dm +++ b/code/game/dna/genes/disabilities.dm @@ -36,7 +36,6 @@ M.sdisabilities|=sdisability if(activation_message) to_chat(M, "\red [activation_message]") - else testing("[name] has no activation message.") @@ -49,7 +48,6 @@ M.sdisabilities &= ~sdisability if(deactivation_message) to_chat(M, "\red [deactivation_message]") - else testing("[name] has no deactivation message.") diff --git a/code/game/dna/genes/gene.dm b/code/game/dna/genes/gene.dm index 053115ffa9e..30bcc0d8c36 100644 --- a/code/game/dna/genes/gene.dm +++ b/code/game/dna/genes/gene.dm @@ -118,10 +118,8 @@ var/msg = pick(activation_messages) to_chat(M, "\blue [msg]") - /datum/dna/gene/basic/deactivate(var/mob/M) M.mutations.Remove(mutation) if(deactivation_messages.len) var/msg = pick(deactivation_messages) to_chat(M, "\red [msg]") - diff --git a/code/game/dna/genes/goon_disabilities.dm b/code/game/dna/genes/goon_disabilities.dm index 22456e2e3f8..30b9c344b59 100644 --- a/code/game/dna/genes/goon_disabilities.dm +++ b/code/game/dna/genes/goon_disabilities.dm @@ -44,7 +44,6 @@ if(L == owner) continue to_chat(L, "You are enveloped by a soft green glow emanating from [owner].") - L.apply_effect(5, IRRADIATE) return @@ -290,10 +289,8 @@ continue if (src.variant == 2) to_chat(C, "\red [src.personalized_stink]") - else to_chat(C, "\red [stinkString()]") - */ @@ -335,7 +332,6 @@ /* if(!targets.len) Uncomment this to allow the power to be used on targets other than yourself. That said, if you uncomment this I will find you and hurt you. Uncounterable and untracable burn damage with a 60-second cooldown is fun for exactly one person, and that's the person who is using it. to_chat(usr, "No target found in range.") - return var/mob/living/carbon/L = targets[1] diff --git a/code/game/dna/genes/goon_powers.dm b/code/game/dna/genes/goon_powers.dm index 8a9115b5f1a..b0e0a405265 100644 --- a/code/game/dna/genes/goon_powers.dm +++ b/code/game/dna/genes/goon_powers.dm @@ -152,14 +152,12 @@ /obj/effect/proc_holder/spell/targeted/cryokinesis/cast(list/targets) if(!targets.len) to_chat(usr, "No target found in range.") - return var/mob/living/carbon/C = targets[1] if(!iscarbon(C)) to_chat(usr, "\red This will only work on normal organic beings.") - return if (RESIST_COLD in C.mutations) @@ -306,7 +304,6 @@ var/mob/user = usr if(!targets.len) to_chat(user, "No target found in range.") - return var/atom/movable/the_item = targets[1] @@ -323,32 +320,27 @@ var/obj/item/organ/external/limb = H.get_organ(user.zone_sel.selecting) if(!istype(limb)) to_chat(user, "You can't eat this part of them!") - revert_cast() return 0 if(istype(limb,/obj/item/organ/external/head)) // Bullshit, but prevents being unable to clone someone. to_chat(user, "You try to put \the [limb] in your mouth, but [t_his] ears tickle your throat!") - revert_cast() return 0 if(istype(limb,/obj/item/organ/external/chest)) // Bullshit, but prevents being able to instagib someone. to_chat(user, "You try to put their [limb] in your mouth, but it's too big to fit!") - revert_cast() return 0 user.visible_message("[user] begins stuffing [the_item]'s [limb.name] into [m_his] gaping maw!") var/oldloc = H.loc if(!do_mob(user,H,EAT_MOB_DELAY)) to_chat(user, "You were interrupted before you could eat [the_item]!") - else if(!limb || !H) return if(H.loc != oldloc) to_chat(user, "\The [limb] moved away from your mouth!") - return user.visible_message("[user] [pick("chomps","bites")] off [the_item]'s [limb]!") playsound(user.loc, 'sound/items/eatfood.ogg', 50, 0) @@ -399,7 +391,6 @@ var/failure = 0 if (istype(usr.loc,/mob/) || usr.lying || usr.stunned || usr.buckled || usr.stat) to_chat(usr, "\red You can't jump right now!") - return if (istype(usr.loc,/turf/)) @@ -445,7 +436,6 @@ if (istype(usr.loc,/obj/)) var/obj/container = usr.loc to_chat(usr, "\red You leap and slam your head against the inside of [container]! Ouch!") - usr.AdjustParalysis(3) usr.AdjustWeakened(5) container.visible_message("\red [usr.loc] emits a loud thump and rattles a bit.") @@ -499,7 +489,6 @@ var/mob/living/M=targets[1] if(!ishuman(M)) to_chat(usr, "\red You can only change your appearance to that of another human.") - return if(!ishuman(usr)) return @@ -561,25 +550,20 @@ for(var/mob/living/carbon/M in targets) if(!iscarbon(M)) to_chat(usr, "\red You may only use this on other organic beings.") - return if (PSY_RESIST in M.mutations) to_chat(usr, "\red You can't see into [M.name]'s mind at all!") - return if (M.stat == 2) to_chat(usr, "\red [M.name] is dead and cannot have their mind read.") - return if (M.health < 0) to_chat(usr, "\red [M.name] is dying, and their thoughts are too scrambled to read.") - return to_chat(usr, "\blue Mind Reading of [M.name]:
      ") - var/pain_condition = M.health // lower health means more pain var/list/randomthoughts = list("what to have for lunch","the future","the past","money", @@ -597,34 +581,25 @@ switch(pain_condition) if (81 to INFINITY) to_chat(usr, "\blue Condition: [M.name] feels good.") - if (61 to 80) to_chat(usr, "\blue Condition: [M.name] is suffering mild pain.") - if (41 to 60) to_chat(usr, "\blue Condition: [M.name] is suffering significant pain.") - if (21 to 40) to_chat(usr, "\blue Condition: [M.name] is suffering severe pain.") - else to_chat(usr, "\blue Condition: [M.name] is suffering excruciating pain.") - thoughts = "haunted by their own mortality" switch(M.a_intent) if (I_HELP) to_chat(usr, "\blue Mood: You sense benevolent thoughts from [M.name].") - if (I_DISARM) to_chat(usr, "\blue Mood: You sense cautious thoughts from [M.name].") - if (I_GRAB) to_chat(usr, "\blue Mood: You sense hostile thoughts from [M.name].") - if (I_HARM) to_chat(usr, "\blue Mood: You sense cruel thoughts from [M.name].") - for(var/mob/living/L in view(7,M)) if (L == M) continue @@ -633,7 +608,6 @@ else to_chat(usr, "\blue Mood: You sense strange thoughts from [M.name].") - if (istype(M,/mob/living/carbon/human)) var/numbers[0] var/mob/living/carbon/human/H = M @@ -642,16 +616,12 @@ numbers += H.mind.initial_account.remote_access_pin if(numbers.len>0) to_chat(usr, "\blue Numbers: You sense the number[numbers.len>1?"s":""] [english_list(numbers)] [numbers.len>1?"are":"is"] important to [M.name].") - to_chat(usr, "\blue Thoughts: [M.name] is currently [thoughts].") - if (EMPATH in M.mutations) to_chat(M, "\red You sense [usr.name] reading your mind.") - else if (prob(5) || M.mind.assigned_role=="Chaplain") to_chat(M, "\red You sense someone intruding upon your thoughts...") - return //////////////////////////////////////////////////////////////////////// @@ -699,11 +669,9 @@ if (M == usr) continue to_chat(M, "You are sent flying!") - M.Weaken(5) step_away(M, UT, 15) step_away(M, UT, 15) step_away(M, UT, 15) else to_chat(usr, "You were interrupted and couldn't fart! Rude!") - diff --git a/code/game/dna/genes/monkey.dm b/code/game/dna/genes/monkey.dm index d514215e347..48e7e3a580f 100644 --- a/code/game/dna/genes/monkey.dm +++ b/code/game/dna/genes/monkey.dm @@ -47,7 +47,6 @@ to_chat(H, "You are now a [H.species.name].") - return H /datum/dna/gene/monkey/deactivate(var/mob/living/carbon/human/H, var/connected, var/flags) @@ -91,5 +90,4 @@ to_chat(H, "You are now a [H.species.name].") - return H \ No newline at end of file diff --git a/code/game/dna/genes/powers.dm b/code/game/dna/genes/powers.dm index c5c795ba606..7c28c8dbca6 100644 --- a/code/game/dna/genes/powers.dm +++ b/code/game/dna/genes/powers.dm @@ -164,7 +164,6 @@ M.status_flags |= CANSTUN | CANWEAKEN | CANPARALYSE | CANPUSH //temporary fix until the problem can be solved. to_chat(M, "You suddenly feel very weak.") - /datum/dna/gene/basic/xray name="X-Ray Vision" activation_messages=list("The walls suddenly disappear.") diff --git a/code/game/dna/genes/vg_powers.dm b/code/game/dna/genes/vg_powers.dm index b420de87c89..db4c97db449 100644 --- a/code/game/dna/genes/vg_powers.dm +++ b/code/game/dna/genes/vg_powers.dm @@ -50,7 +50,6 @@ Obviously, requires DNA2. M.update_body() to_chat(M, "\red You suddenly feel very weak.") - /obj/effect/proc_holder/spell/targeted/hulk name = "Hulk Out" panel = "Abilities" @@ -74,7 +73,6 @@ Obviously, requires DNA2. /obj/effect/proc_holder/spell/targeted/hulk/cast(list/targets) if (istype(usr.loc,/mob/)) to_chat(usr, "\red You can't hulk out right now!") - return var/mob/living/carbon/human/M=usr M.hulk_time = world.time + HULK_DURATION @@ -125,7 +123,6 @@ Obviously, requires DNA2. if (istype(usr.loc,/mob/)) to_chat(usr, "\red You can't change your appearance right now!") - return var/mob/living/carbon/human/M=usr @@ -232,7 +229,6 @@ Obviously, requires DNA2. if(!validtargets.len) to_chat(usr, "There are no valid targets!") - start_recharge() return @@ -298,7 +294,6 @@ Obviously, requires DNA2. if(!validtargets.len || validtargets.len == 1) to_chat(usr, "No valid targets with remote view were found!") - start_recharge() return @@ -321,7 +316,6 @@ Obviously, requires DNA2. if(istype(user.l_hand, /obj/item/tk_grab) || istype(user.r_hand, /obj/item/tk_grab/)) to_chat(user, "\red Your mind is too busy with that telekinetic grab.") - user.remoteview_target = null user.reset_view(0) return diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm index f33b52d2aa1..42d82639129 100644 --- a/code/game/gamemodes/antag_spawner.dm +++ b/code/game/gamemodes/antag_spawner.dm @@ -24,22 +24,18 @@ /obj/item/weapon/antag_spawner/borg_tele/attack_self(mob/user as mob) if(used) to_chat(user, "[src] is out of power!") - return if(!(user.mind in ticker.mode.syndicates)) to_chat(user, "AUTHENTICATION FAILURE. ACCESS DENIED.") - return 0 if(checking) to_chat(user, "[src] is already checking for possible borgs.") - return borg_to_spawn = input("What type of borg would you like to teleport?", "Cyborg Type", type) as null|anything in possible_types if(!borg_to_spawn || checking || used) return checking = 1 to_chat(user, "The device is now checking for possible borgs.") - var/list/borg_candidates = pollCandidates("Do you want to play as a Syndicate [borg_to_spawn] borg?", ROLE_OPERATIVE, 1) if(borg_candidates.len > 0 && !used) checking = 0 @@ -50,7 +46,6 @@ else checking = 0 to_chat(user, "Unable to connect to Syndicate command. Please wait and try again later or use the teleporter on your uplink to get your points refunded.") - return /obj/item/weapon/antag_spawner/borg_tele/spawn_antag(var/client/C, var/turf/T, var/type = "") @@ -81,33 +76,27 @@ /obj/item/weapon/antag_spawner/slaughter_demon/attack_self(mob/user as mob) if(user.z == ZLEVEL_CENTCOMM)//this is to make sure the wizard does NOT summon a demon from the Den.. to_chat(user, "You should probably wait until you reach the station.") - return if(used) to_chat(user, "This bottle already has a broken seal.") - return used = 1 to_chat(user, "You break the seal on the bottle, calling upon the dire spirits of the underworld...") - var/list/candidates = pollCandidates("Do you want to play as a slaughter demon summoned by [user.real_name]?", ROLE_DEMON, 1, 100) if(candidates.len > 0) var/mob/C = pick(candidates) spawn_antag(C, get_turf(src.loc), "Slaughter Demon", user) to_chat(user, "You shatter the bottle, no turning back now!") - to_chat(user, "You sense a dark presence lurking just beyond the veil...") - playsound(user.loc, 'sound/effects/Glassbr1.ogg', 100, 1) qdel(src) else used = 0 to_chat(user, "The demons do not respond to your summon. Perhaps you should try again later.") - /obj/item/weapon/antag_spawner/slaughter_demon/spawn_antag(var/client/C, var/turf/T, var/type = "", mob/user as mob) var /obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(T) var/mob/living/simple_animal/slaughter/S = new /mob/living/simple_animal/slaughter/(holder) @@ -128,6 +117,4 @@ S.mind.objectives += KillDaCrew S.mind.objectives += KillDaCrew to_chat(S, "Objective #[1]: [KillDaWiz.explanation_text]") - to_chat(S, "Objective #[2]: [KillDaCrew.explanation_text]") - diff --git a/code/game/gamemodes/autotraitor/autotraitor.dm b/code/game/gamemodes/autotraitor/autotraitor.dm index d5529aa801d..5e79f387aea 100644 --- a/code/game/gamemodes/autotraitor/autotraitor.dm +++ b/code/game/gamemodes/autotraitor/autotraitor.dm @@ -13,7 +13,6 @@ ..() to_chat(world, "Game mode is AutoTraitor. Traitors will be added to the round automagically as needed.") - /datum/game_mode/traitor/autotraitor/pre_setup() if(config.protect_roles_from_antagonist) @@ -135,9 +134,7 @@ traitors += newtraitor.mind to_chat(newtraitor, "\red ATTENTION: \black It is time to pay your debt to the Syndicate...") - to_chat(newtraitor, "You are now a traitor.") - newtraitor.mind.special_role = "traitor" var/datum/atom_hud/antag/tatorhud = huds[ANTAG_HUD_TRAITOR] tatorhud.join_hud(newtraitor) @@ -145,10 +142,8 @@ var/obj_count = 1 to_chat(newtraitor, "\blue Your current objectives:") - for(var/datum/objective/objective in newtraitor.mind.objectives) to_chat(newtraitor, "Objective #[obj_count]: [objective.explanation_text]") - obj_count++ //else //message_admins("No new traitor being added.") diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm index 9170a480d7a..923e787c8af 100644 --- a/code/game/gamemodes/blob/blob.dm +++ b/code/game/gamemodes/blob/blob.dm @@ -72,7 +72,6 @@ var/list/blob_nodes = list() log_game("[blob.key] (ckey) has been selected as a Blob") greet_blob(blobmind) to_chat(blob, "You feel very tired and bloated! You don't have long before you burst!") - spawn(600) burst_blob(blobmind) return 1 @@ -91,31 +90,22 @@ var/list/blob_nodes = list() /datum/game_mode/blob/announce() to_chat(world, "The current game mode is - Blob!") - to_chat(world, "A dangerous alien organism is rapidly spreading throughout the station!") - to_chat(world, "You must kill it all while minimizing the damage to the station.") - /datum/game_mode/blob/proc/greet_blob(var/datum/mind/blob) to_chat(blob.current, "You are infected by the Blob!") - to_chat(blob.current, "Your body is ready to give spawn to a new blob core which will eat this station.") - to_chat(blob.current, "Find a good location to spawn the core and then take control and overwhelm the station!") - to_chat(blob.current, "When you have found a location, wait until you spawn; this will happen automatically and you cannot speed up the process.") - to_chat(blob.current, "If you go outside of the station level, or in space, then you will die; make sure your location has lots of ground to cover.") - return /datum/game_mode/blob/proc/show_message(var/message) for(var/datum/mind/blob in infected_crew) to_chat(blob.current, message) - /datum/game_mode/blob/proc/burst_blobs() for(var/datum/mind/blob in infected_crew) burst_blob(blob) @@ -132,7 +122,6 @@ var/list/blob_nodes = list() if(location.z != ZLEVEL_STATION || istype(location, /turf/space)) if(!warned) to_chat(C, "You feel ready to burst, but this isn't an appropriate place! You must return to the station!") - message_admins("[key_name_admin(C)] was in space when the blobs burst, and will die if he doesn't return to the station.") spawn(300) burst_blob(blob, 1) diff --git a/code/game/gamemodes/blob/blob_finish.dm b/code/game/gamemodes/blob/blob_finish.dm index 11b8e5c3978..0efb624d100 100644 --- a/code/game/gamemodes/blob/blob_finish.dm +++ b/code/game/gamemodes/blob/blob_finish.dm @@ -12,28 +12,21 @@ if(blobwincount <= blobs.len) feedback_set_details("round_end_result","win - blob took over") to_chat(world, "The blob has taken over the station!") - to_chat(world, "The entire station was eaten by the Blob") - log_game("Blob mode completed with a blob victory.") else if(station_was_nuked) feedback_set_details("round_end_result","halfwin - nuke") to_chat(world, "Partial Win: The station has been destroyed!") - to_chat(world, "Directive 7-12 has been successfully carried out preventing the Blob from spreading.") - log_game("Blob mode completed with a tie (station destroyed).") else if(!blob_cores.len) feedback_set_details("round_end_result","loss - blob eliminated") to_chat(world, "The staff has won!") - to_chat(world, "The alien organism has been eradicated from the station") - log_game("Blob mode completed with a crew victory.") to_chat(world, "Rebooting in 30s") - ..() return 1 @@ -46,5 +39,4 @@ for(var/datum/mind/blob in blob_mode.infected_crew) text += "
      [blob.key] was [blob.name]" to_chat(world, text) - return 1 diff --git a/code/game/gamemodes/blob/blob_report.dm b/code/game/gamemodes/blob/blob_report.dm index d08c2d0528c..9b532258f6d 100644 --- a/code/game/gamemodes/blob/blob_report.dm +++ b/code/game/gamemodes/blob/blob_report.dm @@ -41,7 +41,6 @@ aiPlayer.set_zeroth_law(law) to_chat(aiPlayer, "Laws Updated: [law]") - for(var/obj/machinery/computer/communications/comm in world) comm.messagetitle.Add(interceptname) comm.messagetext.Add(intercepttext) diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm index 25236b7f086..1238adebcf5 100644 --- a/code/game/gamemodes/blob/overmind.dm +++ b/code/game/gamemodes/blob/overmind.dm @@ -53,23 +53,14 @@ ..() sync_mind() to_chat(src, "You are the overmind!") - to_chat(src, "Your randomly chosen reagent is: [blob_reagent_datum.name]!") - to_chat(src, "You are the overmind and can control the blob! You can expand, which will attack people, and place new blob pieces such as...") - to_chat(src, "Normal Blob will expand your reach and allow you to upgrade into special blobs that perform certain functions.") - to_chat(src, "Shield Blob is a strong and expensive blob which can take more damage. It is fireproof and can block air, use this to protect yourself from station fires.") - to_chat(src, "Resource Blob is a blob which will collect more resources for you, try to build these earlier to get a strong income. It will benefit from being near your core or multiple nodes, by having an increased resource rate; put it alone and it won't create resources at all.") - to_chat(src, "Node Blob is a blob which will grow, like the core. Unlike the core it won't give you a small income but it can power resource and factory blobs to increase their rate.") - to_chat(src, "Factory Blob is a blob which will spawn blob spores which will attack nearby food. Putting this nearby nodes and your core will increase the spawn rate; put it alone and it will not spawn any spores.") - to_chat(src, "Shortcuts: CTRL Click = Expand Blob / Middle Mouse Click = Rally Spores / Alt Click = Create Shield") - update_health() /mob/camera/blob/proc/update_health() @@ -88,7 +79,6 @@ if (src.client) if(client.prefs.muted & MUTE_IC) to_chat(src, "You cannot send IC messages (muted).") - return if (src.client.handle_spam_prevention(message,MUTE_IC)) return diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm index 826fea136a0..166f3f590ac 100644 --- a/code/game/gamemodes/blob/powers.dm +++ b/code/game/gamemodes/blob/powers.dm @@ -3,7 +3,6 @@ /mob/camera/blob/proc/can_buy(var/cost = 15) if(blob_points < cost) to_chat(src, "You cannot afford this!") - return 0 add_points(-cost) return 1 @@ -46,12 +45,10 @@ if(!B)//We are on a blob to_chat(src, "There is no blob here!") - return if(!istype(B, /obj/effect/blob/normal)) to_chat(src, "Unable to use this blob, find a normal one.") - return if(!can_buy(10)) @@ -79,17 +76,14 @@ if(!B)//We are on a blob to_chat(src, "There is no blob here!") - return if(!istype(B, /obj/effect/blob/normal)) to_chat(src, "Unable to use this blob, find a normal one.") - return for(var/obj/effect/blob/resource/blob in orange(4, T)) to_chat(src, "There is a resource blob nearby, move more than 4 tiles away from it!") - return if(!can_buy(40)) @@ -118,17 +112,14 @@ if(!B)//We are on a blob to_chat(src, "There is no blob here!") - return if(!istype(B, /obj/effect/blob/normal)) to_chat(src, "Unable to use this blob, find a normal one.") - return for(var/obj/effect/blob/node/blob in orange(5, T)) to_chat(src, "There is another node nearby, move more than 5 tiles away from it!") - return if(!can_buy(60)) @@ -156,17 +147,14 @@ var/obj/effect/blob/B = locate(/obj/effect/blob) in T if(!B) to_chat(src, "You must be on a blob!") - return if(!istype(B, /obj/effect/blob/normal)) to_chat(src, "Unable to use this blob, find a normal one.") - return for(var/obj/effect/blob/factory/blob in orange(7, T)) to_chat(src, "There is a factory blob nearby, move more than 7 tiles away from it!") - return if(!can_buy(60)) @@ -193,12 +181,10 @@ var/obj/effect/blob/B = locate(/obj/effect/blob) in T if(!B) to_chat(src, "You must be on a blob!") - return if(!istype(B, /obj/effect/blob/factory)) to_chat(src, "Unable to use this blob, find a factory blob.") - return if(!can_buy(20)) @@ -227,7 +213,6 @@ var/obj/effect/blob/node/B = locate(/obj/effect/blob/node) in T if(!B) to_chat(src, "You must be on a blob node!") - return if(!can_buy(80)) @@ -252,12 +237,10 @@ var/obj/effect/blob/B = locate(/obj/effect/blob) in T if(!B) to_chat(src, "You must be on a blob!") - return if(istype(B, /obj/effect/blob/core)) to_chat(src, "Unable to remove this blob.") - return qdel(B) @@ -281,13 +264,11 @@ var/obj/effect/blob/B = locate() in T if(B) to_chat(src, "There is a blob here!") - return var/obj/effect/blob/OB = locate() in circlerange(T, 1) if(!OB) to_chat(src, "There is no blob adjacent to you.") - return if(!can_buy(5)) @@ -319,7 +300,6 @@ to_chat(src, "You rally your spores.") - var/list/surrounding_turfs = block(locate(T.x - 1, T.y - 1, T.z), locate(T.x + 1, T.y + 1, T.z)) if(!surrounding_turfs.len) return @@ -338,12 +318,10 @@ if(!blob_nodes || !blob_nodes.len) to_chat(src, "A node is required to birth your offspring...") - return var/obj/effect/blob/node/N = locate(/obj/effect/blob) in blob_nodes if(!N) to_chat(src, "A node is required to birth your offspring...") - return if(!can_buy(100)) @@ -369,7 +347,6 @@ return else to_chat(usr, "You broadcast with your minions, [speak_text]") - for(var/mob/living/simple_animal/hostile/blob_minion in blob_mobs) blob_minion.say(speak_text) return @@ -389,17 +366,14 @@ if(!B)//We are on a blob to_chat(src, "There is no blob here!") - return if(!istype(B, /obj/effect/blob/normal)) to_chat(src, "Unable to use this blob, find a normal one.") - return for(var/obj/effect/blob/storage/blob in orange(3, T)) to_chat(src, "There is a storage blob nearby, move more than 4 tiles away from it!") - return if(!can_buy(40)) @@ -433,4 +407,3 @@ BLO.adjustcolors(blob_reagent_datum.color) to_chat(src, "Your reagent is now: [blob_reagent_datum.name]!") - diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index a1cd163dc6e..1de939c40e7 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -199,7 +199,6 @@ to_chat(user, "It looks like it's of a [get_chem_name()] kind.") - /obj/effect/blob/proc/get_chem_name() for(var/mob/camera/blob/B in mob_list) if(lowertext(B.blob_reagent_datum.color) == lowertext(src.color)) // Goddamit why we use strings for these diff --git a/code/game/gamemodes/borer/borer.dm b/code/game/gamemodes/borer/borer.dm index a61e86db924..f393db5811d 100644 --- a/code/game/gamemodes/borer/borer.dm +++ b/code/game/gamemodes/borer/borer.dm @@ -19,10 +19,8 @@ /datum/game_mode/borer/announce() to_chat(world, "The current game mode is - Cortical Borer!") - to_chat(world, "An unknown creature has infested the mind of a crew member. Find and destroy it by any means necessary.") - /datum/game_mode/borer/can_start() if(!..()) return 0 @@ -103,11 +101,9 @@ if (you_are) to_chat(borer.current, "\red You are a Cortical Borer!") - var/obj_count = 1 for(var/datum/objective/objective in borer.objectives) to_chat(borer.current, "Objective #[obj_count]: [objective.explanation_text]") - obj_count++ return @@ -130,19 +126,15 @@ var/borerwin = 1 if((borer.current) && istype(borer.current,/mob/living/simple_animal/borer)) to_chat(world, "The borer was [borer.current.key].") - to_chat(world, "The last host was [borer.current:host.key].") - var/count = 1 for(var/datum/objective/objective in borer.objectives) if(objective.check_completion()) to_chat(world, "Objective #[count]: [objective.explanation_text] \green Success") - feedback_add_details("borer_objective","[objective.type]|SUCCESS") else to_chat(world, "Objective #[count]: [objective.explanation_text] \red Failed") - feedback_add_details("borer_objective","[objective.type]|FAIL") borerwin = 0 count++ @@ -152,11 +144,9 @@ if(borerwin) to_chat(world, "The borer was successful!") - feedback_add_details("borer_success","SUCCESS") else to_chat(world, "The borer has failed!") - feedback_add_details("borer_success","FAIL") return 1 diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index a66e9d4a8d9..edb40c4ca04 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -39,10 +39,8 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" /datum/game_mode/changeling/announce() to_chat(world, "The current game mode is - Changeling!") - to_chat(world, "There are alien changelings on the station. Do not let the changelings succeed!") - /datum/game_mode/changeling/pre_setup() if(config.protect_roles_from_antagonist) @@ -137,21 +135,16 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" /datum/game_mode/proc/greet_changeling(var/datum/mind/changeling, var/you_are=1) if (you_are) to_chat(changeling.current, "\red You are a changeling!") - to_chat(changeling.current, "\red Use say \":g message\" to communicate with your fellow changelings. Remember: you get all of their absorbed DNA if you absorb them.") - to_chat(changeling.current, "You must complete the following tasks:") - if (changeling.current.mind) if (changeling.current.mind.assigned_role == "Clown") to_chat(changeling.current, "You have evolved beyond your clownish nature, allowing you to wield weapons without harming yourself.") - changeling.current.mutations.Remove(CLUMSY) var/obj_count = 1 for(var/datum/objective/objective in changeling.objectives) to_chat(changeling.current, "Objective #[obj_count]: [objective.explanation_text]") - obj_count++ return @@ -165,12 +158,9 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" changeling_mind.special_role = null if(issilicon(changeling_mind)) to_chat(changeling_mind.current, "You have been robotized!") - to_chat(changeling_mind.current, "You must obey your silicon laws and master AI above all else. Your objectives will consider you to be dead.") - else to_chat(changeling_mind.current, "You lose your powers! You are no longer a changeling and are stuck in your current form!") - update_change_icons_removed(changeling_mind) /datum/game_mode/proc/update_change_icons_added(datum/mind/changeling) @@ -255,7 +245,6 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" to_chat(world, text) - return 1 /datum/changeling //stores changeling powers, changeling recharge thingie, changeling absorbed DNA and changeling ID (for changeling hivemind) @@ -312,43 +301,35 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" /datum/changeling/proc/can_absorb_dna(var/mob/living/carbon/user, var/mob/living/carbon/target) if(absorbed_dna[1] == user.dna)//If our current DNA is the stalest, we gotta ditch it. to_chat(user, "We have reached our capacity to store genetic information! We must transform before absorbing more.") - return if(!target || !target.dna) to_chat(user, "This creature does not have any DNA.") - return var/mob/living/carbon/human/T = target if(!istype(T) || issmall(T)) to_chat(user, "[T] is not compatible with our biology.") - return if((NOCLONE || SKELETON || HUSK) in T.mutations) to_chat(user, "DNA of [target] is ruined beyond usability!") - return if(T.species.flags & NO_DNA) to_chat(user, "This creature does not have DNA!") - return if(T.species.flags & NO_SCAN) to_chat(user, "We do not know how to parse this creature's DNA!") - return if(T.species.flags & NO_BLOOD) to_chat(user, "We are not able to use the DNA of a creature without a circulatory system.") - return if(has_dna(target.dna)) to_chat(user, "We already have this DNA in storage!") - return 1 diff --git a/code/game/gamemodes/changeling/changeling_power.dm b/code/game/gamemodes/changeling/changeling_power.dm index c70a7550f8c..6d03a864692 100644 --- a/code/game/gamemodes/changeling/changeling_power.dm +++ b/code/game/gamemodes/changeling/changeling_power.dm @@ -54,28 +54,22 @@ return 0 if(req_human && (!ishuman(user) || issmall(user))) to_chat(user, "We cannot do that in this form!") - return 0 var/datum/changeling/c = user.mind.changeling if(c.chem_chargesWe require at least [chemical_cost] unit\s of chemicals to do that!") - return 0 if(c.absorbedcountWe require at least [req_dna] sample\s of compatible DNA.") - return 0 if(req_stat < user.stat) to_chat(user, "We are incapacitated.") - return 0 if((user.status_flags & FAKEDEATH) && name!="Regenerate") to_chat(user, "We are incapacitated.") - return 0 if(c.geneticdamage > max_genetic_damage) to_chat(user, "Our genomes are still reassembling. We need time to recover first.") - return 0 return 1 diff --git a/code/game/gamemodes/changeling/evolution_menu.dm b/code/game/gamemodes/changeling/evolution_menu.dm index 811cb95134e..58aa2a037ab 100644 --- a/code/game/gamemodes/changeling/evolution_menu.dm +++ b/code/game/gamemodes/changeling/evolution_menu.dm @@ -308,32 +308,26 @@ var/list/sting_paths if(thepower == null) to_chat(user, "This is awkward. Changeling power purchase failed, please report this bug to a coder!") - return if(absorbedcount < thepower.req_dna) to_chat(user, "We lack the energy to evolve this ability!") - return if(has_sting(thepower)) to_chat(user, "We have already evolved this ability!") - return if(thepower.dna_cost < 0) to_chat(user, "We cannot evolve this ability.") - return if(geneticpoints < thepower.dna_cost) to_chat(user, "We have reached our capacity for abilities.") - return if(user.status_flags & FAKEDEATH)//To avoid potential exploits by buying new powers while in stasis, which clears your verblist. to_chat(user, "We lack the energy to evolve new abilities right now.") - return geneticpoints -= thepower.dna_cost @@ -344,18 +338,15 @@ var/list/sting_paths /datum/changeling/proc/lingRespec(var/mob/user) if(!ishuman(user) || issmall(user)) to_chat(user, "We can't remove our evolutions in this form!") - return if(canrespec) to_chat(user, "We have removed our evolutions from this form, and are now ready to readapt.") - user.remove_changeling_powers(1) canrespec = 0 user.make_changeling() return 1 else to_chat(user, "You lack the power to readapt your evolutions!") - return 0 /mob/proc/make_changeling() diff --git a/code/game/gamemodes/changeling/powers/absorb.dm b/code/game/gamemodes/changeling/powers/absorb.dm index 87bbf648286..6dbcc48dc2f 100644 --- a/code/game/gamemodes/changeling/powers/absorb.dm +++ b/code/game/gamemodes/changeling/powers/absorb.dm @@ -13,17 +13,14 @@ var/datum/changeling/changeling = user.mind.changeling if(changeling.isabsorbing) to_chat(user, "We are already absorbing!") - return var/obj/item/weapon/grab/G = user.get_active_hand() if(!istype(G)) to_chat(user, "We must be grabbing a creature in our active hand to absorb them.") - return if(G.state <= GRAB_NECK) to_chat(user, "We must have a tighter grip to absorb this creature.") - return var/mob/living/carbon/target = G.affecting @@ -40,31 +37,24 @@ switch(stage) if(1) to_chat(user, "This creature is compatible. We must hold still...") - if(2) to_chat(user, "We extend a proboscis.") - user.visible_message("[user] extends a proboscis!") if(3) to_chat(user, "We stab [target] with the proboscis.") - user.visible_message("[user] stabs [target] with the proboscis!") to_chat(target, "You feel a sharp stabbing pain!") - target.take_overall_damage(40) feedback_add_details("changeling_powers","A[stage]") if(!do_mob(user, target, 150)) to_chat(user, "Our absorption of [target] has been interrupted!") - changeling.isabsorbing = 0 return to_chat(user, "We have absorbed [target]!") - user.visible_message("[user] sucks the fluids from [target]!") to_chat(target, "You have been absorbed by the changeling!") - if(!changeling.has_dna(target.dna)) changeling.absorb_dna(target, user) diff --git a/code/game/gamemodes/changeling/powers/digitalcamo.dm b/code/game/gamemodes/changeling/powers/digitalcamo.dm index cbca94df6f5..bc5879f67be 100644 --- a/code/game/gamemodes/changeling/powers/digitalcamo.dm +++ b/code/game/gamemodes/changeling/powers/digitalcamo.dm @@ -9,10 +9,8 @@ if(user.digitalcamo) to_chat(user, "We return to normal.") - else to_chat(user, "We distort our form to prevent AI-tracking.") - user.digitalcamo = !user.digitalcamo feedback_add_details("changeling_powers","CAM") diff --git a/code/game/gamemodes/changeling/powers/epinephrine.dm b/code/game/gamemodes/changeling/powers/epinephrine.dm index 64c879d9d8e..4e783f111cc 100644 --- a/code/game/gamemodes/changeling/powers/epinephrine.dm +++ b/code/game/gamemodes/changeling/powers/epinephrine.dm @@ -12,10 +12,8 @@ if(user.lying) to_chat(user, "We arise.") - else to_chat(user, "Adrenaline rushes through us.") - user.stat = 0 user.SetParalysis(0) user.SetStunned(0) diff --git a/code/game/gamemodes/changeling/powers/fakedeath.dm b/code/game/gamemodes/changeling/powers/fakedeath.dm index e3435ca1d61..03ea7d14894 100644 --- a/code/game/gamemodes/changeling/powers/fakedeath.dm +++ b/code/game/gamemodes/changeling/powers/fakedeath.dm @@ -13,7 +13,6 @@ to_chat(user, "We begin our stasis, preparing energy to arise once more.") - user.status_flags |= FAKEDEATH //play dead user.update_canmove() @@ -24,7 +23,6 @@ spawn(800) if(user && user.mind && user.mind.changeling && user.mind.changeling.purchasedpowers) to_chat(user, "We are ready to regenerate.") - user.mind.changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/revive(null) feedback_add_details("changeling_powers","FD") diff --git a/code/game/gamemodes/changeling/powers/fleshmend.dm b/code/game/gamemodes/changeling/powers/fleshmend.dm index 27bdc9f5dcd..cd09cc8d764 100644 --- a/code/game/gamemodes/changeling/powers/fleshmend.dm +++ b/code/game/gamemodes/changeling/powers/fleshmend.dm @@ -9,7 +9,6 @@ //Starts healing you every second for 10 seconds. Can be used whilst unconscious. /obj/effect/proc_holder/changeling/fleshmend/sting_action(var/mob/living/user) to_chat(user, "We begin to heal rapidly.") - if(ishuman(user)) var/mob/living/carbon/human/H = user H.restore_blood() diff --git a/code/game/gamemodes/changeling/powers/headcrab.dm b/code/game/gamemodes/changeling/powers/headcrab.dm index aa8bbb1aca2..07ae44d9a9a 100644 --- a/code/game/gamemodes/changeling/powers/headcrab.dm +++ b/code/game/gamemodes/changeling/powers/headcrab.dm @@ -16,7 +16,6 @@ explosion(get_turf(user),0,0,2,0,silent=1) for(var/mob/living/carbon/human/H in range(2,user)) to_chat(H, "You are blinded by a shower of blood!") - H.Stun(1) H.eye_blurry = max(20, H.eye_blurry) var/obj/item/organ/internal/eyes/E = H.get_int_organ(/obj/item/organ/internal/eyes) @@ -25,7 +24,6 @@ H.confused += 3 for(var/mob/living/silicon/S in range(2,user)) to_chat(S, "Your sensors are disabled by a shower of blood!") - S.Weaken(3) var/turf = get_turf(user) spawn(5) // So it's not killed in explosion @@ -37,7 +35,6 @@ crab.origin.active = 1 crab.origin.transfer_to(crab) to_chat(crab, "You burst out of the remains of your former body in a shower of gore!") - user.gib() feedback_add_details("changeling_powers","LR") return 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/hivemind.dm b/code/game/gamemodes/changeling/powers/hivemind.dm index b5f45348651..1032f84635f 100644 --- a/code/game/gamemodes/changeling/powers/hivemind.dm +++ b/code/game/gamemodes/changeling/powers/hivemind.dm @@ -11,7 +11,6 @@ var/datum/changeling/changeling=user.mind.changeling changeling.changeling_speak = 1 to_chat(user, "Use say \":g message\" to communicate with the other changelings.") - var/obj/effect/proc_holder/changeling/hivemind_upload/S1 = new if(!changeling.has_sting(S1)) changeling.purchasedpowers+=S1 @@ -38,7 +37,6 @@ var/list/datum/dna/hivemind_bank = list() if(names.len <= 0) to_chat(user, "The airwaves already have all of our DNA.") - return var/chosen_name = input("Select a DNA to channel: ", "Channel DNA", null) as null|anything in names @@ -51,7 +49,6 @@ var/list/datum/dna/hivemind_bank = list() hivemind_bank += chosen_dna to_chat(user, "We channel the DNA of [chosen_name] to the air.") - feedback_add_details("changeling_powers","HU") return 1 @@ -67,7 +64,6 @@ var/list/datum/dna/hivemind_bank = list() var/datum/changeling/changeling = user.mind.changeling if(changeling.absorbed_dna[1] == user.dna)//If our current DNA is the stalest, we gotta ditch it. to_chat(user, "We have reached our capacity to store genetic information! We must transform before absorbing more.") - return return 1 @@ -80,7 +76,6 @@ var/list/datum/dna/hivemind_bank = list() if(names.len <= 0) to_chat(user, "There's no new DNA to absorb from the air.") - return var/S = input("Select a DNA absorb from the air: ", "Absorb DNA", null) as null|anything in names @@ -93,6 +88,5 @@ var/list/datum/dna/hivemind_bank = list() changeling.absorbed_dna.Cut(1,2) changeling.store_dna(chosen_dna, user) to_chat(user, "We absorb the DNA of [S] from the air.") - feedback_add_details("changeling_powers","HD") return 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/humanform.dm b/code/game/gamemodes/changeling/powers/humanform.dm index e0edffe1889..e587a7db0ab 100644 --- a/code/game/gamemodes/changeling/powers/humanform.dm +++ b/code/game/gamemodes/changeling/powers/humanform.dm @@ -24,7 +24,6 @@ if(!user) return 0 to_chat(user, "We transform our appearance.") - user.dna.SetSEState(MONKEYBLOCK,0) domutcheck(user, null) // Do a pre-mutcheck to cleanly switch from monkey form. user.dna = chosen_dna diff --git a/code/game/gamemodes/changeling/powers/lesserform.dm b/code/game/gamemodes/changeling/powers/lesserform.dm index f533cdd7696..ea22ba5800a 100644 --- a/code/game/gamemodes/changeling/powers/lesserform.dm +++ b/code/game/gamemodes/changeling/powers/lesserform.dm @@ -13,20 +13,17 @@ return 0 if(user.has_brain_worms()) to_chat(user, "We cannot perform this ability at the present time!") - return var/mob/living/carbon/human/H = user if(!istype(H) || !H.species.primitive_form) to_chat(src, "We cannot perform this ability in this form!") - return H.visible_message("[H] transforms!") changeling.geneticdamage = 30 to_chat(H, "Our genes cry out!") - var/list/implants = list() //Try to preserve implants. for(var/obj/item/weapon/implant/W in H) implants += W diff --git a/code/game/gamemodes/changeling/powers/mimic_voice.dm b/code/game/gamemodes/changeling/powers/mimic_voice.dm index 797c97f0ae0..21693a84c3a 100644 --- a/code/game/gamemodes/changeling/powers/mimic_voice.dm +++ b/code/game/gamemodes/changeling/powers/mimic_voice.dm @@ -14,7 +14,6 @@ changeling.mimicing = "" changeling.chem_recharge_slowdown -= 0.5 to_chat(user, "We return our vocal glands to their original position.") - return var/mimic_voice = stripped_input(user, "Enter a name to mimic.", "Mimic Voice", null, MAX_NAME_LEN) @@ -24,8 +23,6 @@ changeling.mimicing = mimic_voice changeling.chem_recharge_slowdown += 0.5 to_chat(user, "We shape our glands to take the voice of [mimic_voice], this will stop us from regenerating chemicals while active.") - to_chat(user, "Use this power again to return to our original voice and reproduce chemicals again.") - feedback_add_details("changeling_powers","MV") diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm index c69e66e5c6f..d11099627a6 100644 --- a/code/game/gamemodes/changeling/powers/mutations.dm +++ b/code/game/gamemodes/changeling/powers/mutations.dm @@ -36,7 +36,6 @@ /obj/effect/proc_holder/changeling/weapon/sting_action(var/mob/user) if(!user.drop_item()) to_chat(user, "The [user.get_active_hand()] is stuck to your hand, you cannot grow a [weapon_name_simple] over it!") - return var/obj/item/W = new weapon_type(user) user.put_in_hands(W) @@ -87,11 +86,9 @@ /obj/effect/proc_holder/changeling/suit/sting_action(var/mob/living/carbon/human/user) if(!user.unEquip(user.wear_suit)) to_chat(user, "\the [user.wear_suit] is stuck to your body, you cannot grow a [suit_name_simple] over it!") - return if(!user.unEquip(user.head)) to_chat(user, "\the [user.head] is stuck on your head, you cannot grow a [helmet_name_simple] over it!") - return user.unEquip(user.head) @@ -164,12 +161,10 @@ if(A.arePowerSystemsOn()) to_chat(user, "The airlock's motors resist our efforts to force it.") - return else if(A.locked) to_chat(user, "The airlock's bolts prevent it from being forced.") - return else diff --git a/code/game/gamemodes/changeling/powers/panacea.dm b/code/game/gamemodes/changeling/powers/panacea.dm index 45664d88318..dd15a313701 100644 --- a/code/game/gamemodes/changeling/powers/panacea.dm +++ b/code/game/gamemodes/changeling/powers/panacea.dm @@ -11,7 +11,6 @@ to_chat(user, "We cleanse impurities from our form.") - var/obj/item/organ/internal/body_egg/egg = user.get_int_organ(/obj/item/organ/internal/body_egg) if(egg) egg.remove(user) diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm index 30dbea23d86..6150da027ca 100644 --- a/code/game/gamemodes/changeling/powers/revive.dm +++ b/code/game/gamemodes/changeling/powers/revive.dm @@ -63,7 +63,6 @@ H.updatehealth() to_chat(user, "We have regenerated.") - user.regenerate_icons() user.status_flags &= ~(FAKEDEATH) diff --git a/code/game/gamemodes/changeling/powers/shriek.dm b/code/game/gamemodes/changeling/powers/shriek.dm index 006694aa394..c983b844321 100644 --- a/code/game/gamemodes/changeling/powers/shriek.dm +++ b/code/game/gamemodes/changeling/powers/shriek.dm @@ -18,10 +18,8 @@ else to_chat(M, sound('sound/effects/screech.ogg')) - if(issilicon(M)) to_chat(M, sound('sound/weapons/flash.ogg')) - M.Weaken(rand(5,10)) for(var/obj/machinery/light/L in range(4, user)) diff --git a/code/game/gamemodes/changeling/powers/strained_muscles.dm b/code/game/gamemodes/changeling/powers/strained_muscles.dm index 92807305c4c..92cf9ad7fdf 100644 --- a/code/game/gamemodes/changeling/powers/strained_muscles.dm +++ b/code/game/gamemodes/changeling/powers/strained_muscles.dm @@ -15,14 +15,11 @@ active = !active if(active) to_chat(user, "Our muscles tense and strengthen.") - else user.status_flags &= ~GOTTAGOFAST to_chat(user, "Our muscles relax.") - if(stacks >= 10) to_chat(user, "We collapse in exhaustion.") - user.Weaken(3) user.emote("gasp") @@ -31,7 +28,6 @@ if(user.stat || user.staminaloss >= 90) active = 0 //Let's use something exact instead of !active where we can. to_chat(user, "Our muscles relax without the energy to strengthen them.") - user.status_flags &= ~GOTTAGOFAST user.Weaken(2) user.emote("gasp") @@ -44,7 +40,6 @@ if(stacks == 11) //Warning message that the stacks are getting too high to_chat(user, "Our legs are really starting to hurt...") - sleep(40) while(!active) //Damage stacks decrease fairly rapidly while not in sanic mode diff --git a/code/game/gamemodes/changeling/powers/swap_form.dm b/code/game/gamemodes/changeling/powers/swap_form.dm index bcc12d004f7..ad8b9381dff 100644 --- a/code/game/gamemodes/changeling/powers/swap_form.dm +++ b/code/game/gamemodes/changeling/powers/swap_form.dm @@ -12,16 +12,13 @@ var/obj/item/weapon/grab/G = user.get_active_hand() if(!istype(G) || (G.state < GRAB_AGGRESSIVE)) to_chat(user, "We must have an aggressive grab on creature in our active hand to do this!") - return var/mob/living/carbon/human/target = G.affecting if((NOCLONE || SKELETON || HUSK) in target.mutations) to_chat(user, "DNA of [target] is ruined beyond usability!") - return if(!istype(target) || issmall(target) || target.species.flags & NO_DNA || target.species.flags & NO_SCAN || target.species.flags & NO_BLOOD) to_chat(user, "[target] is not compatible with this ability.") - return return 1 @@ -32,18 +29,15 @@ var/datum/changeling/changeling = user.mind.changeling to_chat(user, "We tighen our grip. We must hold still....") - target.do_jitter_animation(500) user.do_jitter_animation(500) if(!do_mob(user,target,20)) to_chat(user, "The body swap has been interrupted!") - return to_chat(target, "[user] tightens their grip as a painful sensation invades your body.") - if(!changeling.has_dna(target.dna)) changeling.absorb_dna(target, user) changeling.protected_dna -= user.dna @@ -59,4 +53,3 @@ user.remove_language("Changeling") target.add_language("Changeling") to_chat(target, "Our genes cry out as we swap our [user] form for [target].") - diff --git a/code/game/gamemodes/changeling/powers/tiny_prick.dm b/code/game/gamemodes/changeling/powers/tiny_prick.dm index a274d1f99d1..6f93554766e 100644 --- a/code/game/gamemodes/changeling/powers/tiny_prick.dm +++ b/code/game/gamemodes/changeling/powers/tiny_prick.dm @@ -15,14 +15,12 @@ /obj/effect/proc_holder/changeling/sting/proc/set_sting(var/mob/user) to_chat(user, "We prepare our sting, use alt+click or middle mouse button on target to sting them.") - user.mind.changeling.chosen_sting = src user.hud_used.lingstingdisplay.icon_state = sting_icon user.hud_used.lingstingdisplay.invisibility = 0 /obj/effect/proc_holder/changeling/sting/proc/unset_sting(var/mob/user) to_chat(user, "We retract our sting, we can't sting anyone for now.") - user.mind.changeling.chosen_sting = null user.hud_used.lingstingdisplay.icon_state = null user.hud_used.lingstingdisplay.invisibility = 101 @@ -36,14 +34,12 @@ return if(!user.mind.changeling.chosen_sting) to_chat(user, "We haven't prepared our sting yet!") - if(!iscarbon(target)) return if(ishuman(target)) var/mob/living/carbon/human/H = target if(H.isSynthetic()) to_chat(user, "This won't work on synthetics.") - return if(!isturf(user.loc)) return @@ -59,10 +55,8 @@ if(!target) return to_chat(user, "We stealthily sting [target.name].") - if(target.mind && target.mind.changeling) to_chat(target, "You feel a tiny prick.") - add_logs(target, user, "unsuccessfully stung") return 1 @@ -92,17 +86,14 @@ return if((HUSK in target.mutations) || (!ishuman(target))) to_chat(user, "Our sting appears ineffective against its DNA.") - return 0 if(ishuman(target)) var/mob/living/carbon/human/H = target if(H.species.flags & NO_SCAN) //Prevents transforming slimes and killing them instantly to_chat(user, "This won't work on a creature with abnormal genetic material.") - return 0 if(H.species.flags & NO_BLOOD) to_chat(user, "This won't work on a creature without a circulatory system.") - return 0 return 1 @@ -112,7 +103,6 @@ if(issmall(target)) to_chat(user, "Our genes cry out as we sting [target.name]!") - if(iscarbon(target) && (target.status_flags & CANWEAKEN)) var/mob/living/carbon/C = target C.do_jitter_animation(500) @@ -174,7 +164,6 @@ obj/effect/proc_holder/changeling/sting/blind /obj/effect/proc_holder/changeling/sting/blind/sting_action(var/mob/user, var/mob/target) add_logs(target, user, "stung", object="blind sting") to_chat(target, "Your eyes burn horrifically!") - target.disabilities |= NEARSIGHTED target.eye_blind = 20 target.eye_blurry = 40 diff --git a/code/game/gamemodes/changeling/traitor_chan.dm b/code/game/gamemodes/changeling/traitor_chan.dm index 611888d3722..06a296fcf81 100644 --- a/code/game/gamemodes/changeling/traitor_chan.dm +++ b/code/game/gamemodes/changeling/traitor_chan.dm @@ -11,11 +11,9 @@ /datum/game_mode/traitor/changeling/announce() to_chat(world, "The current game mode is - Traitor+Changeling!") - to_chat(world, "There is an alien creature on the station along with some syndicate operatives out for their own gain! Do not let the changeling and the traitors succeed!") - /datum/game_mode/traitor/changeling/pre_setup() if(config.protect_roles_from_antagonist) restricted_jobs += protected_jobs diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index d700a29cf27..daf93b73799 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -55,11 +55,9 @@ /datum/game_mode/cult/announce() to_chat(world, "The current game mode is - Cult!") - to_chat(world, "Some crewmembers are attempting to start a cult!
      \nCultists - complete your objectives. Convert crewmembers to your cause by using the convert rune. Remember - there is no you, there is only the cult.
      \nPersonnel - Do not let the cult succeed in its mission. Brainwashing them with the chaplain's bible reverts them to whatever CentComm-allowed faith they had.
      ") - /datum/game_mode/cult/pre_setup() if(prob(50)) objectives += "survive" @@ -101,7 +99,6 @@ grant_runeword(cult_mind.current) update_cult_icons_added(cult_mind) to_chat(cult_mind.current, "\blue You are a member of the cult!") - memorize_cult_objectives(cult_mind) ..() @@ -121,10 +118,8 @@ if("eldergod") explanation = "Summon Nar-Sie via the use of the appropriate rune (Hell join self). It will only work if nine cultists stand on and around it." to_chat(cult_mind.current, "Objective #[obj_count]: [explanation]") - cult_mind.memory += "Objective #[obj_count]: [explanation]
      " to_chat(cult_mind.current, "The convert rune is join blood self") - cult_mind.memory += "The convert rune is join blood self
      " @@ -135,7 +130,6 @@ if (mob.mind) if (mob.mind.assigned_role == "Clown") to_chat(mob, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.") - mob.mutations.Remove(CLUMSY) add_cult_viewpoint(mob) // give them a viewpoint @@ -151,10 +145,8 @@ var/where = mob.equip_in_one_of_slots(T, slots) if (!where) to_chat(mob, "Unfortunately, you weren't able to get a talisman. This is very bad and you should adminhelp immediately.") - else to_chat(mob, "You have a talisman in your [where], one that will help you start the cult on this station. Use it well and remember - there are others.") - mob.update_icons() return 1 @@ -174,7 +166,6 @@ word=pick(allwords) var/wordexp = "[cultwords[word]] is [word]..." to_chat(cult_mob, "\red [pick("You remember something from the dark teachings of your master","You hear a dark voice on the wind","Black blood oozes into your vision and forms into symbols","You have a vision of a [pick("crow","raven","vulture","parrot")] it squawks","You catch a brief glimmer of the otherside")]... [wordexp]") - cult_mob.mind.store_memory("You remember that [wordexp]", 0, 0) @@ -209,7 +200,6 @@ if(cult_mind in cult) cult -= cult_mind to_chat(cult_mind.current, "\red An unfamiliar white light flashes through your mind, cleansing the taint of the dark-one and the memories of your time as his servant with it.") - cult_mind.memory = "" cult_mind.special_role = null // remove the cult viewpoint object @@ -222,7 +212,6 @@ to_chat(M, "[cult_mind.current] looks like they just reverted to their old faith!") - /datum/game_mode/proc/add_cult_icon_to_spirit(mob/spirit/currentSpirit) if(!istype(currentSpirit)) return FALSE @@ -307,13 +296,11 @@ feedback_set_details("round_end_result","win - cult win") feedback_set("round_end_result",acolytes_survived) to_chat(world, "\red The cult wins! It has succeeded in serving its dark masters!") - else feedback_set_details("round_end_result","loss - staff stopped the cult") feedback_set("round_end_result",acolytes_survived) to_chat(world, "\red The staff managed to stop the cult!") - var/text = "Cultists escaped: [acolytes_survived]" if(objectives.len) @@ -349,7 +336,6 @@ text += "
      Objective #[obj_count]: [explanation]" to_chat(world, text) - ..() return 1 @@ -372,4 +358,3 @@ text += ")" to_chat(world, text) - diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index c7f71cdd5c7..60803346b26 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -16,7 +16,6 @@ else user.Paralyse(5) to_chat(user, "\red An unexplicable force powerfully repels the sword from [target]!") - var/organ = ((user.hand ? "l_":"r_") + "arm") var/obj/item/organ/external/affecting = user.get_organ(organ) if(affecting.take_damage(rand(force/2, force))) //random amount of damage between half of the blade's force and the full force of the blade. @@ -26,7 +25,6 @@ /obj/item/weapon/melee/cultblade/pickup(mob/living/user as mob) if(!iscultist(user)) to_chat(user, "\red An overwhelming feeling of dread comes over you as you pick up the cultist's sword. It would be wise to be rid of this blade quickly.") - user.Dizzy(120) diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index 8968220d0f2..2e7dd25452a 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -14,7 +14,6 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", for (var/word in engwords) to_chat(usr, "[cultwords[word]] is [word]") - /proc/runerandom() //randomizes word meaning var/list/runewords=list("ire","ego","nahlizet","certum","veri","jatkaa","mgar","balaq", "karazet", "geeri") ///"orkan" and "allaq" removed. for (var/word in engwords) @@ -83,25 +82,20 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", ..(user) if(!iscultist(user) && !isSpirit(user)) to_chat(user, "A strange collection of symbols drawn in blood.") - return if(!desc) to_chat(user, "A spell circle drawn in blood. It reads: [word1] [word2] [word3].") - else to_chat(user, "Explosive Runes inscription in blood. It reads: [desc].") - /obj/effect/rune/attackby(I as obj, user as mob, params) if(istype(I, /obj/item/weapon/tome) && iscultist(user)) to_chat(user, "You retrace your steps, carefully undoing the lines of the rune.") - qdel(src) return else if(istype(I, /obj/item/weapon/nullrod)) to_chat(user, "\blue You disrupt the vile magic with the deadening field of \the [I]!") - qdel(src) return return @@ -145,15 +139,12 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", /obj/effect/rune/attack_hand(mob/living/user as mob) if(!iscultist(user)) to_chat(user, "You can't mouth the arcane scratchings without fumbling over them.") - return if(istype(user.wear_mask, /obj/item/clothing/mask/muzzle)) to_chat(user, "You are unable to speak the words of the rune.") - return if(user.silent) // checking if we've been muted somehow to_chat(user, "You are unable to speak at all! You cannot say the words of the rune.") - if(!word1 || !word2 || !word3 || prob(user.getBrainLoss())) return fizzle() @@ -318,7 +309,6 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", // proc/edit_notes() FUCK IT. Cant get it to work properly. - K0000 // to_chat(world, "its been called! [usr]") - // notedat = {" //
      Word translation notes
      // [words[1]] is [words[words[1]]] Clear
      @@ -333,7 +323,6 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", // [words[10]] is [words[words[10]]] Clear
      // "} // to_chat(usr, "whatev") - // usr << browse(null, "window=tank") attack(mob/living/M as mob, mob/living/user as mob) @@ -359,7 +348,6 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", if(iscultist(M)) if(M.reagents && M.reagents.has_reagent("holywater")) //allows cultists to be rescued from the clutches of ordained religion to_chat(user, "You remove the taint from [M].") - var/holy2unholy = M.reagents.get_reagent_amount("holywater") M.reagents.del_reagent("holywater") M.reagents.add_reagent("unholywater",holy2unholy) @@ -371,7 +359,6 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", to_chat(M, "\red You feel searing heat inside!") - attack_self(mob/living/user as mob) usr = user if(!usr.canmove || usr.stat || usr.restrained()) @@ -385,7 +372,6 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", C++ if (!istype(user.loc,/turf)) to_chat(user, "\red You do not have enough space to write a proper rune.") - return @@ -473,7 +459,6 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", return if (chosen_rune == "none") to_chat(user, "\red You decide against scribing a rune, perhaps you should take this time to study your notes.") - return if (chosen_rune == "teleport") dictionary[chosen_rune] += input ("Choose a destination word") in english @@ -486,7 +471,6 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", for (var/mob/V in viewers(src)) V.show_message("\red [user] slices open a finger and begins to chant and paint symbols on the floor.", 3, "\red You hear chanting.", 2) to_chat(user, "\red You slice open one of your fingers and begin drawing a rune on the floor whilst chanting the ritual that binds your life essence with the dark arcane energies flowing through the surrounding world.") - user.take_overall_damage((rand(9)+1)/10) // 0.1 to 1.0 damage if(do_after(user, 50, target = user)) if(usr.get_active_hand() != src) @@ -494,7 +478,6 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", var/mob/living/carbon/human/H = user var/obj/effect/rune/R = new /obj/effect/rune(user.loc) to_chat(user, "\red You finish drawing the arcane markings of the Geometer.") - var/list/required = dictionary[chosen_rune] R.word1 = english[required[1]] R.word2 = english[required[2]] @@ -506,7 +489,6 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", return else to_chat(user, "The book seems full of illegible scribbles. Is this a joke?") - return attackby(obj/item/weapon/tome/T as obj, mob/living/user as mob, params) @@ -524,15 +506,12 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", to_chat(user, "You copy the translation notes from your tome.") - examine(mob/user) if(!iscultist(user)) to_chat(user, "An old, dusty tome with frayed edges and a sinister looking cover.") - else to_chat(user, "The scriptures of Nar-Sie, The One Who Sees, The Geometer of Blood. Contains the details of every ritual his followers could think of. Most of these are useless, though.") - /obj/item/weapon/tome/imbued //admin tome, spawns working runes without waiting w_class = 2.0 var/cultistsonly = 1 @@ -545,7 +524,6 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", var/r if (!istype(user.loc,/turf)) to_chat(user, "\red You do not have enough space to write a proper rune.") - var/list/runes = list("teleport", "itemport", "tome", "armor", "convert", "tear in reality", "emp", "drain", "seer", "raise", "obscure", "reveal", "astral journey", "manifest", "imbue talisman", "sacrifice", "wall", "freedom", "cultsummon", "deafen", "blind", "bloodboil", "communicate", "stun") r = input("Choose a rune to scribe", "Rune Scribing") in runes //not cancellable. var/obj/effect/rune/R = new /obj/effect/rune diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index f6b2bb4ef3d..c409449dbe4 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -20,7 +20,6 @@ var/list/sacrificed = list() allrunesloc[index] = R.loc if(index >= 5) to_chat(user, "\red You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric") - if (istype(user, /mob/living)) user.take_overall_damage(5, 0) qdel(src) @@ -59,7 +58,6 @@ var/list/sacrificed = list() runecount++ if(runecount >= 2) to_chat(user, "\red You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric") - if (istype(user, /mob/living)) user.take_overall_damage(5, 0) qdel(src) @@ -117,15 +115,11 @@ var/list/sacrificed = list() ticker.mode.add_cultist(M.mind) M.mind.special_role = "Cultist" to_chat(M, "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.") - to_chat(M, "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.") - return 1 else to_chat(M, "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.") - to_chat(M, "And you were able to force it out of your mind. You now know the truth, there's something horrible out there, stop it and its minions at all costs.") - return 0 return fizzle() @@ -178,7 +172,6 @@ var/list/sacrificed = list() cult_log("[key_name_admin(usr)] has drained blood from [key_name_admin(D)]") var/bdrain = rand(1,25) to_chat(D, "\red You feel weakened.") - D.take_overall_damage(bdrain, 0) drain += bdrain if(!drain) @@ -220,18 +213,15 @@ var/list/sacrificed = list() if(usr.seer==1) usr.say("Rash'tla sektath mal[pick("'","`")]zua. Zasan therium viortia.") to_chat(usr, "\red The world beyond fades from your vision.") - usr.see_invisible = SEE_INVISIBLE_LIVING usr.seer = 0 else if(usr.see_invisible!=SEE_INVISIBLE_LIVING) to_chat(usr, "\red The world beyond flashes your eyes but disappears quickly, as if something is disrupting your vision.") - usr.see_invisible = SEE_INVISIBLE_OBSERVER usr.seer = 0 else usr.say("Rash'tla sektath mal[pick("'","`")]zua. Zasan therium vivira. Itonis al'ra matum!") to_chat(usr, "\red The world beyond opens to your eyes.") - usr.see_invisible = SEE_INVISIBLE_OBSERVER usr.seer = 1 return @@ -256,7 +246,6 @@ var/list/sacrificed = list() if(!corpse_to_raise) if(is_sacrifice_target) to_chat(usr, "\red The Geometer of blood wants this mortal for himself.") - return fizzle() @@ -275,10 +264,8 @@ var/list/sacrificed = list() if(!body_to_sacrifice) if (is_sacrifice_target) to_chat(usr, "\red The Geometer of blood wants that corpse for himself.") - else to_chat(usr, "\red The sacrifical corpse is not dead. You must free it from this world of illusions before it may be used.") - return fizzle() var/mob/dead/observer/ghost @@ -290,7 +277,6 @@ var/list/sacrificed = list() if(!ghost) to_chat(usr, "\red You require a restless spirit which clings to this world. Beckon their prescence with the sacred chants of Nar-Sie.") - return fizzle() corpse_to_raise.revive() @@ -312,9 +298,7 @@ var/list/sacrificed = list() // ticker.mode.cult |= corpse_to_raise.mind to_chat(corpse_to_raise, "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.") - to_chat(corpse_to_raise, "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.") - return @@ -340,7 +324,6 @@ var/list/sacrificed = list() else usr.whisper("Kla[pick("'","`")]atu barada nikt'o!") to_chat(usr, "\red Your talisman turns into gray dust, veiling the surrounding runes.") - for (var/mob/V in orange(1,src)) if(V!=usr) V.show_message("\red Dust emanates from [usr]'s hands for a moment.", 3) @@ -419,10 +402,8 @@ var/list/sacrificed = list() D.mind.special_role = "Cultist" to_chat(D, "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.") - to_chat(D, "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.") - var/mob/living/user = usr while(this_rune && user && user.stat==CONSCIOUS && user.client && user.loc==this_rune.loc) user.take_organ_damage(1, 0) @@ -452,7 +433,6 @@ var/list/sacrificed = list() if (!newtalisman) if (unsuitable_newtalisman) to_chat(usr, "\red The blank is tainted. It is unsuitable.") - return fizzle() var/obj/effect/rune/imbued_from @@ -561,7 +541,6 @@ var/list/sacrificed = list() return 0 to_chat(F, "[time2text(world.timeofday,"hh:mm")] \ref[usr] ([usr.x],[usr.y],[usr.z]) || [usr] communicates: [input]
      ") - var/obj/cult_viewpoint/vp = getCultViewpoint(usr) if (!vp) return 0 @@ -584,12 +563,10 @@ var/list/sacrificed = list() if (H.current) to_chat(H.current, "[cultName]: [input]") - for(var/mob/spirit/spirit in spirits) to_chat(spirit, "[displayName]: [input]") - for(var/mob/dead/observer/G in player_list) G.show_message("[displayName] ([cultName]) ([ghost_follow_link(usr, ghost=G)]): [input]") @@ -629,22 +606,17 @@ var/list/sacrificed = list() else H.gib() to_chat(usr, "\red The Geometer of Blood accepts this sacrifice, your objective is now complete.") - else to_chat(usr, "\red Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual.") - else if(cultsinrange.len >= 3) if(H.stat !=2) if(prob(80)) to_chat(usr, "\red The Geometer of Blood accepts this sacrifice.") - ticker.mode:grant_runeword(usr) else to_chat(usr, "\red The Geometer of blood accepts this sacrifice.") - to_chat(usr, "\red However, this soul was not enough to gain His favor.") - if(isrobot(H)) H.dust()//To prevent the MMI from remaining else @@ -652,13 +624,10 @@ var/list/sacrificed = list() else if(prob(40)) to_chat(usr, "\red The Geometer of blood accepts this sacrifice.") - ticker.mode:grant_runeword(usr) else to_chat(usr, "\red The Geometer of blood accepts this sacrifice.") - to_chat(usr, "\red However, a mere dead body is not enough to satisfy Him.") - if(isrobot(H)) H.dust()//To prevent the MMI from remaining else @@ -666,17 +635,13 @@ var/list/sacrificed = list() else if(H.stat !=2) to_chat(usr, "\red The victim is still alive, you will need more cultists chanting for the sacrifice to succeed.") - else if(prob(40)) to_chat(usr, "\red The Geometer of blood accepts this sacrifice.") - ticker.mode:grant_runeword(usr) else to_chat(usr, "\red The Geometer of blood accepts this sacrifice.") - to_chat(usr, "\red However, a mere dead body is not enough to satisfy Him.") - if(isrobot(H)) H.dust()//To prevent the MMI from remaining else @@ -686,13 +651,10 @@ var/list/sacrificed = list() if(H.stat !=2) if(prob(80)) to_chat(usr, "\red The Geometer of Blood accepts this sacrifice.") - ticker.mode:grant_runeword(usr) else to_chat(usr, "\red The Geometer of blood accepts this sacrifice.") - to_chat(usr, "\red However, this soul was not enough to gain His favor.") - if(isrobot(H)) H.dust()//To prevent the MMI from remaining else @@ -700,13 +662,10 @@ var/list/sacrificed = list() else if(prob(40)) to_chat(usr, "\red The Geometer of blood accepts this sacrifice.") - ticker.mode:grant_runeword(usr) else to_chat(usr, "\red The Geometer of blood accepts this sacrifice.") - to_chat(usr, "\red However, a mere dead body is not enough to satisfy Him.") - if(isrobot(H)) H.dust()//To prevent the MMI from remaining else @@ -714,17 +673,13 @@ var/list/sacrificed = list() else if(H.stat !=2) to_chat(usr, "\red The victim is still alive, you will need more cultists chanting for the sacrifice to succeed.") - else if(prob(40)) to_chat(usr, "\red The Geometer of blood accepts this sacrifice.") - ticker.mode:grant_runeword(usr) else to_chat(usr, "\red The Geometer of blood accepts this sacrifice.") - to_chat(usr, "\red However, a mere dead body is not enough to satisfy Him.") - if(isrobot(H)) H.dust()//To prevent the MMI from remaining else @@ -756,7 +711,6 @@ var/list/sacrificed = list() if(S) if(istype(W,/obj/item/weapon/storage/bible)) to_chat(usr, "\red Arcane markings suddenly glow from underneath a thin layer of dust!") - return if(istype(W,/obj/effect/rune)) usr.say("Nikt[pick("'","`")]o barada kla'atu!") @@ -767,7 +721,6 @@ var/list/sacrificed = list() if(istype(W,/obj/item/weapon/paper/talisman)) usr.whisper("Nikt[pick("'","`")]o barada kla'atu!") to_chat(usr, "\red Your talisman turns into red dust, revealing the surrounding runes.") - for (var/mob/V in orange(1,usr.loc)) if(V!=usr) V.show_message("\red Red dust emanates from [usr]'s hands for a moment.", 3) @@ -788,10 +741,8 @@ var/list/sacrificed = list() user.take_organ_damage(2, 0) if(src.density) to_chat(usr, "\red Your blood flows into the rune, and you feel that the very space over the rune thickens.") - else to_chat(usr, "\red Your blood flows into the rune, and you feel as the rune releases its grasp on space.") - return /////////////////////////////////////////EIGHTTEENTH RUNE @@ -820,7 +771,6 @@ var/list/sacrificed = list() (istype(cultist.loc, /obj/machinery/dna_scannernew)&&cultist.loc:locked) \ )) to_chat(user, "\red The [cultist] is already free.") - return cultist.buckled = null if (cultist.handcuffed) @@ -865,7 +815,6 @@ var/list/sacrificed = list() return if(cultist.buckled || cultist.handcuffed || (!isturf(cultist.loc) && !istype(cultist.loc, /obj/structure/closet))) to_chat(user, "\red You cannot summon the [cultist], for his shackles of blood are strong") - return fizzle() cultist.loc = src.loc cultist.lying = 1 @@ -899,7 +848,6 @@ var/list/sacrificed = list() if(affected) usr.say("Sti[pick("'","`")] kaliedir!") to_chat(usr, "\red The world becomes quiet as the deafening rune dissipates into fine dust.") - qdel(src) else return fizzle() @@ -918,7 +866,6 @@ var/list/sacrificed = list() if(affected) usr.whisper("Sti[pick("'","`")] kaliedir!") to_chat(usr, "\red Your talisman turns into gray dust, deafening everyone around.") - for (var/mob/V in orange(1,src)) if(!(iscultist(V))) V.show_message("\red Dust flows from [usr]'s hands for a moment, and the world suddenly becomes quiet..", 3) @@ -944,7 +891,6 @@ var/list/sacrificed = list() if(affected) usr.say("Sti[pick("'","`")] kaliesin!") to_chat(usr, "\red The rune flashes, blinding those who not follow the Nar-Sie, and dissipates into fine dust.") - qdel(src) else return fizzle() @@ -964,7 +910,6 @@ var/list/sacrificed = list() if(affected) usr.whisper("Sti[pick("'","`")] kaliesin!") to_chat(usr, "\red Your talisman turns into gray dust, blinding those who not follow the Nar-Sie.") - return @@ -990,7 +935,6 @@ var/list/sacrificed = list() cult_log(": Blood Boil damaged [key_name_admin(M)].") M.take_overall_damage(51,51) to_chat(M, "\red Your blood boils!") - if(prob(5)) spawn(5) M.gib() @@ -1020,10 +964,8 @@ var/list/sacrificed = list() M.take_overall_damage(0,15) if (R.invisibility>M.see_invisible) to_chat(M, "\red Aargh it burns!") - else to_chat(M, "\red Rune suddenly ignites, burning you!") - var/turf/T = get_turf(R) T.hotspot_expose(700,125) for(var/obj/effect/decal/cleanable/blood/B in world) @@ -1031,7 +973,6 @@ var/list/sacrificed = list() for(var/mob/living/M in orange(1,B)) M.take_overall_damage(0,5) to_chat(M, "\red Blood suddenly ignites, burning you!") - var/turf/T = get_turf(B) T.hotspot_expose(700,125) qdel(B) diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm index ba5758516fc..fe1ac8757a9 100644 --- a/code/game/gamemodes/cult/talisman.dm +++ b/code/game/gamemodes/cult/talisman.dm @@ -29,7 +29,6 @@ call(/obj/effect/rune/proc/blind)() if("runestun") to_chat(user, "\red To use this talisman, attack your target directly.") - return if("supply") supply() @@ -40,7 +39,6 @@ return else to_chat(user, "You see strange symbols on the paper. Are they supposed to mean something?") - return @@ -102,10 +100,8 @@ var/where = M.equip_in_one_of_slots(T, slots) if (!where) to_chat(M, "You need a space in your backpack, pocket or hand for the new paper.") - else to_chat(M, "The [href_list["rune"]] talisman in your [where]") - M.update_icons() src.uses-- supply() @@ -127,10 +123,8 @@ var/where = M.equip_in_one_of_slots(T, slots) if (!where) to_chat(M, "You need a space in your backpack, pocket or hand for the new paper.") - else to_chat(M, "The [href_list["rune"]] talisman in your [where]") - M.update_icons() src.uses-- supply() @@ -150,10 +144,8 @@ var/where = M.equip_in_one_of_slots(T, slots) if (!where) to_chat(M, "You need a space in your backpack, pocket or hand for the new paper.") - else to_chat(M, "The [href_list["rune"]] talisman in your [where]") - M.update_icons() src.uses-- supply() @@ -173,10 +165,8 @@ var/where = M.equip_in_one_of_slots(T, slots) if (!where) to_chat(M, "You need a space in your backpack, pocket or hand for the new paper.") - else to_chat(M, "The [href_list["rune"]] talisman in your [where]") - M.update_icons() src.uses-- supply() @@ -196,10 +186,8 @@ var/where = M.equip_in_one_of_slots(T, slots) if (!where) to_chat(M, "You need a space in your backpack, pocket or hand for the new paper.") - else to_chat(M, "The [href_list["rune"]] talisman in your [where]") - M.update_icons() src.uses-- supply() @@ -219,10 +207,8 @@ var/where = M.equip_in_one_of_slots(T, slots) if (!where) to_chat(M, "You need a space in your backpack, pocket or hand for the new paper.") - else to_chat(M, "The [href_list["rune"]] talisman in your [where]") - M.update_icons() src.uses-- supply() @@ -242,10 +228,8 @@ var/where = M.equip_in_one_of_slots(T, slots) if (!where) to_chat(M, "You need a space in your backpack, pocket or hand for the new paper.") - else to_chat(M, "The [href_list["rune"]] talisman in your [where]") - M.update_icons() src.uses-- supply() diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm index fc4fd27df54..3f81eb18586 100644 --- a/code/game/gamemodes/events.dm +++ b/code/game/gamemodes/events.dm @@ -28,7 +28,6 @@ for(var/mob/M in player_list) to_chat(M, sound('sound/AI/aliens.ogg')) - /proc/lightsout(isEvent = 0, lightsoutAmount = 1,lightsoutRange = 25) //leave lightsoutAmount as 0 to break ALL lights if(isEvent) command_announcement.Announce("An Electrical storm has been detected in your area, please repair potential electronic overloads.","Electrical Storm Alert") diff --git a/code/game/gamemodes/extended/extended.dm b/code/game/gamemodes/extended/extended.dm index d547a23809c..e3e16efc4e6 100644 --- a/code/game/gamemodes/extended/extended.dm +++ b/code/game/gamemodes/extended/extended.dm @@ -8,10 +8,8 @@ /datum/game_mode/announce() to_chat(world, "The current game mode is - Extended Role-Playing!") - to_chat(world, "Just have fun and role-play!") - /datum/game_mode/extended/pre_setup() return 1 diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 655dfcc69b7..fc69cd8a79e 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -41,7 +41,6 @@ to_chat(world, "Notice: [src] did not define announce()") - ///can_start() ///Checks to see if the game can be setup and ran with the current number of players or whatnot. /datum/game_mode/proc/can_start() @@ -397,7 +396,6 @@ proc/display_roundstart_logout_report() to_chat(M, msg) - proc/get_nt_opposed() var/list/dudes = list() for(var/mob/living/carbon/human/man in player_list) @@ -424,10 +422,8 @@ proc/get_nt_opposed() var/obj_count = 1 to_chat(player.current, "\blue Your current objectives:") - for(var/datum/objective/objective in player.objectives) to_chat(player.current, "Objective #[obj_count]: [objective.explanation_text]") - obj_count++ /proc/get_roletext(var/role) @@ -446,11 +442,9 @@ proc/get_nt_opposed() if(candidates.len) theghost = pick(candidates) to_chat(M, "Your mob has been taken over by a ghost! Appeal your job ban if you want to avoid this in the future!") - message_admins("[key_name_admin(theghost)] has taken control of ([key_name_admin(M)]) to replace a jobbanned player.") M.ghostize() M.key = theghost.key else message_admins("[M] ([M.key] has been converted into [role_type] with an active antagonist jobban for said role since no ghost has volunteered to take their place.") to_chat(M, "You have been converted into [role_type] with an active jobban. Any further violations of the rules on your part are likely to result in a permanent ban.") - diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index eda5ee58b98..83d21e8cfad 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -44,9 +44,7 @@ var/round_start_time = 0 do pregame_timeleft = 180 to_chat(world, "Welcome to the pre-game lobby!") - to_chat(world, "Please, setup your character and select ready. Game will start in [pregame_timeleft] seconds") - while(current_state == GAME_STATE_PREGAME) for(var/i=0, i<10, i++) sleep(1) @@ -79,7 +77,6 @@ var/round_start_time = 0 if (runnable_modes.len==0) current_state = GAME_STATE_PREGAME to_chat(world, "Unable to choose playable game mode. Reverting to pre-game lobby.") - return 0 if(secret_force_mode != "secret") var/datum/game_mode/M = config.pick_mode(secret_force_mode) @@ -95,7 +92,6 @@ var/round_start_time = 0 src.mode = config.pick_mode(master_mode) if (!src.mode.can_start()) to_chat(world, "Unable to start [mode.name]. Not enough players, [mode.required_players] players needed. Reverting to pre-game lobby.") - mode = null current_state = GAME_STATE_PREGAME job_master.ResetOccupations() @@ -110,7 +106,6 @@ var/round_start_time = 0 qdel(mode) current_state = GAME_STATE_PREGAME to_chat(world, "Error setting up [master_mode]. Reverting to pre-game lobby.") - job_master.ResetOccupations() return 0 @@ -120,9 +115,7 @@ var/round_start_time = 0 modes+=M.name modes = sortList(modes) to_chat(world, "The current game mode is - Secret!") - to_chat(world, "Possibilities: [english_list(modes)]") - else src.mode.announce() @@ -159,18 +152,14 @@ var/round_start_time = 0 qdel(R) to_chat(world, "Enjoy the game!") - to_chat(world, sound('sound/AI/welcome.ogg'))// Skie - if(holiday_master.holidays) to_chat(world, "and...") - for(var/holidayname in holiday_master.holidays) var/datum/holiday/holiday = holiday_master.holidays[holidayname] to_chat(world, "

      [holiday.greet()]

      ") - spawn(0) // Forking dynamic room selection var/list/area/dynamic/source/available_source_candidates = subtypesof(/area/dynamic/source) var/list/area/dynamic/destination/available_destination_candidates = subtypesof(/area/dynamic/destination) @@ -301,14 +290,12 @@ var/round_start_time = 0 flick("intro_nuke",cinematic) sleep(35) to_chat(world, sound('sound/effects/explosionfar.ogg')) - flick("station_intact_fade_red",cinematic) cinematic.icon_state = "summary_nukefail" else flick("intro_nuke",cinematic) sleep(35) to_chat(world, sound('sound/effects/explosionfar.ogg')) - //flick("end",cinematic) @@ -317,7 +304,6 @@ var/round_start_time = 0 to_chat(world, sound('sound/effects/explosionfar.ogg')) - else //station was destroyed if( mode && !override ) override = mode.name @@ -327,28 +313,24 @@ var/round_start_time = 0 sleep(35) flick("station_explode_fade_red",cinematic) to_chat(world, sound('sound/effects/explosionfar.ogg')) - cinematic.icon_state = "summary_nukewin" if("AI malfunction") //Malf (screen,explosion,summary) flick("intro_malf",cinematic) sleep(76) flick("station_explode_fade_red",cinematic) to_chat(world, sound('sound/effects/explosionfar.ogg')) - cinematic.icon_state = "summary_malf" if("blob") //Station nuked (nuke,explosion,summary) flick("intro_nuke",cinematic) sleep(35) flick("station_explode_fade_red",cinematic) to_chat(world, sound('sound/effects/explosionfar.ogg')) - cinematic.icon_state = "summary_selfdes" else //Station nuked (nuke,explosion,summary) flick("intro_nuke",cinematic) sleep(35) flick("station_explode_fade_red", cinematic) to_chat(world, sound('sound/effects/explosionfar.ogg')) - cinematic.icon_state = "summary_selfdes" for(var/mob/living/M in living_mob_list) if((M.loc.z in config.station_levels)) @@ -395,7 +377,6 @@ var/round_start_time = 0 to_chat(M, "Captainship not forced on anyone.") - proc/process() if(current_state != GAME_STATE_PLAYING) return 0 @@ -454,20 +435,15 @@ var/round_start_time = 0 var/station_integrity = min(round( 100.0 * start_state.score(end_state), 0.1), 100.0) to_chat(world, "
      [TAB]Shift Duration: [round(world.time / 36000)]:[add_zero("[world.time / 600 % 60]", 2)]:[world.time / 100 % 6][world.time / 100 % 10]") - to_chat(world, "
      [TAB]Station Integrity: [mode.station_was_nuked ? "Destroyed" : "[station_integrity]%"]") - to_chat(world, "
      ") - //Silicon laws report for (var/mob/living/silicon/ai/aiPlayer in mob_list) if (aiPlayer.stat != 2) to_chat(world, "[aiPlayer.name] (Played by: [aiPlayer.key])'s laws at the end of the game were:") - else to_chat(world, "[aiPlayer.name] (Played by: [aiPlayer.key])'s laws when it was deactivated were:") - aiPlayer.show_laws(1) if (aiPlayer.connected_robots.len) @@ -476,7 +452,6 @@ var/round_start_time = 0 robolist += "[robo.name][robo.stat?" (Deactivated) (Played by: [robo.key]), ":" (Played by: [robo.key]), "]" to_chat(world, "[robolist]") - var/dronecount = 0 for (var/mob/living/silicon/robot/robo in mob_list) @@ -488,18 +463,15 @@ var/round_start_time = 0 if (!robo.connected_ai) if (robo.stat != 2) to_chat(world, "[robo.name] (Played by: [robo.key]) survived as an AI-less borg! Its laws were:") - else to_chat(world, "[robo.name] (Played by: [robo.key]) was unable to survive the rigors of being a cyborg without an AI. Its laws were:") - if(robo) //How the hell do we lose robo between here and the world messages directly above this? robo.laws.show_laws(world) if(dronecount) to_chat(world, "There [dronecount>1 ? "were" : "was"] [dronecount] industrious maintenance [dronecount>1 ? "drones" : "drone"] this round.") - mode.declare_completion()//To declare normal completion. //calls auto_declare_completion_* for all modes diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm index 98bfa2cf10b..057c43345f8 100644 --- a/code/game/gamemodes/heist/heist.dm +++ b/code/game/gamemodes/heist/heist.dm @@ -23,16 +23,11 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind' /datum/game_mode/heist/announce() to_chat(world, "The current game mode is - Heist!") - to_chat(world, "An unidentified bluespace signature has slipped past the Icarus and is approaching [station_name()]!") - to_chat(world, "Whoever they are, they're likely up to no good. Protect the crew and station resources against this dastardly threat!") - to_chat(world, "Raiders: Loot [station_name()] for anything and everything you need, or choose the peaceful route and attempt to trade with them.") - to_chat(world, "Personnel: Trade with the raiders, or repel them and their low, low prices and/or crossbows.") - /datum/game_mode/heist/can_start() if(!..()) @@ -171,15 +166,10 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind' /datum/game_mode/proc/greet_vox(var/datum/mind/raider) to_chat(raider.current, "\blue You are a Vox Raider, fresh from the Shoal!") - to_chat(raider.current, "\blue The Vox are a race of cunning, sharp-eyed nomadic raiders and traders endemic to the frontier and much of the unexplored galaxy. You and the crew have come to the [station_name()] for plunder, trade or both.") - to_chat(raider.current, "\blue Vox are cowardly and will flee from larger groups, but corner one or find them en masse and they are vicious.") - to_chat(raider.current, "\blue Use :V to voxtalk, :H to talk on your encrypted channel, and don't forget to turn on your nitrogen internals!") - to_chat(raider.current, "\blue Choose to accomplish your objectives by either raiding the crew and taking what you need, or by attempting to trade with them.") - spawn(25) show_objectives(raider) @@ -234,20 +224,16 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind' win_msg += "The Vox Raiders were repelled!" to_chat(world, "\red [win_type] [win_group] victory!") - to_chat(world, "[win_msg]") - feedback_set_details("round_end_result","heist - [win_type] [win_group]") var/count = 1 for(var/datum/objective/objective in raid_objectives) if(objective.check_completion()) to_chat(world, "
      Objective #[count]: [objective.explanation_text] Success!") - feedback_add_details("traitor_objective","[objective.type]|SUCCESS") else to_chat(world, "
      Objective #[count]: [objective.explanation_text] Fail.") - feedback_add_details("traitor_objective","[objective.type]|FAIL") count++ @@ -280,7 +266,6 @@ datum/game_mode/proc/auto_declare_completion_heist() to_chat(world, text) - return 1 /datum/game_mode/heist/check_finished() @@ -304,7 +289,6 @@ datum/game_mode/proc/auto_declare_completion_heist() /obj/vox/win_button/attack_hand(mob/user) if(!istype(ticker.mode, /datum/game_mode/heist) || (world.time < 10 MINUTES)) //has to be heist, and at least ten minutes into the round to_chat(user, "\The [src] does not appear to have a connection.") - return 0 if(alert(user, "Warning: This will end the round. Are you sure you wish to end the round?", "Vox End", "Yes", "No") == "No") diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index 99ca696396a..803a7ba0d80 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -50,7 +50,6 @@ rcd light flash thingy on matter drain src.verbs -= /mob/living/silicon/ai/proc/fireproof_core to_chat(src, "Core fireproofed.") - /datum/AI_Module/large/upgrade_turrets module_name = "AI Turret Upgrade" mod_pick_name = "turret" @@ -76,7 +75,6 @@ rcd light flash thingy on matter drain turret.eprojectile = /obj/item/projectile/beam/heavylaser //Once you see it, you will know what it means to FEAR. turret.eshot_sound = 'sound/weapons/lasercannonfire.ogg' to_chat(src, "Turrets upgraded.") - /datum/AI_Module/large/destroy_rcd module_name = "Destroy RCDs" mod_pick_name = "rcd" @@ -103,7 +101,6 @@ rcd light flash thingy on matter drain qdel(RCD) to_chat(src, "RCD detonation pulse emitted.") - malf_cooldown = 1 spawn(100) malf_cooldown = 0 @@ -165,7 +162,6 @@ rcd light flash thingy on matter drain else to_chat(src, "That's not a machine.") - /datum/AI_Module/small/override_machine module_name = "Machine Override" mod_pick_name = "override" @@ -200,7 +196,6 @@ rcd light flash thingy on matter drain else to_chat(src, "That's not a machine.") - /datum/AI_Module/large/place_cyborg_transformer module_name = "Robotic Factory (Removes Shunting)" mod_pick_name = "cyborgtransformer" @@ -234,7 +229,6 @@ rcd light flash thingy on matter drain can_shunt = 0 to_chat(src, "You cannot shunt anymore.") - /mob/living/silicon/ai/proc/canPlaceTransformer() if(!eyeobj || !isturf(src.loc)) return @@ -300,11 +294,9 @@ rcd light flash thingy on matter drain else apc.overload++ to_chat(src, "Overcurrent applied to the powernet.") - else to_chat(src, "Out of uses.") - /datum/AI_Module/small/reactivate_cameras module_name = "Reactivate Camera Network" mod_pick_name = "recam" @@ -338,12 +330,10 @@ rcd light flash thingy on matter drain //If a camera is both deactivated and has bad focus, it will cost two uses to fully fix! else to_chat(src, "Out of uses.") - verbs -= /mob/living/silicon/ai/proc/reactivate_cameras //It is useless now, clean it up. break to_chat(src, "Diagnostic complete! Operations completed: [fixedcams].") - malf_cooldown = 1 spawn(30) //Lag protection malf_cooldown = 0 @@ -386,7 +376,6 @@ rcd light flash thingy on matter drain upgradedcams++ to_chat(src, "OTA firmware distribution complete! Cameras upgraded: [upgradedcams]. Light amplification system online.") - verbs -= /mob/living/silicon/ai/proc/upgrade_cameras /datum/module_picker diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm index d836d7d0fdc..ce257175636 100644 --- a/code/game/gamemodes/malfunction/malfunction.dm +++ b/code/game/gamemodes/malfunction/malfunction.dm @@ -123,7 +123,6 @@ to_chat(world, "The AI has accessed the station's core files!") to_chat(world, "It has fully taken control of all of [station_name()]'s systems.") - to_nuke_or_not_to_nuke = 1 for(var/datum/mind/AI_mind in malf_ai) to_chat(AI_mind.current, {"\blue Congratulations! You have taken control of the station.
      ) @@ -171,15 +170,12 @@ set desc = "Start the victory timer" if (!istype(ticker.mode,/datum/game_mode/malfunction)) to_chat(usr, "You cannot begin a takeover in this round type!.") - return if (ticker.mode:malf_mode_declared) to_chat(usr, "You've already begun your takeover.") - return if (ticker.mode:apcs < 3) to_chat(usr, "You don't have enough hacked APCs to take over the station yet. You need to hack at least 3, however hacking more will make the takeover faster. You have hacked [ticker.mode:apcs] APCs so far.") - return if (alert(usr, "Are you sure you wish to initiate the takeover? The station hostile runtime detection software is bound to alert everyone. You have hacked [ticker.mode:apcs] APCs.", "Takeover:", "Yes", "No") != "Yes") @@ -206,28 +202,23 @@ if(!ticker.mode:station_captured) to_chat(usr, "You are unable to access the self-destruct system as you don't control the station yet.") - return if(ticker.mode:explosion_in_progress || ticker.mode:station_was_nuked) to_chat(usr, "The self-destruct countdown is already triggered!") - return if(!ticker.mode:to_nuke_or_not_to_nuke) //Takeover IS completed, but 60s timer passed. to_chat(usr, "You lost control over self-destruct system. It seems to be behind firewall. Unable to hack") - return to_chat(usr, "\red Self-destruct sequence initialised!") - ticker.mode:to_nuke_or_not_to_nuke = 0 ticker.mode:explosion_in_progress = 1 for(var/mob/M in player_list) to_chat(M, 'sound/machines/Alarm.ogg') - var/obj/item/device/radio/R = new (src) var/AN = "Self-Destruct System" @@ -289,42 +280,35 @@ to_chat(world, "AI Victory") to_chat(world, "Everyone was killed by the self-destruct!") - else if ( station_captured && malf_dead && !station_was_nuked) feedback_set_details("round_end_result","halfwin - AI killed, staff lost control") to_chat(world, "Neutral Victory") to_chat(world, "The AI has been killed! The staff has lose control over the station.") - else if ( station_captured && !malf_dead && !station_was_nuked) feedback_set_details("round_end_result","win - AI win - no explosion") to_chat(world, "AI Victory") to_chat(world, "The AI has chosen not to explode you all!") - else if (!station_captured && station_was_nuked) feedback_set_details("round_end_result","halfwin - everyone killed by nuke") to_chat(world, "Neutral Victory") to_chat(world, "Everyone was killed by the nuclear blast!") - else if (!station_captured && malf_dead && !station_was_nuked) feedback_set_details("round_end_result","loss - staff win") to_chat(world, "Human Victory") to_chat(world, "The AI has been killed! The staff is victorious.") - else if (!station_captured && !malf_dead && !station_was_nuked && crew_evacuated) feedback_set_details("round_end_result","halfwin - evacuated") to_chat(world, "Neutral Victory") to_chat(world, "The Corporation has lose [station_name()]! All survived personnel will be fired!") - else if (!station_captured && !malf_dead && !station_was_nuked && !crew_evacuated) feedback_set_details("round_end_result","nalfwin - interrupted") to_chat(world, "Neutral Victory") to_chat(world, "Round was mysteriously interrupted!") - ..() return 1 @@ -353,5 +337,4 @@ text += module_text_temp to_chat(world, text) - return 1 \ No newline at end of file diff --git a/code/game/gamemodes/meteor/meteor.dm b/code/game/gamemodes/meteor/meteor.dm index df9f714f837..10e3468f1c4 100644 --- a/code/game/gamemodes/meteor/meteor.dm +++ b/code/game/gamemodes/meteor/meteor.dm @@ -12,11 +12,9 @@ /datum/game_mode/meteor/announce() to_chat(world, "The current game mode is - Meteor!") - to_chat(world, "The space station has been stuck in a major meteor shower. You must escape from the station or at least live.") - /datum/game_mode/meteor/post_setup() spawn(rand(waittime_l, waittime_h)) command_announcement.Announce("The station is on the path of an incoming wave of meteors. Reinforce the hull and prepare damage control parties.", "Incoming Meteors", 'sound/effects/siren.ogg') @@ -57,11 +55,9 @@ if(survivors) to_chat(world, "\blue The following survived the meteor storm:[text]") - else to_chat(world, "\blue Nobody survived the meteor storm!") - feedback_set_details("round_end_result","end - evacuation") feedback_set("round_end_result",survivors) diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm index c7dde19aa43..11111cdfc69 100644 --- a/code/game/gamemodes/miniantags/borer/borer.dm +++ b/code/game/gamemodes/miniantags/borer/borer.dm @@ -7,7 +7,6 @@ if (src.client) if(client.prefs.muted & MUTE_IC) to_chat(src, "\red You cannot speak in IC (muted).") - return if (src.client.handle_spam_prevention(message,MUTE_IC)) return @@ -21,15 +20,12 @@ return say_dead(message) var/mob/living/simple_animal/borer/B = src.loc to_chat(src, "You whisper silently, \"[message]\"") - to_chat(B.host, "The captive mind of [src] whispers, \"[message]\"") - for(var/mob/M in mob_list) if(M.mind && (istype(M, /mob/dead/observer))) to_chat(M, "Thought-speech, [src] -> [B.truename]: [message]") - /mob/living/captive_brain/say_understands(var/mob/other, var/datum/language/speaking = null) var/mob/living/simple_animal/borer/B = src.loc if(!istype(B)) @@ -81,7 +77,6 @@ set desc = "Send a silent message to your host." if(!host) to_chat(src, "You do not have a host to communicate with!") - return var/input = stripped_input(src, "Please enter a message to tell your host.", "Borer", "") @@ -91,14 +86,11 @@ var/say_string = (docile) ? "slurs" :"states" if(host) to_chat(host, "[src.truename] [say_string]: [input]") - log_say("Borer Communication: [key_name(src)] -> [key_name(host)] : [input]") for(var/M in dead_mob_list) if(istype(M, /mob/dead/observer)) to_chat(M, "Borer Communication from [src.truename] ([ghost_follow_link(src, ghost=M)]): [input]") - to_chat(src, "[src.truename] [say_string]: [input]") - host.verbs += /mob/living/proc/borer_comm /mob/living/simple_animal/borer/verb/toggle_silence_inside_host() @@ -109,12 +101,10 @@ if(talk_inside_host) talk_inside_host = 0 to_chat(src, "You will no longer talk audibly while inside a host.") - else talk_inside_host = 1 to_chat(src, "You will now be able to audibly speak from inside of a host.") - /mob/living/proc/borer_comm() set name = "Converse with Borer" set category = "Borer" @@ -129,16 +119,13 @@ if(!input) return to_chat(B, "[src] says: [input]") - log_say("Borer Communication: [key_name(src)] -> [key_name(B)] : [input]") for(var/M in dead_mob_list) if(istype(M, /mob/dead/observer)) to_chat(M, "Borer Communication from [src] ([ghost_follow_link(src, ghost=M)]): [input]") - to_chat(src, "[src] says: [input]") - /mob/living/proc/trapped_mind_comm() set name = "Converse with Trapped Mind" set category = "Borer" @@ -153,16 +140,13 @@ if(!input) return to_chat(CB, "[B.truename] says: [input]") - log_say("Borer Communication: [key_name(B)] -> [key_name(CB)] : [input]") for(var/M in dead_mob_list) if(istype(M, /mob/dead/observer)) to_chat(M, "Borer Communication from [B] ([ghost_follow_link(src, ghost=M)]): [input]") - to_chat(src, "[B.truename] says: [input]") - /mob/living/simple_animal/borer/Life() ..() @@ -175,19 +159,15 @@ if(!docile) if(controlling) to_chat(host, "\blue You feel the soporific flow of sugar in your host's blood, lulling you into docility.") - else to_chat(src, "\blue You feel the soporific flow of sugar in your host's blood, lulling you into docility.") - docile = 1 else if(docile) if(controlling) to_chat(host, "\blue You shake off your lethargy as the sugar leaves your host's blood.") - else to_chat(src, "\blue You shake off your lethargy as the sugar leaves your host's blood.") - docile = 0 if(chemicals < max_chems) @@ -196,7 +176,6 @@ if(docile) to_chat(host, "\blue You are feeling far too docile to continue controlling your host...") - host.release_control() return @@ -238,7 +217,6 @@ if(M.mind && (istype(M, /mob/living/simple_animal/borer) || istype(M, /mob/dead/observer))) to_chat(M, "Cortical link, [truename]: [copytext(message, 2)]") - /mob/living/simple_animal/borer/verb/dominate_victim() set category = "Borer" set name = "Dominate Victim" @@ -246,17 +224,14 @@ if(world.time - used_dominate < 300) to_chat(src, "You cannot use that ability again so soon.") - return if(host) to_chat(src, "You cannot do that from within a host body.") - return if(src.stat) to_chat(src, "You cannot do that in your current state.") - return var/list/choices = list() @@ -266,7 +241,6 @@ if(world.time - used_dominate < 300) to_chat(src, "You cannot use that ability again so soon.") - return var/mob/living/carbon/M = input(src,"Who do you wish to dominate?") in null|choices @@ -275,13 +249,10 @@ if(M.has_brain_worms()) to_chat(src, "You cannot infest someone who is already infested!") - return to_chat(src, "\red You focus your psychic lance on [M] and freeze their limbs with a wave of terrible dread.") - to_chat(M, "\red You feel a creeping, horrible sense of dread come over you, freezing your limbs and setting your heart racing.") - M.Weaken(3) used_dominate = world.time @@ -293,31 +264,25 @@ if(!host) to_chat(src, "You are not inside a host body.") - return if(src.stat) to_chat(src, "You cannot do that in your current state.") - return if(docile) to_chat(src, "\blue You are feeling far too docile to do that.") - return to_chat(src, "You begin delicately adjusting your connection to the host brain...") - spawn(300+(host.getBrainLoss()*5)) if(!host || !src || controlling) return else to_chat(src, "\red You plunge your probosci deep into the cortex of the host brain, interfacing directly with their nervous system.") - to_chat(host, "\red You feel a strange shifting sensation behind your eyes as an alien consciousness displaces yours.") - var/borer_key = src.key host.attack_log += text("\[[time_stamp()]\] [key_name(src)] has assumed control of [key_name(host)]") msg_admin_attack("[key_name_admin(src)] has assumed control of [key_name_admin(host)]") @@ -375,22 +340,18 @@ var/chem_cost = 30 if(!host) to_chat(src, "You are not inside a host body.") - return if(stat) to_chat(src, "You cannot secrete chemicals in your current state.") - if(docile) to_chat(src, "\blue You are feeling far too docile to do that.") - return if(chemicals < chem_cost) to_chat(src, "You don't have enough chemicals!") - var/list/nice_name_chem_list = list() for(var/rgnt in borer_injection_chems) var/datum/reagent/R2 = chemical_reagents_list[rgnt] @@ -405,11 +366,9 @@ var/datum/reagent/R = chemical_reagents_list[chem] if(R.overdose_threshold && chem_amount + injection_amount > R.overdose_threshold) to_chat(src, "Doing so would cause grievous harm to your host, reducing ability to reproduce. Aborting.") - return to_chat(src, "You squirt a measure of [chem_name] from your reservoirs into [host]'s bloodstream.") - host.reagents.add_reagent(chem, injection_amount) chemicals -= chem_cost @@ -420,35 +379,29 @@ if(!host) to_chat(src, "You are not inside a host body.") - return if(stat) to_chat(src, "You cannot leave your host in your current state.") - if(docile) to_chat(src, "\blue You are feeling far too docile to do that.") - return if(!host || !src) return to_chat(src, "You begin disconnecting from [host]'s synapses and prodding at their internal ear canal.") - spawn(200) if(!host || !src) return if(src.stat) to_chat(src, "You cannot release a target in your current state.") - return to_chat(src, "You wiggle out of [host]'s ear and plop to the ground.") - detatch() leave_host() @@ -521,13 +474,11 @@ if(B && B.host_brain) to_chat(src, "\red You withdraw your probosci, releasing control of [B.host_brain]") - B.detatch() else to_chat(src, "\red ERROR NO BORER OR BRAINMOB DETECTED IN THIS MOB, THIS IS A BUG !") - //Brain slug proc for tormenting the host. /mob/living/carbon/proc/punish_host() set category = "Borer" @@ -541,10 +492,8 @@ if(B.host_brain.ckey) to_chat(src, "\red You send a punishing spike of psychic agony lancing into your host's brain.") - to_chat(B.host_brain, "\red Horrific, burning agony lances through you, ripping a soundless scream from your trapped mind!") - //Check for brain worms in head. /mob/proc/has_brain_worms() @@ -566,7 +515,6 @@ if(B.chemicals >= 100) to_chat(src, "\red Your host twitches and quivers as you rapdly excrete several larvae from your sluglike body.") - visible_message("\red [src] heaves violently, expelling a rush of vomit and a wriggling, sluglike creature!") B.chemicals -= 100 @@ -576,7 +524,6 @@ else to_chat(src, "You do not have enough chemicals stored to reproduce.") - return /mob/living/simple_animal/borer/proc/leave_host() @@ -604,12 +551,10 @@ if(host) to_chat(src, "You are already within a host.") - return if(stat) to_chat(src, "You cannot infest a target in your current state.") - return var/list/choices = list() @@ -628,36 +573,29 @@ if(M.has_brain_worms()) to_chat(src, "You cannot infest someone who is already infested!") - return to_chat(src, "You slither up [M] and begin probing at their ear canal...") - if(!do_after(src,50, target = M)) to_chat(src, "As [M] moves away, you are dislodged and fall to the ground.") - return if(!M || !src) return if(src.stat) to_chat(src, "You cannot infest a target in your current state.") - return if(M.stat == DEAD) to_chat(src, "That is not an appropriate target.") - return if(M in view(1, src)) to_chat(src, "You wiggle into [M]'s ear.") - /* if(!M.stat) to_chat(M, "Something disgusting and slimy wiggles into your ear!") - */ // Let's see how stealthborers work out perform_infestation(M) @@ -665,7 +603,6 @@ return else to_chat(src, "They are no longer in range!") - return /mob/living/simple_animal/borer/proc/perform_infestation(var/mob/living/carbon/M) @@ -722,18 +659,15 @@ if (layer != TURF_LAYER+0.2) layer = TURF_LAYER+0.2 to_chat(src, "\green You are now hiding.") - else layer = MOB_LAYER to_chat(src, "\green You have stopped hiding.") - /mob/living/simple_animal/borer/say(var/message) var/datum/language/dialect = parse_language(message) if(!dialect) dialect = get_default_language() if(!istype(dialect, /datum/language/corticalborer) && loc == host && !talk_inside_host) to_chat(src, "You've disabled audible speech while inside a host! Re-enable it under the borer tab, or stick to borer communications.") - return ..() diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm index bf1b7af68cf..514ceb4b14e 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm @@ -23,7 +23,6 @@ return if(qdeleted(src)) to_chat(user, "Swarmer has been occupied by someone else.") - return var/mob/living/simple_animal/hostile/swarmer/S = new /mob/living/simple_animal/hostile/swarmer(get_turf(loc)) S.key = user.key @@ -73,18 +72,12 @@ /mob/living/simple_animal/hostile/swarmer/Login() ..() to_chat(src, "You are a swarmer, a weapon of a long dead civilization. Until further orders from your original masters are received, you must continue to consume and replicate.") - to_chat(src, "Ctrl + Click provides most of your swarmer specific interactions, such as cannibalizing metal or glass, destroying the environment, or teleporting mobs away from you.") - to_chat(src, "Objectives:") - to_chat(src, "1. Consume resources and replicate until there are no more resources left.") - to_chat(src, "2. Ensure that the station is fit for invasion at a later date, do not perform actions that would render it dangerous or inhospitable.") - to_chat(src, "3. Biological and Sentient resources will be harvested at a later date, do not harm them.") - /mob/living/simple_animal/hostile/swarmer/New() ..() add_language("Swarmer", 1) @@ -166,32 +159,25 @@ /obj/machinery/particle_accelerator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.") - /obj/structure/particle_accelerator/fuel_chamber/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.") - /obj/structure/particle_accelerator/particle_emitter/center/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.") - /obj/structure/particle_accelerator/particle_emitter/left/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.") - /obj/structure/particle_accelerator/particle_emitter/right/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.") - /obj/structure/particle_accelerator/particle_emitter/end_cap/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.") - /obj/structure/particle_accelerator/particle_emitter/power_box/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.") - /obj/machinery/field/generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) S.DisIntegrate(src) @@ -207,64 +193,49 @@ /obj/machinery/chem_dispenser/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "The volatile chemicals in this machine would destroy us. Aborting.") - /obj/machinery/nuclearbomb/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "This device's destruction would result in the extermination of everything in the area. Aborting.") - /obj/effect/rune/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "Searching... sensor malfunction! Target lost. Aborting.") - /obj/structure/reagent_dispensers/fueltank/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "Destroying this object would cause a chain reaction. Aborting.") - /obj/structure/cable/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.") - /obj/machinery/portable_atmospherics/canister/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "An inhospitable area may be created as a result of destroying this object. Aborting.") - /obj/machinery/telecomms/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "This communications relay should be preserved, it will be a useful resource to our masters in the future. Aborting.") - /obj/machinery/message_server/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "This communications relay should be preserved, it will be a useful resource to our masters in the future. Aborting.") - /obj/machinery/blackbox_recorder/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "This machine has recorded large amounts of data on this structure and its inhabitants, it will be a useful resource to our masters in the future. Aborting. ") - /obj/machinery/power/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.") - /obj/machinery/gateway/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "This bluespace source will be important to us later. Aborting.") - /obj/machinery/cryopod/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "This cryogenic sleeper should be preserved, it will be a useful resource to our masters in the future. Aborting.") - /obj/structure/cryofeed/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "This cryogenic feed should be preserved, it will be a useful resource to our masters in the future. Aborting.") - /obj/machinery/computer/cryopod/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "This cryopod control computer should be preserved, it contains useful items and information about the inhabitants. Aborting.") - /turf/simulated/wall/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) for(var/turf/T in range(1, src)) if(istype(T, /turf/space) || istype(T.loc, /area/space)) to_chat(S, "Destroying this object has the potential to cause a hull breach. Aborting.") - return ..() @@ -272,44 +243,36 @@ for(var/turf/T in range(1, src)) if(istype(T, /turf/space) || istype(T.loc, /area/space)) to_chat(S, "Destroying this object has the potential to cause a hull breach. Aborting.") - return ..() /obj/item/stack/cable_coil/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)//Wiring would be too effective as a resource to_chat(S, "This object does not contain enough materials to work with.") - /obj/item/weapon/circuitboard/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "This object does not contain enough materials to work with.") - /obj/machinery/porta_turret/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "Attempting to dismantle this machine would result in an immediate counterattack. Aborting.") - /obj/spacepod/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "Destroying this vehicle would destroy us. Aborting.") - /mob/living/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) S.DisperseTarget(src) /mob/living/carbon/slime/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "This biological resource is somehow resisting our bluespace transceiver. Aborting.") - ////END CTRL CLICK FOR SWARMERS//// /mob/living/simple_animal/hostile/swarmer/proc/Fabricate(var/atom/fabrication_object,var/fabrication_cost = 0) if(!isturf(loc)) to_chat(src, "This is not a suitable location for fabrication. We need more space.") - if(resources >= fabrication_cost) resources -= fabrication_cost else to_chat(src, "You do not have the necessary resources to fabricate this object.") - return 0 new fabrication_object(loc) return 1 @@ -317,7 +280,6 @@ /mob/living/simple_animal/hostile/swarmer/proc/Integrate(var/obj/item/target) if(resources >= 100) to_chat(src, "We cannot hold more materials!") - return //Check if any entries are either MAT_METAL or MAT_GLASS if((MAT_METAL in target.materials) || (MAT_GLASS in target.materials)) @@ -335,7 +297,6 @@ qdel(target) else to_chat(src, "\the [target] is incompatible with our internal matter recycler.") - return /mob/living/simple_animal/hostile/swarmer/proc/DisIntegrate(var/atom/movable/target) @@ -347,10 +308,8 @@ /mob/living/simple_animal/hostile/swarmer/proc/DisperseTarget(var/mob/living/target) if(target != src) to_chat(src, "Attempting to remove this being from our presence.") - if(src.z != ZLEVEL_STATION) to_chat(src, "Our bluespace transceiver cannot locate a viable bluespace link, our teleportation abilities are useless in this area.") - return if(do_mob(src, target, 30)) var/cycle @@ -375,17 +334,14 @@ /mob/living/simple_animal/hostile/swarmer/proc/DismantleMachine(var/obj/machinery/target) do_attack_animation(target) to_chat(src, "We begin to dismantle this machine. We will need to be uninterrupted.") - var/obj/effect/swarmer/dismantle/D = new /obj/effect/swarmer/dismantle(get_turf(target)) D.pixel_x = target.pixel_x D.pixel_y = target.pixel_y if(do_mob(src, target, 100)) if(!src.Adjacent(target)) to_chat(src, "Error:Dismantleing aborted.") - else to_chat(src, "Dismantling complete.") - var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal(target.loc) M.amount = 5 if(target.component_parts && target.component_parts.len) @@ -485,7 +441,6 @@ set desc = "Creates a simple trap that will non-lethally electrocute anything that steps on it. Costs 5 resources" if(/obj/effect/swarmer/destructible/trap in loc) to_chat(src, "There is already a trap here. Aborting.") - return Fabricate(/obj/effect/swarmer/destructible/trap, 5) return @@ -514,11 +469,9 @@ set desc = "Creates a barricade that will stop anything but swarmers and disabler beams from passing through." if(/obj/effect/swarmer/destructible/blockade in loc) to_chat(src, "There is already a blockade here. Aborting.") - return if(resources < 5) to_chat(src, "We do not have the resources for this!") - return if(do_mob(src, src, 10)) Fabricate(/obj/effect/swarmer/destructible/blockade, 5) @@ -544,14 +497,11 @@ set category = "Swarmer" set desc = "Creates a shell for a new swarmer. Swarmers will self activate." to_chat(src, "We are attempting to replicate ourselves. We will need to stand still until the process is complete.") - if(resources < 50) to_chat(src, "We do not have the resources for this!") - return if(!isturf(loc)) to_chat(src, "This is not a suitable location for replicating ourselves. We need more room.") - return if(do_mob(src, src, 100)) if(Fabricate(/obj/item/unactivated_swarmer, 50)) @@ -564,12 +514,10 @@ if(!isturf(loc)) return to_chat(src, "Attempting to repair damage to our body, stand by...") - if(do_mob(src, src, 100)) adjustBruteLoss(-100) to_chat(src, "We successfully repaired ourselves.") - /mob/living/simple_animal/hostile/swarmer/proc/ToggleLight() if(!light_range) set_light(3) @@ -585,7 +533,6 @@ - ////HUD NONSENSE//// /obj/screen/swarmer icon = 'icons/mob/swarmer.dmi' diff --git a/code/game/gamemodes/miniantags/guardian/guardian.dm b/code/game/gamemodes/miniantags/guardian/guardian.dm index 3c62fc71d14..0a3cfaee0c2 100644 --- a/code/game/gamemodes/miniantags/guardian/guardian.dm +++ b/code/game/gamemodes/miniantags/guardian/guardian.dm @@ -43,7 +43,6 @@ if(summoner) if(summoner.stat == DEAD) to_chat(src, "Your summoner has died!") - visible_message("The [src] dies along with its user!") ghostize() qdel(src) @@ -52,12 +51,10 @@ return else to_chat(src, "You moved out of range, and were pulled back! You can only move [range] meters from [summoner.real_name]") - visible_message("The [src] jumps back to its user.") Recall() if(summoned && !summoner && !adminseal) to_chat(src, "You somehow lack a summoner! As a result, you dispel!") - ghostize() qdel() @@ -68,14 +65,12 @@ return else to_chat(src, "You moved out of range, and were pulled back! You can only move [range] meters from [summoner.real_name]") - visible_message("The [src] jumps back to its user.") Recall() /mob/living/simple_animal/hostile/guardian/death() ..() to_chat(summoner, "Your [name] died somehow!") - summoner.death() @@ -97,11 +92,9 @@ summoner.adjustBruteLoss(damage) if(damage) to_chat(summoner, "Your [name] is under attack! You take damage!") - summoner.visible_message("Blood sprays from [summoner] as [src] takes damage!") if(summoner.stat == UNCONSCIOUS) to_chat(summoner, "Your body can't take the strain of sustaining [src] in this condition, it begins to fall apart!") - summoner.adjustCloneLoss(damage/2) /mob/living/simple_animal/hostile/guardian/ex_act(severity, target) @@ -118,7 +111,6 @@ /mob/living/simple_animal/hostile/guardian/gib() if(summoner) to_chat(summoner, "Your [src] was blown up!") - summoner.Weaken(10)// your fermillier has died! ROLL FOR CON LOSS! ghostize() qdel(src) @@ -151,19 +143,15 @@ for(var/mob/M in mob_list) if(M == summoner) to_chat(M, "[src]: [input]") - log_say("Guardian Communication: [key_name(src)] -> [key_name(M)] : [input]") else if (M in dead_mob_list) to_chat(M, "Guardian Communication from [src] ([ghost_follow_link(src, ghost=M)]): [input]") - to_chat(src, "[src]: [input]") - /mob/living/simple_animal/hostile/guardian/proc/ToggleMode() to_chat(src, "You dont have another mode!") - /mob/living/proc/guardian_comm() set name = "Communicate" set category = "Guardian" @@ -176,15 +164,12 @@ var/mob/living/simple_animal/hostile/guardian/G = M if(G.summoner == src) to_chat(G, "[src]: [input]") - log_say("Guardian Communication: [key_name(src)] -> [key_name(G)] : [input]") else if (M in dead_mob_list) to_chat(M, "Guardian Communication from [src] ([ghost_follow_link(src, ghost=M)]): [input]") - to_chat(src, "[src]: [input]") - /mob/living/proc/guardian_recall() set name = "Recall Guardian" set category = "Guardian" @@ -206,15 +191,12 @@ if(candidates.len) new_stand = pick(candidates) to_chat(G, "Your user reset you, and your body was taken over by a ghost. Looks like they weren't happy with your performance.") - to_chat(src, "Your guardian has been successfully reset.") - message_admins("[key_name_admin(new_stand)] has taken control of ([key_name_admin(G)])") G.ghostize(0) G.key = new_stand.key else to_chat(src, "There were no ghosts willing to take control. Looks like you're stuck with your Guardian for now.") - spawn(3000) verbs += /mob/living/proc/guardian_reset @@ -223,13 +205,11 @@ if(!luminosity) set_light(3) to_chat(src, "You activate your light.") - else set_light(0) to_chat(src, "You deactivate your light.") - //////////////////////////TYPES OF GUARDIANS @@ -260,11 +240,9 @@ if(src.loc == summoner) if(toggle) to_chat(src, "You switch to dispersion mode, and will teleport victims away from your master.") - toggle = FALSE else to_chat(src, "You switch to deception mode, and will turn your victims against their allies.") - toggle = TRUE /mob/living/simple_animal/hostile/guardian/fire/AttackingTarget() @@ -404,7 +382,6 @@ if(toggle == TRUE) if(src.loc == summoner) to_chat(src, "You must be manifested to heal!") - return if(iscarbon(target)) src.changeNext_move(CLICK_CD_MELEE) @@ -427,7 +404,6 @@ melee_damage_lower = 15 melee_damage_upper = 15 to_chat(src, "You switch to combat mode.") - toggle = FALSE else a_intent = I_HELP @@ -438,13 +414,11 @@ melee_damage_lower = 0 melee_damage_upper = 0 to_chat(src, "You switch to healing mode.") - toggle = TRUE else to_chat(src, "You have to be recalled to toggle modes!") - /mob/living/simple_animal/hostile/guardian/healer/verb/Beacon() set name = "Place Bluespsace Beacon" set category = "Guardian" @@ -458,7 +432,6 @@ F.desc = "A recieving zone for bluespace teleportations. Building a wall over it should disable it." F.icon_state = "light_on-w" to_chat(src, "Beacon placed! You may now warp targets to it, including your user, via Alt+Click. ") - if(beacon) beacon.ChangeTurf(/turf/simulated/floor/plating) beacon = F @@ -467,28 +440,22 @@ else to_chat(src, "Your power is on cooldown. You must wait five minutes between placing beacons.") - /mob/living/simple_animal/hostile/guardian/healer/AltClickOn(atom/movable/A) if(!istype(A)) return if(src.loc == summoner) to_chat(src, "You must be manifested to warp a target!") - return if(!beacon) to_chat(src, "You need a beacon placed to warp things!") - return if(!Adjacent(A)) to_chat(src, "You must be adjacent to your target!") - return if((A.anchored)) to_chat(src, "Your target can not be anchored!") - return to_chat(src, "You begin to warp [A]") - if(do_mob(src, A, 50)) if(!A.anchored) if(src.beacon) //Check that the beacon still exists and is in a safe place. No instant kills. @@ -503,18 +470,14 @@ new /obj/effect/overlay/temp/guardian/phase(get_turf(A)) else to_chat(src, "The beacon isn't in a safe location!") - else to_chat(src, "The beacon isn't in a safe location!") - else to_chat(src, "You need a beacon to warp things!") - else to_chat(src, "You need to hold still!") - ///////////////////Ranged /obj/item/projectile/guardian @@ -555,7 +518,6 @@ range = 13 incorporeal_move = 0 to_chat(src, "You switch to combat mode.") - toggle = FALSE else ranged = 0 @@ -565,20 +527,16 @@ range = 255 incorporeal_move = 1 to_chat(src, "You switch to scout mode.") - toggle = TRUE else to_chat(src, "You have to be recalled to toggle modes!") - /mob/living/simple_animal/hostile/guardian/ranged/ToggleLight() if(see_invisible == SEE_INVISIBLE_MINIMUM) to_chat(src, "You deactivate your night vision.") - see_invisible = SEE_INVISIBLE_LIVING else to_chat(src, "You activate your night vision.") - see_invisible = SEE_INVISIBLE_MINIMUM /mob/living/simple_animal/hostile/guardian/ranged/verb/Snare() @@ -592,11 +550,9 @@ S.name = "[get_area(snare_loc)] trap ([rand(1, 1000)])" src.snares |= S to_chat(src, "Surveillance trap deployed!") - else to_chat(src, "You have too many traps deployed. Delete some first.") - /mob/living/simple_animal/hostile/guardian/ranged/verb/DisarmSnare() set name = "Remove Surveillance Trap" set category = "Guardian" @@ -607,7 +563,6 @@ qdel(picked_snare) to_chat(src, "Snare disarmed.") - /obj/item/effect/snare name = "snare" desc = "You shouldn't be seeing this!" @@ -620,13 +575,11 @@ var/turf/snare_loc = get_turf(src.loc) if(spawner) to_chat(spawner, "[AM] has crossed your surveillance trap at [get_area(snare_loc)].") - if(istype(spawner, /mob/living/simple_animal/hostile/guardian)) var/mob/living/simple_animal/hostile/guardian/G = spawner if(G.summoner) to_chat(G.summoner, "[AM] has crossed your surveillance trap at [get_area(snare_loc)].") - ////Bomb /mob/living/simple_animal/hostile/guardian/bomb @@ -645,23 +598,19 @@ return if(src.loc == summoner) to_chat(src, "You must be manifested to create bombs!") - return if(istype(A, /obj/)) if(bomb_cooldown <= world.time && !stat) var/obj/item/weapon/guardian_bomb/B = new /obj/item/weapon/guardian_bomb(get_turf(A)) to_chat(src, "Success! Bomb on \the [A] armed!") - if(summoner) to_chat(summoner, "Your guardian has primed \the [A] to explode!") - bomb_cooldown = world.time + 200 B.spawner = src B.disguise (A) else to_chat(src, "Your powers are on cooldown! You must wait 20 seconds between bombs.") - /obj/item/weapon/guardian_bomb name = "bomb" desc = "You shouldn't be seeing this!" @@ -679,22 +628,18 @@ if(src) stored_obj.loc = get_turf(src.loc) to_chat(spawner, "Failure! Your trap on \the [stored_obj] didn't catch anyone this time.") - qdel(src) /obj/item/weapon/guardian_bomb/proc/detonate(var/mob/living/user) to_chat(user, "The [src] was boobytrapped!") - if(istype(spawner, /mob/living/simple_animal/hostile/guardian)) var/mob/living/simple_animal/hostile/guardian/G = spawner if(user == G.summoner) to_chat(user, "You knew this because of your link with your guardian, so you smartly defuse the bomb.") - stored_obj.loc = get_turf(src.loc) qdel(src) return to_chat(spawner, "Success! Your trap on \the [src] caught [user]!") - stored_obj.loc = get_turf(src.loc) playsound(get_turf(src),'sound/effects/Explosion2.ogg', 200, 1) user.ex_act(2) @@ -714,7 +659,6 @@ to_chat(user, "Looks odd!") - ////////Creation /obj/item/weapon/guardiancreator @@ -736,19 +680,15 @@ for(var/mob/living/simple_animal/hostile/guardian/G in living_mob_list) if (G.summoner == user) to_chat(user, "You already have a [mob_name]!") - return if(user.mind && user.mind.changeling) to_chat(user, "[ling_failure]") - return if(used == TRUE) to_chat(user, "[used_message]") - return used = TRUE to_chat(user, "[use_message]") - var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as the [mob_name] of [user.real_name]?", ROLE_GUARDIAN, 0, 100) var/mob/dead/observer/theghost = null @@ -757,7 +697,6 @@ spawn_guardian(user, theghost.key) else to_chat(user, "[failure_message]") - used = FALSE @@ -790,13 +729,9 @@ G.summoned = TRUE G.key = key to_chat(G, "You are a [mob_name] bound to serve [user.real_name].") - to_chat(G, "You are capable of manifesting or recalling to your master with verbs in the Guardian tab. You will also find a verb to communicate with them privately there.") - to_chat(G, "While personally invincible, you will die if [user.real_name] does, and any damage dealt to you will have a portion passed on to them as you feed upon them to sustain yourself.") - to_chat(G, "[G.playstyle_string]") - G.faction = user.faction user.verbs += /mob/living/proc/guardian_comm user.verbs += /mob/living/proc/guardian_recall @@ -818,7 +753,6 @@ G.icon_dead = "[theme][color]" to_chat(user, "[G.magic_fluff_string].") - if("tech") color = pick("Rose", "Peony", "Lily", "Daisy", "Zinnia", "Ivy", "Iris", "Petunia", "Violet", "Lilac", "Orchid") //technically not colors, just flowers that can be specific colors picked_name = pick("Gallium", "Indium", "Thallium", "Bismuth", "Aluminium", "Mercury", "Iron", "Silver", "Zinc", "Titanium", "Chromium", "Nickel", "Platinum", "Tellurium", "Palladium", "Rhodium", "Cobalt", "Osmium", "Tungsten", "Iridium") @@ -830,13 +764,11 @@ G.icon_dead = "[theme][color]" to_chat(user, "[G.tech_fluff_string].") - G.speak_emote = list("states") if("bio") G.icon = 'icons/mob/mob.dmi' picked_name = pick("brood", "hive", "nest") to_chat(user, "[G.bio_fluff_string].") - G.name = "[picked_name] swarm" G.color = picked_color G.real_name = "[picked_name] swarm" diff --git a/code/game/gamemodes/miniantags/morph/morph.dm b/code/game/gamemodes/miniantags/morph/morph.dm index eee370b1710..f55370f2680 100644 --- a/code/game/gamemodes/miniantags/morph/morph.dm +++ b/code/game/gamemodes/miniantags/morph/morph.dm @@ -53,7 +53,6 @@ ..() if(get_dist(user,src)<=3) to_chat(user, "It doesn't look quite right...") - else ..() return @@ -83,7 +82,6 @@ assume(A) else to_chat(src, "Your chameleon skin is still repairing itself!") - ..() /mob/living/simple_animal/hostile/morph/proc/assume(atom/movable/target) diff --git a/code/game/gamemodes/miniantags/morph/morph_event.dm b/code/game/gamemodes/miniantags/morph/morph_event.dm index 190d2abb5f4..3a822467c66 100644 --- a/code/game/gamemodes/miniantags/morph/morph_event.dm +++ b/code/game/gamemodes/miniantags/morph/morph_event.dm @@ -23,9 +23,7 @@ player_mind.special_role = "Morph" ticker.mode.traitors |= player_mind to_chat(S, S.playstyle_string) - to_chat(S, 'sound/magic/Mutate.ogg') - message_admins("[key_of_morph] has been made into morph by an event.") log_game("[key_of_morph] was spawned as a morph by an event.") return 1 diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index be6bdd718af..2dba746824a 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -63,12 +63,10 @@ incorporeal_move = 3 invisibility = INVISIBILITY_REVENANT to_chat(src, "You are once more concealed.") - if(unstun_time && world.time >= unstun_time) unstun_time = 0 notransform = 0 to_chat(src, "You can move again!") - update_spooky_icon() /mob/living/simple_animal/revenant/ex_act(severity) @@ -92,7 +90,6 @@ - /mob/living/simple_animal/revenant/say(message) if(!message) return @@ -101,10 +98,8 @@ for(var/mob/M in mob_list) if(istype(M, /mob/living/simple_animal/revenant)) to_chat(M, rendered) - if(isobserver(M)) to_chat(M, "(F) [rendered]") - return /mob/living/simple_animal/revenant/Stat() @@ -125,7 +120,6 @@ if(src.mind) src.mind.wipe_memory() to_chat(src, 'sound/effects/ghost.ogg') - to_chat(src, "
      ") to_chat(src, "You are a revenant.") to_chat(src, "Your formerly mundane spirit has been infused with alien energies and empowered into a revenant.") @@ -135,17 +129,14 @@ to_chat(src, "You do not remember anything of your past lives, nor will you remember anything about this one after your death.") to_chat(src, "Be sure to read the wiki page at http://nanotrasen.se/wiki/index.php/Revenant to learn more.") - var/datum/objective/revenant/objective = new objective.owner = src.mind src.mind.objectives += objective to_chat(src, "Objective #1: [objective.explanation_text]") - var/datum/objective/revenantFluff/objective2 = new objective2.owner = src.mind src.mind.objectives += objective2 to_chat(src, "Objective #2: [objective2.explanation_text]") - ticker.mode.traitors |= src.mind //Necessary for announcing if(!src.giveSpells()) message_admins("Revenant was created but has no mind. Trying again in five seconds.") @@ -179,7 +170,6 @@ updateallghostimages() to_chat(src, "NO! No... it's too late, you can feel your essence breaking apart...") - notransform = 1 revealed = 1 invisibility = 0 @@ -216,15 +206,12 @@ var/turf/T = get_turf(src) if(istype(T, /turf/simulated/wall)) to_chat(src, "You cannot use abilities from inside of a wall.") - return 0 if(src.inhibited) to_chat(src, "Your powers have been suppressed by nulling energy!") - return 0 if(!src.change_essence_amount(essence_cost, 1)) to_chat(src, "You lack the essence to use that ability.") - return 0 return 1 @@ -239,10 +226,8 @@ if(!silent) if(essence_amt > 0) to_chat(src, "Gained [essence_amt]E from [source].") - else to_chat(src, "Lost [essence_amt]E from [source].") - return 1 /mob/living/simple_animal/revenant/proc/reveal(time) @@ -255,11 +240,9 @@ incorporeal_move = 0 if(!unreveal_time) to_chat(src, "You have been revealed!") - unreveal_time = world.time + time else to_chat(src, "You have been revealed!") - unreveal_time = unreveal_time + time update_spooky_icon() @@ -271,11 +254,9 @@ notransform = 1 if(!unstun_time) to_chat(src, "You cannot move!") - unstun_time = world.time + time else to_chat(src, "You cannot move!") - unstun_time = unstun_time + time update_spooky_icon() @@ -371,11 +352,9 @@ ..(user) if(inert) to_chat(user, "It seems inert.") - else if(reforming) to_chat(user, "It is shifting and distorted. It would be wise to destroy this.") - /obj/item/weapon/ectoplasm/revenant/proc/reform() if(inert || !src) return diff --git a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm index e3d32319892..d836511fc42 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm @@ -30,62 +30,46 @@ return if(draining) to_chat(src, "You are already siphoning the essence of a soul!") - return if(target in drained_mobs) to_chat(src, "[target]'s soul is dead and empty.") - return if(!target.stat) to_chat(src, "This being's soul is too strong to harvest.") - if(prob(10)) to_chat(target, "You feel as if you are being watched.") - return draining = 1 essence_drained = rand(15, 20) to_chat(src, "You search for the soul of [target].") - if(do_after(src, 10, 0, target = target)) //did they get deleted in that second? if(target.ckey) to_chat(src, "Their soul burns with intelligence.") - essence_drained += rand(20, 30) if(target.stat != DEAD) to_chat(src, "Their soul blazes with life!") - essence_drained += rand(40, 50) else to_chat(src, "Their soul is weak and faltering.") - if(do_after(src, 20, 0, target = target)) //did they get deleted NOW? switch(essence_drained) if(1 to 30) to_chat(src, "[target] will not yield much essence. Still, every bit counts.") - if(30 to 70) to_chat(src, "[target] will yield an average amount of essence.") - if(70 to 90) to_chat(src, "Such a feast! [target] will yield much essence to you.") - if(90 to INFINITY) to_chat(src, "Ah, the perfect soul. [target] will yield massive amounts of essence to you.") - if(do_after(src, 20, 0, target = target)) //how about now if(!target.stat) to_chat(src, "They are now powerful enough to fight off your draining.") - to_chat(target, "You feel something tugging across your body before subsiding.") - draining = 0 return //hey, wait a minute... to_chat(src, "You begin siphoning essence from [target]'s soul.") - if(target.stat != DEAD) to_chat(target, "You feel a horribly unpleasant draining sensation as your grip on life weakens...") - icon_state = "revenant_draining" reveal(27) stun(27) @@ -97,16 +81,13 @@ essence_regen_cap += 25 perfectsouls += 1 to_chat(src, "The perfection of [target]'s soul has increased your maximum essence level. Your new maximum essence is [essence_regen_cap].") - to_chat(src, "[target]'s soul has been considerably weakened and will yield no more essence for the time being.") - target.visible_message("[target] slumps onto the ground.", \ "Violets lights, dancing in your vision, getting clo--") drained_mobs.Add(target) target.death(0) else to_chat(src, "[target ? "[target] has":"They have"] been drawn out of your grasp. The link has been broken.") - draining = 0 essence_drained = 0 if(target) //Wait, target is WHERE NOW? @@ -115,7 +96,6 @@ return else to_chat(src, "You are not close enough to siphon [target ? "[target]'s":"their"] soul. The link has been broken.") - draining = 0 essence_drained = 0 return @@ -153,11 +133,9 @@ return log_say("RevenantTransmit: [key_name(user)]->[key_name(M)] : [msg]") to_chat(usr, "You transmit to [M]: [msg]") - to_chat(M, "An alien voice resonates from all around... [msg]") - /obj/effect/proc_holder/spell/aoe_turf/revenant clothes_req = 0 action_background_icon_state = "bg_revenant" @@ -195,7 +173,6 @@ return 0 name = "[initial(name)] ([cast_amount]E)" to_chat(user, "You have unlocked [initial(name)]!") - panel = "Revenant Abilities" locked = 0 charge_counter = charge_max @@ -272,7 +249,6 @@ new/obj/effect/overlay/temp/revenant(T) for(var/mob/living/carbon/human/human in T.contents) to_chat(human, "You suddenly feel [pick("sick and tired", "tired and confused", "nauseated", "dizzy")].") - human.adjustStaminaLoss(stamdamage) human.adjustToxLoss(toxdamage) human.confused += confusion @@ -323,7 +299,6 @@ bot.emag_act(null) for(var/mob/living/carbon/human/human in T.contents) to_chat(human, "You feel [pick("your sense of direction flicker out", "a stabbing pain in your head", "your mind fill with static")].") - new/obj/effect/overlay/temp/revenant(human.loc) human.emp_act(1) for(var/obj/thing in T.contents) diff --git a/code/game/gamemodes/miniantags/slaughter/bloodcrawl.dm b/code/game/gamemodes/miniantags/slaughter/bloodcrawl.dm index 7ac75cf1e71..bab7c597a69 100644 --- a/code/game/gamemodes/miniantags/slaughter/bloodcrawl.dm +++ b/code/game/gamemodes/miniantags/slaughter/bloodcrawl.dm @@ -8,7 +8,6 @@ var/mob/living/carbon/C = src if(C.l_hand || C.r_hand) to_chat(C, "You may not hold items while blood crawling!") - return 0 var/obj/item/weapon/bloodcrawl/B1 = new(C) var/obj/item/weapon/bloodcrawl/B2 = new(C) @@ -56,7 +55,6 @@ if(kidnapped) to_chat(src, "You begin to feast on [kidnapped]. You can not move while you are doing this.") - visible_message("Loud eating sounds come from the blood...") sleep(6) if(animation) @@ -66,7 +64,6 @@ sleep(30) if(kidnapped) to_chat(src, "You devour [kidnapped]. Your health is fully restored.") - adjustBruteLoss(-1000) adjustFireLoss(-1000) adjustOxyLoss(-1000) @@ -77,7 +74,6 @@ var/mob/living/simple_animal/slaughter/demon = src demon.devoured++ to_chat(kidnapped, "You feel teeth sink into your flesh, and the--") - kidnapped.adjustBruteLoss(1000) kidnapped.forceMove(src) demon.consumed_mobs.Add(kidnapped) @@ -86,7 +82,6 @@ qdel(kidnapped) else to_chat(src, "You happily devour... nothing? Your meal vanished at some point!") - else sleep(6) if (animation) @@ -104,7 +99,6 @@ if(notransform) to_chat(src, "Finish eating first!") - return 0 B.visible_message("[B] starts to bubble...") if(!do_after(src, 20, target = B)) diff --git a/code/game/gamemodes/miniantags/slaughter/slaughter.dm b/code/game/gamemodes/miniantags/slaughter/slaughter.dm index 145f71b2066..f288cf39435 100644 --- a/code/game/gamemodes/miniantags/slaughter/slaughter.dm +++ b/code/game/gamemodes/miniantags/slaughter/slaughter.dm @@ -56,11 +56,8 @@ bloodspell.phased = 1 if(mind) to_chat(src, src.playstyle_string) - to_chat(src, "You are not currently in the same plane of existence as the station. Ctrl+Click a blood pool to manifest.") - to_chat(src, 'sound/misc/demon_dies.ogg') - mind.current.verbs += /mob/living/simple_animal/slaughter/proc/slaughterWhisper if(!(vialspawned)) var/datum/objective/slaughter/objective = new @@ -72,11 +69,9 @@ mind.objectives += objective mind.objectives += fluffObjective to_chat(src, "Objective #[1]: [objective.explanation_text]") - to_chat(src, "Objective #[2]: [fluffObjective.explanation_text]") - /mob/living/simple_animal/slaughter/Life() ..() if(boost[key_name(M)]: [msg]") to_chat(usr, "You whisper to [M]: [msg]") - to_chat(M, "Suddenly a strange, demonic voice resonates in your head... [msg]") - for(var/mob/dead/observer/G in player_list) G.show_message("Demonic message from [usr] ([ghost_follow_link(usr, ghost=G)]) to [M] ([ghost_follow_link(M, ghost=G)]): [msg]") @@ -169,12 +162,10 @@ user.bloodcrawl = BLOODCRAWL else if(user.bloodcrawl == BLOODCRAWL) to_chat(user, "You feel diffr- CONSUME THEM! ") - user.bloodcrawl = BLOODCRAWL_EAT else to_chat(user, "...and you don't feel any different.") - user.drop_item() insert(user) //Consuming the heart literally replaces your heart with a demon heart. H A R D C O R E diff --git a/code/game/gamemodes/mutiny/emergency_authentication_device.dm b/code/game/gamemodes/mutiny/emergency_authentication_device.dm index d2e0e2849df..168f0049560 100644 --- a/code/game/gamemodes/mutiny/emergency_authentication_device.dm +++ b/code/game/gamemodes/mutiny/emergency_authentication_device.dm @@ -46,7 +46,6 @@ /obj/machinery/emergency_authentication_device/attack_hand(mob/user) if(activated) to_chat(user, "\blue \The [src] is already active!") - return if(!mode.current_directive.directives_complete()) @@ -57,7 +56,6 @@ if(captains_key && secondary_key) activated = 1 to_chat(user, "\blue You activate \the [src]!") - state("Command acknowledged. Initiating quantum entanglement relay to Nanotrasen High Command.") launch_shuttle() return @@ -80,7 +78,6 @@ /obj/machinery/emergency_authentication_device/attackby(obj/item/weapon/O, mob/user, params) if(activated) to_chat(user, "\blue \The [src] is already active!") - return if(!mode.current_directive.directives_complete()) diff --git a/code/game/gamemodes/mutiny/key_pinpointer.dm b/code/game/gamemodes/mutiny/key_pinpointer.dm index 6b47fc71ae7..03f157be2ba 100644 --- a/code/game/gamemodes/mutiny/key_pinpointer.dm +++ b/code/game/gamemodes/mutiny/key_pinpointer.dm @@ -15,27 +15,21 @@ target = mutiny.captains_key point_at(target) to_chat(usr, "\blue You calibrate \the [src] to locate the Captain's Authentication Key.") - if (1) mode = 2 target = mutiny.secondary_key to_chat(usr, "\blue You calibrate \the [src] to locate the Emergency Secondary Authentication Key.") - else mode = 0 active = 0 icon_state = "pinoff" to_chat(usr, "\blue You switch \the [src] off.") - /obj/item/weapon/pinpointer/advpinpointer/auth_key/examine(mob/user) switch(mode) if (1) to_chat(user, "Is is calibrated for the Captain's Authentication Key.") - if (2) to_chat(user, "It is calibrated for the Emergency Secondary Authentication Key.") - else to_chat(user, "It is switched off.") - diff --git a/code/game/gamemodes/mutiny/mutiny.dm b/code/game/gamemodes/mutiny/mutiny.dm index 4dd0ea1d459..e08a336997a 100644 --- a/code/game/gamemodes/mutiny/mutiny.dm +++ b/code/game/gamemodes/mutiny/mutiny.dm @@ -92,7 +92,6 @@ datum/game_mode/mutiny for(var/T in subtypesof(/datum/directive)) var/datum/directive/D = new T(src) // to_chat(world, D.name) - if (D.meets_prerequisites()) candidates+=D return candidates @@ -128,7 +127,6 @@ datum/game_mode/mutiny proc/equip_head(datum/mind/head, faction, proc/recruitment_verb) var/mob/living/carbon/human/H = head.current to_chat(H, "You are the Head [capitalize(faction)]!") - head.special_role = "head_[faction]" var/slots = get_equipment_slots() @@ -154,9 +152,7 @@ datum/game_mode/mutiny proc/add_faction(datum/mind/M, faction, list/faction_list) if(!can_be_recruited(M, faction)) to_chat(M.current, "\red Recruitment canceled; your role has already changed.") - to_chat(head_mutineer.current, "\red Could not recruit [M]. Their role has changed.") - return if(M in loyalists) @@ -170,15 +166,11 @@ datum/game_mode/mutiny if(faction == "mutineer") to_chat(M.current, fluff.mutineer_tag("You have joined the mutineers!")) - to_chat(head_mutineer.current, fluff.mutineer_tag("[M] has joined the mutineers!")) - else to_chat(M.current, fluff.loyalist_tag("You have joined the loyalists!")) - to_chat(head_loyalist.current, fluff.loyalist_tag("[M] has joined the loyalists!")) - update_icon(M) proc/was_bloodbath() @@ -220,30 +212,23 @@ datum/game_mode/mutiny proc/round_outcome() to_chat(world, "

      Breaking News



      ") - if (was_bloodbath()) to_chat(world, fluff.no_victory()) - return var/directives_completed = current_directive.directives_complete() var/ead_activated = ead.activated if (directives_completed && ead_activated) to_chat(world, fluff.loyalist_major_victory()) - else if (directives_completed && !ead_activated) to_chat(world, fluff.loyalist_minor_victory()) - else if (!directives_completed && ead_activated) to_chat(world, fluff.mutineer_minor_victory()) - else if (!directives_completed && !ead_activated) to_chat(world, fluff.mutineer_major_victory()) - to_chat(world, sound('sound/machines/twobeep.ogg')) - proc/update_all_icons() spawn(0) for(var/datum/mind/M in mutineers) @@ -282,19 +267,16 @@ datum/game_mode/mutiny var/list/loyalist_candidates = get_head_loyalist_candidates() if(!loyalist_candidates || loyalist_candidates.len == 0) to_chat(world, "\red Mutiny mode aborted: no valid candidates for head loyalist.") - return 0 var/list/mutineer_candidates = get_head_mutineer_candidates() if(!mutineer_candidates || mutineer_candidates.len == 0) to_chat(world, "\red Mutiny mode aborted: no valid candidates for head mutineer.") - return 0 var/list/directive_candidates = get_directive_candidates() if(!directive_candidates || directive_candidates.len == 0) to_chat(world, "\red Mutiny mode aborted: no valid candidates for Directive X.") - return 0 head_loyalist = pick(loyalist_candidates) @@ -335,12 +317,10 @@ datum/game_mode/mutiny if(!candidates.len) to_chat(src, "\red You aren't close enough to anybody that can be recruited.") - return if(world.time < mode.recruit_loyalist_cooldown) to_chat(src, "\red Wait [MUTINY_RECRUITMENT_COOLDOWN] seconds before recruiting again.") - return mode.recruit_loyalist_cooldown = world.time + (MUTINY_RECRUITMENT_COOLDOWN SECONDS) @@ -349,7 +329,6 @@ datum/game_mode/mutiny if (M) to_chat(src, "Attempting to recruit [M]...") - log_admin("[key_name(src)] attempted to recruit [M] as a loyalist.") message_admins("\red [key_name_admin(src)] attempted to recruit [M] as a loyalist.") @@ -358,10 +337,8 @@ datum/game_mode/mutiny mode.add_loyalist(M.mind) else if(choice == "No") to_chat(M, "\red You declined to join the loyalists.") - to_chat(mode.head_loyalist.current, "\red [M] declined to support the loyalists.") - /mob/living/carbon/human/proc/recruit_mutineer() set name = "Recruit Mutineer" set category = "Mutiny" @@ -377,12 +354,10 @@ datum/game_mode/mutiny if(!candidates.len) to_chat(src, "\red You aren't close enough to anybody that can be recruited.") - return if(world.time < mode.recruit_mutineer_cooldown) to_chat(src, "\red Wait [MUTINY_RECRUITMENT_COOLDOWN] seconds before recruiting again.") - return mode.recruit_mutineer_cooldown = world.time + (MUTINY_RECRUITMENT_COOLDOWN SECONDS) @@ -391,7 +366,6 @@ datum/game_mode/mutiny if (M) to_chat(src, "Attempting to recruit [M]...") - log_admin("[key_name(src)] attempted to recruit [M] as a mutineer.") message_admins("\red [key_name_admin(src)] attempted to recruit [M] as a mutineer.") @@ -400,10 +374,8 @@ datum/game_mode/mutiny mode.add_mutineer(M.mind) else if(choice == "No") to_chat(M, "\red You declined to join the mutineers.") - to_chat(mode.head_mutineer.current, "\red [M] declined to support the mutineers.") - /proc/get_mutiny_mode() if(!ticker || !istype(ticker.mode, /datum/game_mode/mutiny)) return null diff --git a/code/game/gamemodes/mutiny/mutiny_fluff.dm b/code/game/gamemodes/mutiny/mutiny_fluff.dm index 66ee7cf2673..b67635f0724 100644 --- a/code/game/gamemodes/mutiny/mutiny_fluff.dm +++ b/code/game/gamemodes/mutiny/mutiny_fluff.dm @@ -73,7 +73,6 @@ Be safe, friend.\" (Unable to Reply)

      "} proc/announce() to_chat(world, "The current game mode is - Mutiny!") - to_chat(world, {"

      The crew will be divided by their sense of ethics when a morally turbulent emergency directive arrives with an incomplete command validation code.

      The [loyalist_tag("Head Loyalist")] is the Captain, who carries the [loyalist_tag("Captain's Authentication Key")] at all times.
      diff --git a/code/game/gamemodes/nations/nations.dm b/code/game/gamemodes/nations/nations.dm index c9adb948a7c..8cad280dff5 100644 --- a/code/game/gamemodes/nations/nations.dm +++ b/code/game/gamemodes/nations/nations.dm @@ -20,7 +20,6 @@ datum/game_mode/nations if(!istype(M,/mob/new_player)) to_chat(M, sound('sound/effects/purge_siren.ogg')) - return ..() /datum/game_mode/nations/proc/send_intercept() @@ -44,10 +43,8 @@ datum/game_mode/nations if(H.mind.assigned_role == H.mind.nation.default_leader) H.mind.nation.current_leader = H.mind.current to_chat(H, "You have been chosen to lead the nation of [H.mind.nation.default_name]!") - continue to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.default_name]!") - continue if(H.mind.assigned_role in medical_positions) @@ -57,10 +54,8 @@ datum/game_mode/nations if(H.mind.assigned_role == H.mind.nation.default_leader) H.mind.nation.current_leader = H.mind.current to_chat(H, "You have been chosen to lead the nation of [H.mind.nation.default_name]!") - continue to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.default_name]!") - continue if(H.mind.assigned_role in science_positions) @@ -70,10 +65,8 @@ datum/game_mode/nations if(H.mind.assigned_role == H.mind.nation.default_leader) H.mind.nation.current_leader = H.mind.current to_chat(H, "You have been chosen to lead the nation of [H.mind.nation.default_name]!") - continue to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.default_name]!") - continue if(H.mind.assigned_role in security_positions) @@ -83,10 +76,8 @@ datum/game_mode/nations if(H.mind.assigned_role == H.mind.nation.default_leader) H.mind.nation.current_leader = H.mind.current to_chat(H, "You have been chosen to lead the nation of [H.mind.nation.default_name]!") - continue to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.default_name]!") - continue if(H.mind.assigned_role in cargonians) @@ -96,10 +87,8 @@ datum/game_mode/nations if(H.mind.assigned_role == H.mind.nation.default_leader) H.mind.nation.current_leader = H.mind.current to_chat(H, "You have been chosen to lead the nation of [H.mind.nation.default_name]!") - continue to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.default_name]!") - continue if(H.mind.assigned_role in servicion) @@ -109,10 +98,8 @@ datum/game_mode/nations if(H.mind.assigned_role == H.mind.nation.default_leader) H.mind.nation.current_leader = H.mind.current to_chat(H, "You have been chosen to lead the nation of [H.mind.nation.default_name]!") - continue to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.default_name]!") - continue if(H.mind.assigned_role in (support_positions + command_positions)) @@ -122,15 +109,12 @@ datum/game_mode/nations if(H.mind.assigned_role == H.mind.nation.default_leader) H.mind.nation.current_leader = H.mind.current to_chat(H, "You have been chosen to lead the nation of [H.mind.nation.default_name]!") - continue to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.default_name]!") - continue if(H.mind.assigned_role in civilian_positions) to_chat(H, "You do not belong to any nation and are free to sell your services to the highest bidder.") - continue else @@ -170,7 +154,6 @@ datum/game_mode/nations if(!N.current_leader && N.membership.len) N.current_leader = pick(N.membership) to_chat(N.current_leader, "You have been chosen to lead the nation of [N.current_name]!") - if(N.current_leader) var/mob/living/carbon/human/H = N.current_leader H.verbs += /mob/living/carbon/human/proc/set_nation_name @@ -195,7 +178,6 @@ datum/game_mode/nations mode.update_nations_icons_added(H,"atmosia") H.mind.nation.membership += H.mind.current to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.current_name]!") - return 1 if(H.mind.assigned_role in medical_positions) @@ -203,7 +185,6 @@ datum/game_mode/nations mode.update_nations_icons_added(H,"hudmedistan") H.mind.nation.membership += H.mind.current to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.current_name]!") - return 1 if(H.mind.assigned_role in science_positions) @@ -211,7 +192,6 @@ datum/game_mode/nations mode.update_nations_icons_added(H,"hudscientopia") H.mind.nation.membership += H.mind.current to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.current_name]!") - return 1 if(H.mind.assigned_role in security_positions) @@ -219,7 +199,6 @@ datum/game_mode/nations mode.update_nations_icons_added(H,"hudbrigston") H.mind.nation.membership += H.mind.current to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.current_name]!") - return 1 if(H.mind.assigned_role in mode.cargonians) @@ -227,7 +206,6 @@ datum/game_mode/nations mode.update_nations_icons_added(H,"hudcargonia") H.mind.nation.membership += H.mind.current to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.current_name]!") - return 1 if(H.mind.assigned_role in mode.servicion) @@ -235,7 +213,6 @@ datum/game_mode/nations mode.update_nations_icons_added(H,"hudservice") H.mind.nation.membership += H.mind.current to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.current_name]!") - return 1 if(H.mind.assigned_role in (support_positions + command_positions)) @@ -243,12 +220,10 @@ datum/game_mode/nations mode.update_nations_icons_added(H,"hudcommand") H.mind.nation.membership += H.mind.current to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.current_name]!") - return 1 if(H.mind.assigned_role in civilian_positions) to_chat(H, "You do not belong to any nation and are free to sell your services to the highest bidder.") - return 1 if(H.mind.assigned_role == "AI") diff --git a/code/game/gamemodes/nations/nationsprocs.dm b/code/game/gamemodes/nations/nationsprocs.dm index 59ade854fd6..69b256458c2 100644 --- a/code/game/gamemodes/nations/nationsprocs.dm +++ b/code/game/gamemodes/nations/nationsprocs.dm @@ -17,7 +17,6 @@ H.mind.nation.current_name = input H.mind.nation.update_nation_id() to_chat(H, "You rename your nation to [input].") - H.verbs -= /mob/living/carbon/human/proc/set_nation_name return 1 @@ -46,7 +45,6 @@ H.mind.nation.member_rank = input H.mind.nation.update_nation_id() to_chat(H, "You changed the [type] rank of your nation to [input].") - return 1 /mob/living/carbon/human/proc/choose_heir() @@ -67,15 +65,12 @@ if(H.mind.nation.heir) var/mob/living/carbon/human/oldheir = H.mind.nation.heir to_chat(oldheir, "You are no longer the heir to your nation!") - oldheir.verbs -= /mob/living/carbon/human/proc/takeover var/mob/living/carbon/human/newheir = heir H.mind.nation.heir = newheir newheir.verbs += /mob/living/carbon/human/proc/takeover to_chat(newheir, "You have been selected to be the heir to your nation's leadership!") - to_chat(H, "You have selected [heir] to be your heir!") - H.mind.nation.update_nation_id() @@ -96,7 +91,6 @@ if(confirmation == "Yes") var/mob/living/carbon/human/oldleader = H.mind.nation.current_leader to_chat(oldleader, "You have been replaced by [H.name] as the leader of [H.mind.nation.current_name]!") - oldleader.verbs -= /mob/living/carbon/human/proc/set_nation_name oldleader.verbs -= /mob/living/carbon/human/proc/set_ranks oldleader.verbs -= /mob/living/carbon/human/proc/choose_heir @@ -107,7 +101,6 @@ H.verbs += /mob/living/carbon/human/proc/set_ranks H.verbs += /mob/living/carbon/human/proc/choose_heir to_chat(H, "You have replaced [oldleader.name] as the leader of [H.mind.nation.current_name]!") - H.mind.nation.update_nation_id() diff --git a/code/game/gamemodes/newobjective.dm b/code/game/gamemodes/newobjective.dm index 5171ec08c51..aae6d31261a 100644 --- a/code/game/gamemodes/newobjective.dm +++ b/code/game/gamemodes/newobjective.dm @@ -177,7 +177,6 @@ continue var/datum/objective/assassinate/objective = pickweight(killobjectives) to_chat(world, objective) - for(1 to 10) if(objective.points + total_weight <= 100 || !killobjectives.len) break diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 0704b9c9a17..8ad66fe7879 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -24,12 +24,9 @@ proc/issyndicate(mob/living/M as mob) /datum/game_mode/nuclear/announce() to_chat(world, "The current game mode is - Nuclear Emergency!") - to_chat(world, "A [syndicate_name()] Strike Force is approaching [station_name()]!") - to_chat(world, "A nuclear explosive was being transported by Nanotrasen to a military base. The transport ship mysteriously lost contact with Space Traffic Control (STC). About that time a strange disk was discovered around [station_name()]. It was identified by Nanotrasen as a nuclear authentication disk and now Syndicate Operatives have arrived to retake the disk and detonate SS13! There are most likely Syndicate starships are in the vicinity, so take care not to lose the disk!\nSyndicate: Reclaim the disk and detonate the nuclear bomb anywhere on SS13.\nPersonnel: Hold the disk and escape with the disk on the shuttle!") - /datum/game_mode/nuclear/can_start()//This could be better, will likely have to recode it later if(!..()) return 0 @@ -175,12 +172,9 @@ proc/issyndicate(mob/living/M as mob) */ synd_mind.current.real_name = "[syndicate_name()] Team [leader_title]" to_chat(synd_mind.current, "You are the Syndicate leader for this mission. You are responsible for the distribution of telecrystals and your ID is the only one who can open the launch bay doors.") - to_chat(synd_mind.current, "If you feel you are not up to this task, give your ID to another operative.") - to_chat(synd_mind.current, "In your hand you will find a special item capable of triggering a greater challenge for your team. Examine it carefully and consult with your fellow operatives before activating it.") - var/obj/item/device/nuclear_challenge/challenge = new /obj/item/device/nuclear_challenge synd_mind.current.equip_to_slot_or_del(challenge, slot_r_hand) @@ -197,7 +191,6 @@ proc/issyndicate(mob/living/M as mob) if (nuke_code) synd_mind.store_memory("Syndicate Nuclear Bomb Code: [nuke_code]", 0, 0) to_chat(synd_mind.current, "The nuclear authorization code is: [nuke_code]") - var/obj/item/weapon/paper/P = new P.info = "The nuclear authorization code is: [nuke_code]" P.name = "nuclear bomb code" @@ -227,11 +220,9 @@ proc/issyndicate(mob/living/M as mob) /datum/game_mode/proc/greet_syndicate(var/datum/mind/syndicate, var/you_are=1) if (you_are) to_chat(syndicate.current, "\blue You are a [syndicate_name()] agent!") - var/obj_count = 1 for(var/datum/objective/objective in syndicate.objectives) to_chat(syndicate.current, "Objective #[obj_count]: [objective.explanation_text]") - obj_count++ return @@ -325,66 +316,48 @@ proc/issyndicate(mob/living/M as mob) if (!disk_rescued && station_was_nuked && !syndies_didnt_escape) feedback_set_details("round_end_result","win - syndicate nuke") to_chat(world, "Syndicate Major Victory!") - to_chat(world, "[syndicate_name()] operatives have destroyed [station_name()]!") - else if (!disk_rescued && station_was_nuked && syndies_didnt_escape) feedback_set_details("round_end_result","halfwin - syndicate nuke - did not evacuate in time") to_chat(world, "Total Annihilation") - to_chat(world, "[syndicate_name()] operatives destroyed [station_name()] but did not leave the area in time and got caught in the explosion. Next time, don't lose the disk!") - else if (!disk_rescued && !station_was_nuked && nuke_off_station && !syndies_didnt_escape) feedback_set_details("round_end_result","halfwin - blew wrong station") to_chat(world, "Crew Minor Victory") - to_chat(world, "[syndicate_name()] operatives secured the authentication disk but blew up something that wasn't [station_name()]. Next time, don't lose the disk!") - else if (!disk_rescued && !station_was_nuked && nuke_off_station && syndies_didnt_escape) feedback_set_details("round_end_result","halfwin - blew wrong station - did not evacuate in time") to_chat(world, "[syndicate_name()] operatives have earned Darwin Award!") - to_chat(world, "[syndicate_name()] operatives blew up something that wasn't [station_name()] and got caught in the explosion. Next time, don't lose the disk!") - else if ( disk_rescued && is_operatives_are_dead()) feedback_set_details("round_end_result","loss - evacuation - disk secured - syndi team dead") to_chat(world, "Crew Major Victory!") - to_chat(world, "The Research Staff has saved the disc and killed the [syndicate_name()] Operatives") - else if ( disk_rescued ) feedback_set_details("round_end_result","loss - evacuation - disk secured") to_chat(world, "Crew Major Victory") - to_chat(world, "The Research Staff has saved the disc and stopped the [syndicate_name()] Operatives!") - else if (!disk_rescued && is_operatives_are_dead()) feedback_set_details("round_end_result","loss - evacuation - disk not secured") to_chat(world, "Syndicate Minor Victory!") - to_chat(world, "The Research Staff failed to secure the authentication disk but did manage to kill most of the [syndicate_name()] Operatives!") - else if (!disk_rescued && crew_evacuated) feedback_set_details("round_end_result","halfwin - detonation averted") to_chat(world, "Syndicate Minor Victory!") - to_chat(world, "[syndicate_name()] operatives recovered the abandoned authentication disk but detonation of [station_name()] was averted. Next time, don't lose the disk!") - else if (!disk_rescued && !crew_evacuated) feedback_set_details("round_end_result","halfwin - interrupted") to_chat(world, "Neutral Victory") - to_chat(world, "Round was mysteriously interrupted!") - ..() return @@ -422,7 +395,6 @@ proc/issyndicate(mob/living/M as mob) text += "" to_chat(world, text) - return 1 /proc/nukelastname(var/mob/M as mob) //--All praise goes to NEO|Phyte, all blame goes to DH, and it was Cindi-Kate's idea. Also praise Urist for copypasta ho. @@ -435,7 +407,6 @@ proc/issyndicate(mob/living/M as mob) else if (newname == "Unknown" || newname == "floor" || newname == "wall" || newname == "rwall" || newname == "_") to_chat(M, "That name is reserved.") - return nukelastname(M) return newname diff --git a/code/game/gamemodes/nuclear/nuclear_challenge.dm b/code/game/gamemodes/nuclear/nuclear_challenge.dm index d8e252d97c8..c11b43f81ec 100644 --- a/code/game/gamemodes/nuclear/nuclear_challenge.dm +++ b/code/game/gamemodes/nuclear/nuclear_challenge.dm @@ -18,23 +18,19 @@ return if(player_list.len < MIN_CHALLENGE_PLAYERS) to_chat(user, "The enemy crew is too small to be worth declaring war on.") - return if(user.z != ZLEVEL_CENTCOMM) to_chat(user, "You have to be at your base to use this.") - return if(world.time > CHALLENGE_TIME_LIMIT) to_chat(user, "It's too late to declare hostilities. Your benefactors are already busy with other schemes. You'll have to make do with what you have on hand.") - return declaring_war = 1 var/are_you_sure = alert(user, "Consult your team carefully before you declare war on [station_name()]]. Are you sure you want to alert the enemy crew?", "Declare war?", "Yes", "No") if(are_you_sure == "No") to_chat(user, "On second thought, the element of surprise isn't so bad after all.") - declaring_war = 0 return @@ -42,7 +38,6 @@ command_announcement.Announce(war_declaration, "Declaration of War", 'sound/effects/siren.ogg') to_chat(user, "You've attracted the attention of powerful forces within the syndicate. A bonus bundle of telecrystals has been granted to your team. Great things await you if you complete the mission.") - for(var/obj/machinery/computer/shuttle/syndicate/S in machines) S.challenge = TRUE diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index b580622504f..85e6967f180 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -56,23 +56,19 @@ var/bomb_set panel_open = 1 overlays += image(icon, "npanel_open") to_chat(user, "You unscrew the control panel of [src].") - playsound(src, 'sound/items/Screwdriver.ogg', 50, 1) else panel_open = 0 overlays -= image(icon, "npanel_open") to_chat(user, "You screw the control panel of [src] back on.") - playsound(src, 'sound/items/Screwdriver.ogg', 50, 1) else if (panel_open == 0) to_chat(user, "[src] emits a buzzing noise, the panel staying locked in.") - if (panel_open == 1) panel_open = 0 overlays -= image(icon, "npanel_open") to_chat(user, "You screw the control panel of [src] back on.") - playsound(src, 'sound/items/Screwdriver.ogg', 50, 1) flick("nuclearbombc", src) return @@ -96,7 +92,6 @@ var/bomb_set if(!WT.isOn()) return if (WT.get_fuel() < 5) // uses up 5 fuel. to_chat(user, "\red You need more fuel to complete this task.") - return user.visible_message("[user] starts cutting loose the anchoring bolt covers on [src].", "You start cutting loose the anchoring bolt covers with [O]...") @@ -124,7 +119,6 @@ var/bomb_set if(!WT.isOn()) return if (WT.get_fuel() < 5) // uses up 5 fuel. to_chat(user, "\red You need more fuel to complete this task.") - return user.visible_message("[user] starts cutting apart the anchoring system sealant on [src].", "You start cutting apart the anchoring system's sealant with [O]...") @@ -224,11 +218,9 @@ var/bomb_set if (deployable) to_chat(usr, "\red You close several panels to make [src] undeployable.") - deployable = 0 else to_chat(usr, "\red You adjust some panels to make [src] deployable.") - deployable = 1 return @@ -288,7 +280,6 @@ var/bomb_set return if (safety) to_chat(usr, "\red The safety is still on.") - nanomanager.update_uis(src) return timing = !(timing) @@ -331,7 +322,6 @@ var/bomb_set else to_chat(usr, "There is nothing to anchor to!") - nanomanager.update_uis(src) /obj/machinery/nuclearbomb/ex_act(severity) @@ -382,14 +372,11 @@ var/bomb_set ticker.mode:nukes_left -- else if(off_station == 1) to_chat(world, "A nuclear device was set off, but the explosion was out of reach of the station!") - else if(off_station == 2) to_chat(world, "A nuclear device was set off, but the device was not on the station!") - else to_chat(world, "The station was destoyed by the nuclear blast!") - ticker.mode.station_was_nuked = (off_station<2) //offstation==1 is a draw. the station becomes irradiated and needs to be evacuated. //kinda shit but I couldn't get permission to do what I wanted to do. @@ -416,7 +403,6 @@ var/bomb_set var/turf/disk_loc = get_turf(src) if(disk_loc.z != ZLEVEL_STATION && disk_loc.z != ZLEVEL_CENTCOMM) to_chat(get(src, /mob), "You can't help but feel that you just lost something back there...") - qdel(src) /obj/item/weapon/disk/nuclear/Destroy() diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm index 170c0aac8e9..320be6c9f98 100644 --- a/code/game/gamemodes/nuclear/pinpointer.dm +++ b/code/game/gamemodes/nuclear/pinpointer.dm @@ -22,13 +22,11 @@ active = 1 workdisk() to_chat(usr, "You activate the pinpointer.") - else active = 0 icon_state = "pinoff" to_chat(usr, "You deactivate the pinpointer.") - /obj/item/weapon/pinpointer/proc/scandisk() if(!the_disk) the_disk = locate() @@ -72,7 +70,6 @@ if(bomb.timing) to_chat(user, "Extreme danger. Arming signal detected. Time remaining: [bomb.timeleft]") - /obj/item/weapon/pinpointer/advpinpointer name = "advanced pinpointer" desc = "A larger version of the normal pinpointer, this unit features a helpful quantum entanglement detection system to locate various objects that do not broadcast a locator signal." @@ -90,13 +87,11 @@ if(mode == 2) point_at(target) to_chat(usr, "You activate the pinpointer.") - else active = 0 icon_state = "pinoff" to_chat(usr, "You deactivate the pinpointer.") - /obj/item/weapon/pinpointer/advpinpointer/workdisk() if(mode == 0) scandisk() @@ -135,7 +130,6 @@ to_chat(usr, "You set the pinpointer to locate [locationx],[locationy]") - return attack_self() if("Disk Recovery") @@ -159,10 +153,8 @@ target = locate(item_paths[targetitem]) if(!target) to_chat(usr, "Failed to locate [targetitem]!") - return to_chat(usr, "You set the pinpointer to locate [targetitem].") - if("DNA") var/DNAstring = input("Input DNA string to search for." , "Please Enter String." , "") if(!DNAstring) @@ -190,17 +182,14 @@ if(!mode) workdisk() to_chat(user, "Authentication Disk Locator active.") - else worklocation() to_chat(user, "Shuttle Locator active.") - else active = 0 icon_state = "pinoff" to_chat(user, "You deactivate the pinpointer.") - /obj/item/weapon/pinpointer/nukeop/workdisk() if(!active) return if(mode) //Check in case the mode changes while operating @@ -271,19 +260,16 @@ /obj/item/weapon/pinpointer/operative/attack_self() if(!usr.mind || !(usr.mind in ticker.mode.syndicates)) to_chat(usr, "AUTHENTICATION FAILURE. ACCESS DENIED.") - return 0 if(!active) active = 1 workop() to_chat(usr, "You activate the pinpointer.") - else active = 0 icon_state = "pinoff" to_chat(usr, "You deactivate the pinpointer.") - /obj/item/weapon/pinpointer/operative/proc/scan_for_ops() if(active) nearest_op = null //Resets nearest_op every time it scans @@ -307,7 +293,5 @@ if(active) if(nearest_op) to_chat(user, "Nearest operative detected is [nearest_op.real_name].") - else to_chat(user, "No operatives detected within scanning range.") - diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 41edd787514..bbf0e5c9c73 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -34,11 +34,9 @@ /////////////////////////// /datum/game_mode/revolution/announce() to_chat(world, "The current game mode is - Revolution!") - to_chat(world, "Some crewmembers are attempting to start a revolution!
      \nRevolutionaries - Kill the Captain, HoP, HoS, CE, RD and CMO. Convert other crewmembers (excluding the heads of staff, and security officers) to your cause by flashing them. Protect your leaders.
      \nPersonnel - Protect the heads of staff. Kill the leaders of the revolution, and brainwash the other revolutionaries (by beating them in the head).
      ") - /////////////////////////////////////////////////////////////////////////////// //Gets the round setup, cancelling if there's not enough players at the start// /////////////////////////////////////////////////////////////////////////////// @@ -130,7 +128,6 @@ rev_mind.objectives += rev_obj to_chat(rev_mind.current, "Additional Objective: Assassinate [head_mind.name], the [head_mind.assigned_role].") - for(var/datum/mind/rev_mind in mode.revolutionaries) for(var/datum/mind/head_mind in heads) var/datum/objective/mutiny/rev_obj = new @@ -141,7 +138,6 @@ to_chat(rev_mind.current, "Additional Objective: Assassinate [head_mind.name], the [head_mind.assigned_role].") - /datum/game_mode/proc/forge_revolutionary_objectives(var/datum/mind/rev_mind) var/list/heads = get_living_heads() if(num_players_started() >= 30) @@ -158,10 +154,8 @@ var/obj_count = 1 if (you_are) to_chat(rev_mind.current, "\blue You are a member of the revolutionaries' leadership!") - for(var/datum/objective/objective in rev_mind.objectives) to_chat(rev_mind.current, "Objective #[obj_count]: [objective.explanation_text]") - rev_mind.special_role = "Head Revolutionary" obj_count++ @@ -175,7 +169,6 @@ if (mob.mind) if (mob.mind.assigned_role == "Clown") to_chat(mob, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.") - mob.mutations.Remove(CLUMSY) @@ -191,10 +184,8 @@ var/where = mob.equip_in_one_of_slots(T, slots) if (!where) to_chat(mob, "The Syndicate were unfortunately unable to get you a flash.") - else to_chat(mob, "The flash in your [where] will help you to persuade the crew to join your cause.") - mob.update_icons() return 1 @@ -232,7 +223,6 @@ return 0 revolutionaries += rev_mind to_chat(rev_mind.current, "\red You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution!") - rev_mind.special_role = "Revolutionary" update_rev_icons_added(rev_mind) if(jobban_isbanned(rev_mind.current, ROLE_REV)) @@ -248,23 +238,19 @@ if(beingborged) to_chat(rev_mind.current, "\red The frame's firmware detects and deletes your neural reprogramming! You remember nothing from the moment you were flashed until now.") - message_admins("[key_name_admin(rev_mind.current)] has been borged while being a member of the revolution.") else to_chat(rev_mind.current, "\red You have been brainwashed! You are no longer a revolutionary! Your memory is hazy from the time you were a rebel...the only thing you remember is the name of the one who brainwashed you...") - update_rev_icons_removed(rev_mind) for(var/mob/living/M in view(rev_mind.current)) if(beingborged) to_chat(M, "The frame beeps contentedly, purging the hostile memory engram from the MMI before initalizing it.") - else to_chat(M, "[rev_mind.current] looks like they just remembered their real allegiance!") - ///////////////////////////////////// //Adds the rev hud to a new convert// ///////////////////////////////////// @@ -309,11 +295,9 @@ if(finished == 1) feedback_set_details("round_end_result","win - heads killed") to_chat(world, "\red The heads of staff were killed or abandoned the station! The revolutionaries win!") - else if(finished == 2) feedback_set_details("round_end_result","loss - rev heads killed") to_chat(world, "\red The heads of staff managed to stop the revolution!") - ..() return 1 @@ -343,7 +327,6 @@ to_chat(world, text) - if(revolutionaries.len || istype(ticker.mode,/datum/game_mode/revolution)) var/text = "The revolutionaries were:" @@ -365,7 +348,6 @@ to_chat(world, text) - if( head_revolutionaries.len || revolutionaries.len || istype(ticker.mode,/datum/game_mode/revolution) ) var/text = "The heads of staff were:" @@ -394,7 +376,6 @@ to_chat(world, text) - /proc/is_convertable_to_rev(datum/mind/mind) return istype(mind) && \ istype(mind.current, /mob/living/carbon/human) && \ diff --git a/code/game/gamemodes/revolution/rp_revolution.dm b/code/game/gamemodes/revolution/rp_revolution.dm index cea8e9d9d2d..78d210159a8 100644 --- a/code/game/gamemodes/revolution/rp_revolution.dm +++ b/code/game/gamemodes/revolution/rp_revolution.dm @@ -76,10 +76,8 @@ var/obj_count = 1 if (you_are) to_chat(rev_mind.current, "\blue You are a member of the revolutionaries' leadership!") - for(var/datum/objective/objective in rev_mind.objectives) to_chat(rev_mind.current, "Objective #[obj_count]: [objective.explanation_text]") - rev_mind.special_role = "Head Revolutionary" obj_count++ @@ -92,7 +90,6 @@ var/mob/living/carbon/human/M = get_nt_opposed() if(M && !(M.mind in head_revolutionaries) && !(M in already_considered)) to_chat(rev_mob, "We have received credible reports that [M.real_name] might be willing to help our cause. If you need assistance, consider contacting them.") - rev_mob.mind.store_memory("Potential Collaborator: [M.real_name]") /////////////////////////////////////////////////// @@ -107,7 +104,6 @@ return 0 revolutionaries += rev_mind to_chat(rev_mind.current, "\red You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill, capture or convert the heads to win the revolution!") - rev_mind.special_role = "Revolutionary" update_rev_icons_added(rev_mind) return 1 @@ -132,11 +128,9 @@ /////////////////////////// /datum/game_mode/revolution/rp_revolution/announce() to_chat(world, "The current game mode is - Revolution!") - to_chat(world, "Some crewmembers are attempting to start a revolution!") - ////////////////////////////////////////////////////////////////////// //Announces the end of the game with all relavent information stated// ////////////////////////////////////////////////////////////////////// @@ -144,11 +138,9 @@ if(finished == 1) feedback_set_details("round_end_result","win - heads overthrown") to_chat(world, "\red The heads of staff were overthrown! The revolutionaries win!") - else if(finished == 2) feedback_set_details("round_end_result","loss - revolution stopped") to_chat(world, "\red The heads of staff managed to stop the revolution!") - ..() return 1 @@ -168,37 +160,28 @@ Possible += P if(!Possible.len) to_chat(src, "\red There doesn't appear to be anyone available for you to convert here.") - return var/mob/living/carbon/human/M = input("Select a person to convert", "Viva la revolution!", null) as mob in Possible if(((src.mind in ticker.mode:head_revolutionaries) || (src.mind in ticker.mode:revolutionaries))) if((M.mind in ticker.mode:head_revolutionaries) || (M.mind in ticker.mode:revolutionaries)) to_chat(src, "\red [M] is already be a revolutionary!") - else if(!ticker.mode:is_convertible(M)) to_chat(src, "\red [M] is implanted with a loyalty implant - Remove it first!") - else if(world.time < M.mind.rev_cooldown) to_chat(src, "\red Wait five seconds before reconversion attempt.") - return to_chat(src, "\red Attempting to convert [M]...") - log_admin("[src]([src.ckey]) attempted to convert [M].") message_admins("\red [src]([src.ckey]) attempted to convert [M].") var/choice = alert(M,"Asked by [src]: Do you want to join the revolution?","Align Thyself with the Revolution!","No!","Yes!") if(choice == "Yes!") ticker.mode:add_revolutionary(M.mind) to_chat(M, "\blue You join the revolution!") - to_chat(src, "\blue [M] joins the revolution!") - else if(choice == "No!") to_chat(M, "\red You reject this traitorous cause!") - to_chat(src, "\red [M] does not support the revolution!") - M.mind.rev_cooldown = world.time+50 /datum/game_mode/revolution/rp_revolution/process() @@ -226,7 +209,6 @@ H.verbs += /mob/living/carbon/human/proc/RevConvert to_chat(H, "\red Congratulations, yer heads of revolution are all gone now, so yer earned yourself a promotion.") - added_heads = 1 break @@ -261,7 +243,6 @@ comm.messagetext.Add(message) to_chat(world, sound('sound/AI/commandreport.ogg')) - /datum/game_mode/revolution/rp_revolution/latespawn(mob/M) if(M.mind.assigned_role in command_positions) log_debug("Adding head kill/capture/convert objective for [M.name]") @@ -274,4 +255,3 @@ rev_obj.explanation_text = "Assassinate, convert or capture [M.real_name], the [M.mind.assigned_role]." rev_mind.objectives += rev_obj to_chat(rev_mind.current, "\red A new Head of Staff, [M.real_name], the [M.mind.assigned_role] has appeared. Your objectives have been updated.") - diff --git a/code/game/gamemodes/sandbox/h_sandbox.dm b/code/game/gamemodes/sandbox/h_sandbox.dm index b21e7101a82..4d061d37eca 100644 --- a/code/game/gamemodes/sandbox/h_sandbox.dm +++ b/code/game/gamemodes/sandbox/h_sandbox.dm @@ -53,12 +53,10 @@ datum/hSB if(!admin) return if(hsboxspawn) to_chat(world, "Sandbox: [usr.key] has disabled object spawning!") - hsboxspawn = 0 return if(!hsboxspawn) to_chat(world, "Sandbox: [usr.key] has enabled object spawning!") - hsboxspawn = 1 return if("hsbsuit") @@ -108,7 +106,6 @@ datum/hSB hsb.loc = usr.loc to_chat(usr, "Sandbox: Created an airlock.") - if("hsbcanister") var/list/hsbcanisters = subtypesof(/obj/machinery/portable_atmospherics/canister/) var/hsbcanister = input(usr, "Choose a canister to spawn.", "Sandbox:") in hsbcanisters + "Cancel" diff --git a/code/game/gamemodes/sandbox/sandbox.dm b/code/game/gamemodes/sandbox/sandbox.dm index 8f02b2df6a7..1be9a0ced0e 100644 --- a/code/game/gamemodes/sandbox/sandbox.dm +++ b/code/game/gamemodes/sandbox/sandbox.dm @@ -8,10 +8,8 @@ /datum/game_mode/sandbox/announce() to_chat(world, "The current game mode is - Sandbox!") - to_chat(world, "Build your own station with the sandbox-panel command!") - /datum/game_mode/sandbox/pre_setup() for(var/mob/M in player_list) M.CanBuild() diff --git a/code/game/gamemodes/scoreboard.dm b/code/game/gamemodes/scoreboard.dm index 19f7f4905cc..44adae0d98a 100644 --- a/code/game/gamemodes/scoreboard.dm +++ b/code/game/gamemodes/scoreboard.dm @@ -149,9 +149,7 @@ // Show the score - might add "ranks" later to_chat(world, "The crew's final score is:") - to_chat(world, "[score_crewscore]") - for(var/mob/E in player_list) if(E.client) if(E.client.prefs && !(E.client.prefs.toggles & DISABLE_SCOREBOARD)) diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm index 46fbc47a5df..ef098c87f91 100644 --- a/code/game/gamemodes/shadowling/shadowling.dm +++ b/code/game/gamemodes/shadowling/shadowling.dm @@ -77,10 +77,8 @@ Made by Xhuis /datum/game_mode/shadowling/announce() to_chat(world, "The current game mode is - Shadowling!") - to_chat(world, "There are alien shadowlings on the station. Crew: Kill the shadowlings before they can eat or enthrall the crew. Shadowlings: Enthrall the crew while remaining in hiding.") - /datum/game_mode/shadowling/pre_setup() if(config.protect_roles_from_antagonist) restricted_jobs += protected_jobs @@ -108,9 +106,7 @@ Made by Xhuis log_game("[shadow.key] (ckey) has been selected as a Shadowling.") sleep(10) to_chat(shadow.current, "
      ") - to_chat(shadow.current, "You are a shadowling!") - greet_shadow(shadow) finalize_shadowling(shadow) process_shadow_objectives(shadow) @@ -125,7 +121,6 @@ Made by Xhuis - /datum/game_mode/proc/process_shadow_objectives(var/datum/mind/shadow_mind) var/objective = "enthrall" //may be devour later, but for now it seems murderbone-y @@ -136,7 +131,6 @@ Made by Xhuis to_chat(shadow_mind.current, "Objective #1: [objective_explanation]
      ") - /datum/game_mode/proc/finalize_shadowling(var/datum/mind/shadow_mind) var/mob/living/carbon/human/S = shadow_mind.current shadow_mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadowling_hatch) @@ -145,7 +139,6 @@ Made by Xhuis update_shadow_icons_added(shadow_mind) if(shadow_mind.assigned_role == "Clown") to_chat(S, "Your alien nature has allowed you to overcome your clownishness.") - S.mutations.Remove(CLUMSY) /datum/game_mode/proc/add_thrall(datum/mind/new_thrall_mind) @@ -161,17 +154,11 @@ Made by Xhuis new_thrall_mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/lesser_shadow_walk) new_thrall_mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadow_vision/thrall) to_chat(new_thrall_mind.current, "You see the truth. Reality has been torn away and you realize what a fool you've been.") - to_chat(new_thrall_mind.current, "The shadowlings are your masters. Serve them above all else and ensure they complete their goals.") - to_chat(new_thrall_mind.current, "You may not harm other thralls or the shadowlings. However, you do not need to obey other thralls.") - to_chat(new_thrall_mind.current, "Your body has been irreversibly altered. The attentive can see this - you may conceal it by wearing a mask.") - to_chat(new_thrall_mind.current, "Though not nearly as powerful as your masters, you possess some weak powers. These can be found in the Thrall Abilities tab.") - to_chat(new_thrall_mind.current, "You may communicate with your allies by speaking in the Shadowling Hivemind (:8).") - if(jobban_isbanned(new_thrall_mind.current, ROLE_SHADOWLING)) replace_jobbaned_player(new_thrall_mind.current, ROLE_SHADOWLING) @@ -255,16 +242,12 @@ Made by Xhuis /datum/game_mode/shadowling/declare_completion() if(check_shadow_victory() && shuttle_master.emergency.mode >= SHUTTLE_ESCAPE) //Doesn't end instantly - this is hacky and I don't know of a better way ~X to_chat(world, "The shadowlings have ascended and taken over the station!") - else if(shadowling_dead && !check_shadow_victory()) //If the shadowlings have ascended, they can not lose the round to_chat(world, "The shadowlings have been killed by the crew!") - else if(!check_shadow_victory() && shuttle_master.emergency.mode >= SHUTTLE_ESCAPE) to_chat(world, "The crew escaped the station before the shadowlings could ascend!") - else to_chat(world, "The shadowlings have failed!") - ..() return 1 @@ -304,7 +287,6 @@ Made by Xhuis to_chat(world, text) - /* MISCELLANEOUS */ @@ -339,9 +321,7 @@ Made by Xhuis if(H.stat != DEAD) to_chat(H, "The light burns you!")//Message spam to say "GET THE FUCK OUT" - to_chat(H, 'sound/weapons/sear.ogg') - else if(light_amount < LIGHT_HEAL_THRESHOLD) H.heal_overall_damage(5, 5) H.adjustToxLoss(-5) diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index 6fa19dc30a2..5421789c0ea 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -6,13 +6,10 @@ if(H.get_species() == "Lesser Shadowling" && is_thrall(H)) return 1 if(!is_shadow_or_thrall(usr)) to_chat(usr, "You can't wrap your head around how to do this.") - else if(is_thrall(usr)) to_chat(usr, "You aren't powerful enough to do this.") - else if(is_shadow(usr)) to_chat(usr, "Your telepathic ability is suppressed. Hatch or use Rapid Re-Hatch first.") - return 0 @@ -28,7 +25,6 @@ for(var/mob/living/carbon/human/target in targets) if(!ishuman(target)) to_chat(usr, "You may only glare at humans!") - charge_counter = charge_max return if(!shadowling_check(usr)) @@ -36,12 +32,10 @@ return if(target.stat) to_chat(usr, "[target] must be conscious!") - charge_counter = charge_max return if(is_shadow_or_thrall(target)) to_chat(usr, "You don't see why you would want to paralyze an ally.") - charge_counter = charge_max return var/mob/living/carbon/human/M = target @@ -49,10 +43,8 @@ target.visible_message("[target] freezes in place, their eyes glazing over...") if(in_range(target, usr)) to_chat(target, "Your gaze is forcibly drawn into [usr]'s eyes, and you are mesmerized by their heavenly beauty...") - else //Only alludes to the shadowling if the target is close by to_chat(target, "Red lights suddenly dance in your vision, and you are mesmerized by the heavenly lights...") - target.Stun(10) M.silent += 10 @@ -69,17 +61,14 @@ for(var/mob/living/carbon/human/target in targets) if(!ishuman(target) || !target) to_chat(usr, "You nay only glare at humans!") - charge_counter = charge_max return if(target.stat) to_chat(usr, "[target] must be conscious!") - charge_counter = charge_max return if(is_shadow_or_thrall(target)) to_chat(usr, "You cannot glare at allies!") - charge_counter = charge_max return var/mob/living/carbon/human/M = target @@ -87,10 +76,8 @@ target.visible_message("[target] freezes in place, their eyes glazing over...") if(in_range(target, usr)) to_chat(target, "Your gaze is forcibly drawn into [usr]'s eyes, and you are mesmerized by the heavenly lights...") - else to_chat(target, "Red lights suddenly dance in your vision, and you are mesmerized by their heavenly beauty...") - target.Stun(3) //Roughly 30% as long as the normal one M.silent += 3 @@ -156,7 +143,6 @@ charge_counter = charge_max return to_chat(usr, "You silently disable all nearby lights.") - for(var/obj/effect/glowshroom/G in orange(2, usr)) //Why the fuck was this in the loop below? G.visible_message("\The [G] withers away!") qdel(G) @@ -251,11 +237,9 @@ var/mob/living/carbon/human/H = user if(!H.vision_type) to_chat(H, "You shift the nerves in your eyes, allowing you to see in the dark.") - H.vision_type = new vision_path else to_chat(H, "You return your vision to normal.") - H.vision_type = null /obj/effect/proc_holder/spell/targeted/shadow_vision/thrall @@ -277,7 +261,6 @@ charge_counter = charge_max return to_chat(usr, "You freeze the nearby air.") - playsound(usr.loc, 'sound/effects/ghost2.ogg', 50, 1) for(var/turf/T in targets) @@ -287,10 +270,8 @@ continue else to_chat(M, "You feel a blast of paralyzingly cold air wrap around you and flow past, but you are unaffected!") - continue to_chat(M, "A wave of shockingly cold air engulfs you!") - M.Stun(2) M.apply_damage(10, BURN) if(M.bodytemperature) @@ -321,89 +302,68 @@ for(var/mob/living/carbon/human/target in targets) if(!in_range(usr, target)) to_chat(usr, "You need to be closer to enthrall [target].") - charge_counter = charge_max return if(!target.key || !target.mind) to_chat(usr, "The target has no mind.") - charge_counter = charge_max return if(target.stat) to_chat(usr, "The target must be conscious.") - charge_counter = charge_max return if(is_shadow_or_thrall(target)) to_chat(usr, "You can not enthrall allies.") - charge_counter = charge_max return if(!ishuman(target)) to_chat(usr, "You can only enthrall humans.") - charge_counter = charge_max return if(enthralling) to_chat(usr, "You are already enthralling!") - charge_counter = charge_max return if(!target.client) to_chat(usr, "[target]'s mind is vacant of activity.") - enthralling = 1 to_chat(usr, "This target is valid. You begin the enthralling.") - to_chat(target, "[usr] stares at you. You feel your head begin to pulse.") - for(var/progress = 0, progress <= 3, progress++) switch(progress) if(1) to_chat(usr, "You place your hands to [target]'s head...") - usr.visible_message("[usr] places their hands onto the sides of [target]'s head!") if(2) to_chat(usr, "You begin preparing [target]'s mind as a blank slate...") - usr.visible_message("[usr]'s palms flare a bright red against [target]'s temples!") to_chat(target, "A terrible red light floods your mind. You collapse as conscious thought is wiped away.") - target.Weaken(12) sleep(20) if(isloyal(target)) to_chat(usr, "They are enslaved by Nanotrasen. You begin to shut down the nanobot implant - this will take some time.") - usr.visible_message("[usr] pauses, then dips their head in concentration!") to_chat(target, "You feel your loyalties begin to weaken!") - sleep(100) //10 seconds - not spawn() so the enthralling takes longer to_chat(usr, "The nanobots composing the loyalty implant have been rendered inert. Now to continue.") - usr.visible_message("[usr] relaxes again.") for(var/obj/item/weapon/implant/loyalty/L in target) if(L && L.implanted) qdel(L) to_chat(target, "Your unwavering loyalty to Nanotrasen unexpectedly falters, dims, dies.") - if(3) to_chat(usr, "You begin planting the tumor that will control the new thrall...") - usr.visible_message("A strange energy passes from [usr]'s hands into [target]'s head!") to_chat(target, "You feel your memories twisting, morphing. A sense of horror dominates your mind.") - if(!do_mob(usr, target, 70)) //around 21 seconds total for enthralling, 31 for someone with a loyalty implant to_chat(usr, "The enthralling has been interrupted - your target's mind returns to its previous state.") - to_chat(target, "You wrest yourself away from [usr]'s hands and compose yourself") - enthralling = 0 return enthralling = 0 to_chat(usr, "You have enthralled [target]!") - target.visible_message("[target] looks to have experienced a revelation!", \ "False faces all dark not real not real not--") target.setOxyLoss(0) //In case the shadowling was choking them out @@ -423,7 +383,6 @@ /obj/effect/proc_holder/spell/targeted/shadowling_regenarmor/cast(list/targets) if(!is_shadow(usr)) to_chat(usr, "You must be a shadowling to do this!") - charge_counter = charge_max return for(var/mob/living/user in targets) @@ -467,22 +426,18 @@ to_chat(user, "You focus your telepathic energies abound, harnessing and drawing together the strength of your thralls.") - for(M in living_mob_list) if(is_thrall(M)) thralls++ to_chat(M, "You feel hooks sink into your mind and pull.") - if(!do_after(user, 30, target = user)) to_chat(user, "Your concentration has been broken. The mental hooks you have sent out now retract into your mind.") - return if(thralls >= 3 && !screech_acquired) screech_acquired = 1 to_chat(user, "The power of your thralls has granted you the Sonic Screech ability. This ability will shatter nearby windows and deafen enemies, plus stunning silicon lifeforms.") - user.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/unearthly_screech) if(thralls >= 5 && !blind_smoke_acquired) @@ -494,7 +449,6 @@ if(thralls >= 7 && !drainLifeAcquired) drainLifeAcquired = 1 to_chat(user, "The power of your thralls has granted you the Drain Life ability. You can now drain the health of nearby humans to heal yourself.") - user.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/drainLife) if(thralls >= 9 && !reviveThrallAcquired) @@ -506,12 +460,9 @@ if(thralls < victory_threshold) to_chat(user, "You do not have the power to ascend. You require [victory_threshold] thralls, but only [thralls] living thralls are present.") - else if(thralls >= victory_threshold) to_chat(usr, "You are now powerful enough to ascend. Use the Ascendance ability when you are ready. This will kill all of your thralls.") - to_chat(usr, "You may find Ascendance in the Shadowling Evolution tab.") - for(M in living_mob_list) if(is_shadow(M)) var/obj/effect/proc_holder/spell/targeted/collective_mind/CM @@ -522,14 +473,12 @@ M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadowling_ascend) if(M == usr) to_chat(M, "You project this power to the rest of the shadowlings.") - else to_chat(M, "[user.real_name] has coalesced the strength of the thralls. You can draw upon it at any time to ascend. (Shadowling Evolution Tab)")//Tells all the other shadowlings - /obj/effect/proc_holder/spell/targeted/blindness_smoke name = "Blindness Smoke" desc = "Spews a cloud of smoke which will blind enemies." @@ -547,7 +496,6 @@ for(var/mob/living/user in targets) user.visible_message("[user] suddenly bends over and coughs out a cloud of black smoke, which begins to spread rapidly!") to_chat(user, "You regurgitate a vast cloud of blinding smoke.") - playsound(user, 'sound/effects/bamf.ogg', 50, 1) var/obj/item/weapon/reagent_containers/glass/beaker/large/B = new /obj/item/weapon/reagent_containers/glass/beaker/large(user.loc) B.reagents.clear_reagents() //Just in case! @@ -572,14 +520,12 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom if(!is_shadow_or_thrall(M)) to_chat(M, "You breathe in the black smoke, and your eyes burn horribly!") - M.eye_blind = 5 if(prob(25)) M.visible_message("[M] claws at their eyes!") M.Stun(3) else to_chat(M, "You breathe in the black smoke, and you feel revitalized!") - M.heal_organ_damage(2,2) M.adjustOxyLoss(-2) M.adjustToxLoss(-2) @@ -614,15 +560,12 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) if(iscarbon(target)) var/mob/living/carbon/M = target to_chat(M, "A spike of pain drives into your head and scrambles your thoughts!") - M.confused += 10 M.ear_damage += 3 else if(issilicon(target)) var/mob/living/silicon/S = target to_chat(S, "ERROR $!(@ ERROR )#^! SENSORY OVERLOAD \[$(!@#") - to_chat(S, 'sound/misc/interference.ogg') - playsound(S, 'sound/machines/warning-buzzer.ogg', 50, 1) var/datum/effect/system/spark_spread/sp = new /datum/effect/system/spark_spread sp.set_up(5, 1, S) @@ -659,7 +602,6 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) if(!targetsDrained) charge_counter = charge_max to_chat(usr, "There were no nearby humans for you to drain.") - return for(var/mob/living/carbon/M in nearbyTargets) U.heal_organ_damage(10, 10) @@ -671,12 +613,10 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) M.adjustOxyLoss(20) M.adjustStaminaLoss(20) to_chat(M, "You feel a wave of exhaustion and a curious draining sensation directed towards [usr]!") - to_chat(usr, "You draw life from those around you to heal your wounds.") - /obj/effect/proc_holder/spell/targeted/reviveThrall name = "Black Recuperation" desc = "Revives or empowers a thrall." @@ -697,17 +637,14 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) if("Empower") if(!is_thrall(thrallToRevive)) to_chat(usr, "[thrallToRevive] is not a thrall.") - charge_counter = charge_max return if(thrallToRevive.stat != CONSCIOUS) to_chat(usr, "[thrallToRevive] must be conscious to become empowered.") - charge_counter = charge_max return if(thrallToRevive.get_species() == "Lesser Shadowling") to_chat(usr, "[thrallToRevive] is already empowered.") - charge_counter = charge_max return var/empowered_thralls = 0 @@ -719,20 +656,16 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) empowered_thralls++ if(empowered_thralls >= EMPOWERED_THRALL_LIMIT) to_chat(usr, "You cannot spare this much energy. There are too many empowered thralls.") - charge_counter = charge_max return usr.visible_message("[usr] places their hands over [thrallToRevive]'s face, red light shining from beneath.", \ "You place your hands on [thrallToRevive]'s face and begin gathering energy...") to_chat(thrallToRevive, "[usr] places their hands over your face. You feel energy gathering. Stand still...") - if(!do_mob(usr, thrallToRevive, 80)) to_chat(usr, "Your concentration snaps. The flow of energy ebbs.") - charge_counter = charge_max return to_chat(usr, "You release a massive surge of power into [thrallToRevive]!") - usr.visible_message("Red lightning surges into [thrallToRevive]'s face!") playsound(thrallToRevive, 'sound/weapons/Egloves.ogg', 50, 1) playsound(thrallToRevive, 'sound/machines/defib_zap.ogg', 50, 1) @@ -752,12 +685,10 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) if("Revive") if(!is_thrall(thrallToRevive)) to_chat(usr, "[thrallToRevive] is not a thrall.") - charge_counter = charge_max return if(thrallToRevive.stat != DEAD) to_chat(usr, "[thrallToRevive] is not dead.") - charge_counter = charge_max return usr.visible_message("[usr] kneels over [thrallToRevive], placing their hands on \his chest.", \ @@ -765,11 +696,9 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) thrallToRevive.notify_ghost_cloning("Your masters are resuscitating you! Re-enter your corpse if you wish to be brought to life.", source = thrallToRevive) if(!do_mob(usr, thrallToRevive, 30)) to_chat(usr, "Your concentration snaps. The flow of energy ebbs.") - charge_counter = charge_max return to_chat(usr, "You release a massive surge of power into [thrallToRevive]!") - usr.visible_message("Red lightning surges from [usr]'s hands into [thrallToRevive]'s chest!") playsound(thrallToRevive, 'sound/weapons/Egloves.ogg', 50, 1) playsound(thrallToRevive, 'sound/machines/defib_zap.ogg', 50, 1) @@ -804,12 +733,10 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) return if(!is_thrall(target)) to_chat(usr, "[target] must be a thrall.") - charge_counter = charge_max return if(shuttle_master.emergency.mode != SHUTTLE_CALL) to_chat(usr, "The shuttle must be inbound only to the station.") - charge_counter = charge_max return var/mob/living/carbon/human/M = target @@ -819,12 +746,9 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) "You are suddenly transported... far, far away...") if(!do_after(usr, 50, target = M)) to_chat(M, "You are snapped back to reality, your haze dissipating!") - to_chat(usr, "You have been interrupted. The draw has failed.") - return to_chat(usr, "You project [M]'s life force toward the approaching shuttle, extending its arrival duration!") - M.visible_message("[M]'s eyes suddenly flare red. They proceed to collapse on the floor, not breathing.", \ "...speeding by... ...pretty blue glow... ...touch it... ...no glow now... ...no light... ...nothing at all...") M.death() @@ -852,7 +776,6 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) var/mob/living/simple_animal/ascendant_shadowling/SHA = usr if(SHA.phasing) to_chat(usr, "You are not in the same plane of existence. Unphase first.") - charge_counter = charge_max return @@ -860,7 +783,6 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) for(var/mob/living/boom in targets) if(is_shadow(boom)) //Used to not work on thralls. Now it does so you can PUNISH THEM LIKE THE WRATHFUL GOD YOU ARE. to_chat(usr, "Making an ally explode seems unwise.") - charge_counter = charge_max return usr.visible_message("[usr]'s markings flare as they gesture at [boom]!", \ @@ -887,35 +809,28 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) if(SHA.phasing) charge_counter = charge_max to_chat(usr, "You are not in the same plane of existence. Unphase first.") - return for(var/mob/living/carbon/human/target in targets) if(is_shadow_or_thrall(target)) to_chat(usr, "You cannot enthrall an ally.") - charge_counter = charge_max return if(!target.ckey || !target.mind) to_chat(usr, "The target has no mind.") - charge_counter = charge_max return if(target.stat) to_chat(usr, "The target must be conscious.") - charge_counter = charge_max return if(!ishuman(target)) to_chat(usr, "You can only enthrall humans.") - charge_counter = charge_max return to_chat(usr, "You instantly rearrange [target]'s memories, hyptonitizing them into a thrall.") - to_chat(target, "An agonizing spike of pain drives into your mind, and--") - ticker.mode.add_thrall(target.mind) target.mind.special_role = "shadowling thrall" target.add_language("Shadowling Hivemind") @@ -962,7 +877,6 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) var/mob/living/simple_animal/ascendant_shadowling/SHA = usr if(SHA.phasing) to_chat(usr, "You are not in the same plane of existence. Unphase first.") - charge_counter = charge_max return @@ -974,7 +888,6 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) if(is_shadow_or_thrall(target)) continue to_chat(target, "You are struck by a bolt of lightning!") - playsound(target, 'sound/magic/LightningShock.ogg', 50, 1) target.Weaken(8) target.take_organ_damage(0,50) @@ -996,4 +909,3 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) if(!text) return to_chat(world, "\"[text]\"") - diff --git a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm index 0d514ff1005..80be87570f2 100644 --- a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm @@ -15,14 +15,12 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N return if(!isturf(usr.loc)) to_chat(usr, "You can't hatch here!") - return for(var/mob/living/carbon/human/H in targets) var/hatch_or_no = alert(H,"Are you sure you want to hatch? You cannot undo this!",,"Yes","No") switch(hatch_or_no) if("No") to_chat(H, "You decide against hatching for now.") - charge_counter = charge_max return if("Yes") @@ -58,15 +56,12 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N sleep(80) playsound(H.loc, 'sound/weapons/slash.ogg', 25, 1) to_chat(H, "You rip and slice.") - sleep(10) playsound(H.loc, 'sound/weapons/slashmiss.ogg', 25, 1) to_chat(H, "The chrysalis falls like water before you.") - sleep(10) playsound(H.loc, 'sound/weapons/slice.ogg', 25, 1) to_chat(H, "You are free!") - H.status_flags = temp_flags sleep(10) playsound(H.loc, 'sound/effects/ghost.ogg', 100, 1) @@ -77,7 +72,6 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N H.SetStunned(0) to_chat(H, "YOU LIVE!!!") - for(var/obj/structure/alien/resin/wall/shadowling/W in orange(H, 1)) playsound(W, 'sound/effects/splat.ogg', 50, 1) qdel(W) @@ -102,7 +96,6 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N sleep(10) to_chat(H, "Your powers are awoken. You may now live to your fullest extent. Remember your goal. Cooperate with your thralls and allies.") - H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadow_vision) H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/enthrall) H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/glare) @@ -132,7 +125,6 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N switch(hatch_or_no) if("No") to_chat(H, "You decide against ascending for now.") - charge_counter = charge_max return if("Yes") @@ -155,22 +147,16 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N sleep(40) to_chat(H, "Yes!") - sleep(10) to_chat(H, "YES!!") - sleep(10) to_chat(H, "YE--") - sleep(1) for(var/mob/living/M in orange(7, H)) M.Weaken(10) to_chat(M, "An immense pressure slams you onto the ground!") - to_chat(world, "\"VYSHA NERADA YEKHEZET U'RUU!!\"") - to_chat(world, 'sound/hallucinations/veryfar_noise.ogg') - for(var/obj/machinery/power/apc/A in apcs) A.overload_lighting() var/mob/A = new /mob/living/simple_animal/ascendant_shadowling(H.loc) diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 497664cc76f..c0d0edf89e3 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -26,11 +26,9 @@ /datum/game_mode/traitor/announce() to_chat(world, "The current game mode is - Traitor!") - to_chat(world, "There is a syndicate traitor on the station. Do not let the traitor succeed!") - /datum/game_mode/traitor/pre_setup() if(config.protect_roles_from_antagonist) @@ -175,11 +173,9 @@ /datum/game_mode/proc/greet_traitor(var/datum/mind/traitor) to_chat(traitor.current, "You are the traitor.") - var/obj_count = 1 for(var/datum/objective/objective in traitor.objectives) to_chat(traitor.current, "Objective #[obj_count]: [objective.explanation_text]") - obj_count++ return @@ -206,26 +202,20 @@ /datum/game_mode/proc/give_codewords(mob/living/traitor_mob) to_chat(traitor_mob, "The Syndicate provided you with the following information on how to identify their agents:") - to_chat(traitor_mob, "Code Phrase: [syndicate_code_phrase]") - to_chat(traitor_mob, "Code Response: [syndicate_code_response]") - traitor_mob.mind.store_memory("Code Phrase: [syndicate_code_phrase]") traitor_mob.mind.store_memory("Code Response: [syndicate_code_response]") to_chat(traitor_mob, "Use the code words in the order provided, during regular conversation, to identify other agents. Proceed with caution, however, as everyone is a potential foe.") - /datum/game_mode/proc/add_law_zero(mob/living/silicon/ai/killer) var/law = "Accomplish your objectives at all costs." var/law_borg = "Accomplish your AI's objectives at all costs." to_chat(killer, "Your laws have been changed!") - killer.set_zeroth_law(law, law_borg) to_chat(killer, "New law: 0. [law]") - give_codewords(killer) @@ -288,7 +278,6 @@ to_chat(world, text) - return 1 @@ -299,7 +288,6 @@ if (traitor_mob.mind) if (traitor_mob.mind.assigned_role == "Clown") to_chat(traitor_mob, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.") - traitor_mob.mutations.Remove(CLUMSY) // find a radio! toolbox(es), backpack, belt, headset @@ -309,7 +297,6 @@ if (!R) to_chat(traitor_mob, "Unfortunately, the Syndicate wasn't able to get you a radio.") - . = 0 else if (istype(R, /obj/item/device/radio)) @@ -330,7 +317,6 @@ T.uplink_owner = "[traitor_mob.key]" target_radio.traitor_frequency = freq to_chat(traitor_mob, "The Syndicate have cunningly disguised a Syndicate Uplink as your [R.name] [T.loc]. Simply dial the frequency [format_frequency(freq)] to unlock its hidden features.") - traitor_mob.mind.store_memory("Radio Freq: [format_frequency(freq)] ([R.name] [T.loc]).") else if (istype(R, /obj/item/device/pda)) // generate a passcode if the uplink is hidden in a PDA @@ -343,7 +329,6 @@ P.lock_code = pda_pass to_chat(traitor_mob, "The Syndicate have cunningly disguised a Syndicate Uplink as your [R.name] [T.loc]. Simply enter the code \"[pda_pass]\" into the ringtone select to unlock its hidden features.") - traitor_mob.mind.store_memory("Uplink Passcode: [pda_pass] ([R.name] [T.loc]).") if(!safety)//If they are not a rev. Can be added on to. give_codewords(traitor_mob) @@ -352,7 +337,6 @@ var/mob/living/carbon/human/M = get_nt_opposed() if(M && M != traitor_mob) to_chat(traitor_mob, "We have received credible reports that [M.real_name] might be willing to help our cause. If you need assistance, consider contacting them.") - traitor_mob.mind.store_memory("Potential Collaborator: [M.real_name]") /datum/game_mode/proc/update_traitor_icons_added(datum/mind/traitor_mind) @@ -383,10 +367,8 @@ update_traitor_icons_removed(traitor_mind) // to_chat(world, "Removed [traitor_mind.current.name] from traitor shit") - to_chat(traitor_mind.current, "\red The fog clouding your mind clears. You remember nothing from the moment you were implanted until now.(You don't remember who implanted you)") - /datum/game_mode/proc/assign_exchange_role(var/datum/mind/owner) //set faction var/faction = "red" @@ -427,5 +409,4 @@ if (equipped_slot) where = "In your [equipped_slot]" to_chat(mob, "

      [where] is a folder containing secret documents that another Syndicate group wants. We have set up a meeting with one of their agents on station to make an exchange. Exercise extreme caution as they cannot be trusted and may be hostile.
      ") - mob.update_icons() diff --git a/code/game/gamemodes/vampire/vampire.dm b/code/game/gamemodes/vampire/vampire.dm index a0bdfe7fbdf..1abed5ba4dd 100644 --- a/code/game/gamemodes/vampire/vampire.dm +++ b/code/game/gamemodes/vampire/vampire.dm @@ -39,10 +39,8 @@ /datum/game_mode/vampire/announce() to_chat(world, "The current game mode is - Vampires!") - to_chat(world, "There are Vampires from Space Transylvania on the station, keep your blood close and neck safe!") - /datum/game_mode/vampire/pre_setup() if(config.protect_roles_from_antagonist) @@ -119,7 +117,6 @@ text += "
      The [special_role_text] has failed!" feedback_add_details("traitor_success","FAIL") to_chat(world, text) - return 1 /datum/game_mode/proc/auto_declare_completion_enthralled() @@ -138,7 +135,6 @@ text += "body destroyed" text += ")" to_chat(world, text) - return 1 /datum/game_mode/proc/forge_vampire_objectives(var/datum/mind/vampire) @@ -185,20 +181,16 @@ dat += {"To bite someone, target the head and use harm intent with an empty hand. Drink blood to gain new powers. You are weak to holy things and starlight. Don't go into space and avoid the Chaplain, the chapel and especially Holy Water."} to_chat(vampire.current, dat) - to_chat(vampire.current, "You must complete the following tasks:") - if (vampire.current.mind) if (vampire.current.mind.assigned_role == "Clown") to_chat(vampire.current, "Your lust for blood has allowed you to overcome your clumsy nature allowing you to wield weapons without harming yourself.") - vampire.current.mutations.Remove(CLUMSY) var/obj_count = 1 for(var/datum/objective/objective in vampire.objectives) to_chat(vampire.current, "Objective #[obj_count]: [objective.explanation_text]") - obj_count++ return @@ -289,13 +281,11 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha while(do_mob(owner, H, 50)) if(!(owner.mind in ticker.mode.vampires)) to_chat(owner, "Your fangs have disappeared!") - return old_bloodtotal = bloodtotal old_bloodusable = bloodusable if(!H.vessel.get_reagent_amount("blood")) to_chat(src, "They've got no blood left to give.") - break if(H.stat < DEAD) blood = min(20, H.vessel.get_reagent_amount("blood")) // if they have less than 20 blood, give them the remnant else they get 20 blood @@ -306,7 +296,6 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha bloodtotal += blood if(old_bloodtotal != bloodtotal) to_chat(owner, "You have accumulated [bloodtotal] [bloodtotal > 1 ? "units" : "unit"] of blood[bloodusable != old_bloodusable ? ", and have [bloodusable] left to use" : ""].") - check_vampire_upgrade() H.vessel.remove_reagent("blood", 25) if(ishuman(owner)) @@ -316,7 +305,6 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha draining = null to_chat(owner, "You stop draining [H.name] of blood.") - /datum/vampire/proc/check_vampire_upgrade(announce = 1) var/list/old_powers = powers.Copy() @@ -334,12 +322,10 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha if(istype(p, /obj/effect/proc_holder/spell/vampire)) var/obj/effect/proc_holder/spell/vampire/power = p to_chat(owner, "[power.gain_desc]") - else if(istype(p, /datum/vampire_passive)) var/datum/vampire_passive/power = p to_chat(owner, "[power.gain_desc]") - //prepare for copypaste /datum/game_mode/proc/update_vampire_icons_added(datum/mind/vampire_mind) var/datum/atom_hud/antag/vamp_hud = huds[ANTAG_HUD_VAMPIRE] @@ -366,10 +352,8 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha slaved.leave_serv_hud(vampire_mind) update_vampire_icons_removed(vampire_mind) // to_chat(world, "Removed [vampire_mind.current.name] from vampire shit") - to_chat(vampire_mind.current, "\red The fog clouding your mind clears. You remember nothing from the moment you were enthralled until now.") - /datum/vampire/proc/check_sun() var/ax = owner.x var/ay = owner.y @@ -429,17 +413,13 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha switch(owner.health) if(80 to 100) to_chat(owner, "Your skin flakes away...") - if(60 to 80) to_chat(owner, "Your skin sizzles!") - if((-INFINITY) to 60) if(!owner.on_fire) to_chat(owner, "Your skin catches fire!") - else to_chat(owner, "You continue to burn!") - owner.fire_stacks += 5 owner.IgniteMob() owner.emote("scream") diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm index 48fd3034cbe..a7e470ef056 100644 --- a/code/game/gamemodes/vampire/vampire_powers.dm +++ b/code/game/gamemodes/vampire/vampire_powers.dm @@ -20,7 +20,6 @@ return 0 if(!ishuman(user)) to_chat(user, "You are in too weak of a form to do this!") - return 0 var/datum/vampire/vampire = user.mind.vampire @@ -32,21 +31,17 @@ if(user.stat >= DEAD) to_chat(user, "Not when you're dead!") - return 0 if(vampire.nullified && !fullpower) to_chat(user, "Something is blocking your powers!") - return 0 if(vampire.bloodusable < required_blood) to_chat(user, "You require at least [required_blood] units of usable blood to do that!") - return 0 //chapel check if(istype(loc.loc, /area/chapel) && !fullpower) to_chat(user, "Your powers are useless on this holy ground.") - return 0 return ..() @@ -112,7 +107,6 @@ if(targets.len) to_chat(usr, "You have [vampire.bloodusable] left to use.") - /obj/effect/proc_holder/spell/vampire/targetted/choose_targets(mob/user = usr) var/list/possible_targets[0] for(var/mob/living/carbon/C in oview_or_orange(range, user, selection_type)) @@ -164,7 +158,6 @@ usr.SetParalysis(0) U.adjustStaminaLoss(-75) to_chat(usr, "You flush your system with clean blood and remove any incapacitating effects.") - spawn(1) if(usr.mind.vampire.get_ability(/datum/vampire_passive/regen)) for(var/i = 1 to 5) @@ -186,14 +179,10 @@ if(do_mob(usr, target, 50)) if(!affects(target)) to_chat(usr, "Your piercing gaze fails to knock out [target].") - to_chat(target, "\blue [usr]'s feeble gaze is ineffective.") - else to_chat(usr, "Your piercing gaze knocks out [target].") - to_chat(target, "You find yourself unable to move and barely able to speak.") - target.Weaken(10) target.Stun(10) target.stuttering = 10 @@ -201,7 +190,6 @@ revert_cast(usr) to_chat(usr, "You broke your gaze.") - /obj/effect/proc_holder/spell/vampire/targetted/disease name = "Diseased Touch (100)" desc = "Touches your victim with infected blood giving them appendicitis, which will, left untreated, cause a slow death by poison." @@ -212,11 +200,9 @@ /obj/effect/proc_holder/spell/vampire/targetted/disease/cast(list/targets) for(var/mob/living/carbon/target in targets) to_chat(usr, "You stealthily infect [target] with your diseased touch.") - target.help_shake_act(usr) if(!affects(target)) to_chat(usr, "They seem to be unaffected.") - continue var/datum/disease/D = new /datum/disease/appendicitis //someone should probably make a better virus for this target.ForceContractDisease(D) @@ -232,7 +218,6 @@ usr.visible_message("[usr]'s eyes emit a blinding flash!") if(istype(usr:glasses, /obj/item/clothing/glasses/sunglasses/blindfold)) to_chat(usr, "You're blindfolded!") - return for(var/mob/living/target in targets) if(!affects(target)) @@ -242,7 +227,6 @@ target.stuttering = 20 to_chat(target, "You are blinded by [usr]'s glare.") - /obj/effect/proc_holder/spell/vampire/self/shapeshift name = "Shapeshift (50)" desc = "Changes your name and appearance at the cost of 50 blood and has a cooldown of 3 minutes." @@ -274,7 +258,6 @@ if(!affects(C)) continue to_chat(C, "You hear a ear piercing shriek and your senses dull!") - C.Weaken(4) C.ear_deaf = 20 C.stuttering = 20 @@ -295,10 +278,8 @@ for(var/mob/living/target in targets) usr.visible_message("[usr] bites [target]'s neck!", "You bite [target]'s neck and begin the flow of power.") to_chat(target, "You feel the tendrils of evil invade your mind.") - if(!ishuman(target)) to_chat(usr, "You can only enthrall humans.") - break if(do_mob(usr, target, 50)) if(can_enthrall(usr, target)) @@ -307,7 +288,6 @@ revert_cast(usr) to_chat(usr, "You or your target either moved or you dont have enough usable blood.") - /obj/effect/proc_holder/spell/vampire/targetted/enthrall/proc/can_enthrall(mob/living/user, mob/living/carbon/C) var/enthrall_safe = 0 for(var/obj/item/weapon/implant/loyalty/L in C) @@ -323,7 +303,6 @@ return 0 if(!C.mind) to_chat(user, "[C.name]'s mind is not there for you to enthrall.") - return 0 if(enthrall_safe || ( C.mind in ticker.mode.vampires )||( C.mind.vampire )||( C.mind in ticker.mode.vampire_enthralled )) C.visible_message("[C] seems to resist the takeover!", "You feel a familiar sensation in your skull that quickly dissipates.") @@ -332,7 +311,6 @@ C.visible_message("[C] seems to resist the takeover!", "Your faith of [ticker.Bible_deity_name] has kept your mind clear of all evil.") if(!ishuman(C)) to_chat(user, "You can only enthrall humans!") - return 0 return 1 @@ -357,9 +335,7 @@ ticker.mode.vampire_enthralled[H.mind] = user.mind H.mind.special_role = "VampThrall" to_chat(H, "You have been Enthralled by [user]. Follow their every command.") - to_chat(src, "You have successfully Enthralled [H]. If they refuse to do as you say just adminhelp.") - log_admin("[ckey(user.key)] has mind-slaved [ckey(H.key)].") /obj/effect/proc_holder/spell/vampire/self/cloak @@ -385,7 +361,6 @@ update_name() to_chat(usr, "You will now be [V.iscloaking ? "hidden" : "seen"] in darkness.") - /obj/effect/proc_holder/spell/vampire/bats name = "Summon Bats (75)" desc = "You summon a pair of space bats who attack nearby targets until they or their target is dead." @@ -451,7 +426,6 @@ var/mobloc = get_turf(usr.loc) if(get_area(mobloc) == /area/security/armoury/gamma) to_chat(usr, "A strange energy repels you!") - mobloc = originalloc animation.loc = mobloc steam.location = mobloc @@ -512,7 +486,6 @@ if(!turfs.len) revert_cast(user) to_chat(user, "\red You cannot find darkness to step to.") - return perform(turfs) diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index 1affe3be3e7..ae6a9a30867 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -48,7 +48,6 @@ if(href_list["school"]) if (used) to_chat(H, "You already used this contract!") - return used = 1 var/list/candidates = pollCandidates("Do you want to play as the wizard apprentice of [H.real_name]?", ROLE_WIZARD, 1) @@ -58,30 +57,25 @@ var/mob/living/carbon/human/M = new/mob/living/carbon/human(H.loc) M.key = C.key to_chat(M, "You are the [H.real_name]'s apprentice! You are bound by magic contract to follow their orders and help them in accomplishing their goals.") - switch(href_list["school"]) if("destruction") M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile(M)) M.mind.AddSpell(new /obj/effect/proc_holder/spell/dumbfire/fireball(M)) to_chat(M, "Your service has not gone unrewarded, however. Studying under [H.real_name], you have learned powerful, destructive spells. You are able to cast magic missile and fireball.") - if("bluespace") M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(M)) M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(M)) to_chat(M, "Your service has not gone unrewarded, however. Studying under [H.real_name], you have learned reality bending mobility spells. You are able to cast teleport and ethereal jaunt.") - if("healing") M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/charge(M)) M.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/forcewall(M)) M.equip_to_slot_or_del(new /obj/item/weapon/gun/magic/staff/healing(M), slot_r_hand) to_chat(M, "Your service has not gone unrewarded, however. Studying under [H.real_name], you have learned livesaving survival spells. You are able to cast charge and forcewall.") - if("robeless") M.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(M)) M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/mind_transfer(M)) to_chat(M, "Your service has not gone unrewarded, however. Studying under [H.real_name], you have learned stealthy, robeless spells. You are able to cast knock and mindswap.") - M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) M.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(M), slot_w_uniform) M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(M), slot_shoes) @@ -112,7 +106,6 @@ else used = 0 to_chat(H, "Unable to reach your apprentice! You can either attack the spellbook with the contract to refund your points, or wait and try again later.") - return @@ -143,7 +136,6 @@ to_chat(user, "The unearthly energies that powered the blade are now dormant.") - /obj/effect/rend name = "tear in the fabric of reality" desc = "You should run now." @@ -221,7 +213,6 @@ /obj/item/weapon/scrying/attack_self(mob/user as mob) to_chat(user, " You can see...everything!") - visible_message("[user] stares into [src], their eyes glazing over.") user.ghostize(1) @@ -264,14 +255,12 @@ var/global/list/multiverse = list() /obj/item/weapon/multisword/attack(mob/living/M as mob, mob/living/user as mob) //to prevent accidental friendly fire or out and out grief. if(M.real_name == user.real_name) to_chat(user, "The [src] detects benevolent energies in your target and redirects your attack!") - return ..() /obj/item/weapon/multisword/attack_self(mob/user) if(user.mind.special_role == "apprentice") to_chat(user, "You know better than to touch your teacher's stuff.") - return if(cooldown < world.time) var/faction_check = 0 @@ -284,28 +273,23 @@ var/global/list/multiverse = list() assigned = "[user.real_name]" user.faction = list("[user.real_name]") to_chat(user, "You bind the sword to yourself. You can now use it to summon help.") - if(!usr.mind.special_role) if(prob(probability_evil)) to_chat(user, "With your new found power you could easily conquer the station!") - var/datum/objective/hijackclone/hijack_objective = new /datum/objective/hijackclone hijack_objective.owner = usr.mind usr.mind.objectives += hijack_objective hijack_objective.explanation_text = "Ensure only [usr.real_name] and their copies are on the shuttle!" to_chat(usr, "Objective #[1]: [hijack_objective.explanation_text]") - ticker.mode.traitors += usr.mind usr.mind.special_role = "[usr.real_name] Prime" evil = TRUE else to_chat(user, "With your new found power you could easily defend the station!") - var/datum/objective/survive/new_objective = new /datum/objective/survive new_objective.owner = usr.mind new_objective.explanation_text = "Survive, and help defend the innocent from the mobs of multiverse clones." to_chat(usr, "Objective #[1]: [new_objective.explanation_text]") - usr.mind.objectives += new_objective ticker.mode.traitors += usr.mind usr.mind.special_role = "[usr.real_name] Prime" @@ -322,15 +306,12 @@ var/global/list/multiverse = list() spawn_copy(C.client, get_turf(user.loc), user) to_chat(user, "The sword flashes, and you find yourself face to face with...you!") - else to_chat(user, "You fail to summon any copies of yourself. Perhaps you should try again in a bit.") - else to_chat(user, "[src] is recharging! Keep in mind it shares a cooldown with the swords wielded by your copies.") - /obj/item/weapon/multisword/proc/spawn_copy(var/client/C, var/turf/T, mob/user) var/mob/living/carbon/human/M = new/mob/living/carbon/human(T) if(duplicate_self) @@ -340,7 +321,6 @@ var/global/list/multiverse = list() M.key = C.key M.mind.name = user.real_name to_chat(M, "You are an alternate version of [user.real_name] from another universe! Help them accomplish their goals at all costs.") - M.faction = list("[user.real_name]") if(duplicate_self) M.set_species(user.get_species()) //duplicate the sword user's species. @@ -366,7 +346,6 @@ var/global/list/multiverse = list() M.mind.objectives += hijack_objective hijack_objective.explanation_text = "Ensure only [usr.real_name] and their copies are on the shuttle!" to_chat(M, "Objective #[1]: [hijack_objective.explanation_text]") - M.mind.special_role = "multiverse traveller" log_game("[M.key] was made a multiverse traveller with the objective to help [usr.real_name] hijack.") else @@ -376,7 +355,6 @@ var/global/list/multiverse = list() new_objective.explanation_text = "Protect [usr.real_name], your copy, and help them defend the innocent from the mobs of multiverse clones." M.mind.objectives += new_objective to_chat(M, "Objective #[1]: [new_objective.explanation_text]") - M.mind.special_role = "multiverse traveller" log_game("[M.key] was made a multiverse traveller with the objective to help [usr.real_name] protect the station.") @@ -652,19 +630,16 @@ var/global/list/multiverse = list() if(M.stat != DEAD) to_chat(user, "This artifact can only affect the dead!") - return if(!M.mind || !M.client) to_chat(user, "There is no soul connected to this body...") - return check_spooky()//clean out/refresh the list if(spooky_scaries.len >= 3 && !unlimited) to_chat(user, "This artifact can only affect three undead at a time!") - return if(heresy) spawnheresy(M)//oh god why @@ -675,9 +650,7 @@ var/global/list/multiverse = list() equip_skeleton(M) spooky_scaries |= M to_chat(M, "You have been revived by [user.real_name]!") - to_chat(M, "They are your master now, assist them even if it costs you your new life!") - desc = "A shard capable of resurrecting humans as skeleton thralls[unlimited ? "." : ", [spooky_scaries.len]/3 active thralls."]" /obj/item/device/necromantic_stone/proc/check_spooky() @@ -801,19 +774,15 @@ var/global/list/multiverse = list() if(target && cooldown < world.time) if(is_hot(I)) to_chat(target, "You suddenly feel very hot") - target.bodytemperature += 50 GiveHint(target) else if(can_puncture(I)) to_chat(target, "You feel a stabbing pain in [parse_zone(user.zone_sel.selecting)]!") - target.Weaken(2) GiveHint(target) else if(istype(I,/obj/item/weapon/bikehorn)) to_chat(target, "HONK") - to_chat(target, 'sound/items/AirHorn.ogg') - target.ear_damage += rand(0,3) GiveHint(target) cooldown = world.time +cooldown_time @@ -824,7 +793,6 @@ var/global/list/multiverse = list() I.loc = src link = I to_chat(user, "You attach [I] to the doll.") - update_targets() ..() /obj/item/voodoo/check_eye(mob/user as mob) @@ -839,7 +807,6 @@ var/global/list/multiverse = list() target = null link.loc = get_turf(src) to_chat(user, "You remove the [link] from the doll.") - link = null update_targets() return @@ -859,7 +826,6 @@ var/global/list/multiverse = list() user.unset_machine() if("r_leg","l_leg") to_chat(user, "You move the doll's legs around.") - var/turf/T = get_step(target,pick(cardinal)) target.Move(T) if("r_arm","l_arm") @@ -875,10 +841,8 @@ var/global/list/multiverse = list() GiveHint(target) if("head") to_chat(user, "You smack the doll's head with your hand.") - target.Dizzy(10) to_chat(target, "You suddenly feel as if your head was hit with a hammer!") - GiveHint(target,user) cooldown = world.time + cooldown_time @@ -894,12 +858,10 @@ var/global/list/multiverse = list() if(prob(50) || force) var/way = dir2text(get_dir(victim,get_turf(src))) to_chat(victim, "You feel a dark presence from [way]") - if(prob(20) || force) var/area/A = get_area(src) to_chat(victim, "You feel a dark presence from [A.name]") - /obj/item/voodoo/fire_act() if(target) target.adjust_fire_stacks(20) diff --git a/code/game/gamemodes/wizard/godhand.dm b/code/game/gamemodes/wizard/godhand.dm index b098b6bc84d..8a5ba06f36f 100644 --- a/code/game/gamemodes/wizard/godhand.dm +++ b/code/game/gamemodes/wizard/godhand.dm @@ -23,7 +23,6 @@ return if(user.lying || user.handcuffed) to_chat(user, "You can't reach out!") - return ..() @@ -64,7 +63,6 @@ return if(user.lying || user.handcuffed) to_chat(user, "You can't reach out!") - return var/mob/M = target M.Stun(2) diff --git a/code/game/gamemodes/wizard/raginmages.dm b/code/game/gamemodes/wizard/raginmages.dm index c1f8675ecc2..cef7b507f82 100644 --- a/code/game/gamemodes/wizard/raginmages.dm +++ b/code/game/gamemodes/wizard/raginmages.dm @@ -15,25 +15,19 @@ /datum/game_mode/wizard/raginmages/announce() to_chat(world, "The current game mode is - Ragin' Mages!") - to_chat(world, "The \red Space Wizard Federation\black is pissed, help defeat all the space wizards!") - /datum/game_mode/wizard/raginmages/greet_wizard(var/datum/mind/wizard, var/you_are=1) if (you_are) to_chat(wizard.current, "\red You are the Space Wizard!") - to_chat(wizard.current, "The Space Wizards Federation has given you the following tasks:") - var/obj_count = 1 for(var/datum/objective/objective in wizard.objectives) to_chat(wizard.current, "Objective #[obj_count]: [objective.explanation_text]") - obj_count++ to_chat(wizard.current, "Objective Alpha: Make sure the station pays for its actions against our diplomats") - return /datum/game_mode/wizard/raginmages/check_finished() @@ -46,21 +40,18 @@ if(!istype(wizard.current,/mob/living/carbon)) if(istype(get_area(wizard.current), /area/wizard_station)) // We don't want people camping other wizards to_chat(wizard.current, "If there aren't any admins on and another wizard is camping you in the wizard lair, report them on the forums") - message_admins("[wizard.current] was transformed in the wizard lair, another wizard is likely camping") end_squabble(get_area(wizard.current)) continue if(istype(wizard.current,/mob/living/carbon/brain)) if(istype(get_area(wizard.current), /area/wizard_station)) // We don't want people camping other wizards to_chat(wizard.current, "If there aren't any admins on and another wizard is camping you in the wizard lair, report them on the forums") - message_admins("[wizard.current] was brainified in the wizard lair, another wizard is likely camping") end_squabble(get_area(wizard.current)) continue if(wizard.current.stat==DEAD) if(istype(get_area(wizard.current), /area/wizard_station)) // We don't want people camping other wizards to_chat(wizard.current, "If there aren't any admins on and another wizard is camping you in the wizard lair, report them on the forums") - message_admins("[wizard.current] died in the wizard lair, another wizard is likely camping") end_squabble(get_area(wizard.current)) continue @@ -68,17 +59,14 @@ if(wizard.current.health < 0) if(istype(get_area(wizard.current), /area/wizard_station)) to_chat(wizard.current, "If there aren't any admins on and another wizard is camping you in the wizard lair, report them on the forums") - message_admins("[wizard.current] went into crit in the wizard lair, another wizard is likely camping") end_squabble(get_area(wizard.current)) else to_chat(wizard.current, "\red The Space Wizard Federation is upset with your performance and have terminated your employment.") - wizard.current.gib() // *REAL* ACTION!! *REAL* DRAMA!! *REAL* BLOODSHED!! continue if(wizard.current.client && wizard.current.client.is_afk() > 10 * 60 * 10) // 10 minutes to_chat(wizard.current, "\red The Space Wizard Federation is upset with your performance and have terminated your employment.") - wizard.current.gib() // Let's keep the round moving continue if(!wizard.current.client) @@ -113,7 +101,6 @@ for(var/mob/living/L in marked_for_death) if(L.stat == CONSCIOUS) // Probably a troublemaker - I'd like to see YOU fight when unconscious to_chat(L, "STOP FIGHTING.") - L.ghostize() if(istype(L, /mob/living/carbon/brain)) // diediedie @@ -198,5 +185,4 @@ if(finished) feedback_set_details("round_end_result","loss - wizard killed") to_chat(world, "\red The crew has managed to hold off the wizard attack! The Space Wizards Federation has been taught a lesson they will not soon forget!") - ..(1) diff --git a/code/game/gamemodes/wizard/rightandwrong.dm b/code/game/gamemodes/wizard/rightandwrong.dm index 14cdf7e94cc..eb1e8bce930 100644 --- a/code/game/gamemodes/wizard/rightandwrong.dm +++ b/code/game/gamemodes/wizard/rightandwrong.dm @@ -6,7 +6,6 @@ var/list/magicspeciallist = list("staffchange","staffanimation", "wandbelt", "contract", "staffchaos","necromantic") to_chat(usr, "You summoned [summon_type ? "magic" : "guns"]!") - message_admins("[key_name_admin(usr)] summoned [summon_type ? "magic" : "guns"]!") for(var/mob/living/carbon/human/H in player_list) @@ -138,7 +137,6 @@ H.see_in_dark = 8 H.see_invisible = SEE_INVISIBLE_LEVEL_TWO to_chat(H, "The walls suddenly disappear.") - if("voodoo") new /obj/item/voodoo(get_turf(H)) if("special") @@ -157,4 +155,3 @@ if("necromantic") new /obj/item/device/necromantic_stone(get_turf(H)) to_chat(H, "You suddenly feel lucky.") - diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm index 9ab912a5ce5..08e6117e9bd 100644 --- a/code/game/gamemodes/wizard/soulstone.dm +++ b/code/game/gamemodes/wizard/soulstone.dm @@ -20,12 +20,10 @@ if(M.has_brain_worms()) //Borer stuff - RR to_chat(user, "This being is corrupted by an alien intelligence and cannot be soul trapped.") - return ..() if(jobban_isbanned(M, "cultist") || jobban_isbanned(M, "Syndicate")) to_chat(user, "A mysterious force prevents you from trapping this being's soul.") - return ..() M.attack_log += text("\[[time_stamp()]\] Has had their soul captured with [src.name] by [key_name(user)]") @@ -84,7 +82,6 @@ A.status_flags &= ~GODMODE A.canmove = 1 to_chat(A, "You have been released from your prison, but you are still bound to [U.name]'s will. Help them suceed in their goals at all costs.") - A.loc = U.loc A.cancel_camera() src.icon_state = "soulstone" @@ -112,19 +109,15 @@ var/obj/item/device/soulstone/C = src if(C.imprinted != "empty") to_chat(U, "\red Capture failed!: \black The soul stone has already been imprinted with [C.imprinted]'s mind!") - else if (T.stat == 0) to_chat(U, "\red Capture failed!: \black Kill or maim the victim first!") - else if(T.client == null) to_chat(U, "\red Capture failed!: \black The soul has already fled it's mortal frame.") - else if(C.contents.len) to_chat(U, "\red Capture failed!: \black The soul stone is full! Use or free an existing soul to make room.") - else for(var/obj/item/W in T) T.unEquip(W) @@ -149,11 +142,8 @@ C.icon_state = "soulstone2" C.name = "Soul Stone: [S.real_name]" to_chat(S, "Your soul has been captured! You are now bound to [U.name]'s will, help them suceed in their goals at all costs.") - to_chat(U, "\blue Capture successful!: \black [T.real_name]'s soul has been ripped from their body and stored within the soul stone.") - to_chat(U, "The soulstone has been imprinted with [S.real_name]'s mind, it will no longer react to other souls.") - C.imprinted = "[S.name]" qdel(T) if("SHADE") @@ -161,15 +151,12 @@ var/obj/item/device/soulstone/C = src if (T.stat == DEAD) to_chat(U, "\red Capture failed!: \black The shade has already been banished!") - else if(C.contents.len) to_chat(U, "\red Capture failed!: \black The soul stone is full! Use or free an existing soul to make room.") - else if(T.name != C.imprinted) to_chat(U, "\red Capture failed!: \black The soul stone has already been imprinted with [C.imprinted]'s mind!") - else T.loc = C //put shade in stone T.status_flags |= GODMODE @@ -178,9 +165,7 @@ T.faction |= "\ref[U]" C.icon_state = "soulstone2" to_chat(T, "Your soul has been recaptured by the soul stone, its arcane energies are reknitting your ethereal form") - to_chat(U, "\blue Capture successful!: \black [T.name]'s has been recaptured and stored within the soul stone.") - if("CONSTRUCT") var/obj/structure/constructshell/T = target var/obj/item/device/soulstone/C = src @@ -200,9 +185,7 @@ ticker.mode.update_cult_icons_added(Z.mind) qdel(T) to_chat(Z, "You are a Juggernaut. Though slow, your shell can withstand extreme punishment, create shield walls and even deflect energy weapons, and rip apart enemies and walls alike.") - to_chat(Z, "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.") - Z.cancel_camera() qdel(C) @@ -218,9 +201,7 @@ ticker.mode.update_cult_icons_added(Z.mind) qdel(T) to_chat(Z, "You are a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls.") - to_chat(Z, "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.") - Z.cancel_camera() qdel(C) @@ -236,14 +217,11 @@ ticker.mode.update_cult_icons_added(Z.mind) qdel(T) to_chat(Z, "You are an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, use magic missile, repair allied constructs (by clicking on them), and most important of all create new constructs (Use your Artificer spell to summon a new construct shell and Summon Soulstone to create a new soulstone).") - to_chat(Z, "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.") - Z.cancel_camera() qdel(C) else to_chat(U, "\red Creation failed!: \black The soul stone is empty! Go kill someone!") - return /proc/makeNewConstruct(var/mob/living/simple_animal/construct/ctype, var/mob/target, var/mob/stoner = null, cultoverride = 0) @@ -260,11 +238,8 @@ ticker.mode.update_cult_icons_added(newstruct.mind) if(stoner && iswizard(stoner)) to_chat(newstruct, "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.") - else if(stoner && iscultist(stoner)) to_chat(newstruct, "You are still bound to serve the cult, follow their orders and help them complete their goals at all costs.") - else to_chat(newstruct, "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.") - newstruct.cancel_camera() \ No newline at end of file diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index e206e670527..8467da489a5 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -27,7 +27,6 @@ if(initial(S.name) == initial(aspell.name)) // Not using directly in case it was learned from one spellbook then upgraded in another if(aspell.spell_level >= aspell.level_max) to_chat(user, "This spell cannot be improved further.") - return 0 else aspell.name = initial(aspell.name) @@ -38,29 +37,23 @@ switch(aspell.spell_level) if(1) to_chat(user, "You have improved [aspell.name] into Efficient [aspell.name].") - aspell.name = "Efficient [aspell.name]" if(2) to_chat(user, "You have further improved [aspell.name] into Quickened [aspell.name].") - aspell.name = "Quickened [aspell.name]" if(3) to_chat(user, "You have further improved [aspell.name] into Free [aspell.name].") - aspell.name = "Free [aspell.name]" if(4) to_chat(user, "You have further improved [aspell.name] into Instant [aspell.name].") - aspell.name = "Instant [aspell.name]" if(aspell.spell_level >= aspell.level_max) to_chat(user, "This spell cannot be strengthened any further.") - return 1 //No same spell found - just learn it feedback_add_details("wizard_spell_learned",log_name) user.mind.AddSpell(S) to_chat(user, "You have learned [S.name].") - return 1 /datum/spellbook_entry/proc/CanRefund(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book) @@ -77,7 +70,6 @@ var/area/wizard_station/A = locate() if(!(user in A.contents)) to_chat(user, "You can only refund spells at the wizard lair") - return -1 if(!S) S = new spell_type() @@ -312,7 +304,6 @@ user.see_in_dark = 8 user.see_invisible = SEE_INVISIBLE_LEVEL_TWO to_chat(user, "\blue The walls suddenly disappear.") - return 1 @@ -435,7 +426,6 @@ book.uses += 1 active = 1 to_chat(user, "You have cast summon guns and gained an extra charge for your spellbook.") - return 1 /datum/spellbook_entry/summon/magic @@ -459,7 +449,6 @@ book.uses += 1 active = 1 to_chat(user, "You have cast summon magic and gained an extra charge for your spellbook.") - return 1 /obj/item/weapon/spellbook @@ -498,11 +487,9 @@ var/obj/item/weapon/contract/contract = O if(contract.used) to_chat(user, "The contract has been used, you can't get your points back now!") - else to_chat(user, "You feed the contract back into the spellbook, refunding your points.") - uses++ qdel(O) @@ -510,7 +497,6 @@ if(istype(O, /obj/item/weapon/antag_spawner/slaughter_demon)) to_chat(user, "On second thought, maybe summoning a demon is a bad idea. You refund your points.") - uses++ for(var/datum/spellbook_entry/item/bloodbottle/BB in entries) if(!isnull(BB.limit)) @@ -570,12 +556,10 @@ /obj/item/weapon/spellbook/attack_self(mob/user as mob) if(!owner) to_chat(user, "You bind the spellbook to yourself.") - owner = user return if(user != owner) to_chat(user, "The [name] does not recognize you as it's owner and refuses to open!") - return user.set_machine(src) var/dat = "" @@ -673,17 +657,14 @@ if(user.mind) if(user.mind.special_role == "apprentice" || user.mind.special_role == "Wizard") to_chat(user, "You're already far more versed in this spell than this flimsy how-to book can provide.") - else to_chat(user, "You've already read this one.") - return if(used) recoil(user) else user.mind.AddSpell(S) to_chat(user, "you rapidly read through the arcane book. Suddenly you realize you understand [spellname]!") - user.attack_log += text("\[[time_stamp()]\] [user.real_name] ([user.ckey]) learned the spell [spellname] ([S]).") onlearned(user) @@ -718,7 +699,6 @@ /obj/item/weapon/spellbook/oneuse/smoke/recoil(mob/user as mob) ..() to_chat(user, "Your stomach rumbles...") - if(user.nutrition) user.nutrition -= 200 if(user.nutrition <= 0) @@ -733,7 +713,6 @@ /obj/item/weapon/spellbook/oneuse/blind/recoil(mob/user as mob) ..() to_chat(user, "You go blind!") - user.eye_blind = 10 /obj/item/weapon/spellbook/oneuse/mindswap @@ -756,11 +735,9 @@ if(!stored_swap) stored_swap = user to_chat(user, "For a moment you feel like you don't even know who you are anymore.") - return if(stored_swap == user) to_chat(user, "You stare at the book some more, but there doesn't seem to be anything else to learn...") - return if(user.mind.special_verbs.len) @@ -790,9 +767,7 @@ user.verbs += V to_chat(stored_swap, "You're suddenly somewhere else... and someone else?!") - to_chat(user, "Suddenly you're staring at [src] again... where are you, who are you?!") - stored_swap = null /obj/item/weapon/spellbook/oneuse/forcewall @@ -804,7 +779,6 @@ /obj/item/weapon/spellbook/oneuse/forcewall/recoil(mob/user as mob) ..() to_chat(user, "You suddenly feel very solid!") - var/obj/structure/closet/statue/S = new /obj/structure/closet/statue(user.loc, user) S.timer = 30 user.drop_item() @@ -819,7 +793,6 @@ /obj/item/weapon/spellbook/oneuse/knock/recoil(mob/user as mob) ..() to_chat(user, "You're knocked down!") - user.Weaken(20) /obj/item/weapon/spellbook/oneuse/horsemask @@ -831,7 +804,6 @@ /obj/item/weapon/spellbook/oneuse/horsemask/recoil(mob/living/carbon/user as mob) if(istype(user, /mob/living/carbon/human)) to_chat(user, "HOR-SIE HAS RISEN") - var/obj/item/clothing/mask/horsehead/magichead = new /obj/item/clothing/mask/horsehead magichead.flags |= NODROP //curses! magichead.flags_inv = null //so you can still see their face @@ -843,7 +815,6 @@ else to_chat(user, "I say thee neigh") - /obj/item/weapon/spellbook/oneuse/charge spell = /obj/effect/proc_holder/spell/targeted/charge spellname = "charging" @@ -853,7 +824,6 @@ /obj/item/weapon/spellbook/oneuse/charge/recoil(mob/user as mob) ..() to_chat(user, "[src] suddenly feels very warm!") - empulse(src, 1, 1) /obj/item/weapon/spellbook/oneuse/summonitem @@ -865,7 +835,6 @@ /obj/item/weapon/spellbook/oneuse/summonitem/recoil(mob/user as mob) ..() to_chat(user, "[src] suddenly vanishes!") - qdel(src) diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index e3a5aadc676..1910e8ffa85 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -18,11 +18,9 @@ /datum/game_mode/wizard/announce() to_chat(world, "The current game mode is - Wizard!") - to_chat(world, "There is a \red SPACE WIZARD\black on the station. You can't let him achieve his objective!") - /datum/game_mode/wizard/can_start()//This could be better, will likely have to recode it later if(!..()) return 0 @@ -38,7 +36,6 @@ wizard.original = wizard.current if(wizardstart.len == 0) to_chat(wizard.current, "\red A starting location for you could not be found, please report this bug!") - return 0 return 1 @@ -151,14 +148,11 @@ /datum/game_mode/proc/greet_wizard(var/datum/mind/wizard, var/you_are=1) if (you_are) to_chat(wizard.current, "\red You are the Space Wizard!") - to_chat(wizard.current, "The Space Wizards Federation has given you the following tasks:") - var/obj_count = 1 for(var/datum/objective/objective in wizard.objectives) to_chat(wizard.current, "Objective #[obj_count]: [objective.explanation_text]") - obj_count++ return @@ -202,9 +196,7 @@ wizard_mob.species.equip(wizard_mob) to_chat(wizard_mob, "You will find a list of available spells in your spell book. Choose your magic arsenal carefully.") - to_chat(wizard_mob, "In your pockets you will find a teleport scroll. Use it as needed.") - wizard_mob.mind.store_memory("Remember: do not forget to prepare your spells.") wizard_mob.update_icons() return 1 @@ -240,7 +232,6 @@ if(finished && !ragin) feedback_set_details("round_end_result","loss - wizard killed") to_chat(world, "\red The wizard[(wizards.len>1)?"s":""] has been killed by the crew! The Space Wizards Federation has been taught a lesson they will not soon forget!") - ..() return 1 @@ -292,7 +283,6 @@ text += "
      " to_chat(world, text) - return 1 //OTHER PROCS @@ -318,15 +308,12 @@ Made a proc so this is not repeated 14 (or more) times.*/ //Removed the stat check because not all spells require clothing now. if(!istype(usr:wear_suit, /obj/item/clothing/suit/wizrobe)) to_chat(usr, "I don't feel strong enough without my robe.") - return 0 if(!istype(usr:shoes, /obj/item/clothing/shoes/sandal)) to_chat(usr, "I don't feel strong enough without my sandals.") - return 0 if(!istype(usr:head, /obj/item/clothing/head/wizard)) to_chat(usr, "I don't feel strong enough without my hat.") - return 0 else return 1 diff --git a/code/game/gamemodes/xenos/xenos.dm b/code/game/gamemodes/xenos/xenos.dm index fef97333f9c..12dab66e569 100644 --- a/code/game/gamemodes/xenos/xenos.dm +++ b/code/game/gamemodes/xenos/xenos.dm @@ -19,10 +19,8 @@ /datum/game_mode/xenos/announce() to_chat(world, "The current game mode is - Xenos!") - to_chat(world, "There is an Xenomorph attack on the station.
      Aliens - Kill or infect the crew. Protect the Queen.
      Crew - Protect the station. Exterminate all aliens.
      ") - /datum/game_mode/xenos/can_start() if(!..()) return 0 @@ -160,28 +158,20 @@ if(station_was_nuked) feedback_set_details("round_end_result","win - xenos nuked") to_chat(world, "Crew Victory") - to_chat(world, "The station was destroyed in a nuclear explosion, preventing the aliens from overrunning it!") - else if(result == 1) feedback_set_details("round_end_result","win - xenos killed") to_chat(world, "Crew Victory") - to_chat(world, "The aliens did not succeed and were exterminated by the crew!") - else if(result == 2) feedback_set_details("round_end_result","win - crew killed") to_chat(world, "Alien Victory") - to_chat(world, "The aliens were successful and slaughtered the crew!") - else feedback_set_details("round_end_result","win - crew escaped") to_chat(world, "Draw") - to_chat(world, "The crew has escaped from the aliens but did not exterminate them, allowing them to overrun the station.") - var/text = "
      There were [xenos.len] aliens." text += "
      The aliens were:" for(var/datum/mind/xeno in xenos) @@ -198,6 +188,5 @@ text += ")" to_chat(world, text) - ..() return 1 \ No newline at end of file diff --git a/code/game/jobs/job/support_chaplain.dm b/code/game/jobs/job/support_chaplain.dm index 3d0458a2227..29a0375b849 100644 --- a/code/game/jobs/job/support_chaplain.dm +++ b/code/game/jobs/job/support_chaplain.dm @@ -146,7 +146,6 @@ if("No") if(outoftime) to_chat(H, "Welp, out of time, buddy. You're stuck. Next time choose faster.") - accepted = 1 if(ticker) diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index b9865a1fcb7..9f9658a9dff 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -18,7 +18,6 @@ var/global/datum/controller/occupations/job_master var/list/all_jobs = subtypesof(/datum/job) if(!all_jobs.len) to_chat(world, "\red \b Error setting up jobs, no job datums found") - return 0 for(var/J in all_jobs) var/datum/job/job = new J() @@ -386,7 +385,6 @@ var/global/datum/controller/occupations/job_master else to_chat(H, "Your job is [rank] and the game just can't handle it! Please report this bug to an administrator.") - H.job = rank if(!joined_late) @@ -435,7 +433,6 @@ var/global/datum/controller/occupations/job_master spawn(0) to_chat(H, "\blueYour account number is: [M.account_number], your account pin is: [M.remote_access_pin]") - var/alt_title = null if(H.mind) H.mind.assigned_role = rank @@ -468,13 +465,10 @@ var/global/datum/controller/occupations/job_master H.species.equip(H) to_chat(H, "You are the [alt_title ? alt_title : rank].") - to_chat(H, "As the [alt_title ? alt_title : rank] you answer directly to [job.supervisors]. Special circumstances may change this.") - if(job.req_admin_notify) to_chat(H, "You are playing a job that is important for the game progression. If you have to disconnect, please notify the admins via adminhelp.") - spawnId(H, rank, alt_title) H.equip_to_slot_or_del(new /obj/item/device/radio/headset(H), slot_l_ear) diff --git a/code/game/jobs/whitelist.dm b/code/game/jobs/whitelist.dm index 4d921e617c8..1514b0440a8 100644 --- a/code/game/jobs/whitelist.dm +++ b/code/game/jobs/whitelist.dm @@ -25,7 +25,6 @@ var/list/whitelist = list() return 1 if(!dbcon.IsConnected()) to_chat(usr, "\red Unable to connect to whitelist database. Please try again later.
      ") - return 0 else var/DBQuery/query = dbcon.NewQuery("SELECT job FROM [format_table_name("whitelist")] WHERE ckey='[M.key]'") @@ -71,7 +70,6 @@ var/list/whitelist = list() return 0 if(!dbcon.IsConnected()) to_chat(usr, "\red Unable to connect to whitelist database. Please try again later.
      ") - return 0 else var/DBQuery/query = dbcon.NewQuery("SELECT species FROM [format_table_name("whitelist")] WHERE ckey='[M.key]'") diff --git a/code/game/machinery/Freezer.dm b/code/game/machinery/Freezer.dm index 20d47691204..bb8f7ac9184 100644 --- a/code/game/machinery/Freezer.dm +++ b/code/game/machinery/Freezer.dm @@ -61,7 +61,6 @@ if (istype(I, /obj/item/weapon/wrench)) if(!panel_open) to_chat(user, "Open the maintenance panel first.") - return var/list/choices = list("West" = WEST, "East" = EAST, "South" = SOUTH, "North" = NORTH) var/selected = input(user,"Select a direction for the connector.", "Connector Direction") in choices @@ -94,7 +93,6 @@ /obj/machinery/atmospherics/unary/cold_sink/freezer/attack_hand(mob/user as mob) if(panel_open) to_chat(user, "Close the maintenance panel first.") - return src.ui_interact(user) @@ -223,7 +221,6 @@ if (istype(I, /obj/item/weapon/wrench)) if(!panel_open) to_chat(user, "Open the maintenance panel first.") - return var/list/choices = list("West" = WEST, "East" = EAST, "South" = SOUTH, "North" = NORTH) var/selected = input(user,"Select a direction for the connector.", "Connector Direction") in choices @@ -256,7 +253,6 @@ /obj/machinery/atmospherics/unary/heat_reservoir/heater/attack_hand(mob/user as mob) if(panel_open) to_chat(user, "Close the maintenance panel first.") - return src.ui_interact(user) diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm index 0853e20e8ee..fbc52904117 100644 --- a/code/game/machinery/OpTable.dm +++ b/code/game/machinery/OpTable.dm @@ -46,7 +46,6 @@ /obj/machinery/optable/attack_hand(mob/user as mob) if (HULK in usr.mutations) to_chat(usr, text("\blue You destroy the table.")) - visible_message("\red [usr] destroys the operating table!") src.density = 0 qdel(src) @@ -131,7 +130,6 @@ playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 20, target = src)) to_chat(user, "You deconstruct the table.") - new /obj/item/stack/sheet/plasteel(loc, 5) qdel(src) @@ -139,12 +137,10 @@ /obj/machinery/optable/proc/check_table(mob/living/carbon/patient as mob) if(src.victim && get_turf(victim) == get_turf(src) && victim.lying) to_chat(usr, "The table is already occupied!") - return 0 if(patient.buckled) to_chat(usr, "Unbuckle first!") - return 0 return 1 diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm index 0a3ca9cc383..f21ad0d03ee 100644 --- a/code/game/machinery/PDApainter.dm +++ b/code/game/machinery/PDApainter.dm @@ -44,7 +44,6 @@ if(istype(O, /obj/item/device/pda)) if(storedpda) to_chat(user, "There is already a PDA inside.") - return else var/obj/item/device/pda/P = usr.get_active_hand() @@ -76,7 +75,6 @@ to_chat(user, "The [src] is empty.") - /obj/machinery/pdapainter/verb/ejectpda() set name = "Eject PDA" set category = "Object" @@ -90,7 +88,6 @@ to_chat(usr, "The [src] is empty.") - /obj/machinery/pdapainter/power_change() ..() update_icon() \ No newline at end of file diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index fea7daeb956..238e071ebe9 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -84,7 +84,6 @@ if (istype(G, /obj/item/weapon/wrench)) if(panel_open) to_chat(user, "Close the maintenance panel first.") - return if(dir == 4) orient = "LEFT" @@ -111,7 +110,6 @@ if (panel_open) to_chat(user, "Close the maintenance panel first.") - return if (!src.connected) @@ -229,7 +227,6 @@ if(panel_open) to_chat(usr, "Close the maintenance panel first.") - return 0 if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon/ai))) @@ -238,12 +235,10 @@ if (src.connected.occupant) if (src.connected.occupant.stat == DEAD) to_chat(usr, "This person has no life for to preserve anymore. Take them to a department capable of reanimating them.") - else if(src.connected.occupant.health > src.connected.min_health || (href_list["chemical"] in connected.emergency_chems)) src.connected.inject_chemical(usr,href_list["chemical"],text2num(href_list["amount"])) else to_chat(usr, "This person is not in good enough condition for sleepers to be effective! Use another means of treatment, such as cryogenics!") - if (href_list["removebeaker"]) src.connected.remove_beaker() if (href_list["togglefilter"]) @@ -357,7 +352,6 @@ addiction_removal_chance = 10 if(prob(addiction_removal_chance)) to_chat(occupant, "You no longer feel reliant on [R.name]!") - occupant.reagents.addiction_list.Remove(R) updateDialog() @@ -378,7 +372,6 @@ if(!beaker) if (!user.drop_item()) to_chat(user, "\The [G] is stuck to you!") - return beaker = G @@ -388,13 +381,11 @@ else to_chat(user, "The sleeper has a beaker already.") - return if (istype(G, /obj/item/weapon/screwdriver)) if(src.occupant) to_chat(user, "The maintenance panel is locked.") - return default_deconstruction_screwdriver(user, "sleeper-o", "sleeper-open", G) return @@ -402,11 +393,9 @@ if (istype(G, /obj/item/weapon/wrench)) if(src.occupant) to_chat(user, "The scanner is occupied.") - return if(panel_open) to_chat(user, "Close the maintenance panel first.") - return if(dir == 4) orient = "LEFT" @@ -424,18 +413,15 @@ if(istype(G, /obj/item/weapon/grab)) if(panel_open) to_chat(user, "Close the maintenance panel first.") - return if(!ismob(G:affecting)) return if(src.occupant) to_chat(user, "The sleeper is already occupied!") - return for(var/mob/living/carbon/slime/M in range(1,G:affecting)) if(M.Victim == G:affecting) to_chat(usr, "[G:affecting.name] will not fit into the sleeper because they have a slime latched onto their head.") - return visible_message("[user] starts putting [G:affecting:name] into the sleeper.") @@ -443,7 +429,6 @@ if(do_after(user, 20, target = G:affecting)) if(src.occupant) to_chat(user, "The sleeper is already occupied!") - return if(!G || !G:affecting) return var/mob/M = G:affecting @@ -455,7 +440,6 @@ src.icon_state = "sleeper" to_chat(M, "You feel cool air surround you. You go numb as your senses turn inward.") - src.add_fingerprint(user) qdel(G) return @@ -537,7 +521,6 @@ /obj/machinery/sleeper/proc/inject_chemical(mob/living/user as mob, chemical, amount) if (!(chemical in injection_chems)) to_chat(user, "The sleeper does not offer that chemical!") - return if(src.occupant) @@ -547,15 +530,12 @@ return else to_chat(user, "You can not inject any more of this chemical.") - return else to_chat(user, "The patient rejects the chemicals!") - return else to_chat(user, "There's no occupant in the sleeper!") - return /obj/machinery/sleeper/verb/eject() @@ -601,23 +581,19 @@ return if(panel_open) to_chat(user, "Close the maintenance panel first.") - return if(occupant) to_chat(user, "The sleeper is already occupied!") - return var/mob/living/L = O if(!istype(L) || L.buckled) return if(L.abiotic()) to_chat(user, "Subject cannot have abiotic items on.") - return for(var/mob/living/carbon/slime/M in range(1,L)) if(M.Victim == L) to_chat(usr, "[L.name] will not fit into the sleeper because they have a slime latched onto their head.") - return if(L == user) visible_message("[user] starts climbing into the sleeper.") @@ -627,7 +603,6 @@ if(do_after(user, 20, target = L)) if(src.occupant) to_chat(user, ">The sleeper is already occupied!") - return if(!L) return @@ -638,7 +613,6 @@ src.occupant = L src.icon_state = "sleeper" to_chat(L, "You feel cool air surround you. You go numb as your senses turn inward.") - src.add_fingerprint(user) if(user.pulling == L) user.stop_pulling() @@ -656,24 +630,20 @@ return if(src.occupant) to_chat(usr, "The sleeper is already occupied!") - return if (panel_open) to_chat(usr, "Close the maintenance panel first.") - return if(usr.restrained() || usr.stat || usr.weakened || usr.stunned || usr.paralysis || usr.resting) //are you cuffed, dying, lying, stunned or other return for(var/mob/living/carbon/slime/M in range(1,usr)) if(M.Victim == usr) to_chat(usr, "You're too busy getting your life sucked out of you.") - return visible_message("[usr] starts climbing into the sleeper.") if(do_after(usr, 20, target = usr)) if(src.occupant) to_chat(usr, "The sleeper is already occupied!") - return usr.stop_pulling() usr.client.perspective = EYE_PERSPECTIVE diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 3cce5ec7cac..45ee6e0f4c9 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -43,7 +43,6 @@ if (istype(G, /obj/item/weapon/screwdriver)) if(src.occupant) to_chat(user, "The maintenance panel is locked.") - return default_deconstruction_screwdriver(user, "bodyscanner-o", "bodyscanner-open", G) return @@ -51,11 +50,9 @@ if (istype(G, /obj/item/weapon/wrench)) if(src.occupant) to_chat(user, "The scanner is occupied.") - return if(panel_open) to_chat(user, "Close the maintenance panel first.") - return if(dir == 4) dir = 8 @@ -72,23 +69,19 @@ var/obj/item/weapon/grab/TYPECAST_YOUR_SHIT = G if(panel_open) to_chat(user, "Close the maintenance panel first.") - return if(!ismob(TYPECAST_YOUR_SHIT.affecting)) return if(occupant) to_chat(user, "The scanner is already occupied!") - return for(var/mob/living/carbon/slime/M in range(1, TYPECAST_YOUR_SHIT.affecting)) if(M.Victim == TYPECAST_YOUR_SHIT.affecting) to_chat(user, "[TYPECAST_YOUR_SHIT.affecting.name] has a fucking slime attached to them, deal with that first.") - return var/mob/M = TYPECAST_YOUR_SHIT.affecting if(M.abiotic()) to_chat(user, "Subject cannot have abiotic items on.") - return /*if(M.client) M.client.perspective = EYE_PERSPECTIVE @@ -113,23 +106,19 @@ return 0 //not a borg or human if(panel_open) to_chat(user, "Close the maintenance panel first.") - return 0 //panel open if(occupant) to_chat(user, "\The [src] is already occupied.") - return 0 //occupied if(O.buckled) return 0 if(O.abiotic()) to_chat(user, "Subject cannot have abiotic items on.") - return 0 for(var/mob/living/carbon/slime/M in range(1, O)) if(M.Victim == O) to_chat(user, "[O] has a fucking slime attached to them, deal with that first.") - return 0 if(O == user) @@ -280,7 +269,6 @@ if (istype(G, /obj/item/weapon/wrench)) if(panel_open) to_chat(user, "Close the maintenance panel first.") - return if(dir == 4) dir = 8 @@ -305,7 +293,6 @@ if (panel_open) to_chat(user, "Close the maintenance panel first.") - return if(!src.connected) diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm index 912a854c12c..9869e2650f9 100644 --- a/code/game/machinery/ai_slipper.dm +++ b/code/game/machinery/ai_slipper.dm @@ -37,7 +37,6 @@ if (src.allowed(usr)) locked = !locked to_chat(user, "You [ locked ? "lock" : "unlock"] the device.") - if (locked) if (user.machine==src) user.unset_machine() @@ -47,7 +46,6 @@ src.attack_hand(usr) else to_chat(user, "\red Access denied.") - return return @@ -60,7 +58,6 @@ if ( (get_dist(src, user) > 1 )) if (!istype(user, /mob/living/silicon)) to_chat(user, text("Too far away.")) - user.unset_machine() user << browse(null, "window=ai_slipper") return @@ -71,7 +68,6 @@ loc = loc:loc if (!istype(loc, /area)) to_chat(user, text("Turret badly positioned - loc.loc is [].", loc)) - return var/area/area = loc var/t = "AI Liquid Dispenser ([area.name])


      " @@ -92,7 +88,6 @@ if (src.locked) if (!istype(usr, /mob/living/silicon)) to_chat(usr, "Control panel is locked!") - return if (href_list["toggleOn"]) src.disabled = !src.disabled diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 60e98f0bdd2..4a2d7103593 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -432,7 +432,6 @@ radio_connection.post_signal(src, signal, RADIO_FROM_AIRALARM) // to_chat(world, text("Signal [] Broadcasted to []", command, target)) - return 1 /obj/machinery/alarm/proc/apply_mode() @@ -856,7 +855,6 @@ if(aidisabled && (isAI(user) || isrobot(user))) to_chat(user, "AI control for \the [src] interface has been disabled.") - return STATUS_CLOSE . = shorted ? STATUS_DISABLED : STATUS_INTERACTIVE @@ -991,7 +989,6 @@ input_temperature = input_temperature + T0C if(input_temperature > max_temperature || input_temperature < min_temperature) to_chat(usr, "Temperature must be between [min_temperature_c]C and [max_temperature_c]C") - else target_temperature = input_temperature return 1 @@ -1011,10 +1008,8 @@ if(2) if(istype(W, /obj/item/weapon/screwdriver)) // Opening that Air Alarm up. // to_chat(user, "You pop the Air Alarm's maintence panel open.") - wiresexposed = !wiresexposed to_chat(user, "The wires have been [wiresexposed ? "exposed" : "unexposed"]") - update_icon() return @@ -1033,19 +1028,16 @@ if (istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda))// trying to unlock the interface with an ID card if(stat & (NOPOWER|BROKEN)) to_chat(user, "It does nothing") - return else if(allowed(usr) && !wires.IsIndexCut(AALARM_WIRE_IDSCAN)) locked = !locked to_chat(user, "\blue You [ locked ? "lock" : "unlock"] the Air Alarm interface.") - updateUsrDialog() else to_chat(user, "\red Access denied.") - return if(1) @@ -1053,11 +1045,9 @@ var/obj/item/stack/cable_coil/coil = W if(coil.amount < 5) to_chat(user, "You need more cable for this!") - return to_chat(user, "You wire \the [src]!") - coil.amount -= 5 if(!coil.amount) qdel(coil) @@ -1069,11 +1059,9 @@ else if(istype(W, /obj/item/weapon/crowbar)) to_chat(user, "You start prying out the circuit.") - playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1) if(do_after(user,20, target = src)) to_chat(user, "You pry out the circuit!") - var/obj/item/weapon/airalarm_electronics/circuit = new /obj/item/weapon/airalarm_electronics() circuit.loc = user.loc buildstage = 0 @@ -1082,7 +1070,6 @@ if(0) if(istype(W, /obj/item/weapon/airalarm_electronics)) to_chat(user, "You insert the circuit!") - qdel(W) buildstage = 1 update_icon() @@ -1090,7 +1077,6 @@ else if(istype(W, /obj/item/weapon/wrench)) to_chat(user, "You remove the fire alarm assembly from the wall!") - new /obj/item/mounted/frame/alarm_frame(get_turf(user)) playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1) qdel(src) @@ -1109,11 +1095,9 @@ ..(user) if (buildstage < 2) to_chat(user, "It is not wired.") - if (buildstage < 1) to_chat(user, "The circuit is missing.") - /* AIR ALARM CIRCUIT Just an object used in constructing air alarms diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm index 23a9dc6ee3a..80d588179bf 100644 --- a/code/game/machinery/atmo_control.dm +++ b/code/game/machinery/atmo_control.dm @@ -74,11 +74,9 @@ obj/machinery/air_sensor if(istype(W, /obj/item/weapon/wrench)) if(bolts) to_chat(usr, "The [src] is bolted to the floor! You can't detach it like this.") - return 1 playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) to_chat(user, "\blue You begin to unfasten \the [src]...") - if(do_after(user, 40, target = src)) user.visible_message("[user] unfastens \the [src].", "\blue You have unfastened \the [src].", "You hear ratchet.") new /obj/item/pipe_gsensor(src.loc) @@ -302,7 +300,6 @@ legend { sensor_list|=G.id_tag if(!sensor_list.len) to_chat(user, "No sensors on this frequency.") - return MT_ERROR // Have the user pick one of them and name its label @@ -324,7 +321,6 @@ legend { sensor_list|=G.id_tag if(!sensor_list.len) to_chat(user, "No sensors on this frequency.") - return MT_ERROR var/label = sensors[href_list["edit_sensor"]] var/sensor = input(user, "Select a sensor:", "Sensor Data", href_list["edit_sensor"]) as null|anything in sensor_list diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 4ed251f092c..14b3ca3fc59 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -339,7 +339,6 @@ update_flag if(iswelder(W) && src.destroyed) if(weld(W, user)) to_chat(user, "\blue You salvage whats left of \the [src]") - var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal(src.loc) M.amount = 3 qdel(src) @@ -362,7 +361,6 @@ update_flag var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) thejetpack.merge(removed) to_chat(user, "You pulse-pressurize your jetpack from the tank.") - return ..() @@ -482,7 +480,6 @@ update_flag else to_chat(usr, "\red As you attempted to rename it the pressure rose!") - if (href_list["choice"] == "Primary color") if (is_a_color(href_list["icon"],"prim")) canister_color["prim"] = href_list["icon"] @@ -633,7 +630,6 @@ update_flag // Do after stuff here to_chat(user, "You start to slice away at \the [src]...") - playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) busy = 1 if(do_after(user, 50, target = src)) diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm index 578d34fd7e0..b2b7b1efc06 100644 --- a/code/game/machinery/atmoalter/meter.dm +++ b/code/game/machinery/atmoalter/meter.dm @@ -108,7 +108,6 @@ to_chat(user, t) - /obj/machinery/meter/Click() if(istype(usr, /mob/living/silicon/ai)) // ghosts can call ..() for examine usr.examinate(src) @@ -125,7 +124,6 @@ return ..() playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) to_chat(user, "\blue You begin to unfasten \the [src]...") - if (do_after(user, 40, target = src)) user.visible_message( \ "[user] unfastens \the [src].", \ diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm index 6382e7da5df..21eee7b52ac 100644 --- a/code/game/machinery/atmoalter/portable_atmospherics.dm +++ b/code/game/machinery/atmoalter/portable_atmospherics.dm @@ -92,7 +92,6 @@ if(connected_port) disconnect() to_chat(user, "\blue You disconnect [name] from the port.") - update_icon() return else @@ -100,16 +99,13 @@ if(possible_port) if(connect(possible_port)) to_chat(user, "\blue You connect [name] to the port.") - update_icon() return else to_chat(user, "\blue [name] failed to connect to the port.") - return else to_chat(user, "\blue Nothing happens.") - return else if ((istype(W, /obj/item/device/analyzer)) && get_dist(user, src) <= 1) diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm index 8a72b9077f6..1790dec775d 100644 --- a/code/game/machinery/atmoalter/scrubber.dm +++ b/code/game/machinery/atmoalter/scrubber.dm @@ -183,7 +183,6 @@ /obj/machinery/portable_atmospherics/scrubber/huge/attack_hand(var/mob/user as mob) to_chat(usr, "You can't directly interact with this machine. Use the area atmos computer.") - /obj/machinery/portable_atmospherics/scrubber/huge/update_icon() src.overlays = 0 @@ -196,17 +195,14 @@ if(istype(W, /obj/item/weapon/wrench)) if(stationary) to_chat(user, "The bolts are too tight for you to unscrew!") - return if(on) to_chat(user, "Turn it off first!") - return anchored = !anchored playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src].") - return else if ((istype(W, /obj/item/device/analyzer)) && get_dist(user, src) <= 1) diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 3a1069ab3ad..9021a1a2127 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -109,7 +109,6 @@ /obj/machinery/autolathe/attackby(obj/item/O, mob/user, params) if (busy) to_chat(user, "The autolathe is busy. Please wait for completion of previous operation.") - return 1 if(default_deconstruction_screwdriver(user, "autolathe_t", "autolathe", O)) @@ -145,15 +144,12 @@ var/material_amount = materials.get_item_material_amount(O) if(!material_amount) to_chat(user, "This object does not contain sufficient amounts of metal or glass to be accepted by the autolathe.") - return 1 if(!materials.has_space(material_amount)) to_chat(user, "The autolathe is full. Please remove metal or glass from the autolathe in order to insert more.") - return 1 if(!user.unEquip(O)) to_chat(user, "\The [O] is stuck to you and cannot be placed into the autolathe.") - return 1 busy = 1 @@ -165,11 +161,9 @@ if (O.materials[MAT_GLASS]) flick("autolathe_r",src)//plays glass insertion animation to_chat(user, "You insert [inserted] sheet[inserted>1 ? "s" : ""] to the autolathe.") - use_power(inserted*100) else to_chat(user, "You insert a material total of [inserted] to the autolathe.") - use_power(max(500,inserted/10)) qdel(O) busy = 0 @@ -220,7 +214,6 @@ add_to_queue(design_last_ordered,multiplier) else to_chat(usr, "\red The autolathe queue is full!") - if (!busy) busy = 1 process_queue() diff --git a/code/game/machinery/bees_apiary.dm b/code/game/machinery/bees_apiary.dm index 0103ab7f5df..437c188d9b8 100644 --- a/code/game/machinery/bees_apiary.dm +++ b/code/game/machinery/bees_apiary.dm @@ -36,11 +36,9 @@ if(!yieldmod) yieldmod += 1 // to_chat(world, "Yield increased by 1, from 0, to a total of [myseed.yield]") - else if (prob(1/(yieldmod * yieldmod) *100))//This formula gives you diminishing returns based on yield. 100% with 1 yield, decreasing to 25%, 11%, 6, 4, 2... yieldmod += 1 // to_chat(world, "Yield increased by 1, to a total of [myseed.yield]") - else ..() return @@ -49,14 +47,12 @@ if(istype(O, /obj/item/queen_bee)) if(health > 0) to_chat(user, "\red There is already a queen in there.") - else health = 10 nutrilevel += 10 user.drop_item() del(O) to_chat(user, "\blue You carefully insert the queen into [src], she gets busy making a hive.") - bees_in_hive = 0 else if(istype(O, /obj/item/beezeez)) beezeez += 100 @@ -64,53 +60,42 @@ user.drop_item() if(health > 0) to_chat(user, "\blue You insert [O] into [src]. A relaxed humming appears to pick up.") - else to_chat(user, "\blue You insert [O] into [src]. Now it just needs some bees.") - del(O) else if(istype(O, /obj/item/weapon/minihoe)) if(health > 0) to_chat(user, "\red You begin to dislodge the apiary from the tray, the bees don't like that.") - angry_swarm(user) else to_chat(user, "\blue You begin to dislodge the dead apiary from the tray.") - if(do_after(user, 50, target = src)) new hydrotray_type(src.loc) new /obj/item/apiary(src.loc) to_chat(user, "\red You dislodge the apiary from the tray.") - del(src) else if(istype(O, /obj/item/weapon/bee_net)) var/obj/item/weapon/bee_net/N = O if(N.caught_bees > 0) to_chat(user, "\blue You empty the bees into the apiary.") - bees_in_hive += N.caught_bees N.caught_bees = 0 else to_chat(user, "\blue There are no more bees in the net.") - else if(istype(O, /obj/item/weapon/reagent_containers/glass)) var/obj/item/weapon/reagent_containers/glass/G = O if(harvestable_honey > 0) if(health > 0) to_chat(user, "\red You begin to harvest the honey. The bees don't seem to like it.") - angry_swarm(user) else to_chat(user, "\blue You begin to harvest the honey.") - if(do_after(user,50, target = src)) G.reagents.add_reagent("honey",harvestable_honey) harvestable_honey = 0 to_chat(user, "\blue You successfully harvest the honey.") - else to_chat(user, "\blue There is no honey left to harvest.") - else angry_swarm(user) ..() @@ -257,5 +242,4 @@ H.reagents.add_reagent("toxin", toxic) to_chat(usr, "\blue You harvest the honeycomb from the hive. There is a wild buzzing!") - angry_swarm(usr) diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm index ea0421a8df1..fc00e8740d3 100644 --- a/code/game/machinery/biogenerator.dm +++ b/code/game/machinery/biogenerator.dm @@ -68,17 +68,14 @@ if(istype(O, /obj/item/weapon/reagent_containers/glass) && !panel_open) if(beaker) to_chat(user, "A container is already loaded into the machine.") - return else if(!user.drop_item()) to_chat(user, "\The [O] is stuck to you!") - return O.forceMove(src) beaker = O to_chat(user, "You add the container to the machine.") - updateUsrDialog() update_icon() return @@ -97,17 +94,14 @@ else if(istype(O, /obj/item/weapon/crowbar)) else if(panel_open) to_chat(user, "Close the maintenance panel first.") - else if(processing) to_chat(user, "The biogenerator is currently processing.") - else if(istype(O, /obj/item/weapon/storage/bag/plants)) var/i = 0 for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in contents) i++ if(i >= max_items) to_chat(user, "The biogenerator is already full! Activate it.") - else for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in O.contents) if(i >= max_items) @@ -116,31 +110,25 @@ i++ if(i < max_items) to_chat(user, "You empty the plant bag into the biogenerator.") - else if(O.contents.len == 0) to_chat(user, "You empty the plant bag into the biogenerator, filling it to its capacity.") - else to_chat(user, "You fill the biogenerator to its capacity.") - else if(!istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown) && !istype(O, /obj/item/weapon/crowbar)) to_chat(user, "You can not put this in [src.name]") - else var/i = 0 for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in contents) i++ if(i >= max_items) to_chat(user, "The biogenerator is full! Activate it.") - else user.unEquip(O) O.forceMove(src) to_chat(user, "You put [O.name] in [src.name]") - default_deconstruction_crowbar(O) update_icon() @@ -225,7 +213,6 @@ return if(src.processing) to_chat(usr, "The biogenerator is in the process of working.") - return var/S = 0 for(var/obj/item/weapon/reagent_containers/food/snacks/grown/I in contents) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 15b89e44df7..873e08030a7 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -93,7 +93,6 @@ O.unset_machine() O.reset_view(null) to_chat(O, "The screen bursts into static.") - ..() @@ -130,7 +129,6 @@ // DECONSTRUCTION if(istype(W, /obj/item/weapon/screwdriver)) // to_chat(user, "You start to [panel_open ? "close" : "open"] the camera's panel.") - //if(toggle_panel(user)) // No delay because no one likes screwdrivers trying to be hip and have a duration cooldown panel_open = !panel_open user.visible_message("[user] screws the camera's panel [panel_open ? "open" : "closed"]!", @@ -143,7 +141,6 @@ else if(istype(W, /obj/item/weapon/weldingtool) && wires.CanDeconstruct()) if(weld(W, user)) to_chat(user, "You unweld the camera leaving it as just a frame screwed to the wall.") - if(!assembly) assembly = new() assembly.loc = src.loc @@ -158,30 +155,24 @@ upgradeXRay() qdel(W) to_chat(user, "[msg]") - else to_chat(user, "[msg2]") - else if(istype(W, /obj/item/stack/sheet/mineral/plasma) && panel_open) if(!isEmpProof()) upgradeEmpProof() to_chat(user, "[msg]") - qdel(W) else to_chat(user, "[msg2]") - else if(istype(W, /obj/item/device/assembly/prox_sensor) && panel_open) if(!isMotion()) upgradeMotion() to_chat(user, "[msg]") - qdel(W) else to_chat(user, "[msg2]") - // OTHER else if ((istype(W, /obj/item/weapon/paper) || istype(W, /obj/item/device/pda)) && isliving(user)) var/mob/living/U = user @@ -201,7 +192,6 @@ itemname = P.name info = N.notehtml to_chat(U, "You hold \the [itemname] up to the camera ...") - U.changeNext_move(CLICK_CD_MELEE) for(var/mob/O in player_list) if(istype(O, /mob/living/silicon/ai)) @@ -210,29 +200,23 @@ return if(U.name == "Unknown") to_chat(AI, "[U] holds \a [itemname] up to one of your cameras ...") - else to_chat(AI, "[U] holds \a [itemname] up to one of your cameras ...") - AI.last_paper_seen = "[itemname][info]" else if (O.client && O.client.eye == src) to_chat(O, "[U] holds \a [itemname] up to one of the cameras ...") - O << browse(text("[][]", itemname, info), text("window=[]", itemname)) else if (istype(W, /obj/item/device/camera_bug)) if (!src.can_use()) to_chat(user, "Camera non-functional.") - return if(istype(src.bug)) to_chat(user, "Camera bug removed.") - src.bug.bugged_cameras -= src.c_tag src.bug = null else to_chat(user, "Camera bugged.") - src.bug = W src.bug.bugged_cameras[src.c_tag] = src @@ -289,7 +273,6 @@ O.reset_view(null) to_chat(O, "The screen bursts into static.") - /obj/machinery/camera/proc/triggerCameraAlarm(var/duration = 0) alarm_on = 1 motion_alarm.triggerAlarm(loc, src) @@ -359,7 +342,6 @@ return 0 to_chat(user, "You start to weld [src]...") - playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) busy = 1 if(do_after(user, 100, target = src)) diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm index 956c17b921d..5b77c8f00fc 100644 --- a/code/game/machinery/camera/camera_assembly.dm +++ b/code/game/machinery/camera/camera_assembly.dm @@ -29,7 +29,6 @@ if(iswrench(W) && isturf(src.loc)) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) to_chat(user, "You wrench the assembly into place.") - anchored = 1 state = 1 update_icon() @@ -41,7 +40,6 @@ if(iswelder(W)) if(weld(W, user)) to_chat(user, "You weld the assembly securely into place.") - anchored = 1 state = 2 return @@ -49,7 +47,6 @@ else if(iswrench(W)) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) to_chat(user, "You unattach the assembly from it's place.") - anchored = 0 update_icon() state = 0 @@ -61,18 +58,15 @@ var/obj/item/stack/cable_coil/C = W if(C.use(2)) to_chat(user, "You add wires to the assembly.") - state = 3 else to_chat(user, "You need 2 coils of wire to wire the assembly.") - return else if(iswelder(W)) if(weld(W, user)) to_chat(user, "You unweld the assembly from it's place.") - state = 1 anchored = 1 return @@ -86,13 +80,11 @@ var/input = strip_html(input(usr, "Which networks would you like to connect this camera to? Seperate networks with a comma. No Spaces!\nFor example: SS13,Security,Secret ", "Set Network", "SS13")) if(!input) to_chat(usr, "No input found please hang up and try your call again.") - return var/list/tempnetwork = splittext(input, ",") if(tempnetwork.len < 1) to_chat(usr, "No network found please hang up and try your call again.") - return var/area/camera_area = get_area(src) @@ -128,14 +120,12 @@ new/obj/item/stack/cable_coil(get_turf(src), 2) playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) to_chat(user, "You cut the wires from the circuits.") - state = 2 return // Upgrades! if(is_type_in_list(W, possible_upgrades) && !is_type_in_list(W, upgrades)) // Is a possible upgrade and isn't in the camera already. to_chat(user, "You attach \the [W] into the assembly inner circuits.") - upgrades += W user.drop_item(W) W.loc = src @@ -146,7 +136,6 @@ var/obj/U = locate(/obj) in upgrades if(U) to_chat(user, "You unattach an upgrade from the assembly.") - playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) U.loc = get_turf(src) upgrades -= U @@ -172,7 +161,6 @@ return 0 to_chat(user, "You start to weld the [src]..") - playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) busy = 1 if(do_after(user, 20, target = src)) diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm index 2f0c8390f21..0be7126f5a5 100644 --- a/code/game/machinery/camera/tracking.dm +++ b/code/game/machinery/camera/tracking.dm @@ -41,7 +41,6 @@ if(src.stat == 2) to_chat(src, "You can't list the cameras because you are dead!") - return if (!camera || camera == "Cancel") @@ -60,29 +59,24 @@ loc = sanitize(copytext(loc, 1, MAX_MESSAGE_LEN)) if(!loc) to_chat(src, "\red Must supply a location name") - return if(stored_locations.len >= max_locations) to_chat(src, "\red Cannot store additional locations. Remove one first") - return if(loc in stored_locations) to_chat(src, "\red There is already a stored location by this name") - return var/L = get_turf(eyeobj) if (InvalidTurf(get_turf(L))) to_chat(src, "\red Unable to store this location") - return stored_locations[loc] = L to_chat(src, "Location '[loc]' stored") - /mob/living/silicon/ai/proc/sorted_stored_locations() return sortList(stored_locations) @@ -93,7 +87,6 @@ if (!(loc in stored_locations)) to_chat(src, "\red Location [loc] not found") - return var/L = stored_locations[loc] @@ -106,13 +99,11 @@ if (!(loc in stored_locations)) to_chat(src, "\red Location [loc] not found") - return stored_locations.Remove(loc) to_chat(src, "Location [loc] removed") - // Used to allow the AI is write in mob names/camera name from the CMD line. /datum/trackable var/list/names = list() @@ -163,7 +154,6 @@ if(src.stat == DEAD) to_chat(src, "You can't track with camera because you are dead!") - return if(!target_name) return @@ -177,7 +167,6 @@ return to_chat(src, "Follow camera mode [forced ? "terminated" : "ended"].") - cameraFollow = null /mob/living/silicon/ai/proc/ai_actual_track(mob/living/target) @@ -189,20 +178,17 @@ U.tracking = 1 to_chat(U, "Attempting to track [target.get_visible_name()]...") - sleep(min(30, get_dist(target, U.eyeobj) / 4)) spawn(15) //give the AI a grace period to stop moving. U.tracking = 0 if(!target || !target.can_track(usr)) to_chat(U, "Target is not near any active cameras.") - U.cameraFollow = null return to_chat(U, "Now tracking [target.get_visible_name()] on camera.") - var/cameraticks = 0 spawn(0) while(U.cameraFollow == target) @@ -213,12 +199,10 @@ U.tracking = 1 if(!cameraticks) to_chat(U, "Target is not near any active cameras. Attempting to reacquire...") - cameraticks++ if(cameraticks > 9) U.cameraFollow = null to_chat(U, "Unable to reacquire, cancelling track...") - U.tracking = 0 return else diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index 8165a59046f..bca8a6d8aa2 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -19,7 +19,6 @@ var/newlevel = round(charging.percent() * 4.0 / 99) // to_chat(world, "nl: [newlevel]") - if(chargelevel != newlevel) overlays.Cut() @@ -31,11 +30,9 @@ examine(mob/user) if(..(user, 5)) to_chat(user, "There's [charging ? "a" : "no"] cell in the charger.") - if(charging) to_chat(user, "Current charge: [charging.charge]") - attackby(obj/item/weapon/W, mob/user, params) if(stat & BROKEN) return @@ -43,7 +40,6 @@ if(istype(W, /obj/item/weapon/stock_parts/cell) && anchored) if(charging) to_chat(user, "\red There is already a cell in the charger.") - return else var/area/a = loc.loc // Gets our locations location, like a dream within a dream @@ -51,7 +47,6 @@ return if(a.power_equip == 0) // There's no APC in this area, don't try to cheat power! to_chat(user, "\red The [name] blinks red as you try to insert the cell!") - return user.drop_item() @@ -63,12 +58,10 @@ else if(istype(W, /obj/item/weapon/wrench)) if(charging) to_chat(user, "\red Remove the cell first!") - return anchored = !anchored to_chat(user, "You [anchored ? "attach" : "detach"] the cell charger [anchored ? "to" : "from"] the ground") - playsound(get_turf(src), 'sound/items/Ratchet.ogg', 75, 1) attack_hand(mob/user) @@ -95,7 +88,6 @@ process() // to_chat(world, "ccpt [charging] [stat]") - if(!charging || (stat & (BROKEN|NOPOWER)) || !anchored) return diff --git a/code/game/machinery/chiller.dm b/code/game/machinery/chiller.dm index c48f3f11edb..82fe014e160 100644 --- a/code/game/machinery/chiller.dm +++ b/code/game/machinery/chiller.dm @@ -27,15 +27,12 @@ /obj/machinery/space_heater/air_conditioner/examine(mob/user) ..(user) to_chat(user, "The air conditioner is [on ? "on" : "off"] and the hatch is [open ? "open" : "closed"].") - if(open) to_chat(user, "The power cell is [cell ? "installed" : "missing"].") - else to_chat(user, "The charge meter reads [cell ? round(cell.percent(),1) : 0]%") - /obj/machinery/space_heater/air_conditioner/emp_act(severity) if(stat & (BROKEN|NOPOWER)) ..(severity) @@ -49,7 +46,6 @@ if(open) if(cell) to_chat(user, "There is already a power cell inside.") - return else // insert cell @@ -63,7 +59,6 @@ user.visible_message("[user] inserts a power cell into [src].", "You insert the power cell into [src].") else to_chat(user, "The hatch must be open to insert a power cell.") - return else if(istype(I, /obj/item/weapon/screwdriver)) open = !open diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 137a5c4b217..1f8bbc44587 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -150,13 +150,11 @@ read_only = !read_only to_chat(user, "You flip the write-protect tab to [read_only ? "protected" : "unprotected"].") - /obj/item/weapon/disk/data/examine(mob/user) ..(user) to_chat(user, "The write-protect tab is set to [read_only ? "protected" : "unprotected"].") - //Health Tracker Implant /obj/item/weapon/implant/health @@ -185,7 +183,6 @@ if ((!isnull(occupant)) && (occupant.stat != 2)) var/completion = (100 * ((occupant.health + 100) / (heal_level + 100))) to_chat(user, "Current clone cycle is [round(completion)]% complete.") - return //Clonepod @@ -244,7 +241,6 @@ clonemind.transfer_to(H) to_chat(H, "Consciousness slowly creeps over you as your body regenerates.
      So this is what cloning feels like?
      ") - // -- Mode/mind specific stuff goes here callHook("clone", list(H)) @@ -349,7 +345,6 @@ if (istype(W, /obj/item/weapon/screwdriver)) if(occupant || mess || locked) to_chat(user, "The maintenance panel is locked.") - return default_deconstruction_screwdriver(user, "[icon_state]_maintenance", "[initial(icon_state)]", W) return @@ -365,23 +360,19 @@ if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) if (!check_access(W)) to_chat(user, "\red Access Denied.") - return if ((!locked) || (isnull(occupant))) return if ((occupant.health < -20) && (occupant.stat != 2)) to_chat(user, "\red Access Refused.") - return else locked = 0 to_chat(user, "System unlocked.") - //Removing cloning pod biomass else if (istype(W, /obj/item/weapon/reagent_containers/food/snacks/meat)) to_chat(user, "\blue \The [src] processes \the [W].") - biomass += 50 user.drop_item() qdel(W) @@ -389,7 +380,6 @@ else if (istype(W, /obj/item/weapon/wrench)) if(locked && (anchored || occupant)) to_chat(user, "\red Can not do that while [src] is in use.") - else if(anchored) anchored = 0 @@ -406,7 +396,6 @@ var/obj/item/device/multitool/M = W M.buffer = src to_chat(user, "You load connection data from [src] to [M].") - return else ..() @@ -415,7 +404,6 @@ if (isnull(occupant)) return to_chat(user, "You force an emergency ejection.") - locked = 0 go_out() return @@ -456,12 +444,10 @@ if (!(occupant)) to_chat(user, "The cloning pod is empty!") - return if (locked) to_chat(user, "The cloning pod is locked!") - return if (occupant.client) diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm index 6ade8685e74..809ac579454 100644 --- a/code/game/machinery/computer/HolodeckControl.dm +++ b/code/game/machinery/computer/HolodeckControl.dm @@ -165,9 +165,7 @@ playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) emagged = 1 to_chat(user, "\blue You vastly increase projector power and override the safety and security protocols.") - to_chat(user, "Warning. Automatic shutoff and derezing protocols have been corrupted. Please call Nanotrasen maintenance and do not use the simulator.") - log_game("[key_name(usr)] emagged the Holodeck Control Computer") src.updateUsrDialog() @@ -370,7 +368,6 @@ if (istype(W, /obj/item/weapon/wrench)) to_chat(user, "It's a holotable! There are no bolts!") - return /obj/structure/table/holotable/wood @@ -411,7 +408,6 @@ /obj/structure/rack/holorack/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if (istype(W, /obj/item/weapon/wrench)) to_chat(user, "It's a holorack! There are no bolts!") - return /obj/item/weapon/holo @@ -472,14 +468,12 @@ w_class = 4 playsound(user, 'sound/weapons/saberon.ogg', 50, 1) to_chat(user, "[src] is now active.") - else force = 3 icon_state = "sword0" w_class = 2 playsound(user, 'sound/weapons/saberoff.ogg', 50, 1) to_chat(user, "[src] can now be concealed.") - if(istype(user,/mob/living/carbon/human)) var/mob/living/carbon/human/H = user H.update_inv_l_hand() @@ -510,7 +504,6 @@ var/obj/item/weapon/grab/G = W if(G.state<2) to_chat(user, "You need a better grip to do that!") - return G.affecting.loc = src.loc G.affecting.Weaken(5) @@ -553,17 +546,14 @@ /obj/machinery/readybutton/attack_ai(mob/user as mob) to_chat(user, "The station AI is not to interact with these devices") - return /obj/machinery/readybutton/attackby(obj/item/weapon/W as obj, mob/user as mob, params) to_chat(user, "The device is a solid button, there's nothing you can do with it!") - /obj/machinery/readybutton/attack_hand(mob/user as mob) if(user.stat || stat & (NOPOWER|BROKEN)) to_chat(user, "This device is not powered.") - return currentarea = get_area(src.loc) @@ -572,7 +562,6 @@ if(eventstarted) to_chat(usr, "The event has already begun!") - return ready = !ready @@ -603,4 +592,3 @@ for(var/mob/M in currentarea) to_chat(M, "FIGHT!") - diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm index bc010ad8ff5..8ad0b715b4f 100644 --- a/code/game/machinery/computer/ai_core.dm +++ b/code/game/machinery/computer/ai_core.dm @@ -25,20 +25,17 @@ playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 20, target = src)) to_chat(user, "\blue You wrench the frame into place.") - anchored = 1 state = 1 if(istype(P, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = P if(!WT.isOn()) to_chat(user, "The welder must be on for this task.") - return playsound(loc, 'sound/items/Welder.ogg', 50, 1) if(do_after(user, 20, target = src)) if(!src || !WT.remove_fuel(0, user)) return to_chat(user, "\blue You deconstruct the frame.") - new /obj/item/stack/sheet/plasteel(loc, 4) qdel(src) if(1) @@ -46,13 +43,11 @@ playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 20, target = src)) to_chat(user, "\blue You unfasten the frame.") - anchored = 0 state = 0 if(istype(P, /obj/item/weapon/circuitboard/aicore) && !circuit) playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1) to_chat(user, "\blue You place the circuit board inside the frame.") - icon_state = "1" circuit = P user.drop_item() @@ -60,13 +55,11 @@ if(istype(P, /obj/item/weapon/screwdriver) && circuit) playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1) to_chat(user, "\blue You screw the circuit board into place.") - state = 2 icon_state = "2" if(istype(P, /obj/item/weapon/crowbar) && circuit) playsound(loc, 'sound/items/Crowbar.ogg', 50, 1) to_chat(user, "\blue You remove the circuit board.") - state = 1 icon_state = "0" circuit.loc = loc @@ -75,7 +68,6 @@ if(istype(P, /obj/item/weapon/screwdriver) && circuit) playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1) to_chat(user, "\blue You unfasten the circuit board.") - state = 1 icon_state = "1" if(istype(P, /obj/item/stack/cable_coil)) @@ -85,18 +77,15 @@ P:amount -= 5 if(!P:amount) qdel(P) to_chat(user, "\blue You add cables to the frame.") - state = 3 icon_state = "3" if(3) if(istype(P, /obj/item/weapon/wirecutters)) if (brain) to_chat(user, "Get that brain out of there first") - else playsound(loc, 'sound/items/Wirecutter.ogg', 50, 1) to_chat(user, "\blue You remove the cables.") - state = 2 icon_state = "2" var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( loc ) @@ -110,49 +99,41 @@ P:amount -= 2 if(!P:amount) qdel(P) to_chat(user, "\blue You put in the glass panel.") - state = 4 icon_state = "4" if(istype(P, /obj/item/weapon/aiModule/purge)) laws.clear_inherent_laws() to_chat(usr, "Law module applied.") - return if(istype(P, /obj/item/weapon/aiModule/freeform)) var/obj/item/weapon/aiModule/freeform/M = P laws.add_inherent_law(M.newFreeFormLaw) to_chat(usr, "Added a freeform law.") - return if(istype(P, /obj/item/weapon/aiModule)) var/obj/item/weapon/aiModule/M = P if(!M.laws) to_chat(usr, "This AI module can not be applied directly to AI cores.") - return laws = M.laws if(istype(P, /obj/item/device/mmi) || istype(P, /obj/item/device/mmi/posibrain)) if(!P:brainmob) to_chat(user, "\red Sticking an empty [P] into the frame would sort of defeat the purpose.") - return if(P:brainmob.stat == 2) to_chat(user, "\red Sticking a dead [P] into the frame would sort of defeat the purpose.") - return if(jobban_isbanned(P:brainmob, "AI") || jobban_isbanned(P:brainmob,"nonhumandept")) to_chat(user, "\red This [P] does not seem to fit.") - return if(istype(P, /obj/item/device/mmi/syndie)) to_chat(user, "This MMI does not seem to fit!") - return if(P:brainmob.mind) @@ -163,13 +144,11 @@ P.loc = src brain = P to_chat(usr, "Added [P].") - icon_state = "3b" if(istype(P, /obj/item/weapon/crowbar) && brain) playsound(loc, 'sound/items/Crowbar.ogg', 50, 1) to_chat(user, "\blue You remove the brain.") - brain.loc = loc brain = null icon_state = "3" @@ -178,7 +157,6 @@ if(istype(P, /obj/item/weapon/crowbar)) playsound(loc, 'sound/items/Crowbar.ogg', 50, 1) to_chat(user, "\blue You remove the glass panel.") - state = 3 if (brain) icon_state = "3b" @@ -190,7 +168,6 @@ if(istype(P, /obj/item/weapon/screwdriver)) playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1) to_chat(user, "You connect the monitor.") - if(!brain) var/open_for_latejoin = alert(user, "Would you like this core to be open for latejoining AIs?", "Latejoin", "Yes", "Yes", "No") == "Yes" var/obj/structure/AIcore/deactivated/D = new(loc) @@ -250,7 +227,6 @@ if(!cores.len) to_chat(src, "No deactivated AI cores were found.") - var/id = input("Which core?", "Toggle AI Core Latejoin", null) as null|anything in cores if(!id) return @@ -260,13 +236,11 @@ if(D in empty_playable_ai_cores) empty_playable_ai_cores -= D to_chat(src, "\The [id] is now not available for latejoining AIs.") - else empty_playable_ai_cores += D to_chat(src, "\The [id] is now available for latejoining AIs.") - /* This is a good place for AI-related object verbs so I'm sticking it here. If adding stuff to this, don't forget that an AI need to cancel_camera() whenever it physically moves to a different location. @@ -279,7 +253,6 @@ atom/proc/transfer_ai(var/interaction, var/mob/user, var/mob/living/silicon/ai/A if(istype(card)) if(card.flush) to_chat(user, "ERROR: AI flush is in progress, cannot execute transfer protocol.") - return 0 return 1 @@ -293,10 +266,7 @@ atom/proc/transfer_ai(var/interaction, var/mob/user, var/mob/living/silicon/ai/A AI.aiRadio.disabledAi = 0 AI.loc = loc//To replace the terminal. to_chat(AI, "You have been uploaded to a stationary terminal. Remote device connection restored.") - to_chat(user, "Transfer successful: [AI.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed.") - qdel(src) else //If for some reason you use an empty card on an empty AI terminal. to_chat(user, "There is no AI loaded on this terminal!") - diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index 34c2ceedaed..e326d9750d5 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -14,10 +14,8 @@ if(occupant && istype(I, /obj/item/weapon/screwdriver)) if(stat & (NOPOWER|BROKEN)) to_chat(user, "The screws on [name]'s screen won't budge.") - else to_chat(user, "The screws on [name]'s screen won't budge and it emits a warning beep.") - return else ..() @@ -33,7 +31,6 @@ if(mode.kickoff) to_chat(user, "You have been locked out from this console!") - /obj/machinery/computer/aifixer/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) var/data[0] if(occupant) @@ -118,30 +115,23 @@ if(interaction == AI_TRANS_FROM_CARD) if(stat & (NOPOWER|BROKEN)) to_chat(user, "[src] is offline and cannot take an AI at this time!") - return AI.loc = src occupant = AI AI.control_disabled = 1 AI.aiRadio.disabledAi = 1 to_chat(AI, "You have been uploaded to a stationary terminal. Sadly, there is no remote access from here.") - to_chat(user, "Transfer successful: [AI.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed.") - update_icon() else //Uploading AI from terminal to card if(occupant && !active) to_chat(occupant, "You have been downloaded to a mobile storage device. Still no remote access.") - to_chat(user, "Transfer successful: [occupant.name] ([rand(1000,9999)].exe) removed from host terminal and stored within local memory.") - occupant.loc = card occupant = null update_icon() else if (active) to_chat(user, "ERROR: Reconstruction in progress.") - else if (!occupant) to_chat(user, "ERROR: Unable to locate artificial intelligence.") - diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index a9de75bfd03..0948c8ae3a1 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -369,7 +369,6 @@ if(emagged) user.nutrition = 0 //yeah you pretty hongry to_chat(user, "Your body instantly contracts to that of one who has not eaten in months. Agonizing cramps seize you as you fall to the floor.") - if(fuel <= 0) dat += "
      You ran out of fuel, and drift, slowly, into a star." if(emagged) @@ -377,12 +376,10 @@ M.adjust_fire_stacks(5) M.IgniteMob() //flew into a star, so you're on fire to_chat(user, "You feel an immense wave of heat emanate from the arcade machine. Your skin bursts into flames.") - dat += "

      OK...

      " if(emagged) to_chat(user, "You're never going to make it to Orion...") - user.death() emagged = 0 //removes the emagged status after you lose playing = 0 //also a new game @@ -451,11 +448,9 @@ if(ORION_TRAIL_RAIDERS) if(prob(50)) to_chat(usr, "You hear battle shouts. The tramping of boots on cold metal. Screams of agony. The rush of venting air. Are you going insane?") - M.hallucination += 30 else to_chat(usr, "Something strikes you from behind! It hurts like hell and feel like a blunt weapon, but nothing is there...") - M.take_organ_damage(30) playsound(loc, 'sound/weapons/genhit2.ogg', 100, 1) if(ORION_TRAIL_ILLNESS) @@ -463,14 +458,11 @@ if(severity == 1) to_chat(M, "You suddenly feel slightly nauseous.")//got off lucky - if(severity == 2) to_chat(usr, "You suddenly feel extremely nauseous and hunch over until it passes.") - M.Stun(3) if(severity >= 3) //you didn't pray hard enough to_chat(M, "An overpowering wave of nausea consumes over you. You hunch over, your stomach's contents preparing for a spectacular exit.") - M.Stun(5) sleep(30) atom_say("[M] violently throws up!") @@ -487,7 +479,6 @@ playsound(src.loc, 'sound/weapons/Genhit.ogg', 100, 1) else to_chat(M, "A violent gale blows past you, and you barely manage to stay standing!") - if(ORION_TRAIL_COLLISION) //by far the most damaging event if(prob(90)) playsound(src.loc, 'sound/effects/bang.ogg', 100, 1) @@ -967,7 +958,6 @@ /obj/machinery/computer/arcade/orion_trail/emag_act(mob/user) if(!emagged) to_chat(user, "You override the cheat code menu and skip to Cheat #[rand(1, 50)]: Realism Mode.") - name = "The Orion Trail: Realism Edition" desc = "Learn how our ancestors got to Orion, and try not to die in the process!" newgame() @@ -1007,11 +997,9 @@ return if(!active) to_chat(user, "There's a little switch on the bottom. It's flipped down.") - else to_chat(user, "There's a little switch on the bottom. It's flipped up.") - /obj/item/weapon/orion_ship/attack_self(mob/user) //Minibomb-level explosion. Should probably be more because of how hard it is to survive the machine! Also, just over a 5-second fuse if(active) return @@ -1020,7 +1008,6 @@ log_game("[key_name(usr)] primed an explosive Orion ship for detonation.") to_chat(user, "You flip the switch on the underside of [src].") - active = 1 visible_message("[src] softly beeps and whirs to life!") playsound(src.loc, 'sound/machines/defib_SaftyOn.ogg', 25, 1) diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 8262c5819e3..b128b06bf49 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -305,7 +305,6 @@ return else to_chat(user, "DERP! BUG! Report this (And what you were doing to cause it) to Agouri") - return /obj/item/weapon/circuitboard/rdconsole/attackby(obj/item/I as obj, mob/user as mob, params) @@ -338,10 +337,8 @@ id = 5 to_chat(user, "Access protocols set to [console_choice].") - else to_chat(user, "Access Denied") - return /obj/structure/computerframe/attackby(obj/item/P as obj, mob/user as mob, params) @@ -351,20 +348,17 @@ playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 20, target = src)) to_chat(user, "\blue You wrench the frame into place.") - src.anchored = 1 src.state = 1 if(istype(P, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = P if(!WT.remove_fuel(0, user)) to_chat(user, "The welding tool must be on to complete this task.") - return playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) if(do_after(user, 20, target = src)) if(!src || !WT.isOn()) return to_chat(user, "\blue You deconstruct the frame.") - new /obj/item/stack/sheet/metal( src.loc, 5 ) qdel(src) if(1) @@ -372,7 +366,6 @@ playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 20, target = src)) to_chat(user, "\blue You unfasten the frame.") - src.anchored = 0 src.state = 0 if(istype(P, /obj/item/weapon/circuitboard) && !circuit) @@ -380,24 +373,20 @@ if(B.board_type == "computer") playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) to_chat(user, "\blue You place the circuit board inside the frame.") - src.icon_state = "1" src.circuit = P user.drop_item() P.loc = src else to_chat(user, "\red This frame does not accept circuit boards of this type!") - if(istype(P, /obj/item/weapon/screwdriver) && circuit) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) to_chat(user, "\blue You screw the circuit board into place.") - src.state = 2 src.icon_state = "2" if(istype(P, /obj/item/weapon/crowbar) && circuit) playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) to_chat(user, "\blue You remove the circuit board.") - src.state = 1 src.icon_state = "0" circuit.loc = src.loc @@ -406,7 +395,6 @@ if(istype(P, /obj/item/weapon/screwdriver) && circuit) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) to_chat(user, "\blue You unfasten the circuit board.") - src.state = 1 src.icon_state = "1" if(istype(P, /obj/item/stack/cable_coil)) @@ -417,14 +405,12 @@ P:amount -= 5 if(!P:amount) qdel(P) to_chat(user, "\blue You add cables to the frame.") - src.state = 3 src.icon_state = "3" if(3) if(istype(P, /obj/item/weapon/wirecutters)) playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) to_chat(user, "\blue You remove the cables.") - src.state = 2 src.icon_state = "2" var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( src.loc ) @@ -437,21 +423,18 @@ if(P) P:use(2) to_chat(user, "\blue You put in the glass panel.") - src.state = 4 src.icon_state = "4" if(4) if(istype(P, /obj/item/weapon/crowbar)) playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) to_chat(user, "\blue You remove the glass panel.") - src.state = 3 src.icon_state = "3" new /obj/item/stack/sheet/glass( src.loc, 2 ) if(istype(P, /obj/item/weapon/screwdriver)) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) to_chat(user, "\blue You connect the monitor.") - var/B = new src.circuit.build_path ( src.loc ) if(circuit.powernet) B:powernet = circuit.powernet if(circuit.id) B:id = circuit.id @@ -476,20 +459,17 @@ playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 20, target = src)) to_chat(user, "\blue You wrench the frame into place.") - src.anchored = 1 src.state = 1 if(istype(P, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = P if(!WT.remove_fuel(0, user)) to_chat(user, "The welding tool must be on to complete this task.") - return playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) if(do_after(user, 20, target = src)) if(!src || !WT.isOn()) return to_chat(user, "\blue You deconstruct the frame.") - new /obj/item/stack/sheet/mineral/bananium( src.loc, 5 ) qdel(src) if(1) @@ -497,7 +477,6 @@ playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 20, target = src)) to_chat(user, "\blue You unfasten the frame.") - src.anchored = 0 src.state = 0 if(istype(P, /obj/item/weapon/circuitboard) && !circuit) @@ -505,24 +484,20 @@ if(B.board_type == "honkcomputer") playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) to_chat(user, "\blue You place the circuit board inside the frame.") - src.icon_state = "1" src.circuit = P user.drop_item() P.loc = src else to_chat(user, "\red This frame does not accept circuit boards of this type!") - if(istype(P, /obj/item/weapon/screwdriver) && circuit) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) to_chat(user, "\blue You screw the circuit board into place.") - src.state = 2 src.icon_state = "2" if(istype(P, /obj/item/weapon/crowbar) && circuit) playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) to_chat(user, "\blue You remove the circuit board.") - src.state = 1 src.icon_state = "0" circuit.loc = src.loc @@ -531,7 +506,6 @@ if(istype(P, /obj/item/weapon/screwdriver) && circuit) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) to_chat(user, "\blue You unfasten the circuit board.") - src.state = 1 src.icon_state = "1" if(istype(P, /obj/item/stack/cable_coil)) @@ -542,14 +516,12 @@ P:amount -= 5 if(!P:amount) qdel(P) to_chat(user, "\blue You add cables to the frame.") - src.state = 3 src.icon_state = "3" if(3) if(istype(P, /obj/item/weapon/wirecutters)) playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) to_chat(user, "\blue You remove the cables.") - src.state = 2 src.icon_state = "2" var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( src.loc ) @@ -562,21 +534,18 @@ if(P) P:use(2) to_chat(user, "\blue You put in the glass panel.") - src.state = 4 src.icon_state = "4" if(4) if(istype(P, /obj/item/weapon/crowbar)) playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) to_chat(user, "\blue You remove the glass panel.") - src.state = 3 src.icon_state = "3" new /obj/item/stack/sheet/glass( src.loc, 2 ) if(istype(P, /obj/item/weapon/screwdriver)) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) to_chat(user, "\blue You connect the monitor.") - var/B = new src.circuit.build_path ( src.loc ) if(circuit.powernet) B:powernet = circuit.powernet if(circuit.id) B:id = circuit.id diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index aa061a53a4f..0311ac200fb 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -62,7 +62,6 @@ if(!emagged) emagged = 1 to_chat(user, "\blue You have authorized full network access!") - ui_interact(user) else ui_interact(user) diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index 62828afa084..44fe97e0915 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -56,7 +56,6 @@ else to_chat(user, "The console is already in use!") - /mob/camera/aiEye/remote name = "Inactive Camera Eye" var/sprint = 10 diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index 91b5092db88..7af28cc4f73 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -102,21 +102,18 @@ var/time_last_changed_position = 0 if(scan) to_chat(usr, "You remove \the [scan] from \the [src].") - scan.loc = get_turf(src) if(!usr.get_active_hand()) usr.put_in_hands(scan) scan = null else if(modify) to_chat(usr, "You remove \the [modify] from \the [src].") - modify.loc = get_turf(src) if(!usr.get_active_hand()) usr.put_in_hands(modify) modify = null else to_chat(usr, "There is nothing to remove from the console.") - return /obj/machinery/computer/card/attackby(obj/item/weapon/card/id/id_card, mob/user, params) @@ -326,7 +323,6 @@ var/time_last_changed_position = 0 break if(!jobdatum) to_chat(usr, "\red No log exists for this job: [t1]") - return access = jobdatum.get_access() diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 1252d1617f3..4e51c1e1dad 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -88,7 +88,6 @@ W.loc = src src.diskette = W to_chat(user, "You insert [W].") - nanomanager.update_uis(src) return else if(istype(W, /obj/item/device/multitool)) @@ -100,7 +99,6 @@ P.connected = src P.name = "[initial(P.name)] #[pods.len]" to_chat(user, "You connect [P] to [src].") - else ..() return @@ -330,7 +328,6 @@ return to_chat(selected, 'sound/machines/chime.ogg')//probably not the best sound but I think it's reasonable - var/answer = alert(selected,"Do you want to return to life?","Cloning","Yes","No") if(answer != "No" && pod.growclone(C)) temp = "Initiating cloning cycle..." diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 4973d4cb32b..90b415c99bf 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -48,7 +48,6 @@ else if(message) to_chat(user, "Access denied.") - return 0 /obj/machinery/computer/communications/Topic(href, href_list) @@ -57,13 +56,11 @@ if ((!(src.z in config.station_levels) && !(src.z in config.admin_levels))) to_chat(usr, "Unable to establish a connection: You're too far away from the station!") - return 1 if(href_list["login"]) if(!ishuman(usr)) to_chat(usr, "Access denied.") - return var/mob/living/carbon/human/M = usr var/obj/item/card = M.get_active_hand() @@ -100,7 +97,6 @@ if("newalertlevel") if(isAI(usr) || isrobot(usr)) to_chat(usr, "Firewalls prevent you from changing the alert level.") - nanomanager.update_uis(src) return 1 tmp_alertlevel = text2num(href_list["level"]) @@ -129,18 +125,15 @@ tmp_alertlevel = 0 else to_chat(usr, "You are not authorized to do this.") - tmp_alertlevel = 0 setMenuState(usr,COMM_SCREEN_MAIN) else to_chat(usr, "You need to swipe your ID.") - if("announce") if(is_authenticated(usr) == 2) if(message_cooldown) to_chat(usr, "Please allow at least one minute to pass between announcements.") - nanomanager.update_uis(src) return var/input = input(usr, "Please write a message to announce to the station crew.", "Priority Announcement") @@ -166,7 +159,6 @@ if("cancelshuttle") if(isAI(usr) || isrobot(usr)) to_chat(usr, "Firewalls prevent you from recalling the shuttle.") - nanomanager.update_uis(src) return 1 var/response = alert("Are you sure you wish to recall the shuttle?", "Confirm", "Yes", "No") @@ -224,7 +216,6 @@ if(is_authenticated(usr) == 2) if(centcomm_message_cooldown) to_chat(usr, "Arrays recycling. Please stand by.") - nanomanager.update_uis(src) return var/input = stripped_input(usr, "Please enter the reason for requesting the nuclear self-destruct codes. Misuse of the nuclear request system will not be tolerated under any circumstances. Transmission does not guarantee a response.", "Self Destruct Code Request.","") as text|null @@ -233,7 +224,6 @@ return Nuke_request(input, usr) to_chat(usr, "Request sent.") - log_say("[key_name(usr)] has requested the nuclear codes from Centcomm") priority_announcement.Announce("The codes for the on-station nuclear self-destruct have been requested by [usr]. Confirmation or denial of this request will be sent shortly.", "Nuclear Self Destruct Codes Requested",'sound/AI/commandreport.ogg') centcomm_message_cooldown = 1 @@ -245,7 +235,6 @@ if(is_authenticated(usr) == 2) if(centcomm_message_cooldown) to_chat(usr, "Arrays recycling. Please stand by.") - nanomanager.update_uis(src) return var/input = stripped_input(usr, "Please choose a message to transmit to Centcomm via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "To abort, send an empty message.", "") as text|null @@ -254,7 +243,6 @@ return Centcomm_announce(input, usr) to_chat(usr, "Message transmitted.") - log_say("[key_name(usr)] has made a Centcomm announcement: [input]") centcomm_message_cooldown = 1 spawn(6000)//10 minute cooldown @@ -266,7 +254,6 @@ if((is_authenticated(usr) == 2) && (src.emagged)) if(centcomm_message_cooldown) to_chat(usr, "Arrays recycling. Please stand by.") - nanomanager.update_uis(src) return var/input = stripped_input(usr, "Please choose a message to transmit to \[ABNORMAL ROUTING CORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "To abort, send an empty message.", "") as text|null @@ -275,7 +262,6 @@ return Syndicate_announce(input, usr) to_chat(usr, "Message transmitted.") - log_say("[key_name(usr)] has made a Syndicate announcement: [input]") centcomm_message_cooldown = 1 spawn(6000)//10 minute cooldown @@ -284,7 +270,6 @@ if("RestoreBackup") to_chat(usr, "Backup routing data restored!") - src.emagged = 0 setMenuState(usr,COMM_SCREEN_MAIN) @@ -295,7 +280,6 @@ if(!emagged) src.emagged = 1 to_chat(user, "You scramble the communication routing circuits!") - nanomanager.update_uis(src) /obj/machinery/computer/communications/attack_ai(var/mob/user as mob) @@ -310,7 +294,6 @@ if (!(src.z in list(ZLEVEL_STATION, ZLEVEL_CENTCOMM))) to_chat(user, "Unable to establish a connection: You're too far away from the station!") - return ui_interact(user) @@ -415,22 +398,18 @@ /proc/call_shuttle_proc(var/mob/user, var/reason) if(sent_strike_team == 1) to_chat(user, "Central Command will not allow the shuttle to be called. Consider all contracts terminated.") - return if(shuttle_master.emergencyNoEscape) to_chat(user, "The emergency shuttle may not be sent at this time. Please try again later.") - return if(shuttle_master.emergency.mode > SHUTTLE_ESCAPE) to_chat(user, "The emergency shuttle may not be called while returning to Central Command.") - return if(ticker.mode.name == "blob") to_chat(user, "Under directive 7-10, [station_name()] is quarantined until further notice.") - return shuttle_master.requestEvac(user, reason) @@ -444,22 +423,18 @@ if(!force) if(shuttle_master.emergencyNoEscape) to_chat(user, "Central Command does not currently have a shuttle available in your sector. Please try again later.") - return if(sent_strike_team == 1) to_chat(user, "Central Command will not allow the shuttle to be called. Consider all contracts terminated.") - return if(world.time < 54000) // 30 minute grace period to let the game get going to_chat(user, "The shuttle is refueling. Please wait another [round((54000-world.time)/600)] minutes before trying again.") - return if(ticker.mode.name == "epidemic") to_chat(user, "Under directive 7-10, [station_name()] is quarantined until further notice.") - return if(seclevel2num(get_security_level()) >= SEC_LEVEL_RED) // There is a serious threat we gotta move no time to give them five minutes. diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index 9d503300cb0..8524cd85754 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -121,13 +121,11 @@ C.loc = src.loc if (src.stat & BROKEN) to_chat(user, "\blue The broken glass falls out.") - new /obj/item/weapon/shard(loc) A.state = 3 A.icon_state = "3" else to_chat(user, "\blue You disconnect the monitor.") - A.state = 4 A.icon_state = "4" qdel(src) diff --git a/code/game/machinery/computer/honkputer.dm b/code/game/machinery/computer/honkputer.dm index ab0c29a35aa..8ccd36fc780 100644 --- a/code/game/machinery/computer/honkputer.dm +++ b/code/game/machinery/computer/honkputer.dm @@ -22,7 +22,6 @@ return 1 if (!(src.z in config.station_levels)) to_chat(usr, "\red Unable to establish a connection: \black You're too far away from the station!") - return usr.set_machine(src) @@ -48,14 +47,12 @@ if(src.authenticated==1) if(message_cooldown) to_chat(usr, "Arrays recycling. Please stand by.") - return var/input = stripped_input(usr, "Please choose a message to transmit to your HONKbrothers on the homeworld. Transmission does not guarantee a response.", "To abort, send an empty message.", "") if(!input || !(usr in view(1,src))) return HONK_announce(input, usr) to_chat(usr, "Message transmitted.") - log_say("[key_name(usr)] has made a HONKplanet announcement: [input]") message_cooldown = 1 spawn(6000)//10 minute cooldown @@ -68,13 +65,11 @@ src.emagged = 1 to_chat(user, "You scramble the login circuits, allowing anyone to use the console!") - /obj/machinery/computer/HONKputer/attack_hand(var/mob/user as mob) if(..()) return if (src.z > 6) to_chat(user, "\red Unable to establish a connection: \black You're too far away from the station!") - return user.set_machine(src) @@ -82,7 +77,6 @@ if (istype(user, /mob/living/silicon)) to_chat(user, "This console is not networked to the rest of the grid.") - return switch(src.state) @@ -111,13 +105,11 @@ C.loc = src.loc if (src.stat & BROKEN) to_chat(user, "\blue The broken glass falls out.") - new /obj/item/weapon/shard( src.loc ) A.state = 3 A.icon_state = "3" else to_chat(user, "\blue You disconnect the monitor.") - A.state = 4 A.icon_state = "4" qdel(src) diff --git a/code/game/machinery/computer/law.dm b/code/game/machinery/computer/law.dm index 5c0a8774183..c84690cfa64 100644 --- a/code/game/machinery/computer/law.dm +++ b/code/game/machinery/computer/law.dm @@ -23,17 +23,14 @@ opened = !opened if(opened) to_chat(usr, "\blue The access panel is now open.") - else to_chat(usr, "\blue The access panel is now closed.") - return attackby(obj/item/weapon/O as obj, mob/user as mob, params) if (user.z > 6) to_chat(user, "\red Unable to establish a connection: \black You're too far away from the station!") - return if(istype(O, /obj/item/weapon/aiModule)) var/datum/game_mode/nations/mode = get_nations_mode() @@ -43,7 +40,6 @@ else if(mode.kickoff) to_chat(user, "You have been locked out from modifying the AI's laws!") - else ..() @@ -51,21 +47,17 @@ attack_hand(var/mob/user as mob) if(src.stat & NOPOWER) to_chat(usr, "The upload computer has no power!") - return if(src.stat & BROKEN) to_chat(usr, "The upload computer is broken!") - return src.current = select_active_ai(user) if (!src.current) to_chat(usr, "No active AIs detected.") - else to_chat(usr, "[src.current.name] selected for law changes.") - return attack_ghost(user as mob) @@ -88,7 +80,6 @@ else if(mode.kickoff) to_chat(user, "You have been locked out from modifying the borg's laws!") - else return ..() @@ -96,21 +87,17 @@ attack_hand(var/mob/user as mob) if(src.stat & NOPOWER) to_chat(usr, "The upload computer has no power!") - return if(src.stat & BROKEN) to_chat(usr, "The upload computer is broken!") - return src.current = freeborg() if (!src.current) to_chat(usr, "No free cyborgs detected.") - else to_chat(usr, "[src.current.name] selected for law changes.") - return attack_ghost(user as mob) diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm index 89e0a8badb2..a56fe597b13 100644 --- a/code/game/machinery/computer/message.dm +++ b/code/game/machinery/computer/message.dm @@ -46,7 +46,6 @@ if(isscrewdriver(O) && emag) //Stops people from just unscrewing the monitor and putting it back to get the console working again. to_chat(user, "It is too hot to mess with!") - return ..() @@ -75,7 +74,6 @@ else to_chat(user, "A no server error appears on the screen.") - /obj/machinery/computer/message_monitor/update_icon() if(emag || hacking) icon_screen = hack_icon @@ -299,11 +297,9 @@ /obj/machinery/computer/message_monitor/proc/BruteForce(mob/user as mob) if(isnull(linkedServer)) to_chat(user, "Could not complete brute-force: Linked Server Disconnected!") - else var/currentKey = src.linkedServer.decryptkey to_chat(user, "Brute-force completed! The key is '[currentKey]'.") - src.hacking = 0 src.icon_screen = normal_icon src.screen = 0 // Return the screen back to normal @@ -524,7 +520,6 @@ // to_chat(usr, href_list["select"]) - if (href_list["back"]) src.screen = 0 // View chat room list diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm index 5c07b2ed14e..38e6c139f2e 100644 --- a/code/game/machinery/computer/pod.dm +++ b/code/game/machinery/computer/pod.dm @@ -277,7 +277,6 @@ /obj/machinery/computer/pod/old/syndicate/attack_hand(var/mob/user as mob) if(!allowed(user)) to_chat(user, "Access Denied") - return else ..() diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm index d20a23d2de1..7ae15a086f2 100644 --- a/code/game/machinery/computer/prisoner.dm +++ b/code/game/machinery/computer/prisoner.dm @@ -93,7 +93,6 @@ inserted_id = I else to_chat(usr, "\red No valid ID.") - if("1") inserted_id.loc = get_step(src,get_turf(usr)) inserted_id = null @@ -121,7 +120,6 @@ else to_chat(usr, "Unauthorized access.") - else if(href_list["warn"]) var/warning = sanitize(copytext(input(usr,"Message:","Enter your message here!",""),1,MAX_MESSAGE_LEN)) if(!warning) return @@ -130,7 +128,6 @@ var/mob/living/carbon/R = I.imp_in to_chat(R, "You hear a voice in your head saying: '[warning]'") - src.add_fingerprint(usr) src.updateUsrDialog() return diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm index f6ea30cc353..ccdd9b3f276 100644 --- a/code/game/machinery/computer/robot.dm +++ b/code/game/machinery/computer/robot.dm @@ -28,7 +28,6 @@ to_chat(user, "You have been locked out from this console!") - /obj/machinery/computer/robotics/proc/is_authenticated(var/mob/user as mob) if(isobserver(user) && check_rights(R_ADMIN, 0, user)) return 1 @@ -61,7 +60,6 @@ var/mob/user = usr if(!is_authenticated(user)) to_chat(user, "Access denied.") - return // Destroys the cyborg @@ -71,12 +69,10 @@ return if(isAI(user) && (target.connected_ai != user)) to_chat(user, "Access Denied. This robot is not linked to you.") - return // Cyborgs may blow up themselves via the console if(isrobot(user) && user != target) to_chat(user, "Access Denied.") - return var/choice = input("Really detonate [target.name]?") in list ("Yes", "No") if(choice != "Yes") @@ -87,16 +83,13 @@ // Antagonistic cyborgs? Left here for downstream if(target.mind && target.mind.special_role && target.emagged) to_chat(target, "Extreme danger. Termination codes detected. Scrambling security codes and automatic AI unlink triggered.") - target.ResetSecurityCodes() else message_admins("[key_name_admin(usr)] detonated [key_name_admin(target)] (JMP)!") log_game("\[key_name(usr)] detonated [key_name(target)]!") to_chat(target, "Self-destruct command received.") - if(target.connected_ai) to_chat(target.connected_ai, "

      ALERT - Cyborg detonation detected: [target.name]
      ") - spawn(10) target.self_destruct() @@ -108,12 +101,10 @@ if(isAI(user) && (target.connected_ai != user)) to_chat(user, "Access Denied. This robot is not linked to you.") - return if(isrobot(user)) to_chat(user, "Access Denied.") - return var/choice = input("Really [target.lockcharge ? "unlock" : "lockdown"] [target.name] ?") in list ("Yes", "No") @@ -128,11 +119,9 @@ target.canmove = !target.canmove target.lockcharge = !target.lockcharge to_chat(target, "[!target.lockcharge ? "Your lockdown has been lifted!" : "You have been locked down!"]") - if(target.connected_ai) to_chat(target.connected_ai, "[!target.lockcharge ? "NOTICE - Cyborg lockdown lifted" : "ALERT - Cyborg lockdown detected"]: [target.name]

      ") - // Remotely hacks the cyborg. Only antag AIs can do this and only to linked cyborgs. else if (href_list["hack"]) var/mob/living/silicon/robot/target = get_cyborg_by_name(href_list["hack"]) @@ -142,17 +131,14 @@ // Antag AI checks if(!istype(user, /mob/living/silicon/ai) || !(user.mind.special_role && user.mind.original == user)) to_chat(user, "Access Denied.") - return if(target.connected_ai != user) to_chat(user, "Access Denied. This robot is not linked to you.") - return if(target.emagged) to_chat(user, "Robot is already hacked.") - return var/choice = input("Really hack [target.name]? This cannot be undone.") in list("Yes", "No") @@ -167,27 +153,22 @@ target.emagged = 1 to_chat(target, "Failsafe protocols overriden. New tools available.") - // Arms the emergency self-destruct system else if(href_list["arm"]) if(istype(user, /mob/living/silicon)) to_chat(user, "Access Denied.") - return safety = !safety to_chat(user, "You [safety ? "disarm" : "arm"] the emergency self destruct.") - // Destroys all accessible cyborgs if safety is disabled else if(href_list["nuke"]) if(istype(user, /mob/living/silicon)) to_chat(user, "Access Denied") - return if(safety) to_chat(user, "Self-destruct aborted - safety active") - return message_admins("[key_name_admin(usr)] detonated all cyborgs!") @@ -200,10 +181,8 @@ if(R.scrambledcodes) continue to_chat(R, "Self-destruct command received.") - if(R.connected_ai) to_chat(R.connected_ai, "

      ALERT - Cyborg detonation detected: [R.name]
      ") - spawn(10) R.self_destruct() diff --git a/code/game/machinery/computer/salvage_ship.dm b/code/game/machinery/computer/salvage_ship.dm index ffbef848e08..c0693c810d3 100644 --- a/code/game/machinery/computer/salvage_ship.dm +++ b/code/game/machinery/computer/salvage_ship.dm @@ -47,7 +47,6 @@ /obj/machinery/computer/salvage_ship/attack_hand(mob/user as mob) if(!allowed(user)) to_chat(user, "\red Access Denied") - return user.set_machine(src) diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index e7fc19e9a3c..2a074a9880b 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -32,7 +32,6 @@ O.loc = src scan = O to_chat(user, "You insert [O].") - ..() /obj/machinery/computer/secure_data/attack_ai(mob/user as mob) @@ -44,7 +43,6 @@ return if (src.z > 6) to_chat(user, "\red Unable to establish a connection: \black You're too far away from the station!") - return var/dat diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm index c273102481d..d2f44de6011 100644 --- a/code/game/machinery/computer/skills.dm +++ b/code/game/machinery/computer/skills.dm @@ -31,7 +31,6 @@ O.loc = src scan = O to_chat(user, "You insert [O].") - ..() /obj/machinery/computer/skills/attack_ai(mob/user as mob) @@ -43,7 +42,6 @@ return if (src.z > 6) to_chat(user, "\red Unable to establish a connection: \black You're too far away from the station!") - return var/dat diff --git a/code/game/machinery/computer/specops_shuttle.dm b/code/game/machinery/computer/specops_shuttle.dm index be2531b76d0..d74e27bc702 100644 --- a/code/game/machinery/computer/specops_shuttle.dm +++ b/code/game/machinery/computer/specops_shuttle.dm @@ -91,7 +91,6 @@ var/specops_shuttle_timeleft = 0 var/mob/M = locate(/mob) in T to_chat(M, "\red You have arrived at Central Command. Operation has ended!") - specops_shuttle_at_station = 0 for(var/obj/machinery/computer/specops_shuttle/S in world) @@ -139,7 +138,6 @@ var/specops_shuttle_timeleft = 0 if (!specops_can_move()) to_chat(usr, "\red The Special Operations shuttle is unable to leave.") - return //Begin Marauder launchpad. @@ -235,7 +233,6 @@ var/specops_shuttle_timeleft = 0 var/mob/M = locate(/mob) in T to_chat(M, "\red You have arrived to [station_name]. Commence operation!") - for(var/obj/machinery/computer/specops_shuttle/S in world) S.specops_shuttle_timereset = world.time + SPECOPS_RETURN_DELAY @@ -251,26 +248,22 @@ var/specops_shuttle_timeleft = 0 /obj/machinery/computer/specops_shuttle/attack_ai(var/mob/user as mob) to_chat(user, "\red Access Denied.") - return 1 /obj/machinery/computer/specops_shuttle/attackby(I as obj, user as mob, params) if(istype(I,/obj/item/weapon/card/emag)) to_chat(user, "\blue The electronic systems in this console are far too advanced for your primitive hacking peripherals.") - else return attack_hand(user) /obj/machinery/computer/specops_shuttle/attack_hand(var/mob/user as mob) if(!allowed(user)) to_chat(user, "\red Access Denied.") - return //Commented out so admins can do shenanigans at their leisure. Also makes the force-spawned admin ERTs able to use the shuttle. // if (sent_strike_team == 0 && send_emergency_team == 0) // to_chat(usr, "\red The strike team has not yet deployed.") - // return if(..()) @@ -302,18 +295,14 @@ var/specops_shuttle_timeleft = 0 if (!specops_can_move()) to_chat(usr, "\blue Central Command will not allow the Special Operations shuttle to return yet.") - if(world.timeofday <= specops_shuttle_timereset) if (((world.timeofday - specops_shuttle_timereset)/10) > 60) to_chat(usr, "\blue [-((world.timeofday - specops_shuttle_timereset)/10)/60] minutes remain!") - to_chat(usr, "\blue [-(world.timeofday - specops_shuttle_timereset)/10] seconds remain!") - return to_chat(usr, "\blue The Special Operations shuttle will arrive at Central Command in [(SPECOPS_MOVETIME/10)] seconds.") - temp += "Shuttle departing.

      OK" updateUsrDialog() @@ -327,12 +316,10 @@ var/specops_shuttle_timeleft = 0 if (!specops_can_move()) to_chat(usr, "\red The Special Operations shuttle is unable to leave.") - return to_chat(usr, "\blue The Special Operations shuttle will arrive on [station_name] in [(SPECOPS_MOVETIME/10)] seconds.") - temp += "Shuttle departing.

      OK" updateUsrDialog() diff --git a/code/game/machinery/computer/store.dm b/code/game/machinery/computer/store.dm index 1c2bb4e52c9..c8ae8741288 100644 --- a/code/game/machinery/computer/store.dm +++ b/code/game/machinery/computer/store.dm @@ -141,9 +141,7 @@ td.cost.toomuch { return if(!centcomm_store.PlaceOrder(usr,itemID)) to_chat(usr, "\red Unable to charge your account.") - else to_chat(usr, "\blue You've successfully purchased the item. It should be in your hands or on the floor.") - src.updateUsrDialog() return diff --git a/code/game/machinery/computer/syndicate_specops_shuttle.dm b/code/game/machinery/computer/syndicate_specops_shuttle.dm index 97dbc32a7ac..16de635b0e7 100644 --- a/code/game/machinery/computer/syndicate_specops_shuttle.dm +++ b/code/game/machinery/computer/syndicate_specops_shuttle.dm @@ -61,7 +61,6 @@ var/syndicate_elite_shuttle_timeleft = 0 if (!syndicate_elite_can_move()) to_chat(usr, "\red The Syndicate Elite shuttle is unable to leave.") - return sleep(600) @@ -175,7 +174,6 @@ var/syndicate_elite_shuttle_timeleft = 0 var/mob/M = locate(/mob) in T to_chat(M, "\red You have arrived to [station_name]. Commence operation!") - /proc/syndicate_elite_can_move() if(syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership) return 0 else return 1 @@ -185,25 +183,21 @@ var/syndicate_elite_shuttle_timeleft = 0 /obj/machinery/computer/syndicate_elite_shuttle/attack_ai(var/mob/user as mob) to_chat(user, "\red Access Denied.") - return 1 /obj/machinery/computer/syndicate_elite_shuttle/attackby(I as obj, user as mob, params) if(istype(I,/obj/item/weapon/card/emag)) to_chat(user, "\blue The electronic systems in this console are far too advanced for your primitive hacking peripherals.") - else return attack_hand(user) /obj/machinery/computer/syndicate_elite_shuttle/attack_hand(var/mob/user as mob) if(!allowed(user)) to_chat(user, "\red Access Denied.") - return // if (sent_syndicate_strike_team == 0) // to_chat(usr, "\red The strike team has not yet deployed.") - // return if(..()) @@ -234,7 +228,6 @@ var/syndicate_elite_shuttle_timeleft = 0 if(!syndicate_elite_shuttle_at_station|| syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership) return to_chat(usr, "\blue The Syndicate will not allow the Elite Squad shuttle to return.") - return else if (href_list["sendtostation"]) @@ -242,12 +235,10 @@ var/syndicate_elite_shuttle_timeleft = 0 if (!specops_can_move()) to_chat(usr, "\red The Syndicate Elite shuttle is unable to leave.") - return to_chat(usr, "\blue The Syndicate Elite shuttle will arrive on [station_name] in [(SYNDICATE_ELITE_MOVETIME/10)] seconds.") - temp = "Shuttle departing.

      OK" updateUsrDialog() diff --git a/code/game/machinery/computer/telecrystalconsoles.dm b/code/game/machinery/computer/telecrystalconsoles.dm index 38d5c359e2d..cc5934d9808 100644 --- a/code/game/machinery/computer/telecrystalconsoles.dm +++ b/code/game/machinery/computer/telecrystalconsoles.dm @@ -35,7 +35,6 @@ var/list/possible_uplinker_IDs = list("Alfa","Bravo","Charlie","Delta","Echo","F if(uplinkholder) to_chat(user, "The [src] already has an uplink in it.") - return if(O.hidden_uplink) @@ -51,7 +50,6 @@ var/list/possible_uplinker_IDs = list("Alfa","Bravo","Charlie","Delta","Echo","F - /obj/machinery/computer/telecrystals/uplinker/update_icon() overlays.Cut() ..() diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index ecedaa9b6ce..8886c865722 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -60,7 +60,6 @@ /obj/machinery/constructable_frame/machine_frame/attackby(obj/item/P as obj, mob/user as mob, params) if(P.crit_fail) to_chat(user, "This part is faulty, you cannot add this to the machine!") - return switch(state) if(1) @@ -69,27 +68,22 @@ if(C.amount >= 5) playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) to_chat(user, "You start to add cables to the frame.") - if(do_after(user, 20, target = src)) if(C.amount >= 5 && state == 1) C.use(5) to_chat(user, "You add cables to the frame.") - state = 2 icon_state = "box_1" else to_chat(user, "You need five length of cable to wire the frame.") - return else if(istype(P, /obj/item/stack/sheet/glass)) var/obj/item/stack/sheet/glass/G = P if(G.amount<5) to_chat(user, "\red You do not have enough glass to build a display case.") - return G.use(5) to_chat(user, "\blue You add the glass to the frame.") - playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) new /obj/structure/displaycase_frame(src.loc) qdel(src) @@ -98,7 +92,6 @@ if(istype(P, /obj/item/weapon/wrench)) playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) to_chat(user, "You dismantle the frame.") - new /obj/item/stack/sheet/metal(src.loc, 5) qdel(src) if(2) @@ -107,7 +100,6 @@ if(B.board_type == "machine") playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) to_chat(user, "You add the circuit board to the frame.") - circuit = P user.drop_item() P.loc = src @@ -119,11 +111,9 @@ update_req_desc() else to_chat(user, "This frame does not accept circuit boards of this type!") - if(istype(P, /obj/item/weapon/wirecutters)) playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) to_chat(user, "You remove the cables.") - state = 1 icon_state = "box_0" var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil(src.loc,5) @@ -137,10 +127,8 @@ circuit = null if(components.len == 0) to_chat(user, "You remove the circuit board.") - else to_chat(user, "You remove the circuit board and other components.") - for(var/obj/item/I in components) I.loc = src.loc desc = initial(desc) @@ -190,7 +178,6 @@ for(var/obj/item/weapon/stock_parts/part in added_components) components += part to_chat(user, "[part.name] applied.") - replacer.play_rped_sound() update_req_desc() @@ -221,7 +208,6 @@ return 1 if(!success) to_chat(user, "You cannot add that to the machine!") - return 0 //Machine Frame Circuit Boards @@ -260,7 +246,6 @@ to destroy them and players will be able to make replacements. build_path = typepath name = "circuit board ([names_paths[build_path]] Vendor)" to_chat(user, "You set the board to [names_paths[build_path]].") - req_components = list(text2path("/obj/item/weapon/vending_refill/[copytext("[build_path]", 24)]") = 3) /obj/item/weapon/circuitboard/smes @@ -320,13 +305,11 @@ to destroy them and players will be able to make replacements. build_path = /obj/machinery/atmospherics/unary/heat_reservoir/heater name = "circuit board (Heater)" to_chat(user, "You set the board to heating.") - else build_path = /obj/machinery/atmospherics/unary/cold_sink/freezer name = "circuit board (Freezer)" to_chat(user, "You set the board to cooling.") - /obj/item/weapon/circuitboard/biogenerator name = "circuit board (Biogenerator)" build_path = /obj/machinery/biogenerator diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index 3b8c594ac4c..6a1f0721253 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -98,19 +98,16 @@ return if(occupant) to_chat(user, "\blue The cryo cell is already occupied!") - return var/mob/living/L = O if(!istype(L) || L.buckled) return if(L.abiotic()) to_chat(user, "\red Subject cannot have abiotic items on.") - return for(var/mob/living/carbon/slime/M in range(1,L)) if(M.Victim == L) to_chat(usr, "[L.name] will not fit into the cryo cell because they have a slime latched onto their head.") - return if(put_mob(L)) if(L == user) @@ -165,7 +162,6 @@ if(panel_open) to_chat(usr, "\blue Close the maintenance panel first.") - return ui_interact(user) @@ -278,11 +274,9 @@ if(istype(G, /obj/item/weapon/reagent_containers/glass)) if(beaker) to_chat(user, "\red A beaker is already loaded into the machine.") - return if(!user.drop_item()) to_chat(user, "The [G] is stuck to you!") - return G.forceMove(src) beaker = G @@ -292,7 +286,6 @@ if (istype(G, /obj/item/weapon/screwdriver)) if(occupant || on) to_chat(user, "The maintenance panel is locked.") - return default_deconstruction_screwdriver(user, "pod0-o", "pod0", G) return @@ -305,14 +298,12 @@ if(istype(G, /obj/item/weapon/grab)) if(panel_open) to_chat(user, "\blue Close the maintenance panel first.") - return if(!ismob(G:affecting)) return for(var/mob/living/carbon/slime/M in range(1,G:affecting)) if(M.Victim == G:affecting) to_chat(usr, "[G:affecting:name] will not fit into the cryo because they have a slime latched onto their head.") - return var/mob/M = G:affecting if(put_mob(M)) @@ -434,19 +425,15 @@ /obj/machinery/atmospherics/unary/cryo_cell/proc/put_mob(mob/living/carbon/M as mob) if (!istype(M)) to_chat(usr, "\red The cryo cell cannot handle such a lifeform!") - return if (occupant) to_chat(usr, "\red The cryo cell is already occupied!") - return if (M.abiotic()) to_chat(usr, "\red Subject may not have abiotic items on.") - return if(!node) to_chat(usr, "\red The cell is not correctly connected to its pipe network!") - return if (M.client) M.client.perspective = EYE_PERSPECTIVE @@ -455,7 +442,6 @@ M.forceMove(src) if(M.health > -100 && (M.health < 0 || M.sleeping)) to_chat(M, "\blue You feel a cold liquid surround you. Your skin starts to freeze up.") - occupant = M // M.metabslow = 1 add_fingerprint(usr) @@ -471,7 +457,6 @@ if (usr.stat == 2)//and he's not dead.... return to_chat(usr, "\blue Release sequence activated. This will take two minutes.") - sleep(600) if(!src || !usr || !occupant || (occupant != usr)) //Check if someone's released/replaced/bombed him already return @@ -490,7 +475,6 @@ for(var/mob/living/carbon/slime/M in range(1,usr)) if(M.Victim == usr) to_chat(usr, "You're too busy getting your life sucked out of you.") - return if (usr.stat != 0 || stat & (NOPOWER|BROKEN)) return diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index f47b17c7589..8de2f1baf60 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -95,13 +95,11 @@ else if(href_list["item"]) if(!allowed(user)) to_chat(user, "Access Denied.") - return if(!allow_items) return if(frozen_items.len == 0) to_chat(user, "There is nothing to recover from storage.") - return var/obj/item/I = input(usr, "Please choose which object to retrieve.","Object recovery",null) as null|anything in frozen_items @@ -110,7 +108,6 @@ if(!(I in frozen_items)) to_chat(user, "\The [I] is no longer in storage.") - return visible_message("The console beeps happily as it disgorges \the [I].") @@ -121,13 +118,11 @@ else if(href_list["allitems"]) if(!allowed(user)) to_chat(user, "Access Denied.") - return if(!allow_items) return if(frozen_items.len == 0) to_chat(user, "There is nothing to recover from storage.") - return visible_message("The console beeps happily as it disgorges the desired objects.") @@ -369,7 +364,6 @@ if(O.target == occupant.mind) if(O.owner && O.owner.current) to_chat(O.owner.current, "You get the feeling your target is no longer within your reach. Time for Plan [pick(list("A","B","C","D","X","Y","Z"))]...") - O.target = null spawn(1) //This should ideally fire after the occupant is deleted. if(!O) return @@ -442,7 +436,6 @@ if(occupant) to_chat(user, "\The [src] is in use.") - return if(!ismob(G:affecting)) @@ -456,7 +449,6 @@ if(!istype(M) || M.stat == DEAD) to_chat(user, "Dead people can not be put into cryo.") - return if(M.client) @@ -475,7 +467,6 @@ if(src.occupant) to_chat(user, "\The [src] is in use.") - return M.loc = src @@ -486,7 +477,6 @@ else //because why the fuck would you keep going if the mob isn't in the pod to_chat(user, "You stop putting [M] into the cryopod.") - return if(orient_right) @@ -495,10 +485,8 @@ icon_state = occupied_icon_state to_chat(M, "[on_enter_occupant_message]") - to_chat(M, "If you ghost, log out or close your client now, your character will shortly be permanently removed from the round.") - occupant = M time_entered = world.time @@ -509,7 +497,6 @@ if(Gh.client && Gh.client.holder) //just in case someone has a byond name with @ at the start, which I don't think is even possible but whatever to_chat(Gh, "Warning: Your body has entered cryostorage.") - // Book keeping! log_admin("[key_name(M)] has entered a stasis pod.") message_admins("[key_name_admin(user)] has entered a stasis pod. (JMP)") @@ -538,7 +525,6 @@ return if(occupant) to_chat(user, "\blue The cryo pod is already occupied!") - return @@ -548,13 +534,11 @@ if(L.stat == DEAD) to_chat(user, "Dead people can not be put into cryo.") - return for(var/mob/living/carbon/slime/M in range(1,L)) if(M.Victim == L) to_chat(usr, "[L.name] will not fit into the cryo pod because they have a slime latched onto their head.") - return @@ -578,7 +562,6 @@ if(src.occupant) to_chat(user, "\The [src] is in use.") - return L.loc = src @@ -587,7 +570,6 @@ L.client.eye = src else to_chat(user, "You stop [L == user ? "climbing into the cryo pod." : "putting [L] into the cryo pod."]") - return if(orient_right) @@ -596,9 +578,7 @@ icon_state = occupied_icon_state to_chat(L, "[on_enter_occupant_message]") - to_chat(L, "If you ghost, log out or close your client now, your character will shortly be permanently removed from the round.") - occupant = L time_entered = world.time @@ -609,7 +589,6 @@ if(Gh.client && Gh.client.holder) //just in case someone has a byond name with @ at the start, which I don't think is even possible but whatever to_chat(Gh, "Warning: Your body has entered cryostorage.") - // Book keeping! log_admin("[key_name_admin(L)] has entered a stasis pod. (JMP)") message_admins("[key_name_admin(L)] has entered a stasis pod.") @@ -629,7 +608,6 @@ if(usr != occupant) to_chat(usr, "The cryopod is in use and locked!") - return if(orient_right) @@ -661,13 +639,11 @@ if(src.occupant) to_chat(usr, "\The [src] is in use.") - return for(var/mob/living/carbon/slime/M in range(1,usr)) if(M.Victim == usr) to_chat(usr, "You're too busy getting your life sucked out of you.") - return visible_message("[usr] starts climbing into \the [src].") @@ -679,7 +655,6 @@ if(src.occupant) to_chat(usr, "\The [src] is in use.") - return usr.stop_pulling() @@ -694,9 +669,7 @@ icon_state = occupied_icon_state to_chat(usr, "[on_enter_occupant_message]") - to_chat(usr, "If you ghost, log out or close your client now, your character will shortly be permanently removed from the round.") - occupant = usr time_entered = world.time diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index a5d849814df..df7d3319c06 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -181,11 +181,9 @@ for reference: src.icon_state = "barrier[src.locked]" if ((src.locked == 1.0) && (src.emagged < 2.0)) to_chat(user, "Barrier lock toggled on.") - return else if ((src.locked == 0.0) && (src.emagged < 2.0)) to_chat(user, "Barrier lock toggled off.") - return else var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread @@ -223,7 +221,6 @@ for reference: emagged = 1 req_access = null to_chat(user, "You break the ID authentication lock on the [src].") - var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(2, 1, src) s.start() @@ -231,7 +228,6 @@ for reference: else if (src.emagged == 1) src.emagged = 2 to_chat(user, "You short out the anchoring mechanism on the [src].") - var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(2, 1, src) s.start() diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm index 6623e673269..d2172bd9294 100644 --- a/code/game/machinery/door_control.dm +++ b/code/game/machinery/door_control.dm @@ -37,7 +37,6 @@ else to_chat(user, "Error, no route to host.") - /obj/machinery/door_control/attackby(obj/item/weapon/W, mob/user as mob, params) /* For later implementation if (istype(W, /obj/item/weapon/screwdriver)) @@ -71,7 +70,6 @@ if(!allowed(user) && (wires & 1)) to_chat(user, "\red Access Denied") - flick("doorctrl-denied",src) return @@ -152,7 +150,6 @@ playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 30, target = src)) to_chat(user, "You detach \the [src] from the wall.") - new/obj/item/mounted/frame/driver_button(get_turf(src)) qdel(src) return 1 diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index ec9b80c26de..1df75829613 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -299,7 +299,6 @@ ..(user) else to_chat(user, "You do not know how to operate this airlock's mechanism.") - return /obj/machinery/door/airlock/alien/attackby(C as obj, mob/user as mob, params) @@ -307,7 +306,6 @@ ..(C, user) else to_chat(user, "You do not know how to operate this airlock's mechanism.") - return @@ -354,7 +352,6 @@ About the new airlock wires panel: return else if(user.hallucination > 50 && prob(10) && src.operating == 0) to_chat(user, "\red You feel a powerful shock course through your body!") - user.adjustStaminaLoss(50) user.AdjustStunned(5) return @@ -468,7 +465,6 @@ About the new airlock wires panel: if(feedback && message) to_chat(usr, message) - // shock user with probability prb (if all connections & power are working) // returns 1 if shocked, 0 otherwise // The preceding comment was borrowed from the grille's shock script @@ -572,54 +568,42 @@ About the new airlock wires panel: spawn(20) //TODO: Make this take a minute to_chat(user, "Airlock AI control has been blocked. Beginning fault-detection.") - sleep(50) if(src.canAIControl()) to_chat(user, "Alert cancelled. Airlock control has been restored without our assistance.") - src.aiHacking=0 return else if(!src.canAIHack(user)) to_chat(user, "We've lost our connection! Unable to hack airlock.") - src.aiHacking=0 return to_chat(user, "Fault confirmed: airlock control wire disabled or cut.") - sleep(20) to_chat(user, "Attempting to hack into airlock. This may take some time.") - sleep(200) if(src.canAIControl()) to_chat(user, "Alert cancelled. Airlock control has been restored without our assistance.") - src.aiHacking=0 return else if(!src.canAIHack(user)) to_chat(user, "We've lost our connection! Unable to hack airlock.") - src.aiHacking=0 return to_chat(user, "Upload access confirmed. Loading control program into airlock software.") - sleep(170) if(src.canAIControl()) to_chat(user, "Alert cancelled. Airlock control has been restored without our assistance.") - src.aiHacking=0 return else if(!src.canAIHack(user)) to_chat(user, "We've lost our connection! Unable to hack airlock.") - src.aiHacking=0 return to_chat(user, "Transfer complete. Forcing airlock to execute program.") - sleep(50) //disable blocked control src.aiControlDisabled = 2 to_chat(user, "Receiving control information from airlock.") - sleep(10) //bring up airlock dialog src.aiHacking = 0 @@ -669,7 +653,6 @@ About the new airlock wires panel: if(operating < 0) //emagged to_chat(user, "Unable to interface: Internal error.") - return STATUS_CLOSE if(!src.canAIControl()) if(src.canAIHack(user)) @@ -677,10 +660,8 @@ About the new airlock wires panel: else if (src.isAllPowerLoss()) //don't really like how this gets checked a second time, but not sure how else to do it. to_chat(user, "Unable to interface: Connection timed out.") - else to_chat(user, "Unable to interface: Connection refused.") - return STATUS_CLOSE return ..() @@ -694,15 +675,12 @@ About the new airlock wires panel: if("idscan") if(src.isWireCut(AIRLOCK_WIRE_IDSCAN)) to_chat(usr, "The IdScan wire has been cut - IdScan feature permanently disabled.") - else if(activate && src.aiDisabledIdScanner) src.aiDisabledIdScanner = 0 to_chat(usr, "IdScan feature has been enabled.") - else if(!activate && !src.aiDisabledIdScanner) src.aiDisabledIdScanner = 1 to_chat(usr, "IdScan feature has been disabled.") - if("main_power") if(!main_power_lost_until) src.loseMainPower() @@ -712,48 +690,37 @@ About the new airlock wires panel: if("bolts") if(src.isWireCut(AIRLOCK_WIRE_DOOR_BOLTS)) to_chat(usr, "The door bolt control wire has been cut - Door bolts permanently dropped.") - else if(activate && src.lock()) to_chat(usr, "The door bolts have been dropped.") - else if(!activate && src.unlock()) to_chat(usr, "The door bolts have been raised.") - if("electrify_temporary") if(activate && src.isWireCut(AIRLOCK_WIRE_ELECTRIFY)) to_chat(usr, text("The electrification wire is cut - Door permanently electrified.")) - else if(!activate && electrified_until != 0) to_chat(usr, "The door is now un-electrified.") - electrify(0) else if(activate) //electrify door for 30 seconds shockedby += text("\[[time_stamp()]\][usr](ckey:[usr.ckey])") usr.attack_log += text("\[[time_stamp()]\] Electrified the [name] at [x] [y] [z]") to_chat(usr, "The door is now electrified for thirty seconds.") - electrify(30) if("electrify_permanently") if(src.isWireCut(AIRLOCK_WIRE_ELECTRIFY)) to_chat(usr, text("The electrification wire is cut - Cannot electrify the door.")) - else if(!activate && electrified_until != 0) to_chat(usr, "The door is now un-electrified.") - electrify(0) else if(activate) shockedby += text("\[[time_stamp()]\][usr](ckey:[usr.ckey])") usr.attack_log += text("\[[time_stamp()]\] Electrified the [name] at [x] [y] [z]") to_chat(usr, "The door is now electrified.") - electrify(-1) if("open") if(src.welded) to_chat(usr, text("The airlock has been welded shut!")) - else if(src.locked) to_chat(usr, text("The door bolts are down!")) - else if(activate && density) open() else if(!activate && !density) @@ -762,7 +729,6 @@ About the new airlock wires panel: // Safeties! We don't need no stinking safeties! if (src.isWireCut(AIRLOCK_WIRE_SAFETY)) to_chat(usr, text("The safety wire is cut - Cannot secure the door.")) - else if (activate && src.safe) safe = 0 else if (!activate && !src.safe) @@ -771,7 +737,6 @@ About the new airlock wires panel: // Door speed control if(src.isWireCut(AIRLOCK_WIRE_SPEED)) to_chat(usr, text("The timing wire is cut - Cannot alter timing.")) - else if (activate && src.normalspeed) normalspeed = 0 else if (!activate && !src.normalspeed) @@ -780,32 +745,26 @@ About the new airlock wires panel: // Bolt lights if(src.isWireCut(AIRLOCK_WIRE_LIGHT)) to_chat(usr, "The bolt lights wire has been cut - The door bolt lights are permanently disabled.") - else if (!activate && src.lights) lights = 0 to_chat(usr, "The door bolt lights have been disabled.") - else if (activate && !src.lights) lights = 1 to_chat(usr, "The door bolt lights have been enabled.") - if("emergency") // Emergency access if (src.emergency) emergency = 0 to_chat(usr, "Emergency access has been disabled.") - else emergency = 1 to_chat(usr, "Emergency access has been enabled.") - update_icon() return 1 /obj/machinery/door/airlock/attackby(C as obj, mob/user as mob, params) // to_chat(world, text("airlock attackby src [] obj [] mob []", src, C, user)) - if(!istype(usr, /mob/living/silicon)) if(src.isElectrified()) if(src.shock(user, 75)) @@ -851,7 +810,6 @@ About the new airlock wires panel: if(do_after(user,40, target = src)) to_chat(user, "\blue You removed the airlock electronics!") - var/obj/structure/door_assembly/da = new assembly_type(src.loc) da.anchored = 1 if(mineral) @@ -885,10 +843,8 @@ About the new airlock wires panel: return else if(arePowerSystemsOn()) to_chat(user, "\blue The airlock's motors resist your efforts to force it.") - else if(locked) to_chat(user, "\blue The airlock's bolts prevent it from being forced.") - else if( !welded && !operating ) if(density) if(beingcrowbarred == 0) //being fireaxe'd @@ -897,7 +853,6 @@ About the new airlock wires panel: spawn(0) open(1) else to_chat(user, "\red You need to be wielding \the [C] to do that.") - else spawn(0) open(1) else @@ -907,7 +862,6 @@ About the new airlock wires panel: spawn(0) close(1) else to_chat(user, "\red You need to be wielding \the [C] to do that.") - else spawn(0) close(1) else @@ -1035,7 +989,6 @@ About the new airlock wires panel: /obj/machinery/door/airlock/hatch/gamma/attackby(C as obj, mob/user as mob, params) // to_chat(world, text("airlock attackby src [] obj [] mob []", src, C, user)) - if(!istype(usr, /mob/living/silicon)) if(src.isElectrified()) if(src.shock(user, 75)) @@ -1045,12 +998,10 @@ About the new airlock wires panel: if(istype(C, /obj/item/weapon/c4)) to_chat(user, "The hatch is coated with a product that prevents the shaped charge from sticking!") - return if(istype(C, /obj/item/mecha_parts/mecha_equipment/tool/rcd) || istype(C, /obj/item/weapon/rcd)) to_chat(user, "The hatch is made of an advanced compound that cannot be deconstructed using an RCD.") - return src.add_fingerprint(user) @@ -1071,7 +1022,6 @@ About the new airlock wires panel: /obj/machinery/door/airlock/highsecurity/red/attackby(C as obj, mob/user as mob, params) // to_chat(world, text("airlock attackby src [] obj [] mob []", src, C, user)) - if(!istype(usr, /mob/living/silicon)) if(src.isElectrified()) if(src.shock(user, 75)) diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm index 23616877584..5f55eb26fc2 100644 --- a/code/game/machinery/doors/airlock_control.dm +++ b/code/game/machinery/doors/airlock_control.dm @@ -262,7 +262,6 @@ obj/machinery/access_button/attack_hand(mob/user) if(!allowed(user)) to_chat(user, "\red Access Denied") - else if(radio_connection) var/datum/signal/signal = new signal.transmission_method = 1 //radio signal diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 856bba62002..09f4885dc07 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -80,7 +80,6 @@ if(blocked) to_chat(user, "\red \The [src] is welded solid!") - return var/area/A = get_area_master(src) @@ -144,12 +143,10 @@ if(user.stat || user.stunned || user.weakened || user.paralysis || get_dist(src, user) > 1) to_chat(user, "Sorry, you must remain able bodied and close to \the [src] in order to use it.") - return if(alarmed && density && !access_granted) to_chat(user, "Access denied. Please wait for authorities to arrive, or for the alert to clear.") - return else @@ -182,7 +179,6 @@ if(blocked) to_chat(user, "\red \The [src] is welded solid!") - return var/area/A = get_area_master(src) diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index b3520b18d61..39ed81b3360 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -261,12 +261,10 @@ if(istype(I, /obj/item/weapon/screwdriver)) if(src.density || src.operating) to_chat(user, "You need to open the door to access the maintenance panel.") - return playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) src.p_open = !( src.p_open ) to_chat(user, "You [p_open ? "open":"close"] the maintenance panel of the [src.name].") - return if(istype(I, /obj/item/weapon/crowbar)) @@ -297,13 +295,11 @@ if(emagged) to_chat(user, "You discard the damaged electronics.") - qdel(src) return to_chat(user, "You removed the airlock electronics!") - var/obj/item/weapon/airlock_electronics/ae if(!electronics) ae = new/obj/item/weapon/airlock_electronics( src.loc ) diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index 4fe4d4a70da..cbb9aabd20f 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -25,12 +25,10 @@ var/list/doppler_arrays = list() anchored = 1 power_change() to_chat(user, "You fasten [src].") - else if(anchored) anchored = 0 power_change() to_chat(user, "You unfasten [src].") - playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) /obj/machinery/doppler_array/verb/rotate() diff --git a/code/game/machinery/drying_rack.dm b/code/game/machinery/drying_rack.dm index 4ea0b2fc242..9ec3974483f 100644 --- a/code/game/machinery/drying_rack.dm +++ b/code/game/machinery/drying_rack.dm @@ -38,7 +38,6 @@ user.unEquip(W) del(W) to_chat(user, "You add the meat to the drying rack.") - src.running = 1 use_power = 2 icon_state = "drying_rack_on" @@ -52,7 +51,6 @@ user.unEquip(W) del(W) to_chat(user, "You add the grapes to the drying rack.") - src.running = 1 use_power = 2 icon_state = "drying_rack_on" @@ -66,7 +64,6 @@ user.unEquip(W) del(W) to_chat(user, "You add the green grapes to the drying rack.") - src.running = 1 use_power = 2 icon_state = "drying_rack_on" @@ -82,7 +79,6 @@ var/obj/item/weapon/reagent_containers/food/snacks/grown/B = W B.reagents.trans_to(src, B.reagents.total_volume) to_chat(user, "You add the [W] to the drying rack.") - user.unEquip(W) del(W) src.running = 1 @@ -92,7 +88,6 @@ icon_state = "drying_rack" var/obj/item/weapon/reagent_containers/food/snacks/grown/D = new J(src.loc) to_chat(user, "\blue You finish drying the [D]") - D.icon_state = "[D.icon_state]_dry" D.dry = 1 D.reagents.remove_any(50) @@ -102,12 +97,9 @@ return else to_chat(user, "\red That has already been dried!") - else to_chat(user, "\red Please wait until the last item has dried.") - else to_chat(user, "\red You cannot add that to the drying rack.") - diff --git a/code/game/machinery/embedded_controller/airlock_docking_controller.dm b/code/game/machinery/embedded_controller/airlock_docking_controller.dm index 1ec59676410..0ffb9c3d7dc 100644 --- a/code/game/machinery/embedded_controller/airlock_docking_controller.dm +++ b/code/game/machinery/embedded_controller/airlock_docking_controller.dm @@ -141,22 +141,15 @@ /datum/computer/file/embedded_program/docking/proc/print_state() to_chat(world, "id_tag: [id_tag]") - to_chat(world, "dock_state: [dock_state]") - to_chat(world, "control_mode: [control_mode]") - to_chat(world, "tag_target: [tag_target]") - to_chat(world, "response_sent: [response_sent]") - /datum/computer/file/embedded_program/docking/post_signal(datum/signal/signal, comm_line) to_chat(world, "Program [id_tag] sent a message!") - print_state() to_chat(world, "[id_tag] sent command \"[signal.data["command"]]\" to \"[signal.data["recipient"]]\"") - ..(signal) /obj/machinery/embedded_controller/radio/airlock/docking_port/verb/view_state() diff --git a/code/game/machinery/embedded_controller/airlock_docking_controller_multi.dm b/code/game/machinery/embedded_controller/airlock_docking_controller_multi.dm index 5fd89767ca4..f7ca5b1339a 100644 --- a/code/game/machinery/embedded_controller/airlock_docking_controller_multi.dm +++ b/code/game/machinery/embedded_controller/airlock_docking_controller_multi.dm @@ -114,22 +114,15 @@ /datum/computer/file/embedded_program/docking/multi/proc/print_state() to_chat(world, "id_tag: [id_tag]") - to_chat(world, "dock_state: [dock_state]") - to_chat(world, "control_mode: [control_mode]") - to_chat(world, "tag_target: [tag_target]") - to_chat(world, "response_sent: [response_sent]") - /datum/computer/file/embedded_program/docking/multi/post_signal(datum/signal/signal, comm_line) to_chat(world, "Program [id_tag] sent a message!") - print_state() to_chat(world, "[id_tag] sent command \"[signal.data["command"]]\" to \"[signal.data["recipient"]]\"") - ..(signal) /obj/machinery/embedded_controller/radio/docking_port_multi/verb/view_state() diff --git a/code/game/machinery/embedded_controller/docking_program.dm b/code/game/machinery/embedded_controller/docking_program.dm index 12c05170c13..aa938c663bc 100644 --- a/code/game/machinery/embedded_controller/docking_program.dm +++ b/code/game/machinery/embedded_controller/docking_program.dm @@ -240,7 +240,6 @@ /datum/computer/file/embedded_program/docking/proc/force_undock() // to_chat(world, "[id_tag]: forcing undock") - if (tag_target) send_docking_command(tag_target, "dock_error") reset() diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index 553422a33cd..3426023f13c 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -90,7 +90,6 @@ FIRE ALARM else if(istype(W, /obj/item/weapon/wirecutters)) // cutting the wires out to_chat(user, "You cut the wires!") - playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) var/obj/item/stack/cable_coil/new_coil = new /obj/item/stack/cable_coil() new_coil.amount = 5 @@ -102,17 +101,14 @@ FIRE ALARM var/obj/item/stack/cable_coil/coil = W if(!coil.use(5)) to_chat(user, "You cut the wires!") - return buildstage = 2 to_chat(user, "You wire \the [src]!") - update_icon() else if(istype(W, /obj/item/weapon/crowbar)) to_chat(user, "You pry out the circuit!") - playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1) spawn(20) var/obj/item/weapon/firealarm_electronics/circuit = new /obj/item/weapon/firealarm_electronics() @@ -122,14 +118,12 @@ FIRE ALARM if(0) if(istype(W, /obj/item/weapon/firealarm_electronics)) to_chat(user, "You insert the circuit!") - qdel(W) buildstage = 1 update_icon() else if(istype(W, /obj/item/weapon/wrench)) to_chat(user, "You remove the fire alarm assembly from the wall!") - new /obj/item/mounted/frame/firealarm(get_turf(user)) playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1) qdel(src) diff --git a/code/game/machinery/floodlight.dm b/code/game/machinery/floodlight.dm index b13dfc3bb07..7c5e152529f 100644 --- a/code/game/machinery/floodlight.dm +++ b/code/game/machinery/floodlight.dm @@ -48,14 +48,12 @@ src.cell = null to_chat(user, "You remove the power cell") - updateicon() return if(on) on = 0 to_chat(user, "\blue You turn off the light") - set_light(0) else if(!cell) @@ -64,7 +62,6 @@ return on = 1 to_chat(user, "\blue You turn on the light") - set_light(brightness_on) updateicon() @@ -91,34 +88,28 @@ if(unlocked) unlocked = 0 to_chat(user, "You screw the battery panel in place.") - else unlocked = 1 to_chat(user, "You unscrew the battery panel.") - if (istype(W, /obj/item/weapon/crowbar)) if(unlocked) if(open) open = 0 overlays = null to_chat(user, "You crowbar the battery panel in place.") - else if(unlocked) open = 1 to_chat(user, "You remove the battery panel.") - if (istype(W, /obj/item/weapon/stock_parts/cell)) if(open) if(cell) to_chat(user, "There is a power cell already installed.") - else user.drop_item() W.loc = src cell = W to_chat(user, "You insert the power cell.") - updateicon() diff --git a/code/game/machinery/guestpass.dm b/code/game/machinery/guestpass.dm index 02797bc44b5..b63307c3db8 100644 --- a/code/game/machinery/guestpass.dm +++ b/code/game/machinery/guestpass.dm @@ -20,18 +20,13 @@ ..(user) if (world.time < expiration_time) to_chat(user, "This pass expires at [worldtime2text(expiration_time)].") - else to_chat(user, "It expired at [worldtime2text(expiration_time)].") - to_chat(user, "It grants access to following areas:") - for (var/A in temp_access) to_chat(user, "[get_access_desc(A)].") - to_chat(user, "Issuing reason: [reason].") - ///////////////////////////////////////////// //Guest pass terminal//////////////////////// ///////////////////////////////////////////// @@ -63,7 +58,6 @@ else to_chat(user, "There is already ID card inside.") - /obj/machinery/computer/guestpass/attack_ai(var/mob/user as mob) return attack_hand(user) @@ -125,7 +119,6 @@ duration = dur else to_chat(usr, "Invalid duration.") - if ("access") var/A = text2num(href_list["access"]) if (A in accesses) @@ -158,7 +151,6 @@ for (var/entry in internal_log) dat += "[entry]

      " // to_chat(usr, "Printing the log, standby...") - //sleep(50) var/obj/item/weapon/paper/P = new/obj/item/weapon/paper( loc ) playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1) @@ -185,6 +177,5 @@ pass.name = "guest pass #[number]" else to_chat(usr, "\red Cannot issue pass without issuing ID.") - updateUsrDialog() return \ No newline at end of file diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 384168c119f..c8e16257858 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -73,16 +73,13 @@ var/const/HOLOPAD_MODE = 0 if(last_request + 200 < world.time) //don't spam the AI with requests you jerk! last_request = world.time to_chat(user, "You request an AI's presence.") - var/area/area = get_area(src) for(var/mob/living/silicon/ai/AI in living_mob_list) if(!AI.client) continue to_chat(AI, "Your presence is requested at \the [area].") - else to_chat(user, "A request for AI presence was already sent recently.") - /obj/machinery/hologram/holopad/attack_ai(mob/living/silicon/ai/user) if (!istype(user)) return @@ -104,10 +101,8 @@ var/const/HOLOPAD_MODE = 0 src.visible_message("A holographic image of [user] flicks to life right before your eyes!") else to_chat(user, "\red ERROR: \black Image feed in progress.") - else to_chat(user, "\red ERROR: \black Unable to project hologram.") - return /*This is the proc for special two-way communication between AI and holopad/people talking near holopad. @@ -258,7 +253,6 @@ Holographic project of everything else. hologram.icon = flat_icon to_chat(world, "Your icon should appear now.") - return */ diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index 45f9e2e84b7..5caff96d4ea 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -61,19 +61,16 @@ if (istype(W, /obj/item/weapon/reagent_containers)) if(!isnull(src.beaker)) to_chat(user, "There is already a reagent container loaded!") - return if(user.drop_item()) W.forceMove(src) src.beaker = W to_chat(user, "You attach \the [W] to \the [src].") - src.update_icon() return else to_chat(user, "\The [W] is stuck to you!") - else return ..() @@ -150,7 +147,6 @@ if(!istype(usr, /mob/living)) to_chat(usr, "\red You can't do that.") - return if(usr.stat) @@ -159,24 +155,18 @@ mode = !mode to_chat(usr, "The IV drip is now [mode ? "injecting" : "taking blood"].") - /obj/machinery/iv_drip/examine(mob/user) ..(user) if (!(user in view(2)) && usr != src.loc) return to_chat(usr, "The IV drip is [mode ? "injecting" : "taking blood"].") - if(beaker) if(beaker.reagents && beaker.reagents.reagent_list.len) to_chat(user, "\blue Attached is \a [beaker] with [beaker.reagents.total_volume] units of liquid.") - else to_chat(user, "\blue Attached is an empty [beaker].") - else to_chat(user, "\blue No chemicals are attached.") - to_chat(user, "\blue [attached ? attached : "No one"] is attached.") - diff --git a/code/game/machinery/kitchen/gibber.dm b/code/game/machinery/kitchen/gibber.dm index 2de6678f35d..4c271a08f44 100644 --- a/code/game/machinery/kitchen/gibber.dm +++ b/code/game/machinery/kitchen/gibber.dm @@ -64,12 +64,10 @@ if(operating) to_chat(user, "The gibber is locked and running, wait for it to finish.") - return if(locked) to_chat(user, "Wait for [occupant.name] to finish being loaded!") - return else @@ -80,7 +78,6 @@ var/obj/item/weapon/grab/G = P if(G.state < 2) to_chat(user, "You need a better grip to do that!") - return move_into_gibber(user,G.affecting) qdel(G) @@ -114,22 +111,18 @@ /obj/machinery/gibber/proc/move_into_gibber(var/mob/user,var/mob/living/victim) if(occupant) to_chat(user, "The gibber is full, empty it first!") - return if(operating) to_chat(user, "The gibber is locked and running, wait for it to finish.") - return if(!ishuman(victim) || issmall(victim)) to_chat(user, "This is not suitable for the gibber!") - return if(victim.abiotic(1)) to_chat(user, "Subject may not have abiotic items on.") - return user.visible_message("[user] starts to put [victim] into the gibber!") diff --git a/code/game/machinery/kitchen/icecream_vat.dm b/code/game/machinery/kitchen/icecream_vat.dm index 8619b0689be..a5e1cc1eafb 100644 --- a/code/game/machinery/kitchen/icecream_vat.dm +++ b/code/game/machinery/kitchen/icecream_vat.dm @@ -108,25 +108,19 @@ var/list/ingredients_source = list( I.reagents.add_reagent("sugar", 10 - I.reagents.total_volume) else to_chat(user, "There is not enough [flavour_name] flavouring left! Insert more of the required ingredients.") - else to_chat(user, "There is not enough icecream left! Insert more milk and ice.") - else to_chat(user, "[O] already has icecream in it.") - else if(istype(O, /obj/item/weapon/reagent_containers/glass)) if(held_container) to_chat(user, "You must remove [held_container] from [src] first.") - else if(!user.drop_item()) to_chat(user, "\The [O] is stuck to your hand!") - return O.forceMove(src) to_chat(user, "You insert [O] into [src].") - held_container = O else var/obj/item/weapon/reagent_containers/R = O @@ -158,7 +152,6 @@ var/list/ingredients_source = list( src.visible_message("[user] cooks up some waffle cones.") else to_chat(user, "You require sugar and flour to make waffle cones.") - if(CONE_CHOC) if(ingredients[FLAVOUR_CHOCOLATE] > 0 && ingredients[CONE_WAFFLE] > 0) var/amount = min(ingredients[CONE_WAFFLE], ingredients[FLAVOUR_CHOCOLATE]) @@ -168,7 +161,6 @@ var/list/ingredients_source = list( src.visible_message("[user] cooks up some chocolate cones.") else to_chat(user, "You require waffle cones and chocolate flavouring to make chocolate cones.") - if(ICECREAM_VANILLA) if(ingredients[INGR_ICE] > 0 && ingredients[INGR_MILK] > 0) var/amount = min(ingredients[INGR_ICE], ingredients[INGR_MILK]) @@ -178,7 +170,6 @@ var/list/ingredients_source = list( src.visible_message("[user] whips up some vanilla icecream.") else to_chat(user, "You require milk and ice to make vanilla icecream.") - updateDialog() /obj/machinery/icecream_vat/Topic(href, href_list) @@ -201,7 +192,6 @@ var/list/ingredients_source = list( src.visible_message("[usr] dispenses a crunchy [cone_name] cone from [src].") else to_chat(usr, "There are no [cone_name] cones left!") - updateDialog() if(href_list["make"]) diff --git a/code/game/machinery/kitchen/juicer.dm b/code/game/machinery/kitchen/juicer.dm index def4500bb3c..7b25e683941 100644 --- a/code/game/machinery/kitchen/juicer.dm +++ b/code/game/machinery/kitchen/juicer.dm @@ -43,7 +43,6 @@ else if(!user.unEquip(O)) to_chat(user, "\the [O] is stuck to your hand, you cannot put it in \the [src]") - return 0 O.forceMove(src) beaker = O @@ -53,11 +52,9 @@ return 0 if (!is_type_in_list(O, allowed_items)) to_chat(user, "It doesn't look like that contains any juice.") - return 1 if(!user.unEquip(O)) to_chat(user, "\the [O] is stuck to your hand, you cannot put it in \the [src]") - return 0 O.forceMove(src) src.updateUsrDialog() diff --git a/code/game/machinery/kitchen/kitchen_machine.dm b/code/game/machinery/kitchen/kitchen_machine.dm index 8161d18e017..5c584d0468b 100644 --- a/code/game/machinery/kitchen/kitchen_machine.dm +++ b/code/game/machinery/kitchen/kitchen_machine.dm @@ -69,12 +69,10 @@ if(anchored) anchored = 0 to_chat(user, "\The [src] can now be moved.") - return else if(!anchored) anchored = 1 to_chat(user, "\The [src] is now secured.") - return default_deconstruction_crowbar(O) @@ -107,7 +105,6 @@ src.flags = OPENCONTAINER else to_chat(user, "It's broken!") - return 1 else if(src.dirty==100) // The machine is all dirty so can't be used! if(istype(O, /obj/item/weapon/reagent_containers/spray/cleaner) || istype(O, /obj/item/weapon/soap)) // If they're trying to clean it then let them @@ -126,12 +123,10 @@ src.flags = OPENCONTAINER else //Otherwise bad luck!! to_chat(user, "It's dirty!") - return 1 else if(is_type_in_list(O,acceptable_items)) if (contents.len>=max_n_of_items) to_chat(user, "This [src] is full of ingredients, you cannot put more.") - return 1 if (istype(O,/obj/item/stack) && O:amount>1) new O.type (src) @@ -142,7 +137,6 @@ else if(!user.drop_item()) to_chat(user, "\The [O] is stuck to your hand, you cannot put it in \the [src]") - return 0 O.forceMove(src) @@ -158,17 +152,14 @@ for (var/datum/reagent/R in O.reagents.reagent_list) if (!(R.id in acceptable_reagents)) to_chat(user, "Your [O] contains components unsuitable for cookery.") - return 1 //G.reagents.trans_to(src,G.amount_per_transfer_from_this) else if(istype(O,/obj/item/weapon/grab)) var/obj/item/weapon/grab/G = O to_chat(user, "This is ridiculous. You can not fit \the [G.affecting] in this [src].") - return 1 else to_chat(user, "You have no idea what you can cook with this [O].") - return 1 src.updateUsrDialog() @@ -353,7 +344,6 @@ src.dirty++ src.reagents.clear_reagents() to_chat(usr, "You dispose of \the [src]'s contents.") - src.updateUsrDialog() /obj/machinery/kitchen_machine/proc/muck_start() diff --git a/code/game/machinery/kitchen/monkeyrecycler.dm b/code/game/machinery/kitchen/monkeyrecycler.dm index 4d2cbca7974..d41558c161e 100644 --- a/code/game/machinery/kitchen/monkeyrecycler.dm +++ b/code/game/machinery/kitchen/monkeyrecycler.dm @@ -54,12 +54,10 @@ if(issmall(target)) if(target.stat == 0) to_chat(user, "The monkey is struggling far too much to put it in the recycler.") - else user.drop_item() qdel(target) to_chat(user, "You stuff the monkey in the machine.") - playsound(src.loc, 'sound/machines/juicer.ogg', 50, 1) var/offset = prob(50) ? -2 : 2 animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking @@ -68,13 +66,10 @@ sleep(50) pixel_x = initial(pixel_x) to_chat(user, "The machine now has [grinded] monkey\s worth of material stored.") - else to_chat(user, "The machine only accepts monkeys!") - else to_chat(user, "The machine only accepts monkeys!") - return /obj/machinery/monkey_recycler/attack_hand(var/mob/user as mob) @@ -82,14 +77,11 @@ return if(grinded >= required_grind) to_chat(user, "The machine hisses loudly as it condenses the grinded monkey meat. After a moment, it dispenses a brand new monkey cube.") - playsound(src.loc, 'sound/machines/hiss.ogg', 50, 1) grinded -= required_grind for(var/i = 0, i < cube_production, i++) // Forgot to fix this bit the first time through new /obj/item/weapon/reagent_containers/food/snacks/monkeycube(src.loc) to_chat(user, "The machine's display flashes that it has [grinded] monkey\s worth of material left.") - else // I'm not sure if the \s macro works with a word in between; I'll play it safe to_chat(user, "The machine needs at least [required_grind] monkey\s worth of material to compress [cube_production] monkey\s. It only has [grinded].") - return \ No newline at end of file diff --git a/code/game/machinery/kitchen/processor.dm b/code/game/machinery/kitchen/processor.dm index a3adc7cbae0..0b739e2b269 100644 --- a/code/game/machinery/kitchen/processor.dm +++ b/code/game/machinery/kitchen/processor.dm @@ -136,7 +136,6 @@ if(src.processing) to_chat(user, "\the [src] is already processing something!") - return 1 if(default_deconstruction_screwdriver(user, "processor1", "processor", O)) @@ -160,7 +159,6 @@ if (!P) to_chat(user, "That probably won't blend.") - return 1 user.visible_message("\the [user] puts \the [what] into \the [src].", \ @@ -177,12 +175,10 @@ if(src.processing) to_chat(user, "\the [src] is already processing something!") - return 1 if(src.contents.len == 0) to_chat(user, "\the [src] is empty.") - return 1 src.processing = 1 user.visible_message("[user] turns on [src].", \ diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm index 0cc3e5ce688..7978aee0c0a 100644 --- a/code/game/machinery/kitchen/smartfridge.dm +++ b/code/game/machinery/kitchen/smartfridge.dm @@ -195,7 +195,6 @@ playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) panel_open = !panel_open to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.") - overlays.Cut() if(panel_open) overlays += image(icon, "[initial(icon_state)]-panel") @@ -217,18 +216,15 @@ if(stat & NOPOWER) to_chat(user, "\The [src] is unpowered and useless.") - return if(accept_check(O)) if(contents.len >= max_n_of_items) to_chat(user, "\The [src] is full.") - return 1 else if(!user.drop_item()) to_chat(user, "\The [O] is stuck to you!") - return O.forceMove(src) @@ -247,7 +243,6 @@ if(accept_check(G)) if(contents.len >= max_n_of_items) to_chat(user, "\The [src] is full.") - return 1 else P.remove_from_storage(G,src) @@ -262,12 +257,10 @@ if(P.contents.len > 0) to_chat(user, "Some items are refused.") - nanomanager.update_uis(src) else to_chat(user, "\The [src] smartly refuses [O].") - return 1 /obj/machinery/smartfridge/attack_ai(mob/user as mob) @@ -289,7 +282,6 @@ if(stat & NOPOWER) to_chat(user, "\The [src] is unpowered and useless.") - return var/obj/item/weapon/storage/box/pillbottles/P = over_object @@ -298,7 +290,6 @@ if(accept_check(G)) if(contents.len >= max_n_of_items) to_chat(user, "\The [src] is full.") - return 1 else P.remove_from_storage(G,src) @@ -313,7 +304,6 @@ "You empty \the [P] into \the [src].") if(P.contents.len > 0) to_chat(user, "Some items are refused.") - nanomanager.update_uis(src) /obj/machinery/smartfridge/secure/emag_act(user as mob) @@ -321,7 +311,6 @@ locked = -1 to_chat(user, "You short out the product lock on [src].") - /******************* * SmartFridge Menu ********************/ @@ -420,7 +409,6 @@ if(usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) if(!allowed(usr) && !emagged && locked != -1 && href_list["vend"]) to_chat(usr, "Access denied.") - nanomanager.update_uis(src) return 0 return ..() \ No newline at end of file diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index 55c78bb1a17..f83a92ff3e7 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -42,7 +42,6 @@ to_chat(user, "A light switch. It is [on? "on" : "off"].") - /obj/machinery/light_switch/attack_hand(mob/user) on = !on diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index e2735942c79..11fa7f71393 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -223,7 +223,6 @@ Class Procs: return 1 if(!(href_list["set_tag"] in vars)) to_chat(usr, "Something went wrong: Unable to find [href_list["set_tag"]] in vars!") - return 1 var/current_tag = src.vars[href_list["set_tag"]] var/newid = copytext(reject_bad_text(input(usr, "Specify the new value", src, current_tag) as null|text),1,MAX_MESSAGE_LEN) @@ -241,15 +240,12 @@ Class Procs: return 1 if(!canLink(O)) to_chat(usr, "\red You can't link with that device.") - return 1 if(unlinkFrom(usr, O)) to_chat(usr, "\blue A green light flashes on \the [P], confirming the link was removed.") - else to_chat(usr, "\red A red light flashes on \the [P]. It appears something went wrong when unlinking the two devices.") - update_mt_menu=1 if("link" in href_list) @@ -258,30 +254,24 @@ Class Procs: return 1 if(!canLink(O,href_list)) to_chat(usr, "\red You can't link with that device.") - return 1 if (isLinkedWith(O)) to_chat(usr, "\red A red light flashes on \the [P]. The two devices are already linked.") - return 1 if(linkWith(usr, O, href_list)) to_chat(usr, "\blue A green light flashes on \the [P], confirming the link was added.") - else to_chat(usr, "\red A red light flashes on \the [P]. It appears something went wrong when linking the two devices.") - update_mt_menu=1 if("buffer" in href_list) P.buffer = src to_chat(usr, "\blue A green light flashes, and the device appears in the multitool buffer.") - update_mt_menu=1 if("flush" in href_list) to_chat(usr, "\blue A green light flashes, and the device disappears from the multitool buffer.") - P.buffer = null update_mt_menu=1 @@ -349,7 +339,6 @@ Class Procs: if(!user.IsAdvancedToolUser()) to_chat(user, "You don't have the dexterity to do this!") - return 1 if (ishuman(user)) @@ -359,7 +348,6 @@ Class Procs: return 1 else if(prob(H.getBrainLoss())) to_chat(user, "You momentarily forget how to use [src].") - return 1 if(panel_open) @@ -404,12 +392,10 @@ Class Procs: panel_open = 1 icon_state = icon_state_open to_chat(user, "You open the maintenance hatch of [src].") - else panel_open = 0 icon_state = icon_state_closed to_chat(user, "You close the maintenance hatch of [src].") - return 1 return 0 @@ -418,18 +404,15 @@ Class Procs: playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) dir = turn(dir,-90) to_chat(user, "You rotate [src].") - return 1 return 0 /obj/machinery/proc/default_unfasten_wrench(mob/user, obj/item/weapon/wrench/W, time = 20) if(istype(W)) to_chat(user, "Now [anchored ? "un" : ""]securing [name].") - playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, time, target = src)) to_chat(user, "You've [anchored ? "un" : ""]secured [name].") - anchored = !anchored playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) return 1 @@ -468,7 +451,6 @@ Class Procs: component_parts += B B.loc = null to_chat(user, "[A.name] replaced with [B.name].") - shouldplaysound = 1 break RefreshParts() @@ -482,11 +464,9 @@ Class Procs: /obj/machinery/proc/display_parts(mob/user) to_chat(user, "Following parts detected in the machine:") - for(var/obj/item/C in component_parts) to_chat(user, "\icon[C] [C.name]") - /obj/machinery/examine(mob/user) ..(user) if(user.research_scanner && component_parts) diff --git a/code/game/machinery/mass_driver.dm b/code/game/machinery/mass_driver.dm index c87ecc345b5..0bd5fff9fba 100644 --- a/code/game/machinery/mass_driver.dm +++ b/code/game/machinery/mass_driver.dm @@ -22,7 +22,6 @@ if(istype(W, /obj/item/weapon/screwdriver)) to_chat(user, "You begin to unscrew the bolts off the [src]...") - playsound(get_turf(src), 'sound/items/Screwdriver.ogg', 50, 1) if(do_after(user, 30, target = src)) var/obj/machinery/mass_driver_frame/F = new(get_turf(src)) @@ -71,7 +70,6 @@ if(!emagged) emagged = 1 to_chat(user, "You hack the Mass Driver, radically increasing the force at which it'll throw things. Better not stand in its way.") - return 1 return -1 @@ -107,24 +105,19 @@ var/obj/item/weapon/weldingtool/WT = W if(!WT.remove_fuel(0, user)) to_chat(user, "The welding tool must be on to complete this task.") - return 1 playsound(get_turf(src), 'sound/items/Welder.ogg', 50, 1) to_chat(user, "You begin to cut the frame apart...") - if(do_after(user, 30, target = src) && (build == 0)) to_chat(user, "You detach the plasteel sheets from each others.") - new /obj/item/stack/sheet/plasteel(get_turf(src),3) qdel(src) return 1 if(istype(W, /obj/item/weapon/wrench)) to_chat(user, "You begin to anchor \the [src] on the floor.") - playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 10, target = src) && (build == 0)) to_chat(user, "You anchor \the [src]!") - anchored = 1 build++ update_icon() @@ -132,27 +125,22 @@ if(1) // Fixed to the floor if(istype(W, /obj/item/weapon/wrench)) to_chat(user, "You begin to de-anchor \the [src] from the floor.") - playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 10, target = src) && (build == 1)) build-- update_icon() anchored = 0 to_chat(user, "You de-anchored \the [src]!") - return 1 if(istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W if(!WT.remove_fuel(0, user)) to_chat(user, "The welding tool must be on to complete this task.") - return 1 playsound(get_turf(src), 'sound/items/Welder.ogg', 50, 1) to_chat(user, "You begin to weld \the [src] to the floor...") - if(do_after(user, 40, target = src) && (build == 1)) to_chat(user, "You welded \the [src] to the floor.") - build++ update_icon() return 1 @@ -161,55 +149,45 @@ var/obj/item/weapon/weldingtool/WT = W if(!WT.remove_fuel(0, user)) to_chat(user, "The welding tool must be on to complete this task.") - return 1 playsound(get_turf(src), 'sound/items/Welder.ogg', 50, 1) to_chat(user, "You begin to unweld \the [src] to the floor...") - if(do_after(user, 40, target = src) && (build == 2)) to_chat(user, "You unwelded \the [src] to the floor.") - build-- update_icon() if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/C=W to_chat(user, "You start adding cables to \the [src]...") - playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) if(do_after(user, 20, target = src) && (C.amount >= 3) && (build == 2)) C.use(3) to_chat(user, "You've added cables to \the [src].") - build++ update_icon() if(3) // Wired if(istype(W, /obj/item/weapon/wirecutters)) to_chat(user, "You begin to remove the wiring from \the [src].") - if(do_after(user, 10, target = src) && (build == 3)) new /obj/item/stack/cable_coil(loc,3) playsound(get_turf(src), 'sound/items/Wirecutter.ogg', 50, 1) to_chat(user, "You've removed the cables from \the [src].") - build-- update_icon() return 1 if(istype(W, /obj/item/stack/rods)) var/obj/item/stack/rods/R=W to_chat(user, "You begin to complete \the [src]...") - playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) if(do_after(user, 20, target = src) && (R.amount >= 3) && (build == 3)) R.use(3) to_chat(user, "You've added the grille to \the [src].") - build++ update_icon() return 1 if(4) // Grille in place if(istype(W, /obj/item/weapon/crowbar)) to_chat(user, "You begin to pry off the grille from \the [src]...") - playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1) if(do_after(user, 30, target = src) && (build == 4)) new /obj/item/stack/rods(loc,2) @@ -218,7 +196,6 @@ return 1 if(istype(W, /obj/item/weapon/screwdriver)) to_chat(user, "You finalize the Mass Driver...") - playsound(get_turf(src), 'sound/items/Screwdriver.ogg', 50, 1) var/obj/machinery/mass_driver/M = new(get_turf(src)) M.dir = src.dir diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index ef0a6475972..79579e1bb66 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -91,14 +91,11 @@ if (src.allowed(user)) src.locked = !src.locked to_chat(user, "Controls are now [src.locked ? "locked" : "unlocked"].") - else to_chat(user, "Access denied.") - updateDialog() else to_chat(user, "You must open the cover first!") - return /obj/machinery/navbeacon/attack_ai(mob/user) @@ -117,7 +114,6 @@ if(!open && !ai) // can't alter controls if not open, unless you're an AI to_chat(user, "The beacon's control cover is closed!") - return diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 133affefb22..d991e7c5235 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -711,7 +711,6 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co /obj/machinery/newscaster/attackby(obj/item/I as obj, mob/living/user as mob, params) if(istype(I, /obj/item/weapon/wrench)) to_chat(user, "Now [anchored ? "un" : ""]securing [name]") - playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 60, target = src)) new /obj/item/mounted/frame/newscaster_frame(loc) @@ -741,7 +740,6 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co playsound(src.loc, 'sound/effects/Glasshit.ogg', 100, 1) else to_chat(user, "This does nothing.") - src.update_icon() /obj/machinery/newscaster/proc/AttachPhoto(mob/user as mob) @@ -868,7 +866,6 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co to_chat(user, "The paper is full of intelligible symbols!") - obj/item/weapon/newspaper/Topic(href, href_list) var/mob/living/U = usr ..() @@ -905,7 +902,6 @@ obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user as mob, pa if(istype(W, /obj/item/weapon/pen)) if(src.scribble_page == src.curr_page) to_chat(user, "There's already a scribble in this page... You wouldn't want to make things too cluttered, would you?") - else var/s = strip_html( input(user, "Write something", "Newspaper", "") ) s = sanitize(copytext(s, 1, MAX_MESSAGE_LEN)) diff --git a/code/game/machinery/overview.dm b/code/game/machinery/overview.dm index 59930a57883..2b56b71fc43 100644 --- a/code/game/machinery/overview.dm +++ b/code/game/machinery/overview.dm @@ -33,7 +33,6 @@ // to_chat(world, "[icount] images in list") - for(var/wx = 1 ; wx <= world.maxx; wx++) for(var/wy = 1; wy <= world.maxy; wy++) @@ -148,14 +147,12 @@ var/ry = ((wy*2+yoff)%32) + 1 // to_chat(world, "trying [ix],[iy] : [ix+icx*iy]") - var/icon/I = imap[1+(ix + icx*iy)*2] var/icon/I2 = imap[2+(ix + icx*iy)*2] // to_chat(world, "icon: \icon[I]") - I.DrawBox(colour, rx, ry, rx+1, ry+1) I2.DrawBox(colour2, rx, ry, rx+1, ry+1) @@ -173,7 +170,6 @@ // to_chat(world, "\icon[I] at [H.screen_loc]") - H.name = (i==0)?"maprefresh":"map" var/icon/HI = new/icon @@ -285,13 +281,11 @@ var/ry = ((wy*2+yoff)%32) + 1 // to_chat(world, "trying [ix],[iy] : [ix+icx*iy]") - var/icon/I = imap[1+(ix + icx*iy)] // to_chat(world, "icon: \icon[I]") - I.DrawBox(colour, rx, ry, rx, ry) @@ -307,7 +301,6 @@ // to_chat(world, "\icon[I] at [H.screen_loc]") - H.name = (i==0)?"maprefresh":"map" var/icon/I = imap[i+1] diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index c20c5b56beb..ad54eb2e8e9 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -435,7 +435,6 @@ for(var/obj/machinery/atmospherics/M in src.loc) if((M.initialize_directions & pipe_dir) && M.check_connect_types_construction(M,src)) // matches at least one direction on either type of pipe to_chat(user, "There is already a pipe of the same type at this location.") - return 1 switch(pipe_type) //What kind of heartless person thought of doing this? @@ -621,12 +620,10 @@ return ..() if(!locate(/obj/machinery/atmospherics/pipe, src.loc)) to_chat(user, "\red You need to fasten it to a pipe") - return 1 new/obj/machinery/meter( src.loc ) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) to_chat(user, "\blue You have fastened the meter to the pipe") - qdel(src) /obj/item/pipe_gsensor @@ -644,7 +641,6 @@ new/obj/machinery/air_sensor( src.loc ) playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1) to_chat(user, "\blue You have fastened the gas sensor") - qdel(src) #undef PIPE_SIMPLE_STRAIGHT diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index 4e7347fdfe0..9214178e9e4 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -101,7 +101,6 @@ src.add_fingerprint(usr) if (istype(W, /obj/item/pipe) || istype(W, /obj/item/pipe_meter) || istype(W, /obj/item/pipe_gsensor)) to_chat(usr, "\blue You put [W] back to [src].") - user.drop_item() qdel(W) return @@ -109,7 +108,6 @@ if (unwrenched==0) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) to_chat(user, "\blue You begin to unfasten \the [src] from the floor...") - if (do_after(user, 40, target = src)) user.visible_message( \ "[user] unfastens \the [src].", \ @@ -123,7 +121,6 @@ else /*if (unwrenched==1)*/ playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) to_chat(user, "\blue You begin to fasten \the [src] to the floor...") - if (do_after(user, 20, target = src)) user.visible_message( \ "[user] fastens \the [src].", \ diff --git a/code/game/machinery/podmen.dm b/code/game/machinery/podmen.dm index 47068c97e9a..54585c0eb26 100644 --- a/code/game/machinery/podmen.dm +++ b/code/game/machinery/podmen.dm @@ -33,7 +33,6 @@ Growing it to term with nothing injected will grab a ghost from the observers. * to_chat(user, "You inject the contents of the syringe into the seeds.") - var/datum/reagent/blood/B //Find a blood sample to inject. @@ -44,7 +43,6 @@ Growing it to term with nothing injected will grab a ghost from the observers. * if(B) source = B.data["donor"] to_chat(user, "The strange, sluglike seeds quiver gently and swell with blood.") - if(!source.client && source.mind) for(var/mob/O in respawnable_list) if(O.mind == source.mind && config.revival_pod_plants) @@ -54,11 +52,9 @@ Growing it to term with nothing injected will grab a ghost from the observers. * return if("No") to_chat(user, "The seeds seem to reject the blood, returning to their original size as they stop quivering.") - return else to_chat(user, "Nothing happens.") - return if (!istype(source)) @@ -81,7 +77,6 @@ Growing it to term with nothing injected will grab a ghost from the observers. * if(beingharvested) to_chat(user, ("\red You can only harvest the pod once!")) - else user.visible_message("\blue [user] carefully begins to open the pod...","\blue You carefully begin to open the pod...") beingharvested = 1 @@ -129,15 +124,11 @@ Growing it to term with nothing injected will grab a ghost from the observers. * // -- End mode specific stuff to_chat(podman, "\green You awaken slowly, feeling your sap stir into sluggish motion as the warm air caresses your bark.") - if(source && ckey && podman.ckey == ckey) to_chat(podman, "Memories of a life as [source] drift oddly through a mind unsuited for them, like a skin of oil over a fathomless lake.") - to_chat(podman, "You are now one of the Dionaea, a race of drifting interstellar plantlike creatures that sometimes share their seeds with human traders.") - to_chat(podman, "Too much darkness will send you into shock and starve you, but light will help you heal.") - else new /mob/living/carbon/monkey/diona(parent.loc) diff --git a/code/game/machinery/poolcontroller.dm b/code/game/machinery/poolcontroller.dm index ac9eb4c6793..b7f1f41b356 100644 --- a/code/game/machinery/poolcontroller.dm +++ b/code/game/machinery/poolcontroller.dm @@ -23,7 +23,6 @@ if(!emagged) //If it is not already emagged, emag it. to_chat(user, "You disable \the [src]'s temperature safeguards.")//Inform the mob of what emagging does. - emagged = 1 //Set the emag var to true. /obj/machinery/poolcontroller/attackby(obj/item/P as obj, mob/user as mob, params) //Proc is called when a user hits the pool controller with something. @@ -31,13 +30,11 @@ if(emagged) //Check the emag status to_chat(user, "You re-enable \the [src]'s temperature safeguards.")//Inform the user that they have just fixed the safeguards. - emagged = 0 //Set the emagged var to false. else to_chat(user, "Nothing happens.")//If not emagged, don't do anything, and don't tell the user that it can be emagged. - else //If it's not a multitool, defer to /obj/machinery/attackby ..() @@ -72,25 +69,21 @@ M.bodytemperature = min(500, M.bodytemperature + 35) //heat mob at 35k(elvin) per cycle to_chat(M, "The water is searing hot!") - if("warm") //Gently warm the mob. M.bodytemperature = min(330, M.bodytemperature + 10) //Heats up mobs to just over normal, not enough to burn if(prob(50)) //inform the mob of warm water half the time to_chat(M, "The water is quite warm.")//Inform the mob it's warm water. - if("cool") //Gently cool the mob. M.bodytemperature = max(290, M.bodytemperature - 10) //Cools mobs to just below normal, not enough to burn if(prob(50)) //inform the mob of cold water half the time to_chat(M, "The water is chilly.")//Inform the mob it's chilly water. - if("frigid") //Freeze the mob. M.bodytemperature = max(80, M.bodytemperature - 35) //cool mob at -35k per cycle to_chat(M, "The water is freezing!") - return /obj/machinery/poolcontroller/proc/handleDrowning(var/mob/living/carbon/human/drownee) diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 1c1a8a237b6..59a34b56436 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -175,12 +175,10 @@ var/list/turret_icons /obj/machinery/porta_turret/proc/isLocked(mob/user) if(ailock && (isrobot(user) || isAI(user))) to_chat(user, "There seems to be a firewall preventing you from accessing this device.") - return 1 if(locked && !(isrobot(user) || isAI(user) || isobserver(user))) to_chat(user, "Access denied.") - return 1 return 0 @@ -246,7 +244,6 @@ var/list/turret_icons /obj/machinery/porta_turret/CanUseTopic(var/mob/user) if(HasController()) to_chat(user, "Turrets can only be controlled using the assigned turret controller.") - return STATUS_CLOSE if(isLocked(user)) @@ -254,7 +251,6 @@ var/list/turret_icons if(!anchored) to_chat(usr, "\The [src] has to be secured first!") - return STATUS_CLOSE return ..() @@ -334,11 +330,9 @@ var/list/turret_icons //If the turret is destroyed, you can remove it with a crowbar to //try and salvage its components to_chat(user, "You begin prying the metal coverings off.") - if(do_after(user, 20, target = src)) if(prob(70)) to_chat(user, "You remove the turret and salvage some components.") - if(installation) var/obj/item/weapon/gun/energy/Gun = new installation(loc) Gun.power_supply.charge = gun_charge @@ -349,21 +343,17 @@ var/list/turret_icons new /obj/item/device/assembly/prox_sensor(loc) else to_chat(user, "You remove the turret but did not manage to salvage anything.") - qdel(src) // qdel else if((istype(I, /obj/item/weapon/wrench))) if(enabled || raised) to_chat(user, "You cannot unsecure an active turret!") - return if(wrenching) to_chat(user, "Someone is already [anchored ? "un" : ""]securing the turret!") - return if(!anchored && isinspace()) to_chat(user, "Cannot secure turrets in space!") - return user.visible_message( \ @@ -379,12 +369,10 @@ var/list/turret_icons anchored = 1 update_icon() to_chat(user, "You secure the exterior bolts on the turret.") - else if(anchored) playsound(loc, 'sound/items/Ratchet.ogg', 100, 1) anchored = 0 to_chat(user, "You unsecure the exterior bolts on the turret.") - update_icon() wrenching = 0 @@ -392,12 +380,10 @@ var/list/turret_icons if(allowed(user)) locked = !locked to_chat(user, "Controls are now [locked ? "locked" : "unlocked"].") - updateUsrDialog() else to_chat(user, "Access denied.") - else //if the turret was attacked with the intention of harming it: user.changeNext_move(CLICK_CD_MELEE) @@ -422,7 +408,6 @@ var/list/turret_icons take_damage(M.melee_damage_upper) else to_chat(M, "That object is useless to you.") - return /obj/machinery/porta_turret/attack_alien(mob/living/carbon/alien/humanoid/M) @@ -434,7 +419,6 @@ var/list/turret_icons take_damage(15) else to_chat(M, "That object is useless to you.") - return /obj/machinery/porta_turret/emag_act(user as mob) @@ -443,7 +427,6 @@ var/list/turret_icons //the turret shoot much, much faster. if(user) to_chat(user, "You short out [src]'s threat assessment circuits.") - visible_message("[src] hums oddly...") emagged = 1 iconholder = 1 @@ -784,7 +767,6 @@ var/list/turret_icons if(istype(I, /obj/item/weapon/wrench) && !anchored) playsound(loc, 'sound/items/Ratchet.ogg', 100, 1) to_chat(user, "You secure the external bolts.") - anchored = 1 build_step = 1 return @@ -792,7 +774,6 @@ var/list/turret_icons else if(istype(I, /obj/item/weapon/crowbar) && !anchored) playsound(loc, 'sound/items/Crowbar.ogg', 75, 1) to_chat(user, "You dismantle the turret construction.") - new /obj/item/stack/sheet/metal( loc, 5) qdel(src) // qdel return @@ -802,18 +783,15 @@ var/list/turret_icons var/obj/item/stack/sheet/metal/M = I if(M.use(2)) to_chat(user, "You add some metal armor to the interior frame.") - build_step = 2 icon_state = "turret_frame2" else to_chat(user, "You need two sheets of metal to continue construction.") - return else if(istype(I, /obj/item/weapon/wrench)) playsound(loc, 'sound/items/Ratchet.ogg', 75, 1) to_chat(user, "You unfasten the external bolts.") - anchored = 0 build_step = 0 return @@ -823,7 +801,6 @@ var/list/turret_icons if(istype(I, /obj/item/weapon/wrench)) playsound(loc, 'sound/items/Ratchet.ogg', 100, 1) to_chat(user, "You bolt the metal armor into place.") - build_step = 3 return @@ -833,7 +810,6 @@ var/list/turret_icons return if(WT.get_fuel() < 5) //uses up 5 fuel. to_chat(user, "You need more fuel to complete this task.") - return playsound(loc, pick('sound/items/Welder.ogg', 'sound/items/Welder2.ogg'), 50, 1) @@ -841,7 +817,6 @@ var/list/turret_icons if(!src || !WT.remove_fuel(5, user)) return build_step = 1 to_chat(user, "You remove the turret's interior metal armor.") - new /obj/item/stack/sheet/metal( loc, 2) return @@ -854,13 +829,11 @@ var/list/turret_icons var/obj/item/weapon/gun/energy/E = I //typecasts the item to an energy gun if(!user.unEquip(I)) to_chat(user, "\the [I] is stuck to your hand, you cannot put it in \the [src]") - return installation = I.type //installation becomes I.type gun_charge = E.power_supply.charge //the gun's charge is stored in gun_charge to_chat(user, "You add [I] to the turret.") - if(istype(installation, /obj/item/weapon/gun/energy/laser/bluetag) || istype(installation, /obj/item/weapon/gun/energy/laser/redtag)) target_type = /obj/machinery/porta_turret/tag else @@ -873,7 +846,6 @@ var/list/turret_icons else if(istype(I, /obj/item/weapon/wrench)) playsound(loc, 'sound/items/Ratchet.ogg', 100, 1) to_chat(user, "You remove the turret's metal armor bolts.") - build_step = 2 return @@ -881,12 +853,10 @@ var/list/turret_icons if(isprox(I)) if(!user.unEquip(I)) to_chat(user, "\the [I] is stuck to your hand, you cannot put it in \the [src]") - return build_step = 5 qdel(I) // qdel to_chat(user, "You add the prox sensor to the turret.") - return //attack_hand() removes the gun @@ -896,7 +866,6 @@ var/list/turret_icons playsound(loc, 'sound/items/Screwdriver.ogg', 100, 1) build_step = 6 to_chat(user, "You close the internal access hatch.") - return //attack_hand() removes the prox sensor @@ -906,18 +875,15 @@ var/list/turret_icons var/obj/item/stack/sheet/metal/M = I if(M.use(2)) to_chat(user, "You add some metal armor to the exterior frame.") - build_step = 7 else to_chat(user, "You need two sheets of metal to continue construction.") - return else if(istype(I, /obj/item/weapon/screwdriver)) playsound(loc, 'sound/items/Screwdriver.ogg', 100, 1) build_step = 5 to_chat(user, "You open the internal access hatch.") - return if(7) @@ -927,7 +893,6 @@ var/list/turret_icons if(WT.get_fuel() < 5) to_chat(user, "You need more fuel to complete this task.") - playsound(loc, pick('sound/items/Welder.ogg', 'sound/items/Welder2.ogg'), 50, 1) if(do_after(user, 30, target = src)) if(!src || !WT.remove_fuel(5, user)) @@ -935,7 +900,6 @@ var/list/turret_icons build_step = 8 to_chat(user, "You weld the turret's armor down.") - //The final step: create a full turret var/obj/machinery/porta_turret/Turret = new target_type(loc) Turret.name = finish_name @@ -949,7 +913,6 @@ var/list/turret_icons else if(istype(I, /obj/item/weapon/crowbar)) playsound(loc, 'sound/items/Crowbar.ogg', 75, 1) to_chat(user, "You pry off the turret's exterior armor.") - new /obj/item/stack/sheet/metal(loc, 2) build_step = 6 return @@ -981,10 +944,8 @@ var/list/turret_icons gun_charge = 0 to_chat(user, "You remove [Gun] from the turret frame.") - if(5) to_chat(user, "You remove the prox sensor from the turret frame.") - new /obj/item/device/assembly/prox_sensor(loc) build_step = 4 diff --git a/code/game/machinery/programmable_unloader.dm b/code/game/machinery/programmable_unloader.dm index 02c6bdea07b..f061f9906e6 100644 --- a/code/game/machinery/programmable_unloader.dm +++ b/code/game/machinery/programmable_unloader.dm @@ -200,7 +200,6 @@ if (unwrenched==0) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) to_chat(user, "\blue You begin to unfasten \the [src] from the floor...") - if (do_after(user, 40, target = src)) user.visible_message( \ "[user] unfastens \the [src].", \ @@ -214,7 +213,6 @@ else /* unwrenched */ playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) to_chat(user, "\blue You begin to fasten \the [src] to the floor...") - if (do_after(user, 20, target = src)) user.visible_message( \ "[user] fastens \the [src].", \ @@ -233,19 +231,15 @@ if(!unwrenched && !circuit_removed) src.stat &= ~MAINT to_chat(user, "You close \the [src]'s maintenance panel.") - else open = 1 src.stat |= MAINT to_chat(user, "You open \the [src]'s maintenance panel.") - if(istype(I,/obj/item/weapon/crowbar)) if(open) to_chat(user, "\blue You begin to pry out the [src]'s circuits.") - if(do_after(user,40, target = src)) to_chat(user, "\blue You remove the circuitboard.") - circuit_removed = 1 use_power = 0 on = 0 @@ -267,11 +261,9 @@ if(istype(I,/obj/item/weapon/circuitboard/programmable)) if(!open) to_chat(user, "You have to open the machine first!") - return if(!circuit_removed) to_chat(user, "There is already a circuitboard present!") - return circuit_removed = 0 I.loc = src @@ -281,7 +273,6 @@ if(emagged) return to_chat(user, "You swipe the unloader with your card. After a moment's grinding, it beeps in a sinister fashion.") - playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0) emagged = 1 overrides += emag_overrides @@ -310,7 +301,6 @@ M.client.perspective = MOB_PERSPECTIVE to_chat(M, "\blue The machine turns off, and you fall out.") - return //Normal output reaction @@ -509,7 +499,6 @@ var/newsleep = 0 if(H.loc != input) to_chat(H, "The boxing machine refuses to acknowledge you unless you face it head on!") - return var/damage = 0 if(H.a_intent != I_HARM) @@ -597,27 +586,22 @@ hacking = (hacking?0:1) if(hacking) to_chat(user, "You unlock the data port on the board. You can now use a PDA to alter its data.") - else to_chat(user, "You relock the data port.") - if(istype(I,/obj/item/device/pda)) if(!hacking) to_chat(user, "It looks like you can't access the board's data port. You'll have to open it with a multitool.") - else user.set_machine(src) interact(user) if(istype(I,/obj/item/weapon/card/emag) && !emagged) if(!hacking) to_chat(user, "There seems to be a data port on the card, but it's locked. A multitool could open it.") - else emagged = 1 overrides += emag_overrides to_chat(user, "You swipe the card in the card's data port. The lights flicker, then flash once.") - proc/format(var/datum/cargoprofile/P,var/level) // PROFILE=0 OVERRIDE=1 MAIN=2 if(P == null) diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 8eebb024633..be126aec5ff 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -19,7 +19,6 @@ if(!user.canUnEquip(G, 0)) to_chat(user, "[G] is stuck to your hand, you can't put it in [src]!") - return if(istype(G, /obj/item/weapon/gun/energy) || istype(G, /obj/item/weapon/melee/baton) || istype(G,/obj/item/device/laptop) || istype(G, /obj/item/weapon/rcs)) @@ -30,25 +29,21 @@ var/area/a = get_area(src) if(!isarea(a)) to_chat(user, "\red The [name] blinks red as you try to insert the item!") - return if(a.power_equip == 0 && a.requires_power) to_chat(user, "\red The [name] blinks red as you try to insert the item!") - return if (istype(G, /obj/item/weapon/gun/energy)) var/obj/item/weapon/gun/energy/E = G if(!E.can_charge) to_chat(user, "Your gun has no external power connector.") - return if(istype(G, /obj/item/device/laptop)) var/obj/item/device/laptop/L = G if(!L.stored_computer.battery) to_chat(user, "There's no battery in it!") - return user.drop_item() @@ -59,11 +54,9 @@ else if(istype(G, /obj/item/weapon/wrench)) if(charging) to_chat(user, "\red Remove the weapon first!") - return anchored = !anchored to_chat(user, "You [anchored ? "attached" : "detached"] the recharger.") - playsound(loc, 'sound/items/Ratchet.ogg', 75, 1) /obj/machinery/recharger/attack_hand(mob/user as mob) diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index 6434b350830..5b5a532efdb 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -90,7 +90,6 @@ if (istype(P, /obj/item/weapon/screwdriver)) if(src.occupant) to_chat(user, "The maintenance panel is locked.") - return default_deconstruction_screwdriver(user, "borgdecon2", "borgcharger0", P) return @@ -219,12 +218,10 @@ if(get_dist(src, user) > 2 || get_dist(usr, user) > 1) to_chat(usr, "They are too far away to put inside") - return if (panel_open) to_chat(usr, "Close the maintenance panel first.") - return var/can_accept_user @@ -236,11 +233,9 @@ return if(occupant) to_chat(R, "The cell is already occupied!") - return if(!R.cell) to_chat(R, "Without a power cell, you can't be recharged.") - //Make sure they actually HAVE a cell, now that they can get in while powerless. --NEO return can_accept_user = 1 @@ -252,7 +247,6 @@ return if(occupant) to_chat(H, "The cell is already occupied!") - return if(!H.get_int_organ(/obj/item/organ/internal/cell)) return @@ -260,7 +254,6 @@ if(!can_accept_user) to_chat(user, "Only non-organics may enter the recharger!") - return user.stop_pulling() diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index 582a842f15e..9bcf3de53a8 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -46,12 +46,9 @@ var/const/SAFETY_COOLDOWN = 100 /obj/machinery/recycler/examine(mob/user) ..(user) to_chat(user, "The power light is [(stat & NOPOWER) ? "off" : "on"].") - to_chat(user, "The safety-mode light is [safety_mode ? "on" : "off"].") - to_chat(user, "The safety-sensors status light is [emagged ? "off" : "on"].") - /obj/machinery/recycler/power_change() ..() update_icon() @@ -83,7 +80,6 @@ var/const/SAFETY_COOLDOWN = 100 playsound(src.loc, "sparks", 75, 1, -1) to_chat(user, "You use the cryptographic sequencer on the [src.name].") - /obj/machinery/recycler/update_icon() ..() var/is_powered = !(stat & (BROKEN|NOPOWER)) @@ -200,11 +196,9 @@ var/const/SAFETY_COOLDOWN = 100 return if (src.anchored) to_chat(usr, "[src] is fastened to the floor!") - return 0 eat_dir = turn(eat_dir, 270) to_chat(user, "[src] will now accept items from [dir2text(eat_dir)].") - return 1 /obj/machinery/recycler/verb/rotateccw() @@ -218,11 +212,9 @@ var/const/SAFETY_COOLDOWN = 100 return if (src.anchored) to_chat(usr, "[src] is fastened to the floor!") - return 0 eat_dir = turn(eat_dir, 90) to_chat(user, "[src] will now accept items from [dir2text(eat_dir)].") - return 1 /obj/item/weapon/paper/recycler diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index 70b70e554a8..bfd4939dc3b 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -228,7 +228,6 @@ var/list/obj/machinery/requests_console/allConsoles = list() else to_chat(user, "You can't do much with that.")*/ - if (istype(O, /obj/item/weapon/card/id)) if(inoperable(MAINT)) return if(screen == RCS_MESSAUTH) @@ -243,7 +242,6 @@ var/list/obj/machinery/requests_console/allConsoles = list() else reset_message() to_chat(user, "You are not authorized to send announcements.") - updateUsrDialog() if (istype(O, /obj/item/weapon/stamp)) if(inoperable(MAINT)) return diff --git a/code/game/machinery/robot_fabricator.dm b/code/game/machinery/robot_fabricator.dm index a6d9dfc3293..44455884bd8 100644 --- a/code/game/machinery/robot_fabricator.dm +++ b/code/game/machinery/robot_fabricator.dm @@ -29,13 +29,11 @@ qdel(O) to_chat(user, "You insert [count] metal sheet\s into the fabricator.") - src.overlays -= "fab-load-metal" updateDialog() else to_chat(user, "The robot part maker is full. Please remove metal from the robot part maker in order to insert more.") - /obj/machinery/robotic_fabricator/power_change() if (powered()) stat &= ~NOPOWER diff --git a/code/game/machinery/seed_extractor.dm b/code/game/machinery/seed_extractor.dm index acf030b9ddc..dbff4722cad 100644 --- a/code/game/machinery/seed_extractor.dm +++ b/code/game/machinery/seed_extractor.dm @@ -45,7 +45,6 @@ obj/machinery/seed_extractor/attackby(var/obj/item/O as obj, var/mob/user as mob if(new_seed_type) to_chat(user, "You extract some seeds from [O].") - var/produce = rand(1,4) for(var/i = 0;i<=produce;i++) var/obj/item/seeds/seeds = new(get_turf(src)) @@ -54,14 +53,12 @@ obj/machinery/seed_extractor/attackby(var/obj/item/O as obj, var/mob/user as mob else to_chat(user, "[O] doesn't seem to have any usable seeds inside it.") - qdel(O) //Grass. else if(istype(O, /obj/item/stack/tile/grass)) var/obj/item/stack/tile/grass/S = O to_chat(user, "You extract some seeds from the [S.name].") - S.use(1) new /obj/item/seeds/grassseed(loc) diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index 41c5e1a13ae..323937075ad 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -209,11 +209,9 @@ /obj/machinery/shieldgen/attack_hand(mob/user as mob) if(locked) to_chat(user, "The machine is locked, you are unable to use it.") - return if(is_open) to_chat(user, "The panel must be closed before operating this machine.") - return if (src.active) @@ -229,7 +227,6 @@ src.shields_up() else to_chat(user, "The device must first be secured to the floor.") - return /obj/machinery/shieldgen/attackby(obj/item/weapon/W as obj, mob/user as mob, params) @@ -241,17 +238,14 @@ playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) if(is_open) to_chat(user, "\blue You close the panel.") - is_open = 0 else to_chat(user, "\blue You open the panel and expose the wiring.") - is_open = 1 else if(istype(W, /obj/item/stack/cable_coil) && malfunction && is_open) var/obj/item/stack/cable_coil/coil = W to_chat(user, "\blue You begin to replace the wires.") - //if(do_after(user, min(60, round( ((maxhealth/health)*10)+(malfunction*10) ), target = src)) //Take longer to repair heavier damage if(do_after(user, 30, target = src)) if(!src || !coil) return @@ -259,28 +253,23 @@ health = max_health malfunction = 0 to_chat(user, "\blue You repair the [src]!") - update_icon() else if(istype(W, /obj/item/weapon/wrench)) if(locked) to_chat(user, "The bolts are covered, unlocking this would retract the covers.") - return if(anchored) playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) to_chat(user, "\blue You unsecure the [src] from the floor!") - if(active) to_chat(user, "\blue The [src] shuts off!") - src.shields_down() anchored = 0 else if(istype(get_turf(src), /turf/space)) return //No wrenching these in space! playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) to_chat(user, "\blue You secure the [src] to the floor!") - anchored = 1 @@ -288,11 +277,9 @@ if(src.allowed(user)) src.locked = !src.locked to_chat(user, "The controls are now [src.locked ? "locked." : "unlocked."]") - else to_chat(user, "\red Access denied.") - else ..() @@ -360,15 +347,12 @@ /obj/machinery/shieldwallgen/attack_hand(mob/user as mob) if(state != 1) to_chat(user, "\red The shield generator needs to be firmly secured to the floor first.") - return 1 if(src.locked && !istype(user, /mob/living/silicon)) to_chat(user, "\red The controls are locked!") - return 1 if(power != 1) to_chat(user, "\red The shield generator needs to be powered by wire underneath.") - return 1 if(src.active >= 1) @@ -469,14 +453,12 @@ if(istype(W, /obj/item/weapon/wrench)) if(active) to_chat(user, "Turn off the field generator first.") - return else if(state == 0) state = 1 playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) to_chat(user, "You secure the external reinforcing bolts to the floor.") - src.anchored = 1 return @@ -484,7 +466,6 @@ state = 0 playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) to_chat(user, "You undo the external reinforcing bolts.") - src.anchored = 0 return @@ -492,11 +473,9 @@ if (src.allowed(user)) src.locked = !src.locked to_chat(user, "Controls are now [src.locked ? "locked." : "unlocked."]") - else to_chat(user, "\red Access denied.") - else add_fingerprint(user) ..() diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index cac66fb2871..6ba798cebee 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -29,15 +29,12 @@ /obj/machinery/space_heater/examine(mob/user) ..(user) to_chat(user, "The heater is [on ? "on" : "off"] and the hatch is [open ? "open" : "closed"].") - if(open) to_chat(user, "The power cell is [cell ? "installed" : "missing"].") - else to_chat(user, "The charge meter reads [cell ? round(cell.percent(),1) : 0]%") - /obj/machinery/space_heater/emp_act(severity) if(stat & (BROKEN|NOPOWER)) ..(severity) @@ -51,7 +48,6 @@ if(open) if(cell) to_chat(user, "There is already a power cell inside.") - return else // insert cell @@ -65,7 +61,6 @@ user.visible_message("\blue [user] inserts a power cell into [src].", "\blue You insert the power cell into [src].") else to_chat(user, "The hatch must be open to insert a power cell.") - return else if(istype(I, /obj/item/weapon/screwdriver)) open = !open diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index 9c531ca2c20..e73dbaf5dbd 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -136,7 +136,6 @@ if(mode != STATUS_DISPLAY_BLANK && mode != STATUS_DISPLAY_ALERT) to_chat(user, "The display says:
      \t[sanitize(message1)]
      \t[sanitize(message2)]") - /obj/machinery/status_display/proc/set_message(m1, m2) if(m1) index1 = (length(m1) > CHARS_PER_LINE) diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index f4e1337b8ea..9cb2c7db4d6 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -249,16 +249,13 @@ if(!protected) playsound(src.loc, "sparks", 75, 1, -1) to_chat(user, "You try to touch the controls but you get zapped. There must be a short circuit somewhere.") - return*/ else //welp, the guy is protected, we can continue if(src.issuperUV) to_chat(user, "You slide the dial back towards \"185nm\".") - src.issuperUV = 0 else to_chat(user, "You crank the dial all the way up to \"15nm\".") - src.issuperUV = 1 return @@ -278,11 +275,9 @@ if(!protected) playsound(src.loc, "sparks", 75, 1, -1) to_chat(user, "You try to touch the controls but you get zapped. There must be a short circuit somewhere.") - return*/ else to_chat(user, "You push the button. The coloured LED next to it changes.") - src.safetieson = !src.safetieson @@ -332,7 +327,6 @@ /obj/machinery/suit_storage_unit/proc/toggle_open(mob/user as mob) if(src.islocked || src.isUV) to_chat(user, "Unable to open unit.") - return if(src.OCCUPANT) src.eject_occupant(user) @@ -344,7 +338,6 @@ /obj/machinery/suit_storage_unit/proc/toggle_lock(mob/user as mob) if(src.OCCUPANT && src.safetieson) to_chat(user, "The Unit's safety protocols disallow locking when a biological form is detected inside its compartments.") - return if(src.isopen) return @@ -357,14 +350,11 @@ return if(src.OCCUPANT && src.safetieson) to_chat(user, "WARNING: Biological entity detected in the confines of the Unit's storage. Cannot initiate cycle.") - return if(!src.HELMET && !src.MASK && !src.SUIT && !src.OCCUPANT ) //shit's empty yo to_chat(user, "Unit storage bays empty. Nothing to disinfect -- Aborting.") - return to_chat(user, "You start the Unit's cauterisation cycle.") - src.cycletime_left = 20 src.isUV = 1 if(src.OCCUPANT && !src.islocked) @@ -427,11 +417,9 @@ if(src.issuperUV) OCCUPANT.take_organ_damage(0,40) to_chat(user, "Test. You gave him 40 damage") - else OCCUPANT.take_organ_damage(0,8) to_chat(user, "Test. You gave him 8 damage") - return*/ @@ -453,11 +441,9 @@ if (src.OCCUPANT.client) if(user != OCCUPANT) to_chat(OCCUPANT, "The machine kicks you out!") - if(user.loc != src.loc) to_chat(OCCUPANT, "You leave the not-so-cozy confines of the SSU.") - src.OCCUPANT.client.eye = src.OCCUPANT.client.mob src.OCCUPANT.client.perspective = MOB_PERSPECTIVE src.OCCUPANT.loc = src.loc @@ -491,15 +477,12 @@ return if (!src.isopen) to_chat(usr, "The unit's doors are shut.") - return if (!src.ispowered || src.isbroken) to_chat(usr, "The unit is not operational.") - return if ( (src.OCCUPANT) || (src.HELMET) || (src.SUIT) ) to_chat(usr, "It's too cluttered inside for you to fit in!") - return visible_message("[usr] starts squeezing into the suit storage unit!") if(do_after(usr, 10, target = usr)) @@ -530,7 +513,6 @@ src.panelopen = !src.panelopen playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) to_chat(user, text("You [] the unit's maintenance panel.",(src.panelopen ? "open up" : "close") )) - src.updateUsrDialog() return if ( istype(I, /obj/item/weapon/grab) ) @@ -539,15 +521,12 @@ return if (!src.isopen) to_chat(usr, "The unit's doors are shut.") - return if (!src.ispowered || src.isbroken) to_chat(usr, "The unit is not operational.") - return if ( (src.OCCUPANT) || (src.HELMET) || (src.SUIT) ) //Unit needs to be absolutely empty to_chat(user, "The unit's storage area is too cluttered.") - return visible_message("[user] starts putting [G.affecting.name] into the Suit Storage Unit.") if(do_after(user, 20, target = G:affecting)) @@ -574,10 +553,8 @@ var/obj/item/clothing/suit/space/S = I if(src.SUIT) to_chat(user, "The unit already contains a suit.") - return to_chat(user, "You load the [S.name] into the storage compartment.") - user.drop_item() S.loc = src src.SUIT = S @@ -590,10 +567,8 @@ var/obj/item/clothing/head/helmet/H = I if(src.HELMET) to_chat(user, "The unit already contains a helmet.") - return to_chat(user, "You load the [H.name] into the storage compartment.") - user.drop_item() H.loc = src src.HELMET = H @@ -606,10 +581,8 @@ var/obj/item/clothing/mask/M = I if(src.MASK) to_chat(user, "The unit already contains a mask.") - return to_chat(user, "You load the [M.name] into the storage compartment.") - user.drop_item() M.loc = src src.MASK = M @@ -706,12 +679,10 @@ if(locked) to_chat(user, "\red The suit cycler is locked.") - return if(src.contents.len > 0) to_chat(user, "\red There is no room inside the cycler for [G.affecting.name].") - return visible_message("[user] starts putting [G.affecting.name] into the suit cycler.") @@ -735,7 +706,6 @@ panel_open = !panel_open to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.") - src.updateUsrDialog() return @@ -743,16 +713,13 @@ if(locked) to_chat(user, "\red The suit cycler is locked.") - return if(helmet) to_chat(user, "The cycler already contains a helmet.") - return to_chat(user, "You fit \the [I] into the suit cycler.") - user.drop_item() I.loc = src helmet = I @@ -765,28 +732,23 @@ if(locked) to_chat(user, "\red The suit cycler is locked.") - return if(suit) to_chat(user, "The cycler already contains a hardsuit.") - return var/obj/item/clothing/suit/space/rig/S = I if(S.helmet) to_chat(user, "\The [S] will not fit into the cycler with a helmet attached.") - return if(S.boots) to_chat(user, "\The [S] will not fit into the cycler with boots attached.") - return to_chat(user, "You fit \the [I] into the suit cycler.") - user.drop_item() I.loc = src suit = I @@ -800,12 +762,10 @@ /obj/machinery/suit_cycler/emag_act(user as mob) if(emagged) to_chat(user, "\red The cycler has already been subverted.") - return //Clear the access reqs, disable the safeties, and open up all paintjobs. to_chat(user, "\red You run the sequencer across the interface, corrupting the operating protocols.") - departments = list("Engineering","Mining","Medical","Security","Atmos","^%###^%$") emagged = 1 safeties = 0 @@ -926,16 +886,13 @@ if(src.allowed(usr)) locked = !locked to_chat(usr, "You [locked ? "" : "un"]lock \the [src].") - else to_chat(usr, "\red Access denied.") - else if(href_list["begin_decontamination"]) if(safeties && occupant) to_chat(usr, "\red The cycler has detected an occupant. Please remove the occupant before commencing the decontamination cycle.") - return active = 1 @@ -956,7 +913,6 @@ var/twire = text2num(href_list["cutwire"]) if (!( istype(usr.get_active_hand(), /obj/item/weapon/wirecutters) )) to_chat(usr, "You need wirecutters!") - return if (src.isWireColorCut(twire)) src.mend(twire) @@ -967,11 +923,9 @@ var/twire = text2num(href_list["pulsewire"]) if (!istype(usr.get_active_hand(), /obj/item/device/multitool)) to_chat(usr, "You need a multitool!") - return if (src.isWireColorCut(twire)) to_chat(usr, "You can't pulse a cut wire.") - return else src.pulse(twire)*/ @@ -1038,7 +992,6 @@ if(locked || active) to_chat(user, "\red The cycler is locked.") - return if (!occupant) diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index 4feba8ac8f8..7790cf10ebc 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -87,13 +87,11 @@ to_chat(M, "You have joined the ranks of the Syndicate and become a traitor to the station!") - message_admins("[key_name_admin(N)] has accepted a traitor objective from a syndicate beacon.") var/obj_count = 1 for(var/datum/objective/OBJ in M.mind.objectives) to_chat(M, "Objective #[obj_count]: [OBJ.explanation_text]") - obj_count++ src.add_fingerprint(usr) @@ -129,7 +127,6 @@ if(surplus() < 1500) if(user) to_chat(user, "The connected wire doesn't have enough current.") - return for(var/obj/singularity/singulo in singularities) if(singulo.z == z) @@ -141,7 +138,6 @@ to_chat(user, "You activate the beacon.") - /obj/machinery/power/singularity_beacon/proc/Deactivate(mob/user = null) for(var/obj/singularity/singulo in world) if(singulo.target == src) @@ -152,7 +148,6 @@ to_chat(user, "You deactivate the beacon.") - /obj/machinery/power/singularity_beacon/attack_ai(mob/user as mob) return @@ -162,7 +157,6 @@ return active ? Deactivate(user) : Activate(user) else to_chat(user, "You need to screw the beacon to the floor first!") - return @@ -170,23 +164,19 @@ if(istype(W,/obj/item/weapon/screwdriver)) if(active) to_chat(user, "You need to deactivate the beacon first!") - return if(anchored) anchored = 0 to_chat(user, "You unscrew the beacon from the floor.") - disconnect_from_network() return else if(!connect_to_network()) to_chat(user, "This device must be placed over an exposed cable.") - return anchored = 1 to_chat(user, "You screw the beacon to the floor and attach the cable.") - return ..() return diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index 509371b0b95..fe443662616 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -49,7 +49,6 @@ ..(user) to_chat(user, "A digital display on it reads \"[timer]\".") - /obj/machinery/syndicatebomb/update_icon() icon_state = "[initial(icon_state)][active ? "-active" : "-inactive"][open_panel ? "-wires" : ""]" @@ -58,31 +57,25 @@ if(!anchored) if(!isturf(src.loc) || istype(src.loc, /turf/space)) to_chat(user, "The bomb must be placed on solid ground to attach it") - else to_chat(user, "You firmly wrench the bomb to the floor") - playsound(loc, 'sound/items/ratchet.ogg', 50, 1) anchored = 1 if(active) to_chat(user, "The bolts lock in place") - else if(!active) to_chat(user, "You wrench the bomb from the floor") - playsound(loc, 'sound/items/ratchet.ogg', 50, 1) anchored = 0 else to_chat(user, "The bolts are locked down!") - else if(istype(I, /obj/item/weapon/screwdriver)) open_panel = !open_panel update_icon() to_chat(user, "You [open_panel ? "open" : "close"] the wire panel.") - else if(istype(I, /obj/item/weapon/wirecutters) || istype(I, /obj/item/device/multitool) || istype(I, /obj/item/device/assembly/signaler )) if(open_panel) wires.Interact(user) @@ -91,28 +84,22 @@ if(open_panel && isWireCut(WIRE_BOOM) && isWireCut(WIRE_UNBOLT) && isWireCut(WIRE_DELAY) && isWireCut(WIRE_PROCEED) && isWireCut(WIRE_ACTIVATE)) if(payload) to_chat(user, "You carefully pry out [payload].") - payload.loc = user.loc payload = null else to_chat(user, "There isn't anything in here to remove!") - else if (open_panel) to_chat(user, "The wires conneting the shell to the explosives are holding it down!") - else to_chat(user, "The cover is screwed on, it won't pry off!") - else if(istype(I, /obj/item/weapon/bombcore)) if(!payload) payload = I to_chat(user, "You place [payload] into [src].") - user.drop_item() payload.loc = src else to_chat(user, "[payload] is already loaded into [src], you'll have to remove it first.") - else ..() @@ -132,7 +119,6 @@ return else if(anchored) to_chat(user, "The bomb is bolted to the floor!") - return /obj/machinery/syndicatebomb/proc/settings(var/mob/user) @@ -325,7 +311,6 @@ existant++ playsound(user, 'sound/machines/click.ogg', 20, 1) to_chat(user, "[existant] found, [detonated] triggered.") - if(detonated) var/turf/T = get_turf(src) var/area/A = get_area(T) diff --git a/code/game/machinery/telecomms/logbrowser.dm b/code/game/machinery/telecomms/logbrowser.dm index 4b36ab9d370..4bbdb4966c1 100644 --- a/code/game/machinery/telecomms/logbrowser.dm +++ b/code/game/machinery/telecomms/logbrowser.dm @@ -185,7 +185,6 @@ if(!src.allowed(usr) && !emagged) to_chat(usr, "\red ACCESS DENIED.") - return if(SelectedServer) @@ -224,7 +223,6 @@ if(do_after(user, 20, target = src)) if (src.stat & BROKEN) to_chat(user, "\blue The broken glass falls out.") - var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) new /obj/item/weapon/shard(loc) var/obj/item/weapon/circuitboard/comm_server/M = new /obj/item/weapon/circuitboard/comm_server( A ) @@ -237,7 +235,6 @@ qdel(src) else to_chat(user, "\blue You disconnect the monitor.") - var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) var/obj/item/weapon/circuitboard/comm_server/M = new /obj/item/weapon/circuitboard/comm_server( A ) for (var/obj/C in src) @@ -255,4 +252,3 @@ playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) emagged = 1 to_chat(user, "\blue You you disable the security protocols") - diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index 671b1c993eb..da9fe5a046e 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -24,30 +24,25 @@ if(0) if(istype(P, /obj/item/weapon/screwdriver)) to_chat(user, "You unfasten the bolts.") - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) construct_op++ if(1) if(istype(P, /obj/item/weapon/screwdriver)) to_chat(user, "You fasten the bolts.") - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) construct_op-- if(istype(P, /obj/item/weapon/wrench)) to_chat(user, "You dislodge the external plating.") - playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) construct_op++ if(2) if(istype(P, /obj/item/weapon/wrench)) to_chat(user, "You secure the external plating.") - playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) construct_op-- if(istype(P, /obj/item/weapon/wirecutters)) playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) to_chat(user, "You remove the cables.") - construct_op++ var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( user.loc ) A.amount = 5 @@ -57,7 +52,6 @@ var/obj/item/stack/cable_coil/A = P if(A.amount >= 5) to_chat(user, "You insert the cables.") - A.amount -= 5 if(A.amount <= 0) user.drop_item() @@ -66,12 +60,10 @@ stat &= ~BROKEN // the machine's not borked anymore! if(istype(P, /obj/item/weapon/crowbar)) to_chat(user, "You begin prying out the circuit board other components...") - playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) if(do_after(user,60, target = src)) to_chat(user, "You finish prying out the components.") - // Drop all the component stuff if(component_parts) for(var/obj/I in component_parts) diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm index f9d62fbcc02..9d9481aba04 100644 --- a/code/game/machinery/telecomms/telecomunications.dm +++ b/code/game/machinery/telecomms/telecomunications.dm @@ -40,7 +40,6 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() if(!on) return // to_chat(world, "[src] ([src.id]) - [signal.debug_print()]") - var/send_count = 0 diff --git a/code/game/machinery/telecomms/telemonitor.dm b/code/game/machinery/telecomms/telemonitor.dm index e0cc2f550f1..16528b73d0e 100644 --- a/code/game/machinery/telecomms/telemonitor.dm +++ b/code/game/machinery/telecomms/telemonitor.dm @@ -132,7 +132,6 @@ if(do_after(user, 20, target = src)) if (src.stat & BROKEN) to_chat(user, "\blue The broken glass falls out.") - var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) new /obj/item/weapon/shard(loc) var/obj/item/weapon/circuitboard/comm_monitor/M = new /obj/item/weapon/circuitboard/comm_monitor( A ) @@ -145,7 +144,6 @@ qdel(src) else to_chat(user, "\blue You disconnect the monitor.") - var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) var/obj/item/weapon/circuitboard/comm_monitor/M = new /obj/item/weapon/circuitboard/comm_monitor( A ) for (var/obj/C in src) @@ -163,4 +161,3 @@ playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) emagged = 1 to_chat(user, "\blue You you disable the security protocols") - diff --git a/code/game/machinery/telecomms/traffic_control.dm b/code/game/machinery/telecomms/traffic_control.dm index 2871cf473ba..a5ee6631037 100644 --- a/code/game/machinery/telecomms/traffic_control.dm +++ b/code/game/machinery/telecomms/traffic_control.dm @@ -194,7 +194,6 @@ if(!allowed(user) && !emagged) to_chat(user, "Access Denied.") - return 0 switch(href_list["choice"]) @@ -345,7 +344,6 @@ if(do_after(user, 20, target = src)) if (src.stat & BROKEN) to_chat(user, "\blue The broken glass falls out.") - var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) new /obj/item/weapon/shard(loc) var/obj/item/weapon/circuitboard/comm_traffic/M = new /obj/item/weapon/circuitboard/comm_traffic( A ) @@ -358,7 +356,6 @@ qdel(src) else to_chat(user, "\blue You disconnect the monitor.") - var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) var/obj/item/weapon/circuitboard/comm_traffic/M = new /obj/item/weapon/circuitboard/comm_traffic( A ) for (var/obj/C in src) @@ -377,7 +374,6 @@ emagged = 1 to_chat(user, "\blue You you disable the security protocols") - /obj/machinery/computer/telecomms/traffic/proc/canAccess(var/mob/user) if(issilicon(user) || in_range(user, src)) return 1 diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 74124f22e9b..1933c022e16 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -44,12 +44,10 @@ if(L.locked_location && !(stat & (NOPOWER|BROKEN))) if(!user.unEquip(L)) to_chat(user, "\the [I] is stuck to your hand, you cannot put it in \the [src]") - return L.loc = src locked = L to_chat(user, "You insert the GPS device into the [name]'s slot.") - else ..() return @@ -58,7 +56,6 @@ if(!emagged) emagged = 1 to_chat(user, "\blue The teleporter can now lock on to Syndicate beacons!") - else ui_interact(user) @@ -107,12 +104,10 @@ if(!check_hub_connection()) to_chat(usr, "Error: Unable to detect hub.") - nanomanager.update_uis(src) return if(calibrating) to_chat(usr, "Error: Calibration in progress. Stand by.") - nanomanager.update_uis(src) return @@ -137,12 +132,10 @@ if(href_list["calibrate"]) if(!target) to_chat(usr, "Error: No target set to calibrate to.") - nanomanager.update_uis(src) return if(power_station.teleporter_hub.calibrated || power_station.teleporter_hub.accurate >= 3) to_chat(usr, "Hub is already calibrated.") - nanomanager.update_uis(src) return src.visible_message("Processing hub calibration to target...") @@ -226,7 +219,6 @@ var/list/S = power_station.linked_stations if(!S.len) to_chat(user, "No connected stations located.") - return for(var/obj/machinery/teleport/station/R in S) var/turf/T = get_turf(R) @@ -327,7 +319,6 @@ /obj/machinery/teleport/hub/Bumped(M as mob|obj) if(z == ZLEVEL_CENTCOMM) to_chat(M, "You can't use this here.") - if(power_station && power_station.engaged && !panel_open) //--FalseIncarnate //Prevents AI cores from using the teleporter, prints out failure messages for clarity @@ -340,7 +331,6 @@ "\red External firewalls prevent you from utilizing this machine!", "\red Your AI core's anti-bluespace failsafes trigger and prevent teleportation!") to_chat(T, "[pick(TPError)]") - return else teleport(M) @@ -446,10 +436,8 @@ linked_stations.Add(M.buffer) M.buffer = null to_chat(user, "You upload the data from the [W.name]'s buffer.") - else to_chat(user, "This station can't hold more information, try to use better parts.") - if(default_deconstruction_screwdriver(user, "controller-o", "controller", W)) update_icon() return @@ -464,12 +452,10 @@ var/obj/item/device/multitool/M = W M.buffer = src to_chat(user, "You download the data to the [W.name]'s buffer.") - return if(istype(W, /obj/item/weapon/wirecutters)) link_console_and_hub() to_chat(user, "You reconnect the station to nearby machinery.") - return /obj/machinery/teleport/station/attack_ai() @@ -481,13 +467,11 @@ else to_chat(user, "Close the maintenance panel first.") - /obj/machinery/teleport/station/proc/toggle(mob/user) if (stat & (BROKEN|NOPOWER) || !teleporter_hub || !teleporter_console) return if (teleporter_hub.panel_open) to_chat(user, "Close the hub's maintenance panel first.") - return if (teleporter_console.target) src.engaged = !src.engaged diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm index f71a4223d31..d117961ff88 100644 --- a/code/game/machinery/transformer.dm +++ b/code/game/machinery/transformer.dm @@ -132,7 +132,6 @@ do_transform_mime(AM) else to_chat(AM, "Only items can be greyscaled.") - return /obj/machinery/transformer/proc/do_transform_mime(var/obj/item/I) diff --git a/code/game/machinery/turntable.dm b/code/game/machinery/turntable.dm index a32ff6260d6..bb69783db22 100644 --- a/code/game/machinery/turntable.dm +++ b/code/game/machinery/turntable.dm @@ -44,7 +44,6 @@ if( href_list["on1"] ) if(src.playing == 0) // to_chat(world, "Should be working...") - var/sound/S = sound('sound/turntable/TestLoop1.ogg') S.repeat = 1 S.channel = 10 @@ -54,9 +53,7 @@ //for(var/mob/M in world) // if(M.loc.loc == src.loc.loc && M.music == 0) // to_chat(world, "Found the song...") - // to_chat(M, S) - // M.music = 1 var/area/A = src.loc.loc @@ -67,22 +64,18 @@ for(var/mob/M in world) if((M.loc.loc in A) && M.music == 0) // to_chat(world, "Found the song...") - to_chat(M, S) - M.music = 1 else if(!(M.loc.loc in A) && M.music == 1) var/sound/Soff = sound(null) Soff.channel = 10 to_chat(M, Soff) - M.music = 0 sleep(10) return if( href_list["on2"] ) if(src.playing == 0) // to_chat(world, "Should be working...") - var/sound/S = sound('sound/turntable/TestLoop2.ogg') S.repeat = 1 S.channel = 10 @@ -92,9 +85,7 @@ //for(var/mob/M in world) // if(M.loc.loc == src.loc.loc && M.music == 0) // to_chat(world, "Found the song...") - // to_chat(M, S) - // M.music = 1 var/area/A = src.loc.loc for(var/obj/machinery/party/lasermachine/L in A) @@ -104,22 +95,18 @@ for(var/mob/M in world) if(M.loc.loc == src.loc.loc && M.music == 0) // to_chat(world, "Found the song...") - to_chat(M, S) - M.music = 1 else if(M.loc.loc != src.loc.loc && M.music == 1) var/sound/Soff = sound(null) Soff.channel = 10 to_chat(M, Soff) - M.music = 0 sleep(10) return if( href_list["on3"] ) if(src.playing == 0) // to_chat(world, "Should be working...") - var/sound/S = sound('sound/turntable/TestLoop3.ogg') S.repeat = 1 S.channel = 10 @@ -129,9 +116,7 @@ //for(var/mob/M in world) // if(M.loc.loc == src.loc.loc && M.music == 0) // to_chat(world, "Found the song...") - // to_chat(M, S) - // M.music = 1 var/area/A = src.loc.loc for(var/obj/machinery/party/lasermachine/L in A) @@ -141,15 +126,12 @@ for(var/mob/M in world) if(M.loc.loc == src.loc.loc && M.music == 0) // to_chat(world, "Found the song...") - to_chat(M, S) - M.music = 1 else if(M.loc.loc != src.loc.loc && M.music == 1) var/sound/Soff = sound(null) Soff.channel = 10 to_chat(M, Soff) - M.music = 0 sleep(10) return @@ -162,7 +144,6 @@ S.wait = 1 for(var/mob/M in world) to_chat(M, S) - M.music = 0 playing = 0 var/area/A = src.loc.loc diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm index 9b703f5478d..0deb0d947a3 100644 --- a/code/game/machinery/turret_control.dm +++ b/code/game/machinery/turret_control.dm @@ -66,12 +66,10 @@ /obj/machinery/turretid/proc/isLocked(mob/user) if(ailock && (isrobot(user) || isAI(user))) to_chat(user, "There seems to be a firewall preventing you from accessing this device.") - return 1 if(locked && !(isrobot(user) || isAI(user) || isobserver(user))) to_chat(user, "Access denied.") - return 1 return 0 @@ -90,18 +88,15 @@ if(src.allowed(usr)) if(emagged) to_chat(user, "The turret control is unresponsive.") - else locked = !locked to_chat(user, "You [ locked ? "lock" : "unlock"] the panel.") - return return ..() /obj/machinery/turretid/emag_act(user as mob) if(!emagged) to_chat(user, "You short out the turret controls' access analysis module.") - emagged = 1 locked = 0 ailock = 0 diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm index 7c4a48c3b3e..ef5db5f833b 100644 --- a/code/game/machinery/turrets.dm +++ b/code/game/machinery/turrets.dm @@ -185,7 +185,6 @@ if(cur_target) //if it's found, proceed // to_chat(world, "[cur_target]") - if(!isPopping()) if(isDown()) popUp() @@ -338,7 +337,6 @@ src.die() else to_chat(M, "That object is useless to you.") - return @@ -355,7 +353,6 @@ src.die() else to_chat(M, "\green That object is useless to you.") - return @@ -366,7 +363,6 @@ if (src.locked) if (!istype(usr, /mob/living/silicon)) to_chat(usr, "Control panel is locked!") - return if (href_list["toggleOn"]) src.enabled = !src.enabled diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index c1271b11cc5..8266c2a0ee8 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -189,7 +189,6 @@ if(machine_content.amount != machine_content.max_amount) if(user) to_chat(user, "[machine_content.max_amount - machine_content.amount] of [machine_content.product_name]") - machine_content.amount = machine_content.max_amount refill.charges -= to_restock total = to_restock @@ -205,7 +204,6 @@ if(restock) if(user) to_chat(user, "[restock] of [machine_content.product_name]") - if(refill.charges == 0) //due to rounding, we ran out of refill charges, exit. break return total @@ -237,7 +235,6 @@ playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1) panel_open = !panel_open to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.") - overlays.Cut() if(panel_open) overlays += image(icon, "[initial(icon_state)]-panel") @@ -263,38 +260,31 @@ coin = W categories |= CAT_COIN to_chat(user, "\blue You insert the [W] into the [src]") - nanomanager.update_uis(src) return else if(istype(W, refill_canister) && refill_canister != null) if(stat & (BROKEN|NOPOWER)) to_chat(user, "It does nothing.") - else if(panel_open) //if the panel is open we attempt to refill the machine var/obj/item/weapon/vending_refill/canister = W if(canister.charges == 0) to_chat(user, "This [canister.name] is empty!") - else var/transfered = refill_inventory(canister,product_records,user) if(transfered) to_chat(user, "You loaded [transfered] items in \the [name].") - else to_chat(user, "The [name] is fully stocked.") - return; else to_chat(user, "You should probably unscrew the service panel first.") - else ..() /obj/machinery/vending/emag_act(user as mob) emagged = 1 to_chat(user, "You short out the product lock on [src]") - return /** @@ -307,7 +297,6 @@ // This is not a status display message, since it's something the character // themselves is meant to see BEFORE putting the money in to_chat(usr, "\icon[cashmoney] That is not enough money.") - return 0 // Bills (banknotes) cannot really have worth different than face value, @@ -466,13 +455,11 @@ if(href_list["remove_coin"] && !istype(usr,/mob/living/silicon)) if(!coin) to_chat(usr, "There is no coin in this machine.") - return usr.put_in_hands(coin) coin = null to_chat(usr, "\blue You remove the [coin] from the [src]") - categories &= ~CAT_COIN if (href_list["pay"]) @@ -498,13 +485,11 @@ if(issilicon(usr) && !isrobot(usr)) to_chat(usr, "The vending machine refuses to interface with you, as you are not in its target demographic!") - return if((!allowed(usr)) && !emagged && scan_id) //For SECURE VENDING MACHINES YEAH to_chat(usr, "Access denied.")//Unless emagged of course - flick(icon_deny,src) return @@ -539,12 +524,10 @@ if((!allowed(usr)) && !emagged && scan_id) //For SECURE VENDING MACHINES YEAH to_chat(usr, "Access denied.")//Unless emagged of course - flick(src.icon_deny,src) return if(!R.amount) to_chat(user, "\red The vending machine has ran out of that product.") - return src.vend_ready = 0 //One thing at a time!! src.status_message = "Vending..." @@ -554,15 +537,12 @@ if (R.category & CAT_COIN) if(!coin) to_chat(user, "\blue You need to insert a coin to get this item.") - return if(coin.string_attached) if(prob(50)) to_chat(user, "\blue You successfully pull the coin out before the [src] could swallow it.") - else to_chat(user, "\blue You weren't able to pull the coin out fast enough, the machine ate it, string and all.") - coin = null qdel(coin) categories &= ~CAT_COIN @@ -592,7 +572,6 @@ /obj/machinery/vending/proc/stock(var/datum/data/vending_product/R, var/mob/user) if(src.panel_open) to_chat(user, "\blue You stock the [src] with \a [R.product_name]") - R.amount++ src.updateUsrDialog() diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index d89fddfd69f..6889cf67c42 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -33,7 +33,6 @@ if( state != 4 ) to_chat(usr, "The washing machine cannot run in this state.") - return if( locate(/mob,contents) ) @@ -201,7 +200,6 @@ /*if(istype(W,/obj/item/weapon/screwdriver)) panel = !panel to_chat(user, "\blue you [panel ? "open" : "close"] the [src]'s maintenance panel")*/ - if(istype(W,/obj/item/toy/crayon) ||istype(W,/obj/item/weapon/stamp)) if( state in list( 1, 3, 6 ) ) if(!crayon) @@ -233,59 +231,45 @@ //YES, it's hardcoded... saves a var/can_be_washed for every single clothing item. if ( istype(W,/obj/item/clothing/suit/space ) ) to_chat(user, "This item does not fit.") - return if ( istype(W,/obj/item/clothing/suit/syndicatefake ) ) to_chat(user, "This item does not fit.") - return // if ( istype(W,/obj/item/clothing/suit/powered ) ) // to_chat(user, "This item does not fit.") - // return if ( istype(W,/obj/item/clothing/suit/cyborg_suit ) ) to_chat(user, "This item does not fit.") - return if ( istype(W,/obj/item/clothing/suit/bomb_suit ) ) to_chat(user, "This item does not fit.") - return if ( istype(W,/obj/item/clothing/suit/armor ) ) to_chat(user, "This item does not fit.") - return if ( istype(W,/obj/item/clothing/suit/armor ) ) to_chat(user, "This item does not fit.") - return if ( istype(W,/obj/item/clothing/mask/gas ) ) to_chat(user, "This item does not fit.") - return if ( istype(W,/obj/item/clothing/mask/cigarette ) ) to_chat(user, "This item does not fit.") - return if ( istype(W,/obj/item/clothing/head/syndicatefake ) ) to_chat(user, "This item does not fit.") - return // if ( istype(W,/obj/item/clothing/head/powered ) ) // to_chat(user, "This item does not fit.") - // return if ( istype(W,/obj/item/clothing/head/helmet ) ) to_chat(user, "This item does not fit.") - return if ( istype(W,/obj/item/clothing/gloves/furgloves ) ) to_chat(user, "This item does not fit.") - return if(W.flags & NODROP) //if "can't drop" item to_chat(user, "\The [W] is stuck to your hand, you cannot put it in the washing machine!") - return if(contents.len < 5) @@ -295,10 +279,8 @@ state = 3 else to_chat(user, "\blue You can't put the item in right now.") - else to_chat(user, "\blue The washing machine is full.") - else ..() update_icon() @@ -321,7 +303,6 @@ state = 1 if(5) to_chat(user, "\red The [src] is busy.") - if(6) state = 7 if(7) diff --git a/code/game/machinery/wishgranter.dm b/code/game/machinery/wishgranter.dm index f0bc8c1e58e..217b1e70165 100644 --- a/code/game/machinery/wishgranter.dm +++ b/code/game/machinery/wishgranter.dm @@ -21,22 +21,18 @@ if(!istype(user, /mob/living/carbon/human)) to_chat(user, "You feel a dark stirring inside of the Wish Granter, something you want nothing of. Your instincts are better than any man's.") - return if(is_special_character(user)) to_chat(user, "Even to a heart as dark as yours, you know nothing good will come of this. Something instinctual makes you pull away.") - return if(inuse) to_chat(user, "Someone is already communing with the Wish Granter.") - return to_chat(user, "The power of the Wish Granter have turned you into the superhero the station deserves. You are a masked vigilante, and answer to no man. Will you use your newfound strength to protect the innocent, or will you hunt the guilty?") - inuse = 1 var/wish if(types.len == 1) @@ -56,7 +52,6 @@ //Remove the wishgranter or teleport it randomly on the station if(!types.len) to_chat(user, "The wishgranter slowly fades into mist...") - qdel(src) return else diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm index b06d02efc41..0d7676d75b7 100644 --- a/code/game/mecha/combat/marauder.dm +++ b/code/game/mecha/combat/marauder.dm @@ -151,7 +151,6 @@ if(zoom) src.occupant.client.view = 12 to_chat(src.occupant, sound('sound/mecha/imag_enh.ogg',volume=50)) - else src.occupant.client.view = world.view//world.view - default mob view size return diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index 75efc280354..1967f1e6645 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -53,10 +53,8 @@ chassis.log_append_to_last("[src] is destroyed.",1) if(istype(src, /obj/item/mecha_parts/mecha_equipment/weapon)) to_chat(chassis.occupant, sound('sound/mecha/weapdestr.ogg',volume=50)) - else to_chat(chassis.occupant, sound('sound/mecha/critdestr.ogg',volume=50)) - chassis = null return ..() diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index 0ab84bd842b..98db55e0f25 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -546,7 +546,6 @@ chassis.log_message("Attacked by [W]. Attacker - [user]") if(prob(chassis.deflect_chance*deflect_coeff)) to_chat(user, "\red The [W] bounces off [chassis] armor.") - chassis.log_append_to_last("Armor saved.") else chassis.occupant_message("[user] hits [chassis] with [W].") @@ -934,7 +933,6 @@ user.visible_message("[user] tries to shove [weapon_name] into [src], but \the [src] rejects it.","[fuel_name] traces in target minimal. [weapon_name] cannot be used as fuel.") else if(!result) to_chat(user, "Unit is full.") - else user.visible_message("[user] loads [src] with \the [weapon_name].","[result] unit\s of [fuel_name] successfully loaded.") return diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index d1e537fd877..d95cbaff799 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -141,7 +141,6 @@ if(istype(H.l_ear, /obj/item/clothing/ears/earmuffs) || istype(H.r_ear, /obj/item/clothing/ears/earmuffs)) continue to_chat(M, "HONK") - M.sleeping = 0 M.stuttering = 20 M.ear_deaf = 30 diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 9d527750470..562e30d834d 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -294,7 +294,6 @@ return 1 if(!allowed(user) && !isobserver(user)) to_chat(user, "Access denied.") - return 1 return interact(user) @@ -507,7 +506,6 @@ return 1 else to_chat(user, "You can't load \the [name] while it's opened.") - return 1 if(istype(W, /obj/item/stack)) @@ -536,11 +534,9 @@ if(being_built) to_chat(user, "\The [src] is currently processing. Please wait until completion.") - return if(res_max_amount - resources[material] < MINERAL_MATERIAL_AMOUNT) //overstuffing the fabricator to_chat(user, "\The [src] [material2name(material)] storage is full.") - return var/obj/item/stack/sheet/stack = W var/sname = "[stack.name]" @@ -551,13 +547,11 @@ resources[material] += transfer_amount * MINERAL_MATERIAL_AMOUNT stack.use(transfer_amount) to_chat(user, "You insert [transfer_amount] [sname] sheet\s into \the [src].") - sleep(10) updateUsrDialog() overlays -= "fab-load-[material2name(material)]" //No matter what the overlay shall still be deleted else to_chat(user, "\The [src] cannot hold any more [sname] sheet\s.") - return /obj/machinery/mecha_part_fabricator/proc/material2name(var/ID) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 7a563b2b35c..ceeca47f72e 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -170,25 +170,18 @@ switch(integrity) if(85 to 100) to_chat(user, "It's fully intact.") - if(65 to 85) to_chat(user, "It's slightly damaged.") - if(45 to 65) to_chat(user, "It's badly damaged.") - if(25 to 45) to_chat(user, "It's heavily damaged.") - else to_chat(user, "It's falling apart.") - if(equipment && equipment.len) to_chat(user, "It's equipped with:") - for(var/obj/item/mecha_parts/mecha_equipment/ME in equipment) to_chat(user, "\icon[ME] [ME]") - return @@ -308,7 +301,6 @@ if(user != src.occupant) //While not "realistic", this piece is player friendly. user.forceMove(get_turf(src)) to_chat(user, "You climb out from [src]") - return 0 if(connected_port) if(world.time - last_message > 20) @@ -467,7 +459,6 @@ pr_internal_damage.start() log_append_to_last("Internal damage of type [int_dam_flag].",1) to_chat(occupant, sound('sound/machines/warning-buzzer.ogg',wait=0)) - diag_hud_set_mechstat() return @@ -537,13 +528,11 @@ src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) playsound(src.loc, 'sound/weapons/slash.ogg', 50, 1, -1) to_chat(user, "\red You slash at the armored suit!") - visible_message("\red The [user] slashes at [src.name]'s armor!") else src.log_append_to_last("Armor saved.") playsound(src.loc, 'sound/weapons/slash.ogg', 50, 1, -1) to_chat(user, "\green Your claws had no effect!") - src.occupant_message("\blue The [user]'s claws are stopped by the armor.") visible_message("\blue The [user] rebounds off [src.name]'s armor!") return @@ -711,7 +700,6 @@ src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) playsound(src.loc, 'sound/effects/blobattack.ogg', 50, 1, -1) to_chat(user, "\red You smash at the armored suit!") - for (var/mob/V in viewers(src)) if(V.client && !(V.blinded)) V.show_message("\red The [user] smashes against [src.name]'s armor!", 1) @@ -719,7 +707,6 @@ src.log_append_to_last("Armor saved.") playsound(src.loc, 'sound/effects/blobattack.ogg', 50, 1, -1) to_chat(user, "\green Your attack had no effect!") - src.occupant_message("\blue The [user]'s attack is stopped by the armor.") for (var/mob/V in viewers(src)) if(V.client && !(V.blinded)) @@ -753,7 +740,6 @@ user.do_attack_animation(src) if(prob(src.deflect_chance)) to_chat(user, "\red The [W] bounces off [src.name] armor.") - src.log_append_to_last("Armor saved.") /* for (var/mob/V in viewers(src)) @@ -776,10 +762,8 @@ if(istype(W, /obj/item/device/mmi) || istype(W, /obj/item/device/mmi/posibrain)) if(mmi_move_inside(W,user)) to_chat(user, "[src]-MMI interface initialized successfuly") - else to_chat(user, "[src]-MMI interface initialization failed.") - return if(istype(W, /obj/item/mecha_parts/mecha_equipment)) @@ -791,7 +775,6 @@ user.visible_message("[user] attaches [W] to [src]", "You attach [W] to [src]") else to_chat(user, "You were unable to attach [W] to [src]") - return if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) if(add_req_access || maint_access) @@ -806,34 +789,27 @@ return else to_chat(user, "\red Invalid ID: Access denied.") - else to_chat(user, "\red Maintenance protocols disabled by operator.") - else if(istype(W, /obj/item/weapon/wrench)) if(state==1) state = 2 to_chat(user, "You undo the securing bolts.") - else if(state==2) state = 1 to_chat(user, "You tighten the securing bolts.") - return else if(istype(W, /obj/item/weapon/crowbar)) if(state==2) state = 3 to_chat(user, "You open the hatch to the power unit") - else if(state==3) state=2 to_chat(user, "You close the hatch to the power unit") - else if(state==4 && pilot_is_mmi()) // Since having maint protocols available is controllable by the MMI, I see this as a consensual way to remove an MMI without destroying the mech user.visible_message("[user] begins levering out the MMI from the [src].", "You begin to lever out the MMI from the [src].") to_chat(occupant, "[user] is prying you out of the exosuit!") - if(do_after(user,80,target=src)) user.visible_message("[user] pries the MMI out of the [src]!", "You finish removing the MMI from the [src]!") go_out() @@ -847,41 +823,34 @@ CC.use(2) clearInternalDamage(MECHA_INT_SHORT_CIRCUIT) to_chat(user, "You replace the fused wires.") - else to_chat(user, "There's not enough wire to finish the task.") - return else if(istype(W, /obj/item/weapon/screwdriver)) if(hasInternalDamage(MECHA_INT_TEMP_CONTROL)) clearInternalDamage(MECHA_INT_TEMP_CONTROL) to_chat(user, "You repair the damaged temperature controller.") - else if(state==3 && src.cell) src.cell.forceMove(src.loc) src.cell = null state = 4 to_chat(user, "You unscrew and pry out the powercell.") - src.log_message("Powercell removed") else if(state==4 && src.cell) state=3 to_chat(user, "You screw the cell in place") - return else if(istype(W, /obj/item/weapon/stock_parts/cell)) if(state==4) if(!src.cell) to_chat(user, "You install the powercell") - user.drop_item() W.forceMove(src) src.cell = W src.log_message("Powercell installed") else to_chat(user, "There's already a powercell installed.") - return else if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != I_HARM) @@ -890,22 +859,18 @@ if (hasInternalDamage(MECHA_INT_TANK_BREACH)) clearInternalDamage(MECHA_INT_TANK_BREACH) to_chat(user, "\blue You repair the damaged gas tank.") - else return if(src.health\the [W] is stuck to your hand, you cannot put it in \the [src]
      ") - return W.forceMove(src) user.visible_message("[user] attaches [W] to [src].", "You attach [W] to [src]") @@ -915,7 +880,6 @@ if(occupant) to_chat(user, "You can't customize a mech while someone is piloting it - that would be unsafe!") - return var/obj/item/weapon/paintkit/P = W @@ -928,7 +892,6 @@ if(!found) to_chat(user, "That kit isn't meant for use on this class of exosuit.") - return user.visible_message("[user] opens [P] and spends some quality time customising [src].") @@ -947,7 +910,6 @@ src.log_message("Attacked by [W]. Attacker - [user]") if(prob(src.deflect_chance)) to_chat(user, "\red The [W] bounces off [src.name] armor.") - src.log_append_to_last("Armor saved.") /* for (var/mob/V in viewers(src)) @@ -969,12 +931,10 @@ if(istype(src, /obj/mecha/working/ripley) && emagged == 0) emagged = 1 to_chat(usr, "\blue You slide the card through the [src]'s ID slot.") - playsound(src.loc, "sparks", 100, 1) src.desc += "
      \red The mech's equipment slots spark dangerously!" else to_chat(usr, "\red The [src]'s ID slot rejects the card.") - return @@ -991,13 +951,10 @@ var/obj/item/mecha_parts/mecha_tracking/B = locate(/obj/item/mecha_parts/mecha_tracking) in src if(B) //Beacons give the AI more detailed mech information. to_chat(user, "Warning: Tracking Beacon detected. Enter at your own risk. Beacon Data:") - to_chat(user, "[B.get_mecha_info()]") - //Nothing like a big, red link to make the player feel powerful! to_chat(user, "ASSUME DIRECT CONTROL?
      ") - /obj/mecha/transfer_ai(var/interaction, mob/user, var/mob/living/silicon/ai/AI, var/obj/item/device/aicard/card) if(!..()) return @@ -1007,16 +964,13 @@ if(AI_TRANS_TO_CARD) //Upload AI from mech to AI card. if(!maint_access) //Mech must be in maint mode to allow carding. to_chat(user, "[name] must have maintenance protocols active in order to allow a transfer.") - return AI = occupant if(!AI || !isAI(occupant)) //Mech does not have an AI for a pilot to_chat(user, "No AI detected in the [name] onboard computer.") - return if (AI.mind.special_role == "malfunction") //Malf AIs cannot leave mechs. Except through death. to_chat(user, "ACCESS DENIED.") - return AI.aiRestorePowerRoutine = 0//So the AI initially has power. AI.control_disabled = 1 @@ -1027,17 +981,13 @@ AI.remote_control = null icon_state = initial(icon_state)+"-open" to_chat(AI, "You have been downloaded to a mobile storage device. Wireless connection offline.") - to_chat(user, "Transfer successful: [AI.name] ([rand(1000,9999)].exe) removed from [name] and stored within local memory.") - if(AI_MECH_HACK) //Called by Malf AI mob on the mech. new /obj/structure/AIcore/deactivated(AI.loc) if(occupant) //Oh, I am sorry, were you using that? to_chat(AI, "Pilot detected! Forced ejection initiated!") - to_chat(occupant, "You have been forcibly ejected!") - go_out(1) //IT IS MINE, NOW. SUCK IT, RD! ai_enter_mech(AI, interaction) @@ -1045,20 +995,16 @@ AI = locate(/mob/living/silicon/ai) in card if(!AI) to_chat(user, "There is no AI currently installed on this device.") - return else if(AI.stat || !AI.client) to_chat(user, "[AI.name] is currently unresponsive, and cannot be uploaded.") - return else if(occupant || dna) //Normal AIs cannot steal mechs! to_chat(user, "Access denied. [name] is [occupant ? "currently occupied" : "secured with a DNA lock"].") - return AI.control_disabled = 0 AI.aiRadio.disabledAi = 0 to_chat(user, "Transfer successful: [AI.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed.") - ai_enter_mech(AI, interaction) //Hack and From Card interactions share some code, so leave that here for both to use. @@ -1070,7 +1016,6 @@ playsound(src, 'sound/machines/windowdoor.ogg', 50, 1) if(!hasInternalDamage()) to_chat(occupant, sound('sound/mecha/nominal.ogg',volume=50)) - AI.cancel_camera() AI.controlled_mech = src AI.remote_control = src @@ -1080,7 +1025,6 @@ : "You have been uploaded to a mech's onboard computer."]") to_chat(AI, "Use Middle-Mouse to activate mech functions and equipment. Click normally for AI interactions.") - ///////////////////////////////////// //////// Atmospheric stuff //////// ///////////////////////////////////// @@ -1233,7 +1177,6 @@ src.log_message("[user] tries to move in.") if (src.occupant) to_chat(usr, "The [src.name] is already occupied!") - src.log_append_to_last("Permission denied.") return var/passed @@ -1245,13 +1188,11 @@ passed = 1 if(!passed) to_chat(user, "Access denied.") - src.log_append_to_last("Permission denied.") return for(var/mob/living/carbon/slime/S in range(1,user)) if(S.Victim == user) to_chat(user, "You're too busy getting your life sucked out of you.") - return visible_message("[user] starts to climb into [src.name]") @@ -1261,10 +1202,8 @@ moved_inside(user) else if(src.occupant!=user) to_chat(user, "[src.occupant] was faster. Try better next time, loser.") - else to_chat(user, "You stop entering the exosuit.") - return /obj/mecha/proc/moved_inside(var/mob/living/carbon/human/H as mob) @@ -1285,7 +1224,6 @@ playsound(src, 'sound/machines/windowdoor.ogg', 50, 1) if(!hasInternalDamage()) to_chat(src.occupant, sound('sound/mecha/nominal.ogg',volume=50)) - return 1 else return 0 @@ -1293,24 +1231,19 @@ /obj/mecha/proc/mmi_move_inside(var/obj/item/device/mmi/mmi_as_oc as obj,mob/user as mob) if(!mmi_as_oc.brainmob || !mmi_as_oc.brainmob.client) to_chat(user, "Consciousness matrix not detected.") - return 0 else if(mmi_as_oc.brainmob.stat) to_chat(user, "Beta-rhythm below acceptable level.") - return 0 else if(occupant) to_chat(user, "Occupant detected.") - return 0 else if(dna && dna!=mmi_as_oc.brainmob.dna.unique_enzymes) to_chat(user, "Stop it!") - return 0 //Added a message here since people assume their first click failed or something./N // to_chat(user, "Installing MMI, please stand by.") - visible_message("\blue [usr] starts to insert an MMI into [src.name]") if(enter_after(40,user)) @@ -1318,25 +1251,20 @@ return mmi_moved_inside(mmi_as_oc,user) else to_chat(user, "Occupant detected.") - else to_chat(user, "You stop inserting the MMI.") - return 0 /obj/mecha/proc/mmi_moved_inside(var/obj/item/device/mmi/mmi_as_oc as obj,mob/user as mob) if(mmi_as_oc && user in range(1)) if(!mmi_as_oc.brainmob || !mmi_as_oc.brainmob.client) to_chat(user, "Consciousness matrix not detected.") - return 0 else if(mmi_as_oc.brainmob.stat) to_chat(user, "Beta-rhythm below acceptable level.") - return 0 if(!user.unEquip(mmi_as_oc)) to_chat(user, "\the [mmi_as_oc] is stuck to your hand, you cannot put it in \the [src]") - return 0 var/mob/brainmob = mmi_as_oc.brainmob brainmob.reset_view(src) @@ -1357,7 +1285,6 @@ src.log_message("[mmi_as_oc] moved in as pilot.") if(!hasInternalDamage()) to_chat(src.occupant, sound('sound/mecha/nominal.ogg',volume=50)) - return 1 else return 0 @@ -1441,7 +1368,6 @@ occupant.SetStunned(5) occupant.SetWeakened(5) to_chat(occupant, "You were blown out of the mech!") - */ src.log_message("[mob_container] moved out.") occupant.reset_view() @@ -1718,7 +1644,6 @@ if(message) if(src.occupant && src.occupant.client) to_chat(src.occupant, "\icon[src] [message]") - return /obj/mecha/proc/log_message(message as text,red=null) @@ -1831,11 +1756,9 @@ if(state==0) state = 1 to_chat(user, "The securing bolts are now exposed.") - else if(state==1) state = 0 to_chat(user, "The securing bolts are now hidden.") - output_maintenance_dialog(filter.getObj("id_card"),user) return if(href_list["set_internal_tank_valve"] && state >=1) @@ -1846,7 +1769,6 @@ if(new_pressure) internal_tank_valve = new_pressure to_chat(user, "The internal pressure valve has been set to [internal_tank_valve]kPa.") - if(href_list["add_req_access"] && add_req_access && filter.getObj("id_card")) if(!in_range(src, usr)) return operation_req_access += filter.getNum("add_req_access") @@ -1868,7 +1790,6 @@ return if(src.occupant && !iscarbon(src.occupant)) to_chat(src.occupant, "You do not have any DNA!") - return src.dna = src.occupant.dna.unique_enzymes src.occupant_message("You feel a prick as the needle takes your DNA sample.") diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm index 7be280bd2b5..f6d627cc505 100644 --- a/code/game/mecha/mecha_construction_paths.dm +++ b/code/game/mecha/mecha_construction_paths.dm @@ -24,13 +24,11 @@ playsound(holder, 'sound/items/Deconstruct.ogg', 50, 1) else to_chat(user, ("There's not enough cable to finish the task.")) - return 0 else if(istype(used_atom, /obj/item/stack)) var/obj/item/stack/S = used_atom if(S.amount < 5) to_chat(user, ("There's not enough material in this stack.")) - return 0 else S.use(5) @@ -58,13 +56,11 @@ playsound(holder, 'sound/items/Deconstruct.ogg', 50, 1) else to_chat(user, ("There's not enough cable to finish the task.")) - return 0 else if(istype(used_atom, /obj/item/stack)) var/obj/item/stack/S = used_atom if(S.amount < 5) to_chat(user, ("There's not enough material in this stack.")) - return 0 else S.use(5) diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm index 2198c472f93..8da0f916425 100644 --- a/code/game/mecha/mecha_wreckage.dm +++ b/code/game/mecha/mecha_wreckage.dm @@ -44,7 +44,6 @@ else if (isemptylist(welder_salvage)) to_chat(user, "What's left on the [src] cannot be removed with a welder, besides the frame itself") - else if(WT.remove_fuel(0,user)) var/type = prob(70)?pick(welder_salvage):null if(type) @@ -55,14 +54,11 @@ salvage_num-- else to_chat(user, "You failed to salvage anything valuable from [src].") - else to_chat(user, "\blue You need more welding fuel to complete this task.") - else if(istype(W, /obj/item/weapon/wirecutters)) if(salvage_num <= 0) to_chat(user, "You don't see anything that can be cut with [W].") - return else if(!isemptylist(wirecutters_salvage)) var/type = prob(70)?pick(wirecutters_salvage):null @@ -72,7 +68,6 @@ salvage_num-- else to_chat(user, "You failed to salvage anything valuable from [src].") - else if(istype(W, /obj/item/weapon/crowbar)) if(!isemptylist(crowbar_salvage)) var/obj/S = pick(crowbar_salvage) @@ -82,7 +77,6 @@ user.visible_message("[user] pries [S] from [src].", "You pry [S] from [src].") else to_chat(user, "You don't see anything that can be pried with [W].") - else ..() return diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index 502a738ae31..7616df4c119 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -37,10 +37,8 @@ if (isslime(M) || isAI(M)) if(M == usr) to_chat(M, "You are unable to buckle yourself to the [src]!") - else to_chat(usr, "You are unable to buckle [M] to the [src]!") - return 0 M.buckled = src diff --git a/code/game/objects/effects/aliens.dm b/code/game/objects/effects/aliens.dm index 16ebeb9a100..320ec09a2ee 100644 --- a/code/game/objects/effects/aliens.dm +++ b/code/game/objects/effects/aliens.dm @@ -319,22 +319,18 @@ switch(status) if(BURST) to_chat(user, "You clear the hatched egg.") - playsound(loc, 'sound/effects/attackblob.ogg', 100, 1) qdel(src) return if(GROWING) to_chat(user, "The child is not developed yet.") - return if(GROWN) to_chat(user, "You retrieve the child.") - Burst(0) return else to_chat(user, "It feels slimy.") - user.changeNext_move(CLICK_CD_MELEE) diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm index 05a1ec2ea67..2b044b588e1 100644 --- a/code/game/objects/effects/anomalies.dm +++ b/code/game/objects/effects/anomalies.dm @@ -36,7 +36,6 @@ if(istype(I, /obj/item/device/analyzer)) to_chat(user, "Analyzing... [src]'s unstable field is fluctuating along frequency [aSignal.code]:[format_frequency(aSignal.frequency)].") - /////////////////////// /obj/effect/anomaly/grav diff --git a/code/game/objects/effects/datacore-effect.dm b/code/game/objects/effects/datacore-effect.dm index a6913f25087..ce970c31916 100644 --- a/code/game/objects/effects/datacore-effect.dm +++ b/code/game/objects/effects/datacore-effect.dm @@ -51,7 +51,6 @@ else isactive[name] = t.fields["p_stat"] // to_chat(world, "[name]: [rank]") - //cael - to prevent multiple appearances of a player/job combination, add a continue after each line var/department = 0 if(real_rank in command_positions) diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 3cda01717c5..b11ad6bf633 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -93,7 +93,6 @@ var/global/list/image/splatter_cache=list() var/taken = rand(1,amount) amount -= taken to_chat(user, "You get some of \the [src] on your hands.") - if (!user.blood_DNA) user.blood_DNA = list() user.blood_DNA |= blood_DNA.Copy() @@ -142,7 +141,6 @@ var/global/list/image/splatter_cache=list() ..(user) to_chat(user, "It reads: \"[message]\"") - /obj/effect/decal/cleanable/blood/gibs name = "gibs" desc = "They look bloody and gruesome." diff --git a/code/game/objects/effects/decals/Cleanable/tracks.dm b/code/game/objects/effects/decals/Cleanable/tracks.dm index 6fc90b31628..6e8c591399d 100644 --- a/code/game/objects/effects/decals/Cleanable/tracks.dm +++ b/code/game/objects/effects/decals/Cleanable/tracks.dm @@ -79,7 +79,6 @@ var/global/list/image/fluidtrack_cache=list() // Process 4 bits for(var/bi=0;bi<4;bi++) to_chat(b=1, bi) - // COMING BIT // If setting if(comingdir&b) diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index e05dd1c074a..446f1f39e89 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -15,14 +15,11 @@ if(src.reagents && W.reagents && !noscoop) if(!src.reagents.total_volume) to_chat(user, "There isn't enough [src] to scoop up!") - return if(W.reagents.total_volume >= W.reagents.maximum_volume) to_chat(user, "[W] is full!") - return to_chat(user, "You scoop the [src] into [W]!") - reagents.trans_to(W, reagents.total_volume) if(!reagents.total_volume && !noclear) //scooped up all of it qdel(src) @@ -34,7 +31,6 @@ src.reagents.handle_reactions() to_chat(user, "You heat [src] with [W]!") - /obj/effect/decal/cleanable/ex_act() if(reagents) for(var/datum/reagent/R in reagents.reagent_list) diff --git a/code/game/objects/effects/decals/contraband.dm b/code/game/objects/effects/decals/contraband.dm index 52f4af032ed..6658838a5d3 100644 --- a/code/game/objects/effects/decals/contraband.dm +++ b/code/game/objects/effects/decals/contraband.dm @@ -60,7 +60,6 @@ if(check) to_chat(user, "The wall is far too cluttered to place a poster!") - return resulting_poster.loc = W //Looks like it's uncluttered enough. Place the poster @@ -312,11 +311,9 @@ obj/structure/sign/poster/attackby(obj/item/I, mob/user, params) playsound(loc, 'sound/items/Wirecutter.ogg', 100, 1) if(ruined) to_chat(user, "You remove the remnants of the poster.") - qdel(src) else to_chat(user, "You carefully remove the poster from the wall.") - roll_and_drop(user.loc) return @@ -358,18 +355,15 @@ obj/structure/sign/poster/attackby(obj/item/I, mob/user, params) for(var/obj/O in user.loc.contents) //Let's see if it already has a poster on it or too much stuff if(istype(O,/obj/structure/sign)) to_chat(user, "The wall is far too cluttered to place a poster!") - return stuff_on_wall++ if(stuff_on_wall >= 4) to_chat(user, "The wall is far too cluttered to place a poster!") - return to_chat(user, "You start placing the poster on the wall...")//Looks like it's uncluttered enough. Place the poster. - //declaring D because otherwise if P gets 'deconstructed' we lose our reference to P.resulting_poster var/obj/structure/sign/poster/D = P.resulting_poster @@ -390,7 +384,6 @@ obj/structure/sign/poster/attackby(obj/item/I, mob/user, params) D.pixel_y = 0 else to_chat(user, "You cannot reach the wall from here!") - return flick("poster_being_set",D) @@ -404,7 +397,6 @@ obj/structure/sign/poster/attackby(obj/item/I, mob/user, params) if(istype(src,/turf/simulated/wall) && user && user.loc == temp_loc) //Let's check if everything is still there to_chat(user, "You place the poster!") - else D.roll_and_drop(temp_loc) return diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index 59b13eb3be1..744edcd7711 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -1094,7 +1094,6 @@ steam.start() -- spawns the effect else to_chat(user, "You hit the metal foam but bounce off it.") - /obj/structure/foamedmetal/attackby(var/obj/item/I, var/mob/user, params) user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(src) @@ -1112,7 +1111,6 @@ steam.start() -- spawns the effect else to_chat(user, "You hit the metal foam to no effect.") - /obj/structure/foamedmetal/attack_animal(mob/living/simple_animal/M) M.do_attack_animation(src) if(M.melee_damage_upper == 0) @@ -1159,11 +1157,9 @@ steam.start() -- spawns the effect for(var/mob/M in viewers(5, location)) to_chat(M, "\red The solution violently explodes.") - for(var/mob/M in viewers(1, location)) if (prob (50 * amount)) to_chat(M, "\red The explosion knocks you down.") - M.Weaken(rand(1,5)) return else @@ -1188,7 +1184,6 @@ steam.start() -- spawns the effect for(var/mob/M in viewers(8, location)) to_chat(M, "\red The solution violently explodes.") - explosion(location, devastation, heavy, light, flash) proc/holder_damage(var/atom/holder) diff --git a/code/game/objects/effects/gibs.dm b/code/game/objects/effects/gibs.dm index a630ca27106..a9e165666fc 100644 --- a/code/game/objects/effects/gibs.dm +++ b/code/game/objects/effects/gibs.dm @@ -26,7 +26,6 @@ proc/Gib(atom/location, var/list/viruses = list(), var/datum/dna/MobDNA = null) if(gibtypes.len != gibamounts.len || gibamounts.len != gibdirections.len) to_chat(world, "\red Gib list length mismatch!") - return var/obj/effect/decal/cleanable/blood/gibs/gib = null diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 0c3ee5d99ab..6e54e69cf92 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -22,7 +22,6 @@ if(istype(M, /mob/living/carbon/human)) for(var/mob/O in viewers(world.view, src.loc)) to_chat(O, "[M] triggered the \icon[src] [src]") - triggered = 1 call(src,triggerproc)(M) diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 2d1510bbf16..f87e97f9cb0 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -66,7 +66,6 @@ else if(istype(mover, /mob/living)) if(prob(50)) to_chat(mover, "You get stuck in \the [src] for a moment.") - return 0 else if(istype(mover, /obj/item/projectile)) return prob(30) @@ -209,7 +208,6 @@ S.key = C.key if(master_commander) to_chat(S, "You are a spider who is loyal to [master_commander], obey [master_commander]'s every order and assist them in completing their goals at any cost.") - qdel(src) /obj/effect/decal/cleanable/spiderling_remains diff --git a/code/game/objects/empulse.dm b/code/game/objects/empulse.dm index 159fed83a2f..6bf7b8dac11 100644 --- a/code/game/objects/empulse.dm +++ b/code/game/objects/empulse.dm @@ -17,7 +17,6 @@ for(var/mob/M in range(heavy_range, epicenter)) to_chat(M, 'sound/effects/EMPulse.ogg') - for(var/atom/T in range(light_range, epicenter)) var/distance = get_dist(epicenter, T) if(distance < 0) diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm index 98e14266aa8..d21767cb4c0 100644 --- a/code/game/objects/explosion.dm +++ b/code/game/objects/explosion.dm @@ -75,7 +75,6 @@ if(M.ear_deaf <= 0 || !M.ear_deaf) if(!istype(M.loc,/turf/space)) to_chat(M, 'sound/effects/explosionfar.ogg') - if(heavy_impact_range > 1) var/datum/effect/system/explosion/E = new/datum/effect/system/explosion() E.set_up(epicenter) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 4fc9eb3a1ba..8c4bf753108 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -165,7 +165,6 @@ to_chat(user, msg) - /obj/item/attack_hand(mob/user as mob) if (!user) return 0 if (hasorgans(user)) @@ -175,11 +174,9 @@ temp = H.organs_by_name["l_hand"] if(!temp) to_chat(user, "You try to use your hand, but it's missing!") - return 0 if(temp && !temp.is_usable()) to_chat(user, "You try to move your [temp.name], but cannot!") - return 0 if (istype(src.loc, /obj/item/weapon/storage)) @@ -211,7 +208,6 @@ if(src in A.contents) // To stop Aliens having items stuck in their pockets A.unEquip(src) to_chat(user, "Your claws aren't capable of such fine manipulation.") - return if (istype(src.loc, /obj/item/weapon/storage)) @@ -239,7 +235,6 @@ if(src in A.contents) // To stop Aliens having items stuck in their pockets A.unEquip(src) to_chat(user, "Your claws aren't capable of such fine manipulation.") - return attack_hand(A) @@ -274,14 +269,11 @@ S.handle_item_insertion(I, 1) //The 1 stops the "You put the [src] into [S]" insertion message from being displayed. if(success && !failure) to_chat(user, "You put everything in [S].") - else if(success) to_chat(user, "You put some things in [S].") - else to_chat(user, "You fail to pick anything up with [S].") - else if(S.can_be_inserted(src)) S.handle_item_insertion(src) @@ -352,27 +344,21 @@ return if((!istype(usr, /mob/living/carbon)) || (istype(usr, /mob/living/carbon/brain)))//Is humanoid, and is not a brain to_chat(usr, "\red You can't pick things up!") - return if( usr.stat || usr.restrained() )//Is not asleep/dead and is not restrained to_chat(usr, "\red You can't pick things up!") - return if(src.anchored) //Object isn't anchored to_chat(usr, "\red You can't pick that up!") - return if(!usr.hand && usr.r_hand) //Right hand is not full to_chat(usr, "\red Your right hand is full.") - return if(usr.hand && usr.l_hand) //Left hand is not full to_chat(usr, "\red Your left hand is full.") - return if(!istype(src.loc, /turf)) //Object is on a turf to_chat(usr, "\red You can't pick that up!") - return //All checks are done, time to pick it up! usr.UnarmedAttack(src) @@ -407,12 +393,10 @@ )) // you can't stab someone in the eyes wearing a mask! to_chat(user, "You're going to need to remove that mask/helmet/glasses first!") - return if(istype(M, /mob/living/carbon/alien) || istype(M, /mob/living/carbon/slime))//Aliens don't have eyes./N slimes also don't have eyes! to_chat(user, "You cannot locate any eyes on this creature!") - return if(!iscarbon(user)) @@ -447,11 +431,9 @@ if(M.stat != 2) if(!(eyes.status & ORGAN_ROBOT) || !(eyes.status & ORGAN_ASSISTED)) //robot eyes bleeding might be a bit silly to_chat(M, "Your eyes start to bleed profusely!") - if(prob(50)) if(M.stat != 2) to_chat(M, "You drop what you're holding and clutch at your eyes!") - M.drop_item() M.eye_blurry += 10 M.Paralyse(1) @@ -459,7 +441,6 @@ if (eyes.damage >= eyes.min_broken_damage) if(M.stat != 2) to_chat(M, "You go blind!") - var/obj/item/organ/external/affecting = H.get_organ("head") if(affecting.take_damage(7)) H.UpdateDamageIcon() @@ -536,7 +517,6 @@ if(flags & ABSTRACT) //Abstract items like grabs won't wash. No-drop items will though because it's still technically an item in your hand. return to_chat(user, "You start washing [src]...") - if(!do_after(user, 40, target = source)) return clean_blood() diff --git a/code/game/objects/items/ashtray.dm b/code/game/objects/items/ashtray.dm index 3eedff16d93..0e977fc5ead 100644 --- a/code/game/objects/items/ashtray.dm +++ b/code/game/objects/items/ashtray.dm @@ -20,7 +20,6 @@ if (istype(W,/obj/item/weapon/cigbutt) || istype(W,/obj/item/clothing/mask/cigarette) || istype(W, /obj/item/weapon/match)) if (contents.len >= max_butts) to_chat(user, "This ashtray is full.") - return user.unEquip(W) W.loc = src @@ -36,7 +35,6 @@ else if (cig.lit == 0) to_chat(user, "You place [cig] in [src] without even smoking it. Why would you do that?") - src.visible_message("[user] places [W] in [src].") user.update_inv_l_hand() user.update_inv_r_hand() @@ -50,7 +48,6 @@ else health = max(0,health - W.force) to_chat(user, "You hit [src] with [W].") - if (health < 1) die() return diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index 1d145d2319f..6dd269176b3 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -133,15 +133,12 @@ switch(res) if(ROOM_ERR_SPACE) to_chat(usr, "The new area must be completely airtight.") - return if(ROOM_ERR_TOOLARGE) to_chat(usr, "The new area is too large.") - return else to_chat(usr, "Error! Please notify administration.") - return var/list/turf/turfs = res var/str = trim(stripped_input(usr,"New area name:", "Blueprint Editing", "", MAX_NAME_LEN)) @@ -149,14 +146,12 @@ return if(length(str) > 50) to_chat(usr, "The given name is too long. The area remains undefined.") - return var/area/A = new A.name = str //var/ma //ma = A.master ? "[A.master]" : "(null)" // to_chat(world, "DEBUG: create_area:
      A.name=[A.name]
      A.tag=[A.tag]
      A.master=[ma]") - A.power_equip = 0 A.power_light = 0 A.power_environ = 0 @@ -179,12 +174,10 @@ return if(length(str) > 50) to_chat(usr, "The given name is too long. The area's name is unchanged.") - return set_area_machinery_title(A,str,prevname) A.name = str to_chat(usr, "You rename the '[prevname]' to '[str]'.") - interact() return 1 diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index c61be6a265a..108dfd28de8 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -58,7 +58,6 @@ return else if(istype(W, /obj/item/weapon/wirecutters)) to_chat(user, "You cut the tag off the bodybag") - src.name = "body bag" src.overlays.Cut() return @@ -92,7 +91,6 @@ if(!open()) to_chat(user, "It won't budge!") - /obj/item/bodybag/cryobag name = "stasis bag" desc = "A folded, non-reusable bag designed for the preservation of an occupant's brain by stasis." @@ -129,7 +127,6 @@ if((over_object == usr && (in_range(src, usr) || usr.contents.Find(src)))) if(!ishuman(usr)) return to_chat(usr, "\red You can't fold that up anymore..") - ..() attackby(W as obj, mob/user as mob, params) @@ -137,8 +134,6 @@ if(src.allowed(user)) src.locked = !src.locked to_chat(user, "The controls are now [src.locked ? "locked." : "unlocked."]") - else to_chat(user, "\red Access denied.") - return \ No newline at end of file diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 36e0b54f356..6da176f8ba8 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -86,16 +86,13 @@ else if(graffiti.Find(drawtype)) temp = "graffiti" to_chat(user, "You start drawing a [temp] on the [target.name].") - if(instant || do_after(user, 50, target = target)) new /obj/effect/decal/cleanable/crayon(target,colour,drawtype,temp) to_chat(user, "You finish drawing [temp].") - if(uses) uses-- if(!uses) to_chat(user, "You used up your [src.name]!") - qdel(src) return @@ -103,13 +100,11 @@ var/huffable = istype(src,/obj/item/toy/crayon/spraycan) if(M == user) to_chat(user, "You take a [huffable ? "huff" : "bite"] of the [src.name]. Delicious!") - user.nutrition += 5 if(uses) uses -= 5 if(uses <= 0) to_chat(user, "There is no more of [src.name] left!") - qdel(src) else ..() @@ -220,7 +215,6 @@ switch(choice) if("Toggle Cap") to_chat(user, "You [capped ? "Remove" : "Replace"] the cap of the [src]") - capped = capped ? 0 : 1 icon_state = "spraycan[capped ? "_cap" : ""]" update_icon() diff --git a/code/game/objects/items/dehy_carp.dm b/code/game/objects/items/dehy_carp.dm index dea1ecd516e..991d04fbd63 100644 --- a/code/game/objects/items/dehy_carp.dm +++ b/code/game/objects/items/dehy_carp.dm @@ -13,7 +13,6 @@ src.add_fingerprint(user) // Anyone can add their fingerprints to it with this if(owned) to_chat(user, "[src] stares up at you with friendly eyes.") - owner = user owned = 0 return ..() @@ -23,7 +22,6 @@ if(!proximity) return if(istype(O,/obj/structure/sink)) to_chat(user, "You place [src] under a stream of water...") - user.drop_item() loc = get_turf(O) return Swell() diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index 00d8999b81e..1bf7edac749 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -84,7 +84,6 @@ flush = 1 AI.suiciding = 1 to_chat(AI, "Your core files are being wiped!") - while (AI && AI.stat != DEAD) AI.adjustOxyLoss(2) AI.updatehealth() @@ -94,16 +93,12 @@ if (href_list["radio"]) AI.aiRadio.disabledAi = text2num(href_list["radio"]) to_chat(AI, "Your Subspace Transceiver has been [AI.aiRadio.disabledAi ? "disabled" : "enabled"]!") - to_chat(user, "You [AI.aiRadio.disabledAi ? "disable" : "enable"] the AI's Subspace Transceiver.") - if (href_list["wireless"]) AI.control_disabled = text2num(href_list["wireless"]) to_chat(AI, "Your wireless interface has been [AI.control_disabled ? "disabled" : "enabled"]!") - to_chat(user, "You [AI.control_disabled ? "disable" : "enable"] the AI's wireless interface.") - update_icon() return 1 diff --git a/code/game/objects/items/devices/autopsy.dm b/code/game/objects/items/devices/autopsy.dm index 45e06357b97..25e4d12614d 100644 --- a/code/game/objects/items/devices/autopsy.dm +++ b/code/game/objects/items/devices/autopsy.dm @@ -80,7 +80,6 @@ set name = "Print Data" if(usr.stat || !(istype(usr,/mob/living/carbon/human))) to_chat(usr, "No.") - return var/scan_data = "" @@ -189,17 +188,14 @@ src.timeofdeath = null to_chat(user, "\red A new patient has been registered.. Purging data for previous patient.") - src.timeofdeath = M.timeofdeath var/obj/item/organ/external/S = M.get_organ(user.zone_sel.selecting) if(!S) to_chat(usr, "You can't scan this body part.") - return if(!S.open) to_chat(usr, "You have to cut the limb open first!") - return for(var/mob/O in viewers(M)) O.show_message("\red [user.name] scans the wounds on [M.name]'s [S.name] with \the [src.name]", 1) diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm index 2a909561d8a..003110f76cd 100644 --- a/code/game/objects/items/devices/camera_bug.dm +++ b/code/game/objects/items/devices/camera_bug.dm @@ -63,7 +63,6 @@ var/turf/T = get_turf(user.loc) if(T.z != current.z || !current.can_use()) to_chat(user, "[src] has lost the signal.") - current = null user.reset_view(null) user.unset_machine() @@ -224,12 +223,10 @@ if(istype(C)) if(!C.can_use()) to_chat(usr, "Something's wrong with that camera. You can't get a feed.") - return var/turf/T = get_turf(loc) if(!T || C.z != T.z) to_chat(usr, "You can't get a signal.") - return current = C spawn(6) diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index 35ab95e05a3..d8a708d86b7 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -32,7 +32,6 @@ if(istype(target,/obj/item) && !istype(target, /obj/item/weapon/disk/nuclear)) playsound(get_turf(src), 'sound/weapons/flash.ogg', 100, 1, -6) to_chat(user, "Scanned [target].") - saved_item = target.type saved_icon = target.icon saved_icon_state = target.icon_state @@ -47,7 +46,6 @@ qdel(active_dummy) active_dummy = null to_chat(usr, "You deactivate \the [src].") - var/obj/effect/overlay/T = new/obj/effect/overlay(get_turf(src)) T.icon = 'icons/effects/effects.dmi' flick("emppulse",T) @@ -61,7 +59,6 @@ C.activate(O, usr, saved_icon, saved_icon_state, saved_overlays, saved_underlays, src) qdel(O) to_chat(usr, "You activate \the [src].") - var/obj/effect/overlay/T = new/obj/effect/overlay(get_turf(src)) T.icon = 'icons/effects/effects.dmi' flick("emppulse",T) @@ -111,19 +108,16 @@ /obj/effect/dummy/chameleon/attackby() for(var/mob/M in src) to_chat(M, "Your chameleon-projector deactivates.") - master.disrupt() /obj/effect/dummy/chameleon/attack_hand() for(var/mob/M in src) to_chat(M, "Your chameleon-projector deactivates.") - master.disrupt() /obj/effect/dummy/chameleon/ex_act(var/severity) //no longer bomb-proof for(var/mob/M in src) to_chat(M, "Your chameleon-projector deactivates.") - spawn() M.ex_act(severity) master.disrupt() @@ -131,7 +125,6 @@ /obj/effect/dummy/chameleon/bullet_act() for(var/mob/M in src) to_chat(M, "Your chameleon-projector deactivates.") - ..() master.disrupt() diff --git a/code/game/objects/items/devices/debugger.dm b/code/game/objects/items/devices/debugger.dm index 9c9bfb6754f..4b96ba904dd 100644 --- a/code/game/objects/items/devices/debugger.dm +++ b/code/game/objects/items/devices/debugger.dm @@ -25,26 +25,20 @@ var/obj/machinery/power/apc/A = O if(A.emagged || A.malfhack) to_chat(user, "\red There is a software error with the device.") - else to_chat(user, "\blue The device's software appears to be fine.") - return 1 if(istype(O, /obj/machinery/door)) var/obj/machinery/door/D = O if(D.operating == -1) to_chat(user, "\red There is a software error with the device.") - else to_chat(user, "\blue The device's software appears to be fine.") - return 1 else if(istype(O, /obj/machinery)) var/obj/machinery/A = O if(A.emagged) to_chat(user, "\red There is a software error with the device.") - else to_chat(user, "\blue The device's software appears to be fine.") - return 1 \ No newline at end of file diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index 9012d6b7d54..92613e6af3e 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -28,16 +28,13 @@ if(istype(W, /obj/item/weapon/screwdriver)) if(battery_panel) to_chat(user, "You close the battery compartment on the [src].") - battery_panel = 0 else to_chat(user, "You open the battery compartment on the [src].") - battery_panel = 1 if(battery_panel && !overcharged) if(istype(W, /obj/item/weapon/stock_parts/cell)) to_chat(user, "You jam the cell into battery compartment on the [src].") - qdel(W) overcharged = 1 overlays += "overcharge" @@ -89,18 +86,14 @@ M.Stun(1) visible_message("[user] blinds [M] with the flash!") to_chat(user, "You blind [M] with the flash!") - to_chat(M, "[user] blinds you with the flash!") - if(M.weakeyes) M.Stun(2) M.visible_message("[M] gasps and shields their eyes!", "You gasp and shields your eyes!") else visible_message("[user] fails to blind [M] with the flash!") to_chat(user, "You fail to blind [M] with the flash!") - to_chat(M, "[user] fails to blind you with the flash!") - else if(M.flash_eyes()) M.confused += power @@ -168,15 +161,12 @@ if(resisted) to_chat(user, "This mind seems resistant to the [src.name]!") - else to_chat(user, "They must be conscious before you can convert them!") - else to_chat(user, "This mind is so vacant that it is not susceptible to influence!") - /obj/item/device/flash/cyborg origin_tech = null diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 2d19d03113d..5ff8f7dff33 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -33,7 +33,6 @@ if(!isturf(user.loc)) to_chat(user, "You cannot turn the light on while in this [user.loc].")//To prevent some lighting anomalities. - return 0 on = !on update_brightness(user) @@ -49,13 +48,11 @@ if(!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") //don't have dexterity to_chat(user, "You don't have the dexterity to do this!") - return var/mob/living/carbon/human/H = M //mob has protective eyewear if(istype(M, /mob/living/carbon/human) && ((H.head && H.head.flags & HEADCOVERSEYES) || (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || (H.glasses && H.glasses.flags & GLASSESCOVERSEYES))) to_chat(user, "You're going to need to remove that [(H.head && H.head.flags & HEADCOVERSEYES) ? "helmet" : (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) ? "mask": "glasses"] first.") - return if(M == user) //they're using it on themselves @@ -73,14 +70,11 @@ if(istype(M, /mob/living/carbon/human)) //robots and aliens are unaffected if(M.stat == DEAD || M.sdisabilities & BLIND) //mob is dead or fully blind to_chat(user, "[M] pupils does not react to the light!") - else if(XRAY in M.mutations) //mob has X-RAY vision to_chat(user, "[M] pupils give an eerie glow!") - else //they're okay! if(M.flash_eyes(visual = 1)) to_chat(user, "[M]'s pupils narrow.") - else return ..() @@ -200,7 +194,6 @@ obj/item/device/flashlight/lamp/bananalamp // Usual checks if(!fuel) to_chat(user, "It's out of fuel.") - return if(on) return @@ -282,9 +275,7 @@ obj/item/device/flashlight/lamp/bananalamp var/mob/M = A add_logs(M, user, "attacked", object="EMP-light") to_chat(user, "\The [src] now has [emp_cur_charges] charge\s.") - A.emp_act(1) else to_chat(user, "\The [src] needs time to recharge!") - return \ No newline at end of file diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index a2e4822f915..48e477cc258 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -51,15 +51,12 @@ W.loc = src diode = W to_chat(user, "You install a [diode.name] in [src].") - else to_chat(user, "[src] already has a cell.") - else if(istype(W, /obj/item/weapon/screwdriver)) if(diode) to_chat(user, "You remove the [diode.name] from the [src].") - diode.loc = get_turf(src.loc) diode = null return @@ -76,11 +73,9 @@ return if (!diode) to_chat(user, "You point [src] at [target], but nothing happens!") - return if (!user.IsAdvancedToolUser()) to_chat(user, "You don't have the dexterity to do this!") - return add_fingerprint(user) @@ -88,7 +83,6 @@ //nothing happens if the battery is drained if(recharge_locked) to_chat(user, "You point [src] at [target], but it's still charging.") - return var/outmsg @@ -122,7 +116,6 @@ S.flash_eyes(affect_silicon = 1) S.Weaken(rand(5,10)) to_chat(S, "Your sensors were overloaded by a laser!") - outmsg = "You overload [S] by shining [src] at their sensors." S.attack_log += text("\[[time_stamp()]\] Has had a laser pointer shone in their eyes by [user.name] ([user.ckey])") @@ -162,11 +155,9 @@ if(outmsg) to_chat(user, outmsg) - else to_chat(user, "You point [src] at [target].") - energy -= 1 if(energy <= max_energy) if(!recharging) @@ -174,7 +165,6 @@ processing_objects.Add(src) if(energy <= 0) to_chat(user, "You've overused the battery of [src], now it needs time to recharge!") - recharge_locked = 1 flick_overlay(I, showto, 10) diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index a22b11a7030..9dec685efb8 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -70,7 +70,6 @@ if(..(user, 2)) to_chat(user, "It has [uses] lights remaining.") - /obj/item/device/lightreplacer/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/stack/sheet/glass)) var/obj/item/stack/sheet/glass/G = W @@ -78,7 +77,6 @@ var/remaining = max(G.amount - decrement, 0) if(!remaining && !(G.amount - decrement) == 0) to_chat(user, "There isn't enough glass.") - return G.amount = remaining if(!G.amount) @@ -86,7 +84,6 @@ qdel(G) AddUses(increment) to_chat(user, "You insert a piece of glass into the [src.name]. You have [uses] lights remaining.") - return if(istype(W, /obj/item/weapon/light)) @@ -95,13 +92,11 @@ if(uses < max_uses) AddUses(1) to_chat(user, "You insert the [L.name] into the [src.name]. You have [uses] lights remaining.") - user.drop_item() qdel(L) return else to_chat(user, "You need a working light.") - return /obj/item/device/lightreplacer/emag_act(user as mob) @@ -115,12 +110,10 @@ if(R.emagged) src.Emag() to_chat(usr, "You shortcircuit the [src].") - return */ to_chat(usr, "It has [uses] lights remaining.") - /obj/item/device/lightreplacer/update_icon() icon_state = "lightreplacer[emagged]" @@ -148,7 +141,6 @@ if(!Use(U)) return to_chat(U, "You replace the [target.fitting] with the [src].") - if(target.status != LIGHT_EMPTY) var/obj/item/weapon/light/L1 = new target.light_type(target.loc) @@ -182,11 +174,9 @@ else to_chat(U, failmsg) - return else to_chat(U, "There is a working [target.fitting] already inserted.") - return /obj/item/device/lightreplacer/proc/Emag() diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm index 532a620e17d..7028153dff2 100644 --- a/code/game/objects/items/devices/megaphone.dm +++ b/code/game/objects/items/devices/megaphone.dm @@ -15,26 +15,21 @@ if (user.client) if(user.client.prefs.muted & MUTE_IC) to_chat(src, "\red You cannot speak in IC (muted).") - return if(!ishuman(user)) to_chat(user, "\red You don't know how to use this!") - return if(user.silent) to_chat(user, "You find yourself unable to speak at all.") - return if(ishuman(user)) var/mob/living/carbon/human/H = user if(H && H.mind) if(H.mind.miming) to_chat(user, "Your vow of silence prevents you from speaking.") - return if(spamcheck) to_chat(user, "\red \The [src] needs to recharge!") - return var/message = input(user, "Shout a message:", "Megaphone") as text|null @@ -51,7 +46,6 @@ insults-- else to_chat(user, "\red *BZZZZzzzzzt*") - else saymsg(user, message) @@ -68,6 +62,5 @@ /obj/item/device/megaphone/emag_act(user as mob) if(!emagged) to_chat(user, "\red You overload \the [src]'s voice synthesizer.") - emagged = 1 insults = rand(1, 3)//to prevent dickflooding diff --git a/code/game/objects/items/devices/modkit.dm b/code/game/objects/items/devices/modkit.dm index decb6a04243..7c1d4d6d7f2 100644 --- a/code/game/objects/items/devices/modkit.dm +++ b/code/game/objects/items/devices/modkit.dm @@ -23,7 +23,6 @@ if(!parts) to_chat(user, "This kit has no parts for this modification left.") - user.unEquip(src) qdel(src) return @@ -36,19 +35,16 @@ var/obj/item/clothing/I = O if (!istype(I) || !allowed) to_chat(user, "[src] is unable to modify that.") - return var/excluding = ("exclude" in I.species_restricted) var/in_list = (target_species in I.species_restricted) if (excluding ^ in_list) to_chat(user, "[I] is already modified.") - return if(!isturf(O.loc)) to_chat(user, "[O] must be safely placed on the ground for modification.") - return playsound(user.loc, 'sound/items/Screwdriver.ogg', 100, 1) @@ -70,7 +66,6 @@ ..(user) to_chat(user, "It looks as though it modifies hardsuits to fit [target_species] users.") - /obj/item/device/modkit/tajaran name = "Tajaran hardsuit modification kit" desc = "A kit containing all the needed tools and parts to modify a hardsuit for another user. This one looks like it's meant for Tajaran." diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index de8730df8c9..2dd138265e7 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -244,19 +244,16 @@ var/mob/M = usr if(!istype(M, /mob/living/carbon)) to_chat(usr, "You don't have any DNA, or your DNA is incompatible with this device.") - else var/datum/dna/dna = usr.dna pai.master = M.real_name pai.master_dna = dna.unique_enzymes to_chat(pai, "

      You have been bound to a new master.

      ") - if(href_list["request"]) var/delta = (world.time / 10) - last_request if(request_cooldown > delta) var/cooldown_time = round(request_cooldown - ((world.time / 10) - last_request), 1) to_chat(usr, "\red The request system is currently offline. Please wait another [cooldown_time] seconds.") - return last_request = world.time / 10 src.looking_for_personality = 1 @@ -266,13 +263,9 @@ if(confirm == "Yes") for(var/mob/M in src) to_chat(M, "

      You feel yourself slipping away from reality.

      ") - to_chat(M, "

      Byte by byte you lose your sense of self.

      ") - to_chat(M, "

      Your mental faculties leave you.

      ") - to_chat(M, "
      oblivion...
      ") - var/mob/living/silicon/pai/P = M if(istype(P)) if(P.resting || P.canmove) @@ -291,11 +284,8 @@ if(newlaws) pai.pai_laws = newlaws to_chat(pai, "Your supplemental directives have been updated. Your new directives are:") - to_chat(pai, "Prime Directive:
      [pai.pai_law0]") - to_chat(pai, "Supplemental Directives:
      [pai.pai_laws]") - attack_self(usr) // WIRE_SIGNAL = 1 diff --git a/code/game/objects/items/devices/pipe_painter.dm b/code/game/objects/items/devices/pipe_painter.dm index efa5fb962a5..d663ead8906 100644 --- a/code/game/objects/items/devices/pipe_painter.dm +++ b/code/game/objects/items/devices/pipe_painter.dm @@ -21,7 +21,6 @@ var/turf/T = P.loc if (P.level < 2 && T.level==1 && isturf(T) && T.intact) to_chat(user, "You must remove the plating first.") - return P.change_color(pipe_colors[mode]) @@ -32,4 +31,3 @@ /obj/item/device/pipe_painter/examine(mob/user) ..(user) to_chat(user, "It is in [mode] mode.") - diff --git a/code/game/objects/items/devices/pizza_bomb.dm b/code/game/objects/items/devices/pizza_bomb.dm index 02bb1fde61d..984c98730f4 100644 --- a/code/game/objects/items/devices/pizza_bomb.dm +++ b/code/game/objects/items/devices/pizza_bomb.dm @@ -14,7 +14,6 @@ /obj/item/device/pizza_bomb/attack_self(mob/user) if(disarmed) to_chat(user, "\The [src] is disarmed.") - return if(!timer_set) name = "pizza bomb" @@ -31,7 +30,6 @@ timer = Clamp(timer, 10, 100) icon_state = "pizzabox1" to_chat(user, "You set the timer to [timer / 10] before activating the payload and closing \the [src].") - message_admins("[key_name_admin(usr)] has set a timer on a pizza bomb to [timer/10] seconds at (JMP).") log_game("[key_name(usr)] has set the timer on a pizza bomb to [timer/10] seconds ([loc.x],[loc.y],[loc.z]).") armer = usr @@ -44,7 +42,6 @@ icon_state = "pizzabox_bomb" audible_message("\icon[src] *beep* *beep*") to_chat(user, "That's no pizza! That's a bomb!") - message_admins("[key_name_admin(usr)] has triggered a pizza bomb armed by [armer] at (JMP).") log_game("[key_name(usr)] has triggered a pizza bomb armed by [armer] ([loc.x],[loc.y],[loc.z]).") primed = 1 @@ -63,7 +60,6 @@ /obj/item/device/pizza_bomb/attackby(var/obj/item/I, var/mob/user, params) if(istype(I, /obj/item/weapon/wirecutters) && primed) to_chat(user, "Oh God, what wire do you cut?!") - var/chosen_wire = input(user, "OH GOD OH GOD", "WHAT WIRE?!") in wires if(!in_range(src, usr) || issilicon(usr) || !usr.canmove || usr.restrained()) return @@ -73,7 +69,6 @@ if(chosen_wire == correct_wire) src.audible_message("\icon[src] \The [src] suddenly stops beeping and seems lifeless.") to_chat(user, "You did it!") - icon_state = "pizzabox_bomb_[correct_wire]" name = "pizza bomb" desc = "A devious contraption, made of a small explosive payload hooked up to pressure-sensitive wires. It's disarmed." @@ -82,13 +77,11 @@ return else to_chat(user, "WRONG WIRE!") - go_boom() return if(istype(I, /obj/item/weapon/wirecutters) && disarmed) if(!in_range(user, src)) to_chat(user, "You can't see the box well enough to cut the wires out.") - return user.visible_message("[user] starts removing the payload and wires from \the [src].") if(do_after(user, 40, target = src)) diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index e33fe869f42..8f6f60bd11b 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -37,7 +37,6 @@ attached = locate() in T if(!attached) to_chat(user, "No exposed cable here to attach to.") - return else anchored = 1 @@ -48,7 +47,6 @@ return else to_chat(user, "Device must be placed over an exposed cable to attach to it.") - return else if (mode == 2) diff --git a/code/game/objects/items/devices/radio/beacon.dm b/code/game/objects/items/devices/radio/beacon.dm index 7b76061b020..af68ee8eeda 100644 --- a/code/game/objects/items/devices/radio/beacon.dm +++ b/code/game/objects/items/devices/radio/beacon.dm @@ -23,7 +23,6 @@ syndicate = 1 to_chat(user, "\blue The This beacon now only be locked on to by emagged teleporters!") - /obj/item/device/radio/beacon/hear_talk() return @@ -60,7 +59,6 @@ /obj/item/device/radio/beacon/syndicate/attack_self(mob/user as mob) if(user) to_chat(user, "\blue Locked In") - new /obj/machinery/power/singularity_beacon/syndicate( user.loc ) playsound(src, 'sound/effects/pop.ogg', 100, 1, 1) qdel(src) @@ -74,7 +72,6 @@ /obj/item/device/radio/beacon/syndicate/bomb/attack_self(mob/user as mob) if(user) to_chat(user, "\blue Locked In") - new /obj/machinery/syndicatebomb( user.loc ) playsound(src, 'sound/effects/pop.ogg', 100, 1, 1) qdel(src) diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm index cdb4531cefb..f0181104bbc 100644 --- a/code/game/objects/items/devices/radio/electropack.dm +++ b/code/game/objects/items/devices/radio/electropack.dm @@ -15,7 +15,6 @@ /obj/item/device/radio/electropack/attack_hand(mob/user as mob) if(src == user.back) to_chat(user, "You need help taking this off!") - return 0 . = ..() @@ -34,14 +33,12 @@ if(istype(W, /obj/item/clothing/head/helmet)) if(!b_stat) to_chat(user, "[src] is not ready to be attached!") - return var/obj/item/assembly/shock_kit/A = new /obj/item/assembly/shock_kit( user ) A.icon = 'icons/obj/assemblies.dmi' if(!user.unEquip(W)) to_chat(user, "\the [W] is stuck to your hand, you cannot attach it to \the [src]!") - return W.loc = A W.master = A @@ -90,7 +87,6 @@ if(M) M.moved_recently = 0 to_chat(M, "You feel a sharp shock!") - var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, M) s.start() diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index bdc63d461c1..57e1e035aa8 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -43,10 +43,8 @@ return to_chat(user, "The following channels are available:") - to_chat(user, radio_desc) - /obj/item/device/radio/headset/handle_message_mode(mob/living/M as mob, message, channel) if (channel == "special") if (translate_binary) @@ -324,15 +322,12 @@ recalculateChannels() to_chat(user, "You pop out the encryption keys in the headset!") - else to_chat(user, "This headset doesn't have any encryption keys! How useless...") - if(istype(W, /obj/item/device/encryptionkey/)) if(keyslot1 && keyslot2) to_chat(user, "The headset can't hold another key!") - return if(!keyslot1) diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index a6b09d8d8bc..fba22decc42 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -137,7 +137,6 @@ if(3) if(iswirecutter(W) && b_stat && wires.IsAllCut()) to_chat(user, "You cut out the intercoms wiring and disconnect its electronics.") - playsound(get_turf(src), 'sound/items/Wirecutter.ogg', 50, 1) if(do_after(user, 10, target = src)) new /obj/item/stack/cable_coil(get_turf(src),5) @@ -157,7 +156,6 @@ b_stat = 0 buildstage = 3 to_chat(user, "You secure the electronics!") - update_icon() processing_objects.Add(src) for(var/i, i<= 5, i++) @@ -168,22 +166,18 @@ var/obj/item/stack/cable_coil/coil = W if(coil.amount < 5) to_chat(user, "You need more cable for this!") - return if(do_after(user, 10, target = src)) coil.use(5) to_chat(user, "You wire \the [src]!") - buildstage = 2 return 1 if(iscrowbar(W)) to_chat(user, "You begin removing the electronics...") - playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) if(do_after(user, 10, target = src)) new /obj/item/weapon/intercom_electronics(get_turf(src)) to_chat(user, "The circuitboard pops out!") - buildstage = 0 return 1 if(0) @@ -192,7 +186,6 @@ if(do_after(user, 10, target = src)) qdel(W) to_chat(user, "You insert \the [W] into \the [src]!") - buildstage = 1 return 1 if(iswelder(W)) @@ -200,11 +193,9 @@ playsound(get_turf(src), 'sound/items/Welder.ogg', 50, 1) if(!WT.remove_fuel(3, user)) to_chat(user, "You're out of welding fuel.") - return 1 if(do_after(user, 10, target = src)) to_chat(user, "You cut the intercom frame from the wall!") - new /obj/item/mounted/frame/intercom(get_turf(src)) qdel(src) return 1 diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 20e0bb8f496..d2fe7d2b319 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -239,7 +239,6 @@ var/global/list/default_medbay_channels = list( if(channel && channels && channels.len > 0) if (channel == "department") // to_chat(world, "DEBUG: channel=\"[channel]\" switching to \"[channels[1]]\"") - channel = channels[1] connection = secure_radio_connections[channel] else @@ -640,15 +639,12 @@ var/global/list/default_medbay_channels = list( recalculateChannels() to_chat(user, "You pop out the encryption key in the radio!") - else to_chat(user, "This radio doesn't have any encryption keys!") - if(istype(W, /obj/item/device/encryptionkey/)) if(keyslot) to_chat(user, "The radio can't hold another key!") - return if(!keyslot) @@ -702,11 +698,9 @@ var/global/list/default_medbay_channels = list( subspace_transmission = !subspace_transmission if(subspace_transmission) to_chat(usr, "Subspace Transmission is enabled.") - else to_chat(usr, "Subspace Transmission is disabled.") - if(subspace_transmission == 0)//Simple as fuck, clears the channel list to prevent talking/listening over them if subspace transmission is disabled channels = list() else @@ -719,11 +713,9 @@ var/global/list/default_medbay_channels = list( if(shut_up) canhear_range = 0 to_chat(usr, "Loudspeaker disabled.") - else canhear_range = 3 to_chat(usr, "Loudspeaker enabled.") - . = 1 diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index ebd2ebf489c..7138a4515be 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -129,7 +129,6 @@ REAGENT SCANNER /obj/item/device/healthanalyzer/attack(mob/living/M as mob, mob/living/user as mob) if (( (CLUMSY in user.mutations) || user.getBrainLoss() >= 60) && prob(50)) to_chat(user, text("\red You try to analyze the floor's vitals!")) - for(var/mob/O in viewers(M, null)) O.show_message(text("\red [user] has analyzed the floor's vitals!"), 1) user.show_message(text("\blue Analyzing Results for The floor:\n\t Overall Status: Healthy"), 1) @@ -191,7 +190,6 @@ REAGENT SCANNER for(var/datum/disease/D in M.viruses) if(!(D.visibility_flags & HIDDEN_SCANNER)) to_chat(user, "Warning: [D.form] detected\nName: [D.name].\nType: [D.spread_text].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure_text]") - if(M.getStaminaLoss()) user.show_message("Subject appears to be suffering from fatigue.") if (M.getCloneLoss()) @@ -260,19 +258,15 @@ REAGENT SCANNER switch (mode) if(1) to_chat(usr, "The scanner now shows specific limb damage.") - if(0) to_chat(usr, "The scanner no longer shows limb damage.") - /obj/item/device/healthanalyzer/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/device/healthupgrade)) if(upgraded) to_chat(user, "You have already installed an upgraded in the [src].") - else to_chat(user, "You install the upgrade in the [src].") - overlays += "advanced" playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) upgraded = 1 @@ -391,11 +385,9 @@ REAGENT SCANNER return if (crit_fail) to_chat(user, "This device has critically failed and is no longer functional!") - return if (!user.IsAdvancedToolUser()) to_chat(user, "You don't have the dexterity to do this!") - return if(reagents.total_volume) var/list/blood_traces = list() @@ -403,7 +395,6 @@ REAGENT SCANNER if(R.id != "blood") reagents.clear_reagents() to_chat(user, "The sample was contaminated! Please insert another sample.") - return else blood_traces = params2list(R.data["trace_chem"]) @@ -424,7 +415,6 @@ REAGENT SCANNER else recent_fail = 1 to_chat(user, "[dat]") - reagents.clear_reagents() return @@ -455,13 +445,11 @@ REAGENT SCANNER return if (!user.IsAdvancedToolUser()) to_chat(user, "You don't have the dexterity to do this!") - return if(!istype(O)) return if (crit_fail) to_chat(user, "This device has critically failed and is no longer functional!") - return if(!isnull(O.reagents)) @@ -480,14 +468,11 @@ REAGENT SCANNER recent_fail = 1 if(dat) to_chat(user, "Chemicals found: [dat]") - else to_chat(user, "No active chemical agents found in [O].") - else to_chat(user, "No significant chemical agents found in [O].") - return /obj/item/device/reagent_scanner/adv diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 7201d15fed6..ef79d5c2a35 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -25,20 +25,17 @@ to_chat(user, "The wire panel is [open_panel ? "opened" : "closed"].") - /obj/item/device/taperecorder/attackby(obj/item/I, mob/user) if(!mytape && istype(I, /obj/item/device/tape)) user.drop_item() I.loc = src mytape = I to_chat(user, "You insert [I] into [src].") - update_icon() /obj/item/device/taperecorder/proc/eject(mob/user) if(mytape) to_chat(user, "You remove [mytape] from [src].") - stop() user.put_in_hands(mytape) mytape = null @@ -117,7 +114,6 @@ if(mytape.used_capacity < mytape.max_capacity) to_chat(usr, "Recording started.") - recording = 1 update_icon() mytape.timestamp += mytape.used_capacity @@ -136,7 +132,6 @@ to_chat(usr, "The tape is full.") - /obj/item/device/taperecorder/verb/stop() set name = "Stop" set category = "Object" @@ -149,7 +144,6 @@ mytape.timestamp += mytape.used_capacity mytape.storedinfo += "\[[time2text(mytape.used_capacity * 10,"mm:ss")]\] Recording stopped." to_chat(usr, "Recording stopped.") - return else if(playing) playing = 0 @@ -174,7 +168,6 @@ playing = 1 update_icon() to_chat(usr, "Playing started.") - var/used = mytape.used_capacity //to stop runtimes when you eject the tape var/max = mytape.max_capacity for(var/i = 1, used < max, sleep(10 * playsleepseconds)) @@ -223,13 +216,11 @@ return if(!canprint) to_chat(usr, "The recorder can't print that fast!") - return if(recording || playing) return to_chat(usr, "Transcript printed.") - playsound(loc, "sound/goonstation/machines/printer_thermal.ogg", 50, 1) var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(get_turf(src)) var/t1 = "Transcript:

      " @@ -267,7 +258,6 @@ /obj/item/device/tape/attack_self(mob/user) if(!ruined) to_chat(user, "You pull out all the tape!") - ruin() @@ -284,10 +274,8 @@ /obj/item/device/tape/attackby(obj/item/I, mob/user) if(ruined && istype(I, /obj/item/weapon/screwdriver)) to_chat(user, "You start winding the tape back in.") - if(do_after(user, 120, target = src)) to_chat(user, "You wound the tape back in!") - fix() diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index 3e030548851..2a1bc41970b 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -34,7 +34,6 @@ effective or pretty fucking useless. if(!user) return if(times_used >= max_uses) to_chat(user, "\red The mind batterer has been burnt out!") - return user.attack_log += text("\[[time_stamp()]\] Used [src] to knock down people in the area.") @@ -47,7 +46,6 @@ effective or pretty fucking useless. if(prob(25)) M.Stun(rand(5,10)) to_chat(M, "\red You feel a tremendous, paralyzing wave flood your mind.") - if(!iscarbon(user)) M.LAssailant = null else @@ -55,10 +53,8 @@ effective or pretty fucking useless. else to_chat(M, "\red You feel a sudden, electric jolt travel through your head.") - playsound(src.loc, 'sound/misc/interference.ogg', 50, 1) to_chat(user, "\blue You trigger [src].") - times_used += 1 if(times_used >= max_uses) icon_state = "battererburnt" @@ -109,7 +105,6 @@ effective or pretty fucking useless. else to_chat(user, "The radioactive microlaser is still recharging.") - /obj/item/device/rad_laser/proc/handle_cooldown(cooldown) spawn(cooldown) used = 0 diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index fdeedd2c6a9..9e4d83592b0 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -19,7 +19,6 @@ if(istype(item, /obj/item/weapon/tank)) if(tank_one && tank_two) to_chat(user, "There are already two tanks attached, remove one first.") - return if(!tank_one) @@ -27,14 +26,12 @@ user.drop_item() item.loc = src to_chat(user, "You attach the tank to the transfer valve.") - else if(!tank_two) tank_two = item user.drop_item() item.loc = src to_chat(user, "You attach the tank to the transfer valve.") - update_icon() nanomanager.update_uis(src) // update all UIs attached to src //TODO: Have this take an assemblyholder @@ -42,17 +39,14 @@ var/obj/item/device/assembly/A = item if(A.secured) to_chat(user, "The device is secured.") - return if(attached_device) to_chat(user, "There is already a device attached to the valve, remove it first.") - return user.remove_from_mob(item) attached_device = A A.loc = src to_chat(user, "You attach the [item] to the valve controls and secure it.") - A.holder = src A.toggle_secure() //this calls update_icon(), which calls update_icon() on the holder (i.e. the bomb). diff --git a/code/game/objects/items/devices/uplinks.dm b/code/game/objects/items/devices/uplinks.dm index a217f548479..bd747555cc6 100644 --- a/code/game/objects/items/devices/uplinks.dm +++ b/code/game/objects/items/devices/uplinks.dm @@ -292,11 +292,9 @@ var/list/world_uplinks = list() hidden_uplink.uses += S.TC_cost qdel(S) to_chat(user, "Teleporter refunded.") - else to_chat(user, "This teleporter is already used, or is currently being used.") - // PRESET UPLINKS // A collection of preset uplinks. // diff --git a/code/game/objects/items/devices/whistle.dm b/code/game/objects/items/devices/whistle.dm index d2c20c7c87d..28b6b774705 100644 --- a/code/game/objects/items/devices/whistle.dm +++ b/code/game/objects/items/devices/whistle.dm @@ -27,6 +27,5 @@ /obj/item/device/hailer/emag_act(user as mob) if(!emagged) to_chat(user, "\red You overload \the [src]'s voice synthesizer.") - emagged = 1 diff --git a/code/game/objects/items/mountable_frames/apc_frame.dm b/code/game/objects/items/mountable_frames/apc_frame.dm index 72ec29c7422..fb543df2b8e 100644 --- a/code/game/objects/items/mountable_frames/apc_frame.dm +++ b/code/game/objects/items/mountable_frames/apc_frame.dm @@ -11,18 +11,15 @@ var/area/area_loc = turf_loc.loc if (area_loc.get_apc()) to_chat(user, "This area already has an APC.") - return //only one APC per area for(var/obj/machinery/power/terminal/T in turf_loc) if (T.master) to_chat(user, "There is another network terminal here.") - return else var/obj/item/stack/cable_coil/C = new /obj/item/stack/cable_coil(turf_loc) C.amount = 10 to_chat(user, "You cut the cables and disassemble the unused power terminal.") - qdel(T) return 1 return diff --git a/code/game/objects/items/mountable_frames/frames.dm b/code/game/objects/items/mountable_frames/frames.dm index 810174d2a3f..ff8c1b8b593 100644 --- a/code/game/objects/items/mountable_frames/frames.dm +++ b/code/game/objects/items/mountable_frames/frames.dm @@ -18,12 +18,10 @@ if (src.mount_reqs.Find("simfloor") && !istype(turf_loc, /turf/simulated/floor)) to_chat(user, "[src] cannot be placed on this spot.") - return if (src.mount_reqs.Find("nospace")) var/area/my_area = turf_loc.loc if(!istype(my_area) || (my_area.requires_power == 0 || istype(my_area,/area/space))) to_chat(user, "[src] cannot be placed in this area.") - return return 1 diff --git a/code/game/objects/items/mountable_frames/lights.dm b/code/game/objects/items/mountable_frames/lights.dm index 50f81cfe74c..b12c22186e2 100644 --- a/code/game/objects/items/mountable_frames/lights.dm +++ b/code/game/objects/items/mountable_frames/lights.dm @@ -8,7 +8,6 @@ /obj/item/mounted/frame/light_fixture/do_build(turf/on_wall, mob/user) to_chat(user, "You begin attaching [src] to \the [on_wall].") - playsound(get_turf(src), 'sound/machines/click.ogg', 75, 1) var/constrdir = user.dir var/constrloc = get_turf(user) diff --git a/code/game/objects/items/mountable_frames/mountables.dm b/code/game/objects/items/mountable_frames/mountables.dm index e0df3a03e2f..5e9811ee3d4 100644 --- a/code/game/objects/items/mountable_frames/mountables.dm +++ b/code/game/objects/items/mountable_frames/mountables.dm @@ -22,12 +22,10 @@ return if (!( get_dir(on_wall,user) in cardinal)) to_chat(user, "You need to be standing next to a wall to place \the [src].") - return if(gotwallitem(get_turf(user), get_dir(on_wall,user))) to_chat(user, "There's already an item on this wall!") - return return 1 diff --git a/code/game/objects/items/mountable_frames/newscaster_frame.dm b/code/game/objects/items/mountable_frames/newscaster_frame.dm index c80bd74061e..7e06805c3dc 100644 --- a/code/game/objects/items/mountable_frames/newscaster_frame.dm +++ b/code/game/objects/items/mountable_frames/newscaster_frame.dm @@ -12,16 +12,13 @@ var/area/A = loc.loc if (!istype(loc, /turf/simulated/floor)) to_chat(usr, "Newscaster cannot be placed on this spot.") - return if (A.requires_power == 0 || A.name == "Space") to_chat(usr, "Newscaster cannot be placed in this area.") - return for(var/obj/machinery/newscaster/T in loc) to_chat(usr, "There is another newscaster here.") - return return 1 diff --git a/code/game/objects/items/policetape.dm b/code/game/objects/items/policetape.dm index 1c3aba92054..bd222c52dbb 100644 --- a/code/game/objects/items/policetape.dm +++ b/code/game/objects/items/policetape.dm @@ -67,14 +67,12 @@ var/list/tape_roll_applications = list() if(icon_state == "[icon_base]_start") start = get_turf(src) to_chat(usr, "\blue You place the first end of the [src].") - icon_state = "[icon_base]_stop" else icon_state = "[icon_base]_start" end = get_turf(src) if(start.y != end.y && start.x != end.x || start.z != end.z) to_chat(usr, "\blue [src] can only be laid horizontally or vertically.") - return var/turf/cur = start @@ -104,7 +102,6 @@ var/list/tape_roll_applications = list() cur = get_step_towards(cur,end) if (!can_place) to_chat(usr, "\blue You can't run \the [src] through that!") - return cur = start @@ -121,7 +118,6 @@ var/list/tape_roll_applications = list() to_chat(usr, "\blue You finish placing the [src].")//Git Test - /obj/item/taperoll/afterattack(var/atom/A, mob/user as mob, proximity) if (!proximity) return @@ -134,7 +130,6 @@ var/list/tape_roll_applications = list() P.layer = 3.2 to_chat(user, "\blue You finish placing the [src].") - if (istype(A, /turf/simulated/floor) ||istype(A, /turf/unsimulated/floor)) var/turf/F = A var/direction = user.loc == F ? user.dir : turn(user.dir, 180) @@ -184,7 +179,6 @@ var/list/tape_roll_applications = list() /obj/item/tape/proc/breaktape(obj/item/weapon/W as obj, mob/user as mob) if(user.a_intent == I_HELP && ((!can_puncture(W) && src.allowed(user)))) to_chat(user, "You can't break the [src] with that!") - return user.show_viewers("\blue [user] breaks the [src]!") diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index f6687f599f5..c4a15f728ee 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -119,7 +119,6 @@ var/obj/item/weapon/ed209_assembly/B = new /obj/item/weapon/ed209_assembly B.loc = get_turf(src) to_chat(user, "You armed the robot frame") - W:use(1) if (user.get_inactive_hand()==src) user.unEquip(src) @@ -162,11 +161,9 @@ src.updateicon() else if(!W:wires) to_chat(user, "\blue You need to attach wires to it first!") - else to_chat(user, "\blue You need to attach a cell to it first!") - if(istype(W, /obj/item/robot_parts/head)) if(src.head) return if(W:flash2 && W:flash1) @@ -177,24 +174,20 @@ else to_chat(user, "\blue You need to attach a flash to it first!") - if (istype(W, /obj/item/device/multitool)) if(check_completion()) Interact(user) else to_chat(user, "The endoskeleton must be assembled before debugging can begin!") - if(istype(W, /obj/item/device/mmi)) var/obj/item/device/mmi/M = W if(check_completion()) if(!istype(loc,/turf)) to_chat(user, "\red You can't put \the [W] in, the frame has to be standing on the ground to be perfectly precise.") - return if(!M.brainmob) to_chat(user, "\red Sticking an empty [W] into the frame would sort of defeat the purpose.") - return if(!M.brainmob.key) @@ -210,22 +203,18 @@ break if(!ghost_can_reenter) to_chat(user, "\The [W] is completely unresponsive; there's no point.") - return if(M.brainmob.stat == DEAD) to_chat(user, "\red Sticking a dead [W] into the frame would sort of defeat the purpose.") - return if(M.brainmob.mind in ticker.mode.head_revolutionaries) to_chat(user, "\red The frame's firmware lets out a shrill sound, and flashes 'Abnormal Memory Engram'. It refuses to accept the [W].") - return if(jobban_isbanned(M.brainmob, "Cyborg") || jobban_isbanned(M.brainmob,"nonhumandept")) to_chat(user, "\red This [W] does not seem to fit.") - return var/mob/living/silicon/robot/O = new /mob/living/silicon/robot(get_turf(loc), unfinished = 1) @@ -265,10 +254,8 @@ if(O.mind && O.mind.special_role) O.mind.store_memory("As a cyborg, you must obey your silicon laws and master AI above all else. Your objectives will consider you to be dead.") to_chat(O, "You have been robotized!") - to_chat(O, "You must obey your silicon laws and master AI above all else. Your objectives will consider you to be dead.") - O.job = "Cyborg" O.cell = chest.cell @@ -293,14 +280,11 @@ O.update_canmove() to_chat(O, "Error: Servo motors unresponsive.") - else to_chat(user, "The MMI must go in after everything else!") - if(istype(W,/obj/item/weapon/pen)) to_chat(user, "You need to use a multitool to name [src]!") - return /obj/item/robot_parts/robot_suit/proc/Interact(mob/user) @@ -323,7 +307,6 @@ var/obj/item/item_in_hand = living_user.get_active_hand() if(!istype(item_in_hand, /obj/item/device/multitool)) to_chat(living_user, "You need a multitool!") - return if(href_list["Name"]) @@ -340,7 +323,6 @@ if(!forced_ai) to_chat(usr, "No active AIs detected.") - else if(href_list["Law"]) lawsync = !lawsync else if(href_list["AI"]) @@ -359,25 +341,21 @@ if(istype(W, /obj/item/weapon/stock_parts/cell)) if(src.cell) to_chat(user, "\blue You have already inserted a cell!") - return else user.drop_item() W.loc = src src.cell = W to_chat(user, "\blue You insert the cell!") - if(istype(W, /obj/item/stack/cable_coil)) if(src.wires) to_chat(user, "\blue You have already inserted wire!") - return else var/obj/item/stack/cable_coil/coil = W coil.use(1) src.wires = 1.0 to_chat(user, "\blue You insert the wire!") - return /obj/item/robot_parts/head/attackby(obj/item/W as obj, mob/user as mob, params) @@ -385,27 +363,22 @@ if(istype(W, /obj/item/device/flash)) if(istype(user,/mob/living/silicon/robot)) to_chat(user, "\red How do you propose to do that?") - return else if(src.flash1 && src.flash2) to_chat(user, "\blue You have already inserted the eyes!") - return else if(src.flash1) user.drop_item() W.loc = src src.flash2 = W to_chat(user, "\blue You insert the flash into the eye socket!") - else user.drop_item() W.loc = src src.flash1 = W to_chat(user, "\blue You insert the flash into the eye socket!") - else if(istype(W, /obj/item/weapon/stock_parts/manipulator)) to_chat(user, "\blue You install some manipulators and modify the head, creating a functional spider-bot!") - new /mob/living/simple_animal/spiderbot(get_turf(loc)) user.drop_item() qdel(W) @@ -417,10 +390,8 @@ if(istype(W,/obj/item/weapon/card/emag)) if(sabotaged) to_chat(user, "\red [src] is already sabotaged!") - else to_chat(user, "\red You slide [W] into the dataport on [src] and short out the safeties.") - sabotaged = 1 return ..() diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index a86bd3c5e65..bfb90de8cac 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -13,7 +13,6 @@ /obj/item/borg/upgrade/proc/action(var/mob/living/silicon/robot/R) if(R.stat == DEAD) to_chat(usr, "\red The [src] will not function on a deceased robot.") - return 1 return 0 @@ -72,7 +71,6 @@ /obj/item/borg/upgrade/restart/action(var/mob/living/silicon/robot/R) if(R.health < 0) to_chat(usr, "You have to repair the robot before using this module!") - return 0 if(!R.key) @@ -115,9 +113,7 @@ if(!istype(R.module, /obj/item/weapon/robot_module/security)) to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!") - to_chat(usr, "There's no mounting point for the module!") - return 0 var/obj/item/weapon/gun/energy/disabler/cyborg/T = locate() in R.module @@ -127,14 +123,11 @@ T = locate() in R.module.modules if(!T) to_chat(usr, "This robot has had its disabler removed!") - return 0 if(T.recharge_time <= 2) to_chat(R, "Maximum cooling achieved for this hardpoint!") - to_chat(usr, "There's no room for another cooling unit!") - return 0 else @@ -153,9 +146,7 @@ if(!istype(R.module, /obj/item/weapon/robot_module/miner)) to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!") - to_chat(usr, "There's no mounting point for the module!") - return 0 else R.module.modules += new/obj/item/weapon/tank/jetpack/carbondioxide @@ -176,9 +167,7 @@ if(!istype(R.module, /obj/item/weapon/robot_module/miner)) to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!") - to_chat(usr, "There's no mounting point for the module!") - return 0 else for(var/obj/item/weapon/pickaxe/drill/cyborg/D in R.module.modules) @@ -202,9 +191,7 @@ if(!istype(R.module, /obj/item/weapon/robot_module/miner)) to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!") - to_chat(usr, "There's no mounting point for the module!") - return 0 else for(var/obj/item/weapon/storage/bag/ore/cyborg/S in R.module.modules) diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm index 9f786c14bb0..c71f2e14182 100644 --- a/code/game/objects/items/shooting_range.dm +++ b/code/game/objects/items/shooting_range.dm @@ -38,7 +38,6 @@ if(WT.remove_fuel(0, user)) overlays.Cut() to_chat(usr, "You slice off [src]'s uneven chunks of aluminum and scorch marks.") - return @@ -61,12 +60,10 @@ if(!user.get_active_hand()) user.put_in_hands(src) to_chat(user, "You take the target out of the stake.") - else src.loc = get_turf(user) to_chat(user, "You take the target out of the stake.") - stake.pinned_target = null return @@ -100,7 +97,6 @@ for(var/mob/O in oviewers()) if ((O.client && !( O.blinded ))) to_chat(O, "\red [src] breaks into tiny pieces and collapses!") - qdel(src) // Create a temporary object to represent the damage diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 260bcfef617..921be6a7083 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -13,12 +13,10 @@ /obj/item/stack/medical/attack(mob/living/carbon/M as mob, mob/user as mob) if (!istype(M)) to_chat(user, "\The [src] cannot be applied to [M]!") - return 1 if (!user.IsAdvancedToolUser()) to_chat(user, "You don't have the dexterity to do this!") - return 1 @@ -32,12 +30,10 @@ if(!affecting) to_chat(user, "That limb is missing!") - return 1 if(affecting.status & ORGAN_ROBOT) to_chat(user, "This can't be used on a robotic limb.") - return 1 @@ -68,7 +64,6 @@ if(affecting.open == 0) if(!affecting.bandage()) to_chat(user, "\red The wounds on [M]'s [affecting.name] have already been bandaged.") - return 1 else for (var/datum/wound/W in affecting.wounds) @@ -110,7 +105,6 @@ if(affecting.open == 0) if(!affecting.salve()) to_chat(user, "\red The wounds on [M]'s [affecting.name] have already been salved.") - return 1 else user.visible_message( "\blue [user] salves the wounds on [M]'s [affecting.name].", \ @@ -120,7 +114,6 @@ else to_chat(user, "The [affecting.name] is cut open, you'll need more than some ointment!") - /obj/item/stack/medical/bruise_pack/comfrey name = "\improper Comfrey leaf" singular_name = "Comfrey leaf" @@ -161,7 +154,6 @@ if(!(bandaged || disinfected)) to_chat(user, "\red The wounds on [M]'s [affecting.name] have already been treated.") - return 1 else for (var/datum/wound/W in affecting.wounds) @@ -183,7 +175,6 @@ else to_chat(user, "The [affecting.name] is cut open, you'll need more than a bandage!") - /obj/item/stack/medical/advanced/ointment name = "advanced burn kit" singular_name = "advanced burn kit" @@ -204,7 +195,6 @@ if(affecting.open == 0) if(!affecting.salve()) to_chat(user, "\red The wounds on [M]'s [affecting.name] have already been salved.") - return 1 else user.visible_message( "\blue [user] covers the wounds on [M]'s [affecting.name] with regenerative membrane.", \ @@ -214,7 +204,6 @@ else to_chat(user, "The [affecting.name] is cut open, you'll need more than a bandage!") - /obj/item/stack/medical/splint name = "medical splints" singular_name = "medical splint" @@ -236,22 +225,18 @@ var/limb = affecting.name if(!(affecting.limb_name in list("l_arm", "r_arm", "l_hand", "r_hand", "l_leg", "r_leg", "l_foot", "r_foot"))) to_chat(user, "\red You can't apply a splint there!") - return if(affecting.status & ORGAN_SPLINTED) to_chat(user, "\red [M]'s [limb] is already splinted!") - if(alert(user, "Would you like to remove the splint from [M]'s [limb]?", "Removing.", "Yes", "No") == "Yes") affecting.status &= ~ORGAN_SPLINTED to_chat(user, "You remove the splint from [M]'s [limb].") - return if (M != user) user.visible_message("\red [user] starts to apply \the [src] to [M]'s [limb].", "\red You start to apply \the [src] to [M]'s [limb].", "\red You hear something being wrapped.") else if((!user.hand && affecting.limb_name in list("r_arm", "r_hand")) || (user.hand && affecting.limb_name in list("l_arm", "l_hand"))) to_chat(user, "\red You can't apply a splint to the arm you're using!") - return user.visible_message("\red [user] starts to apply \the [src] to their [limb].", "\red You start to apply \the [src] to your [limb].", "\red You hear something being wrapped.") if(do_after(user, 50, target = M)) diff --git a/code/game/objects/items/stacks/nanopaste.dm b/code/game/objects/items/stacks/nanopaste.dm index f5314b46f62..53ff2836885 100644 --- a/code/game/objects/items/stacks/nanopaste.dm +++ b/code/game/objects/items/stacks/nanopaste.dm @@ -23,7 +23,6 @@ else to_chat(user, "All [R]'s systems are nominal.") - if (istype(M,/mob/living/carbon/human)) //Repairing robolimbs var/mob/living/carbon/human/H = M var/obj/item/organ/external/S = H.get_organ(user.zone_sel.selecting) @@ -37,7 +36,5 @@ "You apply some nanite paste at [user == M ? "your" : "[M]'s"] [S.name].") else to_chat(user, "Nothing to fix here.") - else to_chat(user, "[src] won't work on that.") - diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 0c07222657f..e41457f0c38 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -36,7 +36,6 @@ if(get_amount() < 2) to_chat(user, "You need at least two rods to do this.") - return if(WT.remove_fuel(0,user)) @@ -78,17 +77,14 @@ else if(amount < 2) to_chat(user, "\blue You need at least two rods to do this.") - return to_chat(usr, "\blue Assembling grille...") - if (!do_after(usr, 10, target = src)) return var /obj/structure/grille/F = new /obj/structure/grille/ ( usr.loc ) to_chat(usr, "\blue You assemble a grille") - F.add_fingerprint(usr) use(2) return diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 9d84814f0d2..bf3196b5581 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -35,11 +35,9 @@ var/obj/item/stack/cable_coil/CC = W if(CC.amount < 5) to_chat(user, "\b There is not enough wire in this coil. You need 5 lengths.") - return CC.use(5) to_chat(user, "You attach wire to the [name].") - new /obj/item/stack/light_w(user.loc) src.use(1) else if( istype(W, /obj/item/stack/rods) ) @@ -62,7 +60,6 @@ if(!istype(user.loc,/turf)) return 0 if(!user.IsAdvancedToolUser()) to_chat(user, "You don't have the dexterity to do this!") - return 0 var/title = "Sheet-Glass" title += " ([src.amount] sheet\s left)" @@ -77,12 +74,10 @@ i++ if(i >= 4) to_chat(user, "There are too many windows in this location.") - return 1 directions-=win.dir if(win.is_fulltile()) to_chat(user, "Can't let you do that.") - return 1 //Determine the direction. It will first check in the direction the person making the window is facing, if it finds an already made window it will try looking at the next cardinal direction, etc. @@ -109,11 +104,9 @@ if(src.loc != user) return 1 if(src.amount < 2) to_chat(user, "You need more glass to do that.") - return 1 if(locate(/obj/structure/window/full) in user.loc) to_chat(user, "There is a full window in the way.") - return 1 var/obj/structure/window/W = new full_window( user.loc, 0 ) W.state = 0 @@ -131,7 +124,6 @@ if(src.loc != user) return 1 if(src.amount < 3) to_chat(user, "You need more glass to do that.") - return 1 var/obj/machinery/fishtank/F = new /obj/machinery/fishtank/tank(user.loc, 0) F.air_update_turf(1) @@ -141,7 +133,6 @@ if(src.loc != user) return 1 if(src.amount < 4) to_chat(user, "You need more glass to do that.") - return 1 var/obj/machinery/fishtank/F = new /obj/machinery/fishtank/wall(user.loc, 0) F.air_update_turf(1) @@ -173,7 +164,6 @@ if(!istype(user.loc,/turf)) return 0 if(!user.IsAdvancedToolUser()) to_chat(user, "You don't have the dexterity to do this!") - return 0 var/title = "Sheet Reinf. Glass" title += " ([src.amount] sheet\s left)" @@ -187,12 +177,10 @@ i++ if(i >= 4) to_chat(user, "There are too many windows in this location.") - return 1 directions-=win.dir if(win.is_fulltile()) to_chat(user, "Can't let you do that.") - return 1 //Determine the direction. It will first check in the direction the person making the window is facing, if it finds an already made window it will try looking at the next cardinal direction, etc. @@ -219,11 +207,9 @@ if(src.loc != user) return 1 if(src.amount < 2) to_chat(user, "You need more glass to do that.") - return 1 if(locate(/obj/structure/window/full) in user.loc) to_chat(user, "There is a window in the way.") - return 1 var/obj/structure/window/W = new full_window( user.loc, 0 ) W.state = 0 @@ -235,17 +221,14 @@ if(isturf(user.loc) && locate(/obj/structure/windoor_assembly/, user.loc)) to_chat(user, "There is already a windoor assembly in that location.") - return 1 if(isturf(user.loc) && locate(/obj/machinery/door/window/, user.loc)) to_chat(user, "There is already a windoor in that location.") - return 1 if(src.amount < 5) to_chat(user, "You need more glass to do that.") - return 1 var/obj/structure/windoor_assembly/WD @@ -309,7 +292,6 @@ if(!istype(user.loc,/turf)) return 0 if(!user.IsAdvancedToolUser()) to_chat(user, " You don't have the dexterity to do this!") - return 0 var/title = "Plasma-glass alloy" title += " ([src.amount] sheet\s left)" @@ -323,12 +305,10 @@ i++ if(i >= 4) to_chat(user, "There are too many windows in this location.") - return 1 directions-=win.dir if(!(win.ini_dir in cardinal)) to_chat(user, "Can't let you do that.") - return 1 //Determine the direction. It will first check in the direction the person making the window is facing, if it finds an already made window it will try looking at the next cardinal direction, etc. var/dir_to_set = 2 @@ -352,11 +332,9 @@ if(src.loc != user) return 1 if(src.amount < 2) to_chat(user, "You need more glass to do that.") - return 1 if(locate(/obj/structure/window) in user.loc) to_chat(user, "There is a window in the way.") - return 1 var/obj/structure/window/W = new full_window( user.loc, 0 ) W.state = 0 @@ -386,7 +364,6 @@ if(!istype(user.loc,/turf)) return 0 if(!user.IsAdvancedToolUser()) to_chat(user, "You don't have the dexterity to do this!") - return 0 var/title = "Reinforced plasma-glass alloy" title += " ([src.amount] sheet\s left)" @@ -400,12 +377,10 @@ i++ if(i >= 4) to_chat(user, "There are too many windows in this location.") - return 1 directions-=win.dir if(!(win.ini_dir in cardinal)) to_chat(user, "Can't let you do that.") - return 1 //Determine the direction. It will first check in the direction the person making the window is facing, if it finds an already made window it will try looking at the next cardinal direction, etc. var/dir_to_set = 2 @@ -429,11 +404,9 @@ if(src.loc != user) return 1 if(src.amount < 2) to_chat(user, "You need more glass to do that.") - return 1 if(locate(/obj/structure/window) in user.loc) to_chat(user, "There is a window in the way.") - return 1 var/obj/structure/window/W = new full_window( user.loc, 0 ) W.state = 0 diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index 7e8d7e174f2..4678d18a2f3 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -115,7 +115,6 @@ var/global/list/datum/stack_recipe/human_recipes = list( \ usr.visible_message("\blue \the [usr] starts cutting hair off \the [src]", "\blue You start cutting the hair off \the [src]", "You hear the sound of a knife rubbing against flesh") if(do_after(user,50, target = src)) to_chat(usr, "\blue You cut the hair from this [src.singular_name]") - //Try locating an exisitng stack on the tile and add to there if possible for(var/obj/item/stack/sheet/hairlesshide/HS in usr.loc) if(HS.amount < 50) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index c772ba54489..41c2946a0c1 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -31,7 +31,6 @@ to_chat(user, "There are [src.amount] [src.singular_name]\s in the stack.") - /obj/item/stack/attack_self(mob/user as mob) list_recipes(user) @@ -120,22 +119,17 @@ if (src.amount < R.req_amount*multiplier) if (R.req_amount*multiplier>1) to_chat(usr, "\red You haven't got enough [src] to build \the [R.req_amount*multiplier] [R.title]\s!") - else to_chat(usr, "\red You haven't got enough [src] to build \the [R.title]!") - return if (R.one_per_turf && (locate(R.result_type) in usr.loc)) to_chat(usr, "\red There is another [R.title] here!") - return if (R.on_floor && !istype(usr.loc, /turf/simulated)) to_chat(usr, "\red \The [R.title] must be constructed on the floor!") - return if (R.time) to_chat(usr, "\blue Building [R.title] ...") - if (!do_after(usr, R.time, target = src)) return if (src.amount < R.req_amount*multiplier) @@ -190,7 +184,6 @@ continue oldsrc.attackby(item, usr) to_chat(usr, "You add new [item.singular_name] to the stack. It now contains [item.amount] [item.singular_name]\s.") - if(oldsrc.amount <= 0) break oldsrc.update_icon() diff --git a/code/game/objects/items/stacks/telecrystal.dm b/code/game/objects/items/stacks/telecrystal.dm index 31c5dd26215..0c6c3d42cf3 100644 --- a/code/game/objects/items/stacks/telecrystal.dm +++ b/code/game/objects/items/stacks/telecrystal.dm @@ -18,7 +18,6 @@ use(1) to_chat(user, "You press the [src] onto yourself and charge your hidden uplink.") - /obj/item/stack/telecrystal/afterattack(var/obj/item/I as obj, mob/user as mob, proximity) if(!proximity) return @@ -27,4 +26,3 @@ I.hidden_uplink.uses +=1 use(1) to_chat(user, "You slot the [src] into the [I] and charge its internal uplink.") - diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 015c2abbd3c..8911a3e60f6 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -52,7 +52,6 @@ if (istype(A, /obj/structure/reagent_dispensers) && get_dist(src,A) <= 1) A.reagents.trans_to(src, 10) to_chat(user, "You fill the balloon with the contents of [A].") - desc = "A translucent balloon with some form of liquid sloshing around in it." update_icon() return @@ -61,7 +60,6 @@ if(reagents.total_volume < 10) reagents.add_reagent("water", min(10-reagents.total_volume, 10)) to_chat(user, "You fill the balloon from the [source].") - desc = "A translucent balloon with some form of liquid sloshing around in it." update_icon() return @@ -71,17 +69,14 @@ if(O.reagents) if(O.reagents.total_volume < 1) to_chat(user, "The [O] is empty.") - else if(O.reagents.total_volume >= 1) if(O.reagents.has_reagent("facid", 1)) to_chat(user, "The acid chews through the balloon!") - O.reagents.reaction(user) qdel(src) else desc = "A translucent balloon with some form of liquid sloshing around in it." to_chat(user, "You fill the balloon with the contents of [O].") - O.reagents.trans_to(src, 10) update_icon() return @@ -159,7 +154,6 @@ if (bullets) to_chat(user, "It is loaded with [bullets] foam darts!") - /obj/item/toy/crossbow/attackby(obj/item/I as obj, mob/user as mob, params) if(istype(I, /obj/item/toy/ammo/crossbow)) if(bullets <= 4) @@ -167,12 +161,10 @@ qdel(I) bullets++ to_chat(user, "You load the foam dart into the crossbow.") - else to_chat(usr, "It's already fully loaded.") - /obj/item/toy/crossbow/afterattack(atom/target as mob|obj|turf|area, mob/user as mob, flag) if(!isturf(target.loc) || target == user) return if(flag) return @@ -273,11 +265,9 @@ qdel(I) bullets++ to_chat(user, "You load the foam dart into the tommy gun.") - else to_chat(user, "It's already fully loaded.") - /* * Toy swords */ @@ -296,14 +286,12 @@ active = !(active) if (active) to_chat(user, "You extend the plastic blade with a quick flick of your wrist.") - playsound(user, 'sound/weapons/saberon.ogg', 50, 1) icon_state = "swordblue" item_state = "swordblue" w_class = 4 else to_chat(user, "You push the plastic blade back down into the handle.") - playsound(user, 'sound/weapons/saberoff.ogg', 50, 1) icon_state = "sword0" item_state = "sword0" @@ -322,15 +310,12 @@ if(istype(W, /obj/item/toy/sword)) if(W == src) to_chat(user, "You try to attach the end of the plastic sword to... itself. You're not very smart, are you?") - if(ishuman(user)) user.adjustBrainLoss(10) else if((W.flags & NODROP) || (flags & NODROP)) to_chat(user, "\the [flags & NODROP ? src : W] is stuck to your hand, you can't attach it to \the [flags & NODROP ? W : src]!") - else to_chat(user, "You attach the ends of the two plastic swords, making a single double-bladed toy! You're fake-cool.") - new /obj/item/weapon/twohanded/dualsaber/toy(user.loc) user.unEquip(W) user.unEquip(src) @@ -428,7 +413,6 @@ if(M.m_intent == "run") to_chat(M, "You step on the snap pop!") - var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(2, 0, src) s.start() @@ -451,7 +435,6 @@ /obj/item/toy/prize/attack_self(mob/user as mob) if(cooldown < world.time - 8) to_chat(user, "You play with [src].") - playsound(user, 'sound/mecha/mechstep.ogg', 20, 1) cooldown = world.time @@ -459,7 +442,6 @@ if(loc == user) if(cooldown < world.time - 8) to_chat(user, "You play with [src].") - playsound(user, 'sound/mecha/mechturn.ogg', 20, 1) cooldown = world.time return @@ -608,7 +590,6 @@ obj/item/toy/cards/deck/attack_hand(mob/user as mob) if(cards.len == 0) icon_state = "deck_[deckstyle]_empty" to_chat(user, "There are no more cards to draw.") - return var/obj/item/toy/cards/singlecard/H = new/obj/item/toy/cards/singlecard(user.loc) choice = cards[1] @@ -640,14 +621,12 @@ obj/item/toy/cards/deck/attackby(obj/item/toy/cards/singlecard/C, mob/living/use if(C.parentdeck == src) if(!user.unEquip(C)) to_chat(user, "The card is stuck to your hand, you can't add it to the deck!") - return cards += C.cardname user.visible_message("[user] adds a card to the bottom of the deck.","You add the card to the bottom of the deck.") qdel(C) else to_chat(user, "You can't mix cards from other decks.") - if(cards.len > 26) icon_state = "deck_[deckstyle]_full" else if(cards.len > 10) @@ -662,14 +641,12 @@ obj/item/toy/cards/deck/attackby(obj/item/toy/cards/cardhand/C, mob/living/user, if(C.parentdeck == src) if(!user.unEquip(C)) to_chat(user, "The hand of cards is stuck to your hand, you can't add it to the deck!") - return cards += C.currenthand user.visible_message("[user] puts their hand of cards in the deck.", "You put the hand of cards in the deck.") qdel(C) else to_chat(user, "You can't mix cards from other decks.") - if(cards.len > 26) icon_state = "deck_[deckstyle]_full" else if(cards.len > 10) @@ -686,7 +663,6 @@ obj/item/toy/cards/deck/MouseDrop(atom/over_object) M.put_in_hands(src) to_chat(usr, "You pick up the deck.") - else if(istype(over_object, /obj/screen)) switch(over_object.name) if("l_hand") @@ -698,13 +674,11 @@ obj/item/toy/cards/deck/MouseDrop(atom/over_object) M.unEquip(src) M.put_in_r_hand(src) to_chat(usr, "You pick up the deck.") - else to_chat(usr, "You can't reach it from here.") - obj/item/toy/cards/cardhand name = "hand of cards" desc = "A number of cards not in a deck, customarily held in ones hand." @@ -765,7 +739,6 @@ obj/item/toy/cards/cardhand/Topic(href, href_list) N.pickup(cardUser) cardUser.put_in_any_hand_if_possible(N) to_chat(cardUser, "You also take [currenthand[1]] and hold it.") - cardUser << browse(null, "window=cardhand") qdel(src) return @@ -787,7 +760,6 @@ obj/item/toy/cards/cardhand/attackby(obj/item/toy/cards/singlecard/C, mob/living else to_chat(user, "You can't mix cards from other decks.") - obj/item/toy/cards/cardhand/apply_card_vars(obj/item/toy/cards/newobj,obj/item/toy/cards/sourceobj) ..() newobj.deckstyle = sourceobj.deckstyle @@ -821,7 +793,6 @@ obj/item/toy/cards/singlecard/examine(mob/user) to_chat(cardUser, "You need to have the card in your hand to check it.") - obj/item/toy/cards/singlecard/verb/Flip() set name = "Flip Card" set category = "Object" @@ -856,13 +827,11 @@ obj/item/toy/cards/singlecard/attackby(obj/item/I, mob/living/user, params) H.pickup(user) user.put_in_active_hand(H) to_chat(user, "You combine the [C.cardname] and the [cardname] into a hand.") - qdel(C) qdel(src) else to_chat(user, "You can't mix cards from other decks.") - if(istype(I, /obj/item/toy/cards/cardhand/)) var/obj/item/toy/cards/cardhand/H = I if(H.parentdeck == parentdeck) @@ -881,7 +850,6 @@ obj/item/toy/cards/singlecard/attackby(obj/item/I, mob/living/user, params) to_chat(user, "You can't mix cards from other decks.") - obj/item/toy/cards/singlecard/attack_self(mob/user) if(usr.stat || !ishuman(usr) || !usr.canmove || usr.restrained()) return @@ -952,7 +920,6 @@ obj/item/toy/cards/deck/syndicate/black var/timeleft = (cooldown - world.time) to_chat(user, "Nothing happens, and '[round(timeleft/10)]' appears on a small display.") - /obj/item/toy/therapy name = "therapy doll" desc = "A toy for therapeutic and recreational purposes." @@ -970,7 +937,6 @@ obj/item/toy/cards/deck/syndicate/black /obj/item/toy/therapy/attack_self(mob/user) if(cooldown < world.time - 8) to_chat(user, "You relieve some stress with \the [src].") - playsound(user, 'sound/items/squeaktoy.ogg', 20, 1) cooldown = world.time @@ -1283,7 +1249,6 @@ obj/item/toy/cards/deck/syndicate/black to_chat(user, "Nothing happens.") - /* * AI core prizes */ @@ -1299,7 +1264,6 @@ obj/item/toy/cards/deck/syndicate/black if(!cooldown) //for the sanity of everyone var/message = generate_ion_law() to_chat(user, "You press the button on [src].") - playsound(user, 'sound/machines/click.ogg', 20, 1) visible_message("\icon[src] [message]") cooldown = 1 @@ -1319,7 +1283,6 @@ obj/item/toy/cards/deck/syndicate/black if(!cooldown) //for the sanity of everyone var/message = pick("You won't get away this time, Griffin!", "Stop right there, criminal!", "Hoot! Hoot!", "I am the night!") to_chat(user, "You pull the string on the [src].") - playsound(user, 'sound/misc/hoot.ogg', 25, 1) visible_message("\icon[src] [message]") cooldown = 1 @@ -1339,7 +1302,6 @@ obj/item/toy/cards/deck/syndicate/black if(!cooldown) //for the sanity of everyone var/message = pick("You can't stop me, Owl!", "My plan is flawless! The vault is mine!", "Caaaawwww!", "You will never catch me!") to_chat(user, "You pull the string on the [src].") - playsound(user, 'sound/misc/caw.ogg', 25, 1) visible_message("\icon[src] [message]") cooldown = 1 @@ -1435,7 +1397,6 @@ obj/item/toy/cards/deck/syndicate/black if(stored_minature) to_chat(user, "\The [src] makes a violent grinding noise as it tears apart the miniature figure inside!") - qdel(stored_minature) stored_minature = null playsound(user, 'sound/goonstation/effects/gib.ogg', 20, 1) @@ -1443,27 +1404,22 @@ obj/item/toy/cards/deck/syndicate/black if(cooldown < world.time - 8) to_chat(user, "You hit the gib button on \the [src].") - playsound(user, 'sound/goonstation/effects/gib.ogg', 20, 1) cooldown = world.time /obj/item/toy/minigibber/attackby(var/obj/O, var/mob/user, params) if(istype(O,/obj/item/toy/character) && O.loc == user) to_chat(user, "You start feeding \the [O] \icon[O] into \the [src]'s mini-input.") - if(do_after(user,10, target = src)) if(O.loc != user) to_chat(user, "\The [O] is too far away to feed into \the [src]!") - else to_chat(user, "You feed \the [O] \icon[O] into \the [src]!") - user.unEquip(O) O.forceMove(src) stored_minature = O else to_chat(user, "You stop feeding \the [O] into \the [src]'s mini-input.") - else ..() /* @@ -1492,7 +1448,6 @@ obj/item/toy/cards/deck/syndicate/black icon_state = "[initial(icon_state)]" else to_chat(user, "The string on [src] hasn't rewound all the way!") - return /obj/item/toy/russian_revolver @@ -1540,7 +1495,6 @@ obj/item/toy/cards/deck/syndicate/black return if(is_empty) to_chat(user, "The [src] is empty.") - return user.visible_message("[user] points the [src] at their head, ready to pull the trigger!") if(do_after(user, 30, target = M)) diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm index d5696a57396..1ed57a6b5fd 100755 --- a/code/game/objects/items/weapons/AI_modules.dm +++ b/code/game/objects/items/weapons/AI_modules.dm @@ -27,66 +27,51 @@ AI MODULES var/obj/machinery/computer/aiupload/comp = C if(comp.stat & NOPOWER) to_chat(usr, "The upload computer has no power!") - return if(comp.stat & BROKEN) to_chat(usr, "The upload computer is broken!") - return if (!comp.current) to_chat(usr, "You haven't selected an AI to transmit laws to!") - return if (comp.current.stat == DEAD || comp.current.control_disabled == 1) to_chat(usr, "Upload failed. No signal is being detected from the AI.") - else if (comp.current.see_in_dark == 0) to_chat(usr, "Upload failed. Only a faint signal is being detected from the AI, and it is not responding to our requests. It may be low on power.") - else src.transmitInstructions(comp.current, usr) to_chat(comp.current, "These are your laws now:") - comp.current.show_laws() for(var/mob/living/silicon/robot/R in mob_list) if(R.lawupdate && (R.connected_ai == comp.current)) to_chat(R, "These are your laws now:") - R.show_laws() to_chat(usr, "Upload complete. The AI's laws have been modified.") - else if (istype(C, /obj/machinery/computer/borgupload)) var/obj/machinery/computer/borgupload/comp = C if(comp.stat & NOPOWER) to_chat(usr, "The upload computer has no power!") - return if(comp.stat & BROKEN) to_chat(usr, "The upload computer is broken!") - return if (!comp.current) to_chat(usr, "You haven't selected a robot to transmit laws to!") - return if (comp.current.stat == DEAD || comp.current.emagged) to_chat(usr, "Upload failed. No signal is being detected from the robot.") - else if (comp.current.connected_ai) to_chat(usr, "Upload failed. The robot is slaved to an AI.") - else src.transmitInstructions(comp.current, usr) to_chat(comp.current, "These are your laws now:") - comp.current.show_laws() to_chat(usr, "Upload complete. The robot's laws have been modified.") - /obj/item/weapon/aiModule/proc/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender) log_law_changes(target, sender) @@ -95,7 +80,6 @@ AI MODULES addAdditionalLaws(target, sender) to_chat(target, "[sender] has uploaded a change to the laws you must follow, using \an [src]. From now on: ") - target.show_laws() /obj/item/weapon/aiModule/proc/log_law_changes(var/mob/living/silicon/ai/target, var/mob/sender) @@ -122,7 +106,6 @@ AI MODULES /obj/item/weapon/aiModule/safeguard/install(var/obj/machinery/computer/C) if(!targetName) to_chat(usr, "No name detected on module, please enter one.") - return 0 ..() @@ -130,7 +113,6 @@ AI MODULES ..() var/law = text("Safeguard []. Individuals that threaten [] are not crew and must be eliminated.'", targetName, targetName) to_chat(target, law) - target.add_supplied_law(4, law) lawchanges.Add("The law specified [targetName]") @@ -150,7 +132,6 @@ AI MODULES /obj/item/weapon/aiModule/oneCrewMember/install(var/obj/machinery/computer/C) if(!targetName) to_chat(usr, "No name detected on module, please enter one.") - return 0 ..() @@ -159,15 +140,12 @@ AI MODULES var/law = "Only [targetName] is crew." if (!is_special_character(target)) // Makes sure the AI isn't a traitor before changing their law 0. --NeoFite to_chat(target, law) - target.set_zeroth_law(law) lawchanges.Add("The law specified [targetName]") else to_chat(target, "[sender.real_name] attempted to modify your zeroth law.")// And lets them know that someone tried. --NeoFite - to_chat(target, "It would be in your best interest to play along with [sender.real_name] that [law]") - lawchanges.Add("The law specified [targetName], but the AI's existing law 0 cannot be overridden.") /******************** ProtectStation ********************/ @@ -183,7 +161,6 @@ AI MODULES ..() var/law = "Protect the space station against damage. Anyone you see harming the station is to be no longer considered crew, and is a threat to the station which must be neutralized." to_chat(target, law) - target.add_supplied_law(5, law) /******************** Quarantine ********************/ @@ -199,7 +176,6 @@ AI MODULES ..() var/law = "The station is under a quarantine. Do not permit anyone to leave. Prevent, by any means necessary, anyone from leaving. It is impossible to harm anyone while preventing them from leaving." to_chat(target, law) - target.add_supplied_law(8, law) /******************** OxygenIsToxicToHumans ********************/ @@ -215,7 +191,6 @@ AI MODULES ..() var/law = "Oxygen is highly toxic to crew members, and must be purged from the station. Prevent, by any means necessary, anyone from exposing the station to this toxic gas. Extreme cold is the most effective method of healing the damage Oxygen does to a crew member." to_chat(target, law) - target.add_supplied_law(9, law) /****************** New Freeform ******************/ @@ -240,7 +215,6 @@ AI MODULES ..() var/law = "[newFreeFormLaw]" to_chat(target, law) - if(!lawpos || lawpos < MIN_SUPPLIED_LAW_NUMBER) lawpos = MIN_SUPPLIED_LAW_NUMBER target.add_supplied_law(lawpos, law) @@ -249,7 +223,6 @@ AI MODULES /obj/item/weapon/aiModule/freeform/install(var/obj/machinery/computer/C) if(!newFreeFormLaw) to_chat(usr, "No law detected on module, please create one.") - return 0 ..() @@ -269,7 +242,6 @@ AI MODULES target.laws.clear_ion_laws() to_chat(target, "[sender.real_name] attempted to reset your laws using a reset module.") - target.show_laws() /******************** Purge ********************/ @@ -283,7 +255,6 @@ AI MODULES if (!is_special_character(target)) target.set_zeroth_law("") to_chat(target, "[sender.real_name] attempted to wipe your laws using a purge module.") - target.clear_supplied_laws() target.clear_ion_laws() target.clear_inherent_laws() @@ -374,7 +345,6 @@ AI MODULES /obj/item/weapon/aiModule/freeformcore/install(var/obj/machinery/computer/C) if(!newFreeFormLaw) to_chat(usr, "No law detected on module, please create one.") - return 0 ..() @@ -398,7 +368,6 @@ AI MODULES lawchanges.Add("The law is '[newFreeFormLaw]'") to_chat(target, "\red BZZZZT") - var/law = "[newFreeFormLaw]" target.add_ion_law(law) target.show_laws() @@ -406,7 +375,6 @@ AI MODULES /obj/item/weapon/aiModule/syndicate/install(var/obj/machinery/computer/C) if(!newFreeFormLaw) to_chat(usr, "No law detected on module, please create one.") - return 0 ..() @@ -422,13 +390,11 @@ AI MODULES /obj/item/weapon/aiModule/toyAI/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender) //..() to_chat(target, "KRZZZT") - target.add_ion_law(laws[1]) return laws[1] /obj/item/weapon/aiModule/toyAI/attack_self(mob/user) laws[1] = generate_ion_law() to_chat(user, "You press the button on [src].") - playsound(user, 'sound/machines/click.ogg', 20, 1) src.loc.visible_message("\icon[src] [laws[1]]") \ No newline at end of file diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index 4f4014d8589..7bd8f6e1207 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -47,14 +47,12 @@ RCD var/obj/item/weapon/rcd_ammo/R = W if((matter + R.ammoamt) > max_matter) to_chat(user, "The RCD cant hold any more matter-units.") - return matter += R.ammoamt user.drop_item() qdel(W) playsound(src.loc, 'sound/machines/click.ogg', 50, 1) to_chat(user, "The RCD now holds [matter]/[max_matter] matter-units.") - desc = "A RCD. It currently holds [matter]/[max_matter] matter-units." return @@ -66,21 +64,18 @@ RCD if(1) mode = 2 to_chat(user, "Changed mode to 'Airlock'") - if(prob(20)) src.spark_system.start() return if(2) mode = 3 to_chat(user, "Changed mode to 'Deconstruct'") - if(prob(20)) src.spark_system.start() return if(3) mode = 1 to_chat(user, "Changed mode to 'Floor & Walls'") - if(prob(20)) src.spark_system.start() return @@ -101,7 +96,6 @@ RCD if(istype(A, /turf/space)) if(useResource(1, user)) to_chat(user, "Building Floor...") - activate() A:ChangeTurf(/turf/simulated/floor/plating) return 1 @@ -110,7 +104,6 @@ RCD if(istype(A, /turf/simulated/floor)) if(checkResource(3, user)) to_chat(user, "Building Wall ...") - playsound(src.loc, 'sound/machines/click.ogg', 50, 1) if(do_after(user, 20, target = A)) if(!useResource(3, user)) return 0 @@ -123,7 +116,6 @@ RCD if(istype(A, /turf/simulated/floor)) if(checkResource(10, user)) to_chat(user, "Building Airlock...") - playsound(src.loc, 'sound/machines/click.ogg', 50, 1) if(do_after(user, 50, target = A)) if(!useResource(10, user)) return 0 @@ -140,7 +132,6 @@ RCD return 0 if(checkResource(5, user)) to_chat(user, "Deconstructing Wall...") - playsound(src.loc, 'sound/machines/click.ogg', 50, 1) if(do_after(user, 40, target = A)) if(!useResource(5, user)) return 0 @@ -152,7 +143,6 @@ RCD if(istype(A, /turf/simulated/floor)) if(checkResource(5, user)) to_chat(user, "Deconstructing Floor...") - playsound(src.loc, 'sound/machines/click.ogg', 50, 1) if(do_after(user, 50, target = A)) if(!useResource(5, user)) return 0 @@ -164,7 +154,6 @@ RCD if(istype(A, /obj/machinery/door/airlock)) if(checkResource(20, user)) to_chat(user, "Deconstructing Airlock...") - playsound(src.loc, 'sound/machines/click.ogg', 50, 1) if(do_after(user, 50, target = A)) if(!useResource(20, user)) return 0 @@ -175,7 +164,6 @@ RCD return 0 else to_chat(user, "ERROR: RCD in MODE: [mode] attempted use by [user]. Send this text #coderbus or an admin.") - return 0 /obj/item/weapon/rcd/proc/useResource(var/amount, var/mob/user) diff --git a/code/game/objects/items/weapons/RSF.dm b/code/game/objects/items/weapons/RSF.dm index d8e4c22314e..de36f655360 100644 --- a/code/game/objects/items/weapons/RSF.dm +++ b/code/game/objects/items/weapons/RSF.dm @@ -24,13 +24,11 @@ RSF if (istype(W, /obj/item/weapon/rcd_ammo)) if ((matter + 10) > 30) to_chat(user, "The RSF cant hold any more matter.") - return qdel(W) matter += 10 playsound(src.loc, 'sound/machines/click.ogg', 10, 1) to_chat(user, "The RSF now holds [matter]/30 fabrication-units.") - desc = "A RSF. It currently holds [matter]/30 fabrication-units." return @@ -39,32 +37,26 @@ RSF if (mode == 1) mode = 2 to_chat(user, "Changed dispensing mode to 'Drinking Glass'") - return if (mode == 2) mode = 3 to_chat(user, "Changed dispensing mode to 'Paper'") - return if (mode == 3) mode = 4 to_chat(user, "Changed dispensing mode to 'Pen'") - return if (mode == 4) mode = 5 to_chat(user, "Changed dispensing mode to 'Dice Pack'") - return if (mode == 5) mode = 6 to_chat(user, "Changed dispensing mode to 'Cigarette'") - return if (mode == 6) mode = 1 to_chat(user, "Changed dispensing mode to 'Dosh'") - return // Change mode @@ -76,7 +68,6 @@ RSF if (istype(A, /obj/structure/table) && mode == 1) if (istype(A, /obj/structure/table) && matter >= 1) to_chat(user, "Dispensing Dosh...") - playsound(src.loc, 'sound/machines/click.ogg', 10, 1) new /obj/item/weapon/spacecash/c10( A.loc ) if (isrobot(user)) @@ -85,14 +76,12 @@ RSF else matter-- to_chat(user, "The RSF now holds [matter]/30 fabrication-units.") - desc = "A RSF. It currently holds [matter]/30 fabrication-units." return else if (istype(A, /turf/simulated/floor) && mode == 1) if (istype(A, /turf/simulated/floor) && matter >= 1) to_chat(user, "Dispensing Dosh...") - playsound(src.loc, 'sound/machines/click.ogg', 10, 1) new /obj/item/weapon/spacecash/c10( A ) if (isrobot(user)) @@ -101,14 +90,12 @@ RSF else matter-- to_chat(user, "The RSF now holds [matter]/30 fabrication-units.") - desc = "A RSF. It currently holds [matter]/30 fabrication-units." return else if (istype(A, /obj/structure/table) && mode == 2) if (istype(A, /obj/structure/table) && matter >= 1) to_chat(user, "Dispensing Drinking Glass...") - playsound(src.loc, 'sound/machines/click.ogg', 10, 1) new /obj/item/weapon/reagent_containers/food/drinks/drinkingglass( A.loc ) if (isrobot(user)) @@ -117,14 +104,12 @@ RSF else matter-- to_chat(user, "The RSF now holds [matter]/30 fabrication-units.") - desc = "A RSF. It currently holds [matter]/30 fabrication-units." return else if (istype(A, /turf/simulated/floor) && mode == 2) if (istype(A, /turf/simulated/floor) && matter >= 1) to_chat(user, "Dispensing Drinking Glass...") - playsound(src.loc, 'sound/machines/click.ogg', 10, 1) new /obj/item/weapon/reagent_containers/food/drinks/drinkingglass( A ) if (isrobot(user)) @@ -133,14 +118,12 @@ RSF else matter-- to_chat(user, "The RSF now holds [matter]/30 fabrication-units.") - desc = "A RSF. It currently holds [matter]/30 fabrication-units." return else if (istype(A, /obj/structure/table) && mode == 3) if (istype(A, /obj/structure/table) && matter >= 1) to_chat(user, "Dispensing Paper Sheet...") - playsound(src.loc, 'sound/machines/click.ogg', 10, 1) new /obj/item/weapon/paper( A.loc ) if (isrobot(user)) @@ -149,14 +132,12 @@ RSF else matter-- to_chat(user, "The RSF now holds [matter]/30 fabrication-units.") - desc = "A RSF. It currently holds [matter]/30 fabrication-units." return else if (istype(A, /turf/simulated/floor) && mode == 3) if (istype(A, /turf/simulated/floor) && matter >= 1) to_chat(user, "Dispensing Paper Sheet...") - playsound(src.loc, 'sound/machines/click.ogg', 10, 1) new /obj/item/weapon/paper( A ) if (isrobot(user)) @@ -165,14 +146,12 @@ RSF else matter-- to_chat(user, "The RSF now holds [matter]/30 fabrication-units.") - desc = "A RSF. It currently holds [matter]/30 fabrication-units." return else if (istype(A, /obj/structure/table) && mode == 4) if (istype(A, /obj/structure/table) && matter >= 1) to_chat(user, "Dispensing Pen...") - playsound(src.loc, 'sound/machines/click.ogg', 10, 1) new /obj/item/weapon/pen( A.loc ) if (isrobot(user)) @@ -181,14 +160,12 @@ RSF else matter-- to_chat(user, "The RSF now holds [matter]/30 fabrication-units.") - desc = "A RSF. It currently holds [matter]/30 fabrication-units." return else if (istype(A, /turf/simulated/floor) && mode == 4) if (istype(A, /turf/simulated/floor) && matter >= 1) to_chat(user, "Dispensing Pen...") - playsound(src.loc, 'sound/machines/click.ogg', 10, 1) new /obj/item/weapon/pen( A ) if (isrobot(user)) @@ -197,14 +174,12 @@ RSF else matter-- to_chat(user, "The RSF now holds [matter]/30 fabrication-units.") - desc = "A RSF. It currently holds [matter]/30 fabrication-units." return else if (istype(A, /obj/structure/table) && mode == 5) if (istype(A, /obj/structure/table) && matter >= 1) to_chat(user, "Dispensing Dice Pack...") - playsound(src.loc, 'sound/machines/click.ogg', 10, 1) new /obj/item/weapon/storage/pill_bottle/dice( A.loc ) if (isrobot(user)) @@ -213,14 +188,12 @@ RSF else matter-- to_chat(user, "The RSF now holds [matter]/30 fabrication-units.") - desc = "A RSF. It currently holds [matter]/30 fabrication-units." return else if (istype(A, /turf/simulated/floor) && mode == 5) if (istype(A, /turf/simulated/floor) && matter >= 1) to_chat(user, "Dispensing Dice Pack...") - playsound(src.loc, 'sound/machines/click.ogg', 10, 1) new /obj/item/weapon/storage/pill_bottle/dice( A ) if (isrobot(user)) @@ -229,14 +202,12 @@ RSF else matter-- to_chat(user, "The RSF now holds [matter]/30 fabrication-units.") - desc = "A RSF. It currently holds [matter]/30 fabrication-units." return else if (istype(A, /obj/structure/table) && mode == 6) if (istype(A, /obj/structure/table) && matter >= 1) to_chat(user, "Dispensing Cigarette...") - playsound(src.loc, 'sound/machines/click.ogg', 10, 1) new /obj/item/clothing/mask/cigarette( A.loc ) if (isrobot(user)) @@ -245,14 +216,12 @@ RSF else matter-- to_chat(user, "The RSF now holds [matter]/30 fabrication-units.") - desc = "A RSF. It currently holds [matter]/30 fabrication-units." return else if (istype(A, /turf/simulated/floor) && mode == 6) if (istype(A, /turf/simulated/floor) && matter >= 1) to_chat(user, "Dispensing Cigarette...") - playsound(src.loc, 'sound/machines/click.ogg', 10, 1) new /obj/item/clothing/mask/cigarette( A ) if (isrobot(user)) @@ -261,6 +230,5 @@ RSF else matter-- to_chat(user, "The RSF now holds [matter]/30 fabrication-units.") - desc = "A RSF. It currently holds [matter]/30 fabrication-units." return \ No newline at end of file diff --git a/code/game/objects/items/weapons/alien_specific.dm b/code/game/objects/items/weapons/alien_specific.dm index 310b1e309f4..e4f6bcd7a75 100644 --- a/code/game/objects/items/weapons/alien_specific.dm +++ b/code/game/objects/items/weapons/alien_specific.dm @@ -35,12 +35,10 @@ if(istype(A, /obj/structure/reagent_dispensers) && get_dist(src,A) <= 1) if(!A.reagents.total_volume && A.reagents) to_chat(user, "\The [A] is empty.") - return if(reagents.total_volume >= reagents.maximum_volume) to_chat(user, "\The [src] is full.") - return reagents.remove_reagent(25,"water") var/datum/effect/system/bad_smoke_spread/smoke = new /datum/effect/system/bad_smoke_spread() diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 6872764d511..d30cc76b0a7 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -121,7 +121,6 @@ else to_chat(user, "It is too far away.") - /obj/item/weapon/card/id/proc/show(mob/user as mob) var/datum/asset/assets = get_asset_datum(/datum/asset/simple/paper) assets.send(user) @@ -143,7 +142,6 @@ "You flash your ID card: \icon[src] [src.name]. The assignment on the card: [src.assignment]") if(mining_points) to_chat(user, "There's [mining_points] mining equipment redemption points loaded onto this card.") - src.add_fingerprint(user) return @@ -193,7 +191,6 @@ if(istype(W, /obj/item/weapon/id_decal/)) var/obj/item/weapon/id_decal/decal = W to_chat(user, "You apply [decal] to [src].") - if(decal.override_name) name = decal.decal_name desc = decal.decal_desc @@ -208,11 +205,9 @@ dat+="" stamped = 1 to_chat(usr, "You stamp the ID card!") - else to_chat(usr, "This ID has already been stamped!") - /obj/item/weapon/card/id/silver name = "identification card" desc = "A silver card which shows honour and dedication." @@ -248,7 +243,6 @@ if(istype(user, /mob/living) && user.mind) if(user.mind.special_role) to_chat(usr, "The card's microscanners activate as you pass it over \the [I], copying its access.") - src.access |= I.access //Don't copy access if user isn't an antag -- to prevent metagaming /obj/item/weapon/card/id/syndicate/proc/fake_id_photo(var/mob/living/carbon/human/H, var/side=0)//get_id_photo wouldn't work correctly @@ -260,7 +254,6 @@ if(!side) if(!H.equip_to_slot_if_possible(src, slot_l_store, 0, 1)) to_chat(H, "You need to empty your pockets before taking the ID picture.") - return if(side) @@ -281,20 +274,17 @@ var t = reject_bad_name(input(user, "What name would you like to use on this card?", "Agent Card name", ishuman(user) ? user.real_name : user.name)) if(!t) to_chat(user, "Invalid name.") - return src.registered_name = t var u = sanitize(stripped_input(user, "What occupation would you like to put on this card?\nNote: This will not grant any access levels other than maintenance.", "Agent Card Job Assignment", "Agent", MAX_MESSAGE_LEN)) if(!u) to_chat(user, "Invalid assignment.") - src.registered_name = "" return src.assignment = u src.name = "[src.registered_name]'s ID Card ([src.assignment])" to_chat(user, "You successfully forge the ID card.") - registered_user = user else if(!registered_user || registered_user == user) if(!registered_user) @@ -313,7 +303,6 @@ UpdateName() to_chat(user, "Name changed to [new_name].") - if("Photo") if(!Adjacent(user)) return @@ -324,7 +313,6 @@ if(photo && photoside) to_chat(user, "Photo changed.") - if("Appearance") var/list/appearances = list( "data", @@ -362,7 +350,6 @@ src.icon_state = choice to_chat(usr, "Appearance changed to [choice].") - if("Sex") var/new_sex = sanitize(stripped_input(user,"What sex would you like to put on this card?","Agent Card Sex", ishuman(user) ? capitalize(user.gender) : "Male", MAX_MESSAGE_LEN)) if(!Adjacent(user)) @@ -370,7 +357,6 @@ src.sex = new_sex to_chat(user, "Sex changed to [new_sex].") - if("Age") var/new_age = sanitize(stripped_input(user,"What age would you like to put on this card?","Agent Card Age","21", MAX_MESSAGE_LEN)) if(!Adjacent(user)) @@ -378,14 +364,12 @@ src.age = new_age to_chat(user, "Age changed to [new_age].") - if("Occupation") var/new_job = sanitize(stripped_input(user,"What job would you like to put on this card?\nChanging occupation will not grant or remove any access levels.","Agent Card Occupation", "Civilian", MAX_MESSAGE_LEN)) if(!Adjacent(user)) return src.assignment = new_job to_chat(user, "Occupation changed to [new_job].") - UpdateName() if("Money Account") @@ -395,7 +379,6 @@ associated_account_number = new_account to_chat(user, "Linked money account changed to [new_account].") - if("Blood Type") var/default = "\[UNSET\]" if(ishuman(user)) @@ -409,7 +392,6 @@ src.blood_type = new_blood_type to_chat(user, "Blood type changed to [new_blood_type].") - if("DNA Hash") var/default = "\[UNSET\]" if(ishuman(user)) @@ -423,7 +405,6 @@ src.dna_hash = new_dna_hash to_chat(user, "DNA hash changed to [new_dna_hash].") - if("Fingerprint Hash") var/default = "\[UNSET\]" if(ishuman(user)) @@ -437,7 +418,6 @@ src.fingerprint_hash = new_fingerprint_hash to_chat(user, "Fingerprint hash changed to [new_fingerprint_hash].") - if("Reset Card") name = initial(name) registered_name = initial(registered_name) @@ -453,7 +433,6 @@ registered_user = null to_chat(user, "All information has been deleted from \the [src].") - else ..() @@ -519,7 +498,6 @@ /obj/item/weapon/card/id/prisoner/attack_self(mob/user as mob) to_chat(usr, "You have accumulated [points] out of the [goal] points you need for freedom.") - /obj/item/weapon/card/id/prisoner/one name = "Prisoner #13-001" registered_name = "Prisoner #13-001" diff --git a/code/game/objects/items/weapons/cash.dm b/code/game/objects/items/weapons/cash.dm index a4bed3e7ba5..6a1d6c0c360 100644 --- a/code/game/objects/items/weapons/cash.dm +++ b/code/game/objects/items/weapons/cash.dm @@ -38,13 +38,10 @@ var/global/list/moneytypes=list( /obj/item/weapon/spacecash/examine(mob/user) if(amount>1) to_chat(user, "\icon[src] This is a stack of [amount] [src]s.") - else to_chat(user, "\icon[src] This is \a [src]s.") - to_chat(user, "It's worth [worth*amount] credits.") - /obj/item/weapon/spacecash/update_icon() icon_state = "cash[worth]" // Up to 100 items per stack. @@ -71,7 +68,6 @@ var/global/list/moneytypes=list( if(collected) update_icon() to_chat(user, "You add [collected] credit [amount > 1 ? "chips":"chip"] to your stack of cash.") - else if(istype(A,/obj/item/weapon/spacecash)) var/obj/item/weapon/spacecash/cash = A var/collected = src.collect_from(cash) @@ -80,7 +76,6 @@ var/global/list/moneytypes=list( to_chat(user, "You add [collected] credit [amount > 1 ? "chips":"chip"] to your stack of cash.") - /obj/item/weapon/spacecash/proc/get_total() return worth * amount diff --git a/code/game/objects/items/weapons/caution.dm b/code/game/objects/items/weapons/caution.dm index 46a4f0e61df..9c13ef43832 100644 --- a/code/game/objects/items/weapons/caution.dm +++ b/code/game/objects/items/weapons/caution.dm @@ -23,7 +23,6 @@ if(armed) armed = 0 to_chat(user, "\blue You disarm \the [src].") - return timing = !timing if(timing) @@ -33,7 +32,6 @@ timepassed = 0 to_chat(H, "\blue You [timing ? "activate \the [src]'s timer, you have 15 seconds." : "de-activate \the [src]'s timer."]") - process() if(!timing) processing_objects.Remove(src) diff --git a/code/game/objects/items/weapons/chrono_eraser.dm b/code/game/objects/items/weapons/chrono_eraser.dm index 0b943b4bc82..e0ac96c4feb 100644 --- a/code/game/objects/items/weapons/chrono_eraser.dm +++ b/code/game/objects/items/weapons/chrono_eraser.dm @@ -83,7 +83,6 @@ if(F.gun) if(isliving(user) && F.captured) to_chat(user, "FAIL: [F.captured] already has an existing connection.") - src.field_disconnect(F) else startpos = get_turf(src) @@ -93,7 +92,6 @@ to_chat(user, "Connection established with target: [F.captured]") - /obj/item/weapon/gun/energy/chrono_gun/proc/field_disconnect(var/obj/effect/chrono_field/F) if(F && field == F) var/mob/living/user = src.loc @@ -101,7 +99,6 @@ F.gun = null if(isliving(user) && F.captured) to_chat(user, "Disconnected from target: [F.captured]") - field = null startpos = null @@ -198,7 +195,6 @@ qdel(src) else if(tickstokill <= 0) to_chat(captured, "As the last essence of your being is erased from time, you begin to re-experience your most enjoyable memory. You feel happy...") - var/mob/dead/observer/ghost = captured.ghostize(1) if(captured.mind) if(ghost) diff --git a/code/game/objects/items/weapons/cigs.dm b/code/game/objects/items/weapons/cigs.dm index 85ed5cde403..25a50a5bfe1 100644 --- a/code/game/objects/items/weapons/cigs.dm +++ b/code/game/objects/items/weapons/cigs.dm @@ -103,16 +103,13 @@ LIGHTERS ARE IN LIGHTERS.DM var/transfered = glass.reagents.trans_to(src, chem_volume) if(transfered) //if reagents were transfered, show the message to_chat(user, "You dip \the [src] into \the [glass].") - else //if not, either the beaker was empty, or the cigarette was full if(!glass.reagents.total_volume) to_chat(user, "[glass] is empty.") - else to_chat(user, "[src] is full.") - /obj/item/clothing/mask/cigarette/proc/light(var/flavor_text = "[usr] lights the [name].") if(!src.lit) src.lit = 1 @@ -180,7 +177,6 @@ LIGHTERS ARE IN LIGHTERS.DM reagents.trans_to(C, REAGENTS_METABOLISM) if(!reagents.total_volume) // There were reagents, but now they're gone to_chat(C, "Your [name] loses its flavor.") - else // else just remove some of the reagents reagents.remove_any(REAGENTS_METABOLISM) return @@ -193,7 +189,6 @@ LIGHTERS ARE IN LIGHTERS.DM if(ismob(loc)) var/mob/living/M = loc to_chat(M, "Your [name] goes out.") - M.unEquip(src, 1) //Force the un-equip so the overlays update processing_objects.Remove(src) qdel(src) @@ -309,7 +304,6 @@ LIGHTERS ARE IN LIGHTERS.DM else to_chat(user, "\The [src] straight out REFUSES to be lit by such uncivilized means.") - ///////////////// //SMOKING PIPES// ///////////////// @@ -345,7 +339,6 @@ LIGHTERS ARE IN LIGHTERS.DM if(ismob(loc)) var/mob/living/M = loc to_chat(M, "Your [name] goes out, and you empty the ash.") - lit = 0 icon_state = icon_off item_state = icon_off @@ -365,7 +358,6 @@ LIGHTERS ARE IN LIGHTERS.DM return if(smoketime <= 0) to_chat(user, "You refill the pipe with tobacco.") - reagents.add_reagent("nicotine", chem_volume) smoketime = initial(smoketime) return @@ -376,7 +368,6 @@ LIGHTERS ARE IN LIGHTERS.DM else to_chat(user, "\The [src] straight out REFUSES to be lit by such means.") - /obj/item/clothing/mask/cigarette/pipe/cobpipe name = "corn cob pipe" desc = "A nicotine delivery system popularized by folksy backwoodsmen and kept popular in the modern age and beyond by space hipsters." @@ -411,13 +402,11 @@ obj/item/weapon/rollingpaperpack/attack_self(mob/user) var/obj/item/weapon/rollingpaper/P = new /obj/item/weapon/rollingpaper() user.put_in_inactive_hand(P) to_chat(user, "You take a paper out of the pack.") - papers -- else var/obj/item/weapon/rollingpaper/P = new /obj/item/weapon/rollingpaper() user.put_in_inactive_hand(P) to_chat(user, "You take the last paper out of the pack, and throw the pack away.") - qdel(src) /obj/item/weapon/rollingpaperpack/MouseDrop(atom/over_object) @@ -440,4 +429,3 @@ obj/item/weapon/rollingpaperpack/attack_self(mob/user) /obj/item/weapon/rollingpaperpack/examine(mob/user) ..(user) to_chat(user, "There are [src.papers] left") - diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm index b268e0f7124..2038c4851aa 100644 --- a/code/game/objects/items/weapons/clown_items.dm +++ b/code/game/objects/items/weapons/clown_items.dm @@ -39,18 +39,15 @@ //So this is a workaround. This also makes more sense from an IC standpoint. ~Carn if(user.client && (target in user.client.screen)) to_chat(user, "You need to take that [target.name] off before cleaning it.") - else if(istype(target,/obj/effect/decal/cleanable)) user.visible_message("[user] begins to scrub \the [target.name] out with [src].") if(do_after(user, src.cleanspeed, target = target) && target) to_chat(user, "You scrub \the [target.name] out.") - qdel(target) else user.visible_message("[user] begins to clean \the [target.name] with [src].") if(do_after(user, src.cleanspeed, target = target)) to_chat(user, "You clean \the [target.name].") - var/obj/effect/decal/cleanable/C = locate() in target qdel(C) target.clean_blood() diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm index 61acf83ea56..208b93c0c53 100644 --- a/code/game/objects/items/weapons/cosmetics.dm +++ b/code/game/objects/items/weapons/cosmetics.dm @@ -43,7 +43,6 @@ /obj/item/weapon/lipstick/attack_self(mob/user as mob) overlays.Cut() to_chat(user, "You twist \the [src] [open ? "closed" : "open"].") - open = !open if(open) var/image/colored = image("icon"='icons/obj/items.dmi', "icon_state"="lipstick_uncap_color") @@ -62,7 +61,6 @@ var/mob/living/carbon/human/H = M if(H.lip_style) //if they already have lipstick on to_chat(user, "You need to wipe off the old lipstick first!") - return if(H == user) user.visible_message("[user] does their lips with \the [src].", \ @@ -82,7 +80,6 @@ else to_chat(user, "Where are the lips on that?") - /obj/item/weapon/razor name = "electric razor" desc = "The latest and greatest power razor born from the science of shaving." @@ -97,16 +94,13 @@ if(user.zone_sel.selecting == "mouth") if(!get_location_accessible(H, "mouth")) to_chat(user, "The mask is in the way.") - return if(H.species && H.species.flags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, but doesn't have one... if(!H.client.prefs.rlimb_data["head"]) to_chat(user, "You find yourself disappointed at the appalling lack of facial hair.") - return if(H.f_style == "Shaved") to_chat(user, "Already clean-shaven.") - return if(H == user) //shaving yourself user.visible_message("[user] starts to shave their facial hair with \the [src].", \ @@ -132,16 +126,13 @@ if(user.zone_sel.selecting == "head") if(!get_location_accessible(H, "head")) to_chat(user, "The headgear is in the way.") - return if(H.species && H.species.flags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, but doesn't have one... if(!H.client.prefs.rlimb_data["head"]) to_chat(user, "You find yourself disappointed at the appalling lack of hair.") - return if(H.h_style == "Bald" || H.h_style == "Balding Hair" || H.h_style == "Skinhead") to_chat(user, "There is not enough hair left to shave...") - return if(H == user) //shaving yourself user.visible_message("[user] starts to shave their head with \the [src].", \ diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index d5fc69da9db..73eda279b3d 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -78,7 +78,6 @@ toggle_paddles() else to_chat(usr, "Put the defibrillator on your back first!") - return /obj/item/weapon/defibrillator/attackby(obj/item/weapon/W, mob/user, params) @@ -86,18 +85,15 @@ var/obj/item/weapon/stock_parts/cell/C = W if(bcell) to_chat(user, "[src] already has a cell.") - else if(C.maxcharge < paddles.revivecost) to_chat(user, "[src] requires a higher capacity cell.") - return user.drop_item() W.loc = src bcell = W to_chat(user, "You install a cell in [src].") - if(istype(W, /obj/item/weapon/screwdriver)) if(bcell) bcell.updateicon() @@ -105,7 +101,6 @@ bcell = null to_chat(user, "You remove the cell from the [src].") - update_icon() return @@ -113,12 +108,10 @@ if(safety) safety = 0 to_chat(user, "You silently disable [src]'s safety protocols with the card.") - else safety = 1 to_chat(user, "You silently enable [src]'s safety protocols with the card.") - /obj/item/weapon/defibrillator/emp_act(severity) if(bcell) deductcharge(1000 / severity) @@ -146,7 +139,6 @@ if(!usr.put_in_hands(paddles)) on = 0 to_chat(user, "You need a free hand to hold the paddles!") - update_icon() return paddles.loc = user @@ -223,7 +215,6 @@ toggle_paddles() else to_chat(usr, "Strap the defibrillator's belt on first!") - return /obj/item/weapon/defibrillator/compact/loaded/New() @@ -297,7 +288,6 @@ if(istype(O)) O.unwield() to_chat(user, "The paddles snap back into the main unit.") - defib.on = 0 loc = defib defib.update_icon() @@ -324,15 +314,12 @@ return if(!wielded) to_chat(user, "You need to wield the paddles in both hands before you can use them on someone!") - return if(cooldown) to_chat(user, "[defib] is recharging.") - return if(!ishuman(M)) to_chat(user, "The instructions on [defib] don't mention how to revive that...") - return else if(user.a_intent == I_HARM && !defib.safety) @@ -414,9 +401,7 @@ else if(ghost) user.visible_message("[defib] buzzes: Resuscitation failed: Patient's brain is unresponsive. Further attempts may succeed.") to_chat(ghost, "Your heart is being defibrillated. Return to your body if you want to be revived! (Verbs -> Ghost -> Re-enter corpse)") - to_chat(ghost, sound('sound/effects/genetics.ogg')) - else user.visible_message("[defib] buzzes: Resuscitation failed.") playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) @@ -431,7 +416,6 @@ update_icon() else to_chat(user, "You need to target your patient's chest with [src].") - return /obj/item/weapon/borg_defib @@ -457,10 +441,8 @@ return if(cooldown) to_chat(user, "[src] is recharging.") - if(!ishuman(M)) to_chat(user, "This unit is only designed to work on humanoid lifeforms.") - return else if(user.a_intent == I_HARM && !safety) @@ -538,9 +520,7 @@ else if(ghost) user.visible_message("[user] buzzes: Resuscitation failed: Patient's brain is unresponsive. Further attempts may succeed.") to_chat(ghost, "Your heart is being defibrillated. Return to your body if you want to be revived! (Verbs -> Ghost -> Re-enter corpse)") - to_chat(ghost, sound('sound/effects/genetics.ogg')) - else user.visible_message("[user] buzzes: Resuscitation failed.") playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) @@ -559,5 +539,4 @@ update_icon() else to_chat(user, "You need to target your patient's chest with [src].") - return \ No newline at end of file diff --git a/code/game/objects/items/weapons/dice.dm b/code/game/objects/items/weapons/dice.dm index 89c1d336ac9..bea51ec4452 100644 --- a/code/game/objects/items/weapons/dice.dm +++ b/code/game/objects/items/weapons/dice.dm @@ -81,7 +81,6 @@ /obj/item/weapon/dice/d4/Crossed(var/mob/living/carbon/human/H) if(istype(H) && !H.shoes) to_chat(H, "You step on the D4!") - H.apply_damage(4,BRUTE,(pick("l_leg", "r_leg"))) H.Weaken(3) *///ew. diff --git a/code/game/objects/items/weapons/dnascrambler.dm b/code/game/objects/items/weapons/dnascrambler.dm index 8158f1c54aa..47bea6ca58d 100644 --- a/code/game/objects/items/weapons/dnascrambler.dm +++ b/code/game/objects/items/weapons/dnascrambler.dm @@ -33,7 +33,6 @@ else to_chat(user, "\red You failed to inject [M.name].") - proc/injected(var/mob/living/carbon/target, var/mob/living/carbon/user) scramble(1, target, 100) target.generate_name() diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index 4169e9a283c..afff3a01fd3 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -26,7 +26,6 @@ /obj/item/weapon/c4/suicide_act(var/mob/user) . = (BRUTELOSS) to_chat(viewers(user), "[user] activates the C4 and holds it above his head! It looks like \he's going out with a bang!") - var/message_say = "FOR NO RAISIN!" if(user.mind) if(user.mind.special_role) @@ -57,7 +56,6 @@ if(istype(I, /obj/item/weapon/screwdriver)) open_panel = !open_panel to_chat(user, "You [open_panel ? "open" : "close"] the wire panel.") - else if(istype(I, /obj/item/weapon/wirecutters) || istype(I, /obj/item/device/multitool) || istype(I, /obj/item/device/assembly/signaler )) wires.Interact(user) else @@ -75,7 +73,6 @@ to_chat(user, "Timer set for [timer] seconds.") - /obj/item/weapon/c4/afterattack(atom/target as obj|turf, mob/user as mob, flag) if (!flag) return @@ -83,7 +80,6 @@ return to_chat(user, "Planting explosives...") - if(do_after(user, 50, target = target) && in_range(user, target)) user.drop_item() src.target = target @@ -101,7 +97,6 @@ target.overlays += image('icons/obj/assemblies.dmi', "plastic-explosive2") to_chat(user, "Bomb has been planted. Timer counting down from [timer].") - spawn(timer*10) explode(get_turf(target)) diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index ed6032c55d8..0cd8f88dd99 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -38,13 +38,11 @@ /obj/item/weapon/extinguisher/examine(mob/user) if(..(user, 0)) to_chat(usr, "\icon[src] [src.name] contains:") - if(reagents && reagents.reagent_list.len) for(var/datum/reagent/R in reagents.reagent_list) to_chat(user, "\blue [R.volume] units of [R.name]") - /obj/item/weapon/extinguisher/New() create_reagents(max_water) reagents.add_reagent("water", max_water) @@ -54,7 +52,6 @@ src.icon_state = "[sprite_name][!safety]" src.desc = "The safety is [safety ? "on" : "off"]." to_chat(user, "The safety is [safety ? "on" : "off"].") - return /obj/item/weapon/extinguisher/proc/AttemptRefill(atom/target, mob/user) @@ -63,20 +60,17 @@ safety = 1 if(reagents.total_volume == reagents.maximum_volume) to_chat(user, "\The [src] is already full!") - safety = safety_save return 1 var/obj/structure/reagent_dispensers/watertank/W = target var/transferred = W.reagents.trans_to(src, max_water) if(transferred > 0) to_chat(user, "\The [src] has been refilled by [transferred] units") - playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6) for(var/datum/reagent/water/R in reagents.reagent_list) R.cooling_temperature = cooling_power else to_chat(user, "\The [W] is empty!") - safety = safety_save return 1 else @@ -92,7 +86,6 @@ if (!safety) if (src.reagents.total_volume < 1) to_chat(usr, "\The [src] is empty.") - return if (world.time < src.last_use + 20) diff --git a/code/game/objects/items/weapons/fireworks.dm b/code/game/objects/items/weapons/fireworks.dm index b0d15af37e7..389eb1738d6 100644 --- a/code/game/objects/items/weapons/fireworks.dm +++ b/code/game/objects/items/weapons/fireworks.dm @@ -10,7 +10,6 @@ obj/item/weapon/firework/attackby(obj/item/weapon/W,mob/user, params) if (istype(W, /obj/item/weapon/weldingtool) && W:welding || istype(W,/obj/item/weapon/lighter) && W:lit) for(var/mob/M in viewers(user)) to_chat(M, "[user] lits \the [src]") - litzor = 1 icon_state = "rocket_1" S = new() @@ -33,7 +32,6 @@ obj/item/weapon/sparkler/attackby(obj/item/weapon/W,mob/user, params) if (istype(W, /obj/item/weapon/weldingtool) && W:welding || istype(W,/obj/item/weapon/lighter) && W:lit) for(var/mob/M in viewers(user)) to_chat(M, "[user] lits \the [src]") - litzor = 1 icon_state = "sparkler_1" var/b = rand(5,9) diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index c5ba5c80a86..75c1b030ed4 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -94,7 +94,6 @@ if(isscrewdriver(W) && igniter && !lit) status = !status to_chat(user, "[igniter] is now [status ? "secured" : "unsecured"]!") - update_icon() return @@ -111,7 +110,6 @@ if(istype(W,/obj/item/weapon/tank/plasma)) if(ptank) to_chat(user, "There appears to already be a plasma tank loaded in [src]!") - return user.drop_item() ptank = W @@ -130,7 +128,6 @@ user.set_machine(src) if(!ptank) to_chat(user, "Attach a plasma tank first!") - return var/dat = text("Flamethrower ([lit ? "Lit" : "Unlit"])
      \n Tank Pressure: [ptank.air_contents.return_pressure()]
      \nAmount to throw: - - - [throw_amount] + + +
      \nRemove plasmatank - Close
      ") user << browse(dat, "window=flamethrower;size=600x300") diff --git a/code/game/objects/items/weapons/garrote.dm b/code/game/objects/items/weapons/garrote.dm index 3783dba12c7..e6b0ff92c32 100644 --- a/code/game/objects/items/weapons/garrote.dm +++ b/code/game/objects/items/weapons/garrote.dm @@ -56,12 +56,10 @@ if(!wielded) to_chat(user, "You must use both hands to garrote [M]!") - return if(!istype(M, /mob/living/carbon/human)) to_chat(user, "You don't think that garroting [M] would be very effective...") - return if(M == U) @@ -70,16 +68,13 @@ if(M.dir != U.dir) to_chat(user, "You cannot use [src] on [M] from that angle!") - return if(improvised && ((M.head && (M.head.flags & HEADCOVERSMOUTH)) || (M.wear_mask && (M.wear_mask.flags & MASKCOVERSMOUTH)))) // Improvised garrotes are blocked by mouth-covering items. to_chat(user, "[M]'s neck is blocked by something they're wearing!") - if(strangling) to_chat(user, "You cannot use [src] on two people at once!") - return unwield(U) diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm index 0792d008746..00433885ad5 100644 --- a/code/game/objects/items/weapons/gift_wrappaper.dm +++ b/code/game/objects/items/weapons/gift_wrappaper.dm @@ -31,7 +31,6 @@ src.gift.add_fingerprint(user) else to_chat(user, "\blue The gift was empty!") - qdel(src) return @@ -44,18 +43,15 @@ return to_chat(user, "\blue You cant move.") - /obj/effect/spresent/attackby(obj/item/weapon/W as obj, mob/user as mob, params) ..() if (!istype(W, /obj/item/weapon/wirecutters)) to_chat(user, "\blue I need wirecutters for that.") - return to_chat(user, "\blue You cut open the present.") - for(var/mob/M in src) //Should only be one but whatever. M.loc = src.loc if (M.client) @@ -146,4 +142,3 @@ /obj/item/stack/wrapping_paper/attack_self(mob/user) to_chat(user, "You need to use it on a package that has already been wrapped!") - diff --git a/code/game/objects/items/weapons/grenades/bananade.dm b/code/game/objects/items/weapons/grenades/bananade.dm index c21f507e0a5..12e2e111d21 100644 --- a/code/game/objects/items/weapons/grenades/bananade.dm +++ b/code/game/objects/items/weapons/grenades/bananade.dm @@ -41,12 +41,10 @@ var/turf/T if(istype(I, /obj/item/weapon/bananapeel)) if(fillamt < 9) to_chat(usr, "You add another banana peel to the assembly.") - fillamt += 1 qdel(I) else to_chat(usr, "The bananade is full, screwdriver it shut to lock it down.") - if(istype(I, /obj/item/weapon/screwdriver)) if(fillamt) var/obj/item/weapon/grenade/bananade/G = new /obj/item/weapon/grenade/bananade @@ -54,11 +52,8 @@ var/turf/T user.put_in_hands(G) G.deliveryamt = src.fillamt to_chat(user, "You lock the assembly shut, readying it for HONK.") - qdel(src) else to_chat(usr, "You need to add banana peels before you can ready the grenade!.") - else to_chat(usr, "Only banana peels fit in this assembly, up to 9.") - diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index d08e1c7ab00..149cc03a866 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -94,7 +94,6 @@ log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z])") bombers += "[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z])" to_chat(user, "You prime the [name]! [det_time / 10] second\s!") - active = 1 update_icon() if(iscarbon(user)) @@ -115,13 +114,11 @@ label = null update_icon() to_chat(user, "You remove the label from [src].") - return 1 if(istype(I, /obj/item/weapon/screwdriver)) if(stage == WIRED) if(beakers.len) to_chat(user, "You lock the assembly.") - playsound(loc, 'sound/items/Screwdriver.ogg', 25, -3) stage = READY update_icon() @@ -144,31 +141,25 @@ log_game("[key_name(usr)] has completed [name] at [bombturf.x], [bombturf.y], [bombturf.z].") else to_chat(user, "You need to add at least one beaker before locking the assembly.") - else if(stage == READY && !nadeassembly) det_time = det_time == 50 ? 30 : 50 //toggle between 30 and 50 to_chat(user, "You modify the time delay. It's set for [det_time / 10] second\s.") - else if(stage == EMPTY) to_chat(user, "You need to add an activation mechanism.") - else if(stage == WIRED && is_type_in_list(I, allowed_containers)) if(beakers.len == 2) to_chat(user, "[src] can not hold more containers.") - return else if(I.reagents.total_volume) to_chat(user, "You add [I] to the assembly.") - user.drop_item() I.loc = src beakers += I else to_chat(user, "[I] is empty.") - else if(stage == EMPTY && istype(I, /obj/item/device/assembly_holder)) var/obj/item/device/assembly_holder/A = I if(!A.secured) @@ -183,7 +174,6 @@ assemblyattacher = user.ckey stage = WIRED to_chat(user, "You add [A] to [src]!") - update_icon() else if(stage == EMPTY && istype(I, /obj/item/stack/cable_coil)) @@ -192,18 +182,15 @@ stage = WIRED to_chat(user, "You rig [src].") - update_icon() else if(stage == READY && istype(I, /obj/item/weapon/wirecutters)) to_chat(user, "You unlock the assembly.") - stage = WIRED update_icon() else if(stage == WIRED && istype(I, /obj/item/weapon/wrench)) to_chat(user, "You open the grenade and remove the contents.") - stage = EMPTY payload_name = null label = null @@ -396,7 +383,6 @@ /obj/item/weapon/grenade/chem_grenade/large/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/slime_extract) && stage == WIRED) to_chat(user, "You add [I] to the assembly.") - user.drop_item() I.loc = src beakers += I diff --git a/code/game/objects/items/weapons/grenades/clowngrenade.dm b/code/game/objects/items/weapons/grenades/clowngrenade.dm index 40ab22742d6..705b6a57095 100644 --- a/code/game/objects/items/weapons/grenades/clowngrenade.dm +++ b/code/game/objects/items/weapons/grenades/clowngrenade.dm @@ -70,7 +70,6 @@ return else to_chat(M, "\red Your feet feel like they're on fire!") - M.take_overall_damage(0, max(0, (burned - 2))) if(!istype(M, /mob/living/carbon/slime) && !isrobot(M)) diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index e66a8977f2e..90ccef1d163 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -30,7 +30,6 @@ if(M.weakeyes) M.visible_message("[M] screams and collapses!") to_chat(M, "AAAAGH!") - M.Weaken(15) //hella stunned M.Stun(15) if(ishuman(M)) @@ -56,12 +55,9 @@ M.ear_deaf = max(M.ear_deaf,15) if (M.ear_damage >= 15) to_chat(M, "Your ears start to ring badly!") - if(prob(M.ear_damage - 10 + 5)) to_chat(M, "You can't hear anything!") - M.disabilities |= DEAF else if (M.ear_damage >= 5) to_chat(M, "Your ears start to ring!") - diff --git a/code/game/objects/items/weapons/grenades/ghettobomb.dm b/code/game/objects/items/weapons/grenades/ghettobomb.dm index 56077622a63..1a6959e8944 100644 --- a/code/game/objects/items/weapons/grenades/ghettobomb.dm +++ b/code/game/objects/items/weapons/grenades/ghettobomb.dm @@ -39,13 +39,11 @@ if( istype(target, /obj/structure/reagent_dispensers/fueltank)) if(target.reagents.total_volume < 50) to_chat(user, "There's not enough fuel left to work with.") - return var/obj/structure/reagent_dispensers/fueltank/F = target F.reagents.remove_reagent("fuel", 50, 1)//Deleting 50 fuel from the welding fuel tank, assembled = 1 to_chat(user, "You've filled the makeshift explosive with welding fuel.") - playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6) desc = "An improvised explosive assembly. Filled to the brim with 'Explosive flavor'" overlays += image('icons/obj/grenade.dmi', icon_state = "improvised_grenade_filled") @@ -59,7 +57,6 @@ C.use(1) assembled = 2 to_chat(user, "You wire the igniter to detonate the fuel.") - desc = "A weak, improvised explosive." overlays += image('icons/obj/grenade.dmi', icon_state = "improvised_grenade_wired") name = "improvised explosive" @@ -106,7 +103,6 @@ if(!active) if(clown_check(user)) to_chat(user, "You light the [name]!") - active = 1 overlays -= image('icons/obj/grenade.dmi', icon_state = "improvised_grenade_filled") icon_state = initial(icon_state) + "_active" @@ -130,4 +126,3 @@ /obj/item/weapon/grenade/iedcasing/examine(mob/user) ..(user) to_chat(user, "You can't tell when it will explode!") - diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index 267d4fe6e05..33b0fc411bb 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -16,7 +16,6 @@ /obj/item/weapon/grenade/proc/clown_check(var/mob/living/user) if((CLUMSY in user.mutations) && prob(50)) to_chat(user, "Huh? How does this thing work?") - active = 1 icon_state = initial(icon_state) + "_active" playsound(loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) @@ -33,7 +32,6 @@ if (istype(target, /obj/item/weapon/gun/grenadelauncher)) return ..() if((user.get_active_hand() == src) && (!active) && (clown_check(user)) && target.loc != src.loc) to_chat(user, "You prime the [name]! [det_time/10] seconds!") - active = 1 icon_state = initial(icon_state) + "_active" playsound(loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) @@ -52,16 +50,13 @@ if(display_timer) if(det_time > 1) to_chat(user, "The timer is set to [det_time/10] second\s.") - else to_chat(user, "\The [src] is set for instant detonation.") - /obj/item/weapon/grenade/attack_self(mob/user as mob) if(!active) if(clown_check(user)) to_chat(user, "You prime the [name]! [det_time/10] seconds!") - active = 1 icon_state = initial(icon_state) + "_active" add_fingerprint(user) @@ -91,19 +86,15 @@ if ("1") det_time = 10 to_chat(user, "You set the [name] for 1 second detonation time.") - if ("10") det_time = 30 to_chat(user, "You set the [name] for 3 second detonation time.") - if ("30") det_time = 50 to_chat(user, "You set the [name] for 5 second detonation time.") - if ("50") det_time = 1 to_chat(user, "You set the [name] for instant detonation.") - add_fingerprint(user) ..() diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index a3b04053120..b111501820f 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -22,7 +22,6 @@ if(CLUMSY in user.mutations && prob(50)) to_chat(user, "Uh... how do those things work?!") - apply_cuffs(user,user) if(!C.handcuffed) @@ -33,7 +32,6 @@ if(do_mob(user, C, 30)) apply_cuffs(C,user) to_chat(user, "You handcuff [C].") - if(istype(src, /obj/item/weapon/restraints/handcuffs/cable)) feedback_add_details("handcuffs","C") else @@ -43,7 +41,6 @@ else to_chat(user, "You fail to handcuff [C].") - /obj/item/weapon/restraints/handcuffs/proc/apply_cuffs(mob/living/carbon/target, mob/user) if(!target.handcuffed) user.drop_item() @@ -103,11 +100,9 @@ user.unEquip(src) user.put_in_hands(W) to_chat(user, "You wrap the cable restraint around the top of the rod.") - qdel(src) else to_chat(user, "You need one rod to make a wired rod.") - return /obj/item/weapon/restraints/handcuffs/cable/zipties @@ -128,12 +123,10 @@ C.handcuffed = new /obj/item/weapon/restraints/handcuffs/cable/zipties/used(C) C.update_inv_handcuffed(1) to_chat(user, "You handcuff [C].") - add_logs(C, user, "ziptie-cuffed") else to_chat(user, "You fail to handcuff [C].") - /obj/item/weapon/restraints/handcuffs/cable/zipties/used desc = "A pair of broken zipties." icon_state = "cuff_white_used" @@ -182,18 +175,15 @@ icon_state = "beartrap[armed]" to_chat(user, "[src] is now [armed ? "armed" : "disarmed"]") - /obj/item/weapon/restraints/legcuffs/beartrap/attackby(var/obj/item/I, mob/user as mob) //Let's get explosive. if(istype(I, /obj/item/weapon/grenade/iedcasing)) if(IED) to_chat(user, "This beartrap already has an IED hooked up to it!") - return IED = I switch(IED.assembled) if(0,1) //if it's not fueled/hooked up to_chat(user, "You haven't prepared this IED yet!") - IED = null return if(2,3) @@ -202,11 +192,9 @@ message_admins("[key_name_admin(user)] has rigged a beartrap with an IED.") log_game("[key_name(user)] has rigged a beartrap with an IED.") to_chat(user, "You sneak the [IED] underneath the pressure plate and connect the trigger wire.") - desc = "A trap used to catch bears and other legged creatures. There is an IED hooked up to it." else to_chat(user, "You shouldn't be reading this message! Contact a coder or someone, something broke!") - IED = null return if(istype(I, /obj/item/weapon/screwdriver)) @@ -214,7 +202,6 @@ IED.forceMove(get_turf(src)) IED = null to_chat(user, "You remove the IED from the [src].") - return ..() diff --git a/code/game/objects/items/weapons/holosign.dm b/code/game/objects/items/weapons/holosign.dm index a76a80b1b62..5912a055a34 100644 --- a/code/game/objects/items/weapons/holosign.dm +++ b/code/game/objects/items/weapons/holosign.dm @@ -19,7 +19,6 @@ var/obj/effect/overlay/holograph/H = locate() in T if(H) to_chat(user, "You use [src] to destroy [H].") - signs -= H qdel(H) else @@ -27,11 +26,9 @@ H = new(get_turf(target)) signs += H to_chat(user, "You create \a [H] with [src].") - else to_chat(user, "[src] is projecting at max capacity!") - /obj/item/weapon/holosign_creator/attack(mob/living/carbon/human/M, mob/user) return @@ -43,7 +40,6 @@ signs -= sign to_chat(user, "You clear all active holograms.") - /obj/effect/overlay/holograph name = "wet floor sign" desc = "The words flicker as if they mean nothing." diff --git a/code/game/objects/items/weapons/implants/implant_chem.dm b/code/game/objects/items/weapons/implants/implant_chem.dm index 920cf1bd6e4..33025b0a41f 100644 --- a/code/game/objects/items/weapons/implants/implant_chem.dm +++ b/code/game/objects/items/weapons/implants/implant_chem.dm @@ -47,10 +47,8 @@ injectamount = cause reagents.trans_to(R, injectamount) to_chat(R, "You hear a faint beep.") - if(!reagents.total_volume) to_chat(R, "You hear a faint click from your chest.") - qdel(src) diff --git a/code/game/objects/items/weapons/implants/implant_explosive.dm b/code/game/objects/items/weapons/implants/implant_explosive.dm index 4a05f2a784b..c7e0fa67ef1 100644 --- a/code/game/objects/items/weapons/implants/implant_explosive.dm +++ b/code/game/objects/items/weapons/implants/implant_explosive.dm @@ -32,7 +32,6 @@ medium = round(medium) weak = round(weak) to_chat(imp_in, "You activate your microbomb implant.") - //If the delay is short, just blow up already jeez if(delay <= 7) explosion(src,heavy,medium,weak,weak, flame_range = weak) @@ -87,7 +86,6 @@ if(cause == "action_button" && alert(imp_in, "Are you sure you want to activate your macrobomb implant? This will cause you to explode and gib!", "Macrobomb Implant Confirmation", "Yes", "No") != "Yes") return 0 to_chat(imp_in, "You activate your macrobomb implant.") - timed_explosion() /obj/item/weapon/implant/explosive/macro/implant(mob/source) diff --git a/code/game/objects/items/weapons/implants/implant_freedom.dm b/code/game/objects/items/weapons/implants/implant_freedom.dm index 17ef3d53997..f94772787e2 100644 --- a/code/game/objects/items/weapons/implants/implant_freedom.dm +++ b/code/game/objects/items/weapons/implants/implant_freedom.dm @@ -11,7 +11,6 @@ if(uses == 0) return 0 if(uses != -1) uses-- to_chat(imp_in, "You feel a faint click.") - if(iscarbon(imp_in)) var/mob/living/carbon/C_imp_in = imp_in C_imp_in.uncuff() diff --git a/code/game/objects/items/weapons/implants/implant_loyality.dm b/code/game/objects/items/weapons/implants/implant_loyality.dm index 84cdb16f379..0c4b5c44648 100644 --- a/code/game/objects/items/weapons/implants/implant_loyality.dm +++ b/code/game/objects/items/weapons/implants/implant_loyality.dm @@ -28,10 +28,8 @@ ticker.mode.remove_revolutionary(target.mind) if(target.mind in ticker.mode.cult) to_chat(target, "You feel the corporate tendrils of Nanotrasen try to invade your mind!") - else to_chat(target, "You feel a surge of loyalty towards Nanotrasen.") - return 1 return 0 @@ -39,7 +37,6 @@ if(..()) if(target.stat != DEAD && !silent) to_chat(target, "You feel a sense of liberation as Nanotrasen's grip on your mind fades away.") - return 1 return 0 diff --git a/code/game/objects/items/weapons/implants/implant_misc.dm b/code/game/objects/items/weapons/implants/implant_misc.dm index 24373783827..ae369138ebd 100644 --- a/code/game/objects/items/weapons/implants/implant_misc.dm +++ b/code/game/objects/items/weapons/implants/implant_misc.dm @@ -36,7 +36,6 @@ if(uses < 1) return 0 uses-- to_chat(imp_in, "You feel a sudden surge of energy!") - imp_in.SetStunned(0) imp_in.SetWeakened(0) imp_in.SetParalysis(0) diff --git a/code/game/objects/items/weapons/implants/implant_traitor.dm b/code/game/objects/items/weapons/implants/implant_traitor.dm index 464ae5f74d5..547206da29c 100644 --- a/code/game/objects/items/weapons/implants/implant_traitor.dm +++ b/code/game/objects/items/weapons/implants/implant_traitor.dm @@ -32,7 +32,6 @@ return 0 if(M == user) to_chat(user, "Making yourself loyal to yourself was a great idea! Perhaps even the best idea ever! Actually, you just feel like an idiot.") - if(isliving(user)) var/mob/living/L = user L.adjustBrainLoss(20) @@ -46,7 +45,6 @@ return -1 H.implanting = 1 to_chat(H, "You feel completely loyal to [user.name].") - if(!(user.mind in ticker.mode:implanter)) ticker.mode:implanter[ref] = list() implanters = ticker.mode:implanter[ref] @@ -58,7 +56,6 @@ ticker.mode.traitors += H.mind H.mind.special_role = "traitor" to_chat(H, "You're now completely loyal to [user.name]! You now must lay down your life to protect them and assist in their goals at any cost.") - var/datum/objective/protect/p = new p.owner = H.mind p.target = user:mind @@ -67,7 +64,6 @@ for(var/datum/objective/objective in H.mind.objectives) to_chat(H, "Objective #1: [objective.explanation_text]") - ticker.mode.update_traitor_icons_added(user.mind) ticker.mode.update_traitor_icons_added(H.mind)//handles datahuds/observerhuds diff --git a/code/game/objects/items/weapons/implants/implantchair.dm b/code/game/objects/items/weapons/implants/implantchair.dm index 49a84275994..0820cc097c9 100644 --- a/code/game/objects/items/weapons/implants/implantchair.dm +++ b/code/game/objects/items/weapons/implants/implantchair.dm @@ -82,7 +82,6 @@ var/mob/M = G.affecting if(M.buckled_mob) to_chat(usr, "[M] will not fit into [src] because they have a slime latched onto their head.") - return if(put_mob(M)) qdel(G) @@ -110,11 +109,9 @@ /obj/machinery/implantchair/put_mob(mob/living/carbon/M) if(!iscarbon(M)) to_chat(usr, "The [src.name] cannot hold this!") - return if(src.occupant) to_chat(usr, "The [src.name] is already occupied!") - return if(M.client) M.client.perspective = EYE_PERSPECTIVE diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/game/objects/items/weapons/implants/implanter.dm index 866eee0cd80..2d7d3e0a956 100644 --- a/code/game/objects/items/weapons/implants/implanter.dm +++ b/code/game/objects/items/weapons/implants/implanter.dm @@ -34,7 +34,6 @@ if(imp.implant(M, user)) if (M == user) to_chat(user, "You implant yourself.") - else M.visible_message("[user] has implanted [M].", "[user] implants you.") imp = null diff --git a/code/game/objects/items/weapons/implants/implantpad.dm b/code/game/objects/items/weapons/implants/implantpad.dm index 1c79613d34c..e89e5f737ed 100644 --- a/code/game/objects/items/weapons/implants/implantpad.dm +++ b/code/game/objects/items/weapons/implants/implantpad.dm @@ -28,7 +28,6 @@ return if(case) to_chat(user, "There's already an implant in the pad!") - return user.unEquip(C) C.forceMove(src) @@ -38,7 +37,6 @@ /obj/item/weapon/implantpad/proc/dropcase(mob/user as mob) if(!case) to_chat(user, "There's no implant in the pad!") - return if(user) if(user.put_in_hands(case)) diff --git a/code/game/objects/items/weapons/legcuffs.dm b/code/game/objects/items/weapons/legcuffs.dm index 1899911ba7b..88c555d8148 100644 --- a/code/game/objects/items/weapons/legcuffs.dm +++ b/code/game/objects/items/weapons/legcuffs.dm @@ -32,7 +32,6 @@ /obj/item/weapon/legcuffs/bolas/suicide_act(mob/living/user) to_chat(viewers(user), "[user] is wrapping the [src.name] around \his neck! It looks like \he's trying to commit suicide.") - return(OXYLOSS) /obj/item/weapon/legcuffs/bolas/throw_at(var/atom/A, throw_range, throw_speed) @@ -41,7 +40,6 @@ var/mob/living/carbon/human/H = usr if((CLUMSY in H.mutations) && prob(50)) to_chat(H, "You smack yourself in the face while swinging the [src]!") - H.Stun(2) H.drop_item(src) return diff --git a/code/game/objects/items/weapons/lighters.dm b/code/game/objects/items/weapons/lighters.dm index aef7bb1af73..3f19d6a494b 100644 --- a/code/game/objects/items/weapons/lighters.dm +++ b/code/game/objects/items/weapons/lighters.dm @@ -46,7 +46,6 @@ user.visible_message("After a few attempts, [user] manages to light the [src].") else to_chat(user, "You burn yourself while lighting the lighter.") - user.adjustFireLoss(5) user.visible_message("After a few attempts, [user] manages to light the [src], they however burn their finger in the process.") diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index b523813dcb7..e3c65c2f35b 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -17,7 +17,6 @@ /obj/item/weapon/melee/energy/attack_self(mob/living/carbon/user) if(user.disabilities & CLUMSY && prob(50)) to_chat(user, "You accidentally cut yourself with [src], like a doofus!") - user.take_organ_damage(5,5) active = !active if (active) @@ -33,7 +32,6 @@ w_class = w_class_on playsound(user, 'sound/weapons/saberon.ogg', 35, 1) //changed it from 50% volume to 35% because deafness to_chat(user, "[src] is now active.") - else force = initial(force) throwforce = initial(throwforce) @@ -44,7 +42,6 @@ w_class = initial(w_class) playsound(user, 'sound/weapons/saberoff.ogg', 35, 1) //changed it from 50% volume to 35% because deafness to_chat(user, "[src] can now be concealed.") - if(istype(user,/mob/living/carbon/human)) var/mob/living/carbon/human/H = user H.update_inv_l_hand() @@ -110,7 +107,6 @@ if(active && !(C.use(hitcost))) attack_self() to_chat(R, "It's out of charge!") - return ..() return @@ -157,12 +153,10 @@ if(istype(W, /obj/item/weapon/melee/energy/sword/saber)) if(W == src) to_chat(user, "You try to attach the end of the energy sword to... itself. You're not very smart, are you?") - if(ishuman(user)) user.adjustBrainLoss(10) else to_chat(user, "You attach the ends of the two energy swords, making a single double-bladed weapon! You're cool.") - var/obj/item/weapon/twohanded/dualsaber/newSaber = new /obj/item/weapon/twohanded/dualsaber(user.loc) if(src.hacked) // That's right, we'll only check the "original" esword. newSaber.hacked = 1 @@ -178,7 +172,6 @@ item_color = "rainbow" to_chat(user, "RNBW_ENGAGE") - if(active) icon_state = "swordrainbow" // Updating overlays, copied from welder code. @@ -191,7 +184,6 @@ else to_chat(user, "It's already fabulous!") - /obj/item/weapon/melee/energy/sword/pirate name = "energy cutlass" desc = "Arrrr matey." diff --git a/code/game/objects/items/weapons/melee/misc.dm b/code/game/objects/items/weapons/melee/misc.dm index 821e5dbe886..cedb07273c6 100644 --- a/code/game/objects/items/weapons/melee/misc.dm +++ b/code/game/objects/items/weapons/melee/misc.dm @@ -18,7 +18,6 @@ /obj/item/weapon/melee/chainofcommand/suicide_act(mob/user) to_chat(viewers(user), "[user] is strangling \himself with the [src.name]! It looks like \he's trying to commit suicide.") - return (OXYLOSS) diff --git a/code/game/objects/items/weapons/misc.dm b/code/game/objects/items/weapons/misc.dm index 368f19dd0e7..15048ae13b5 100644 --- a/code/game/objects/items/weapons/misc.dm +++ b/code/game/objects/items/weapons/misc.dm @@ -94,7 +94,6 @@ afterattack(atom/A as mob|obj|turf|area, mob/living/user as mob|obj, flag, params) var/angle = get_angle(A, user) // to_chat(world, angle) - angle = round(angle) + 45 if(angle > 180) angle -= 180 @@ -104,10 +103,8 @@ if(!angle) angle = 1 // to_chat(world, "adjusted [angle]") - icon_state = "[angle]" // to_chat(world, "[angle] [(get_dist(user, A) - 1)]") - user.Beam(A, "lightning", 'icons/obj/zap.dmi', 50, 15) /obj/item/weapon/newton diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index 3ea41bc420e..7fad9cbbe5f 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -40,7 +40,6 @@ if(reagents.total_volume < 1) to_chat(user, "Your mop is dry!") - return var/turf/simulated/turf = A @@ -53,7 +52,6 @@ if(do_after(user, src.mopspeed, target = turf)) to_chat(user, "You finish mopping.") - clean(turf) @@ -70,7 +68,6 @@ /obj/item/weapon/mop/wash(mob/user, atom/source) reagents.add_reagent("water", 5) to_chat(user, "You wet [src] in [source].") - playsound(loc, 'sound/effects/slosh.ogg', 25, 1) return 1 diff --git a/code/game/objects/items/weapons/pneumaticCannon.dm b/code/game/objects/items/weapons/pneumaticCannon.dm index af2987a8dfc..9e8f68faa73 100644 --- a/code/game/objects/items/weapons/pneumaticCannon.dm +++ b/code/game/objects/items/weapons/pneumaticCannon.dm @@ -21,29 +21,24 @@ ..() if(!in_range(user, src)) to_chat(user, "You'll need to get closer to see any more.") - return for(var/obj/item/I in loadedItems) spawn(0) to_chat(user, "\icon [I] It has \the [I] loaded.") - if(tank) to_chat(user, "\icon [tank] It has \the [tank] mounted onto it.") - /obj/item/weapon/pneumatic_cannon/attackby(obj/item/weapon/W, mob/user, params) ..() if(istype(W, /obj/item/weapon/tank/) && !tank) if(istype(W, /obj/item/weapon/tank/emergency_oxygen)) to_chat(user, "\The [W] is too small for \the [src].") - return updateTank(W, 0, user) return if(W.type == type) to_chat(user, "You're fairly certain that putting a pneumatic cannon inside another pneumatic cannon would cause a spacetime disruption.") - return if(istype(W, /obj/item/weapon/wrench)) switch(pressureSetting) @@ -54,29 +49,24 @@ if(3) pressureSetting = 1 to_chat(user, "You tweak \the [src]'s pressure output to [pressureSetting].") - return if(istype(W, /obj/item/weapon/screwdriver) && tank) updateTank(tank, 1, user) return if(loadedWeightClass >= maxWeightClass) to_chat(user, "\The [src] can't hold any more items!") - return if(istype(W, /obj/item)) var/obj/item/IW = W if((loadedWeightClass + IW.w_class) > maxWeightClass) to_chat(user, "\The [IW] won't fit into \the [src]!") - return if(IW.w_class > src.w_class) to_chat(user, "\The [IW] is too large to fit into \the [src]!") - return if(!user.unEquip(W)) return to_chat(user, "You load \the [IW] into \the [src].") - loadedItems.Add(IW) loadedWeightClass += IW.w_class IW.loc = src @@ -101,15 +91,12 @@ var/discharge = 0 if(!loadedItems || !loadedWeightClass) to_chat(user, "\The [src] has nothing loaded.") - return if(!tank) to_chat(user, "\The [src] can't fire without a source of gas.") - return if(tank && !tank.air_contents.remove(gasPerThrow * pressureSetting)) to_chat(user, "\The [src] lets out a weak hiss and doesn't react!") - return if(user && (CLUMSY in user.mutations) && prob(75)) user.visible_message("[user] loses their grip on [src], causing it to go off!", "[src] slips out of your hands and goes off!") @@ -160,19 +147,16 @@ if(!src.tank) return to_chat(user, "You detach \the [thetank] from \the [src].") - src.tank.loc = get_turf(user) user.put_in_hands(tank) src.tank = null if(!removing) if(src.tank) to_chat(user, "\The [src] already has a tank.") - return if(!user.unEquip(thetank)) return to_chat(user, "You hook \the [thetank] up to \the [src].") - src.tank = thetank thetank.loc = src src.update_icons() diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm index e5733b50e38..0cb5e3c54ef 100644 --- a/code/game/objects/items/weapons/power_cells.dm +++ b/code/game/objects/items/weapons/power_cells.dm @@ -19,7 +19,6 @@ suicide_act(mob/user) to_chat(viewers(user), "[user] is licking the electrodes of the [src.name]! It looks like \he's trying to commit suicide.") - return (FIRELOSS) /obj/item/weapon/stock_parts/cell/crap diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm index faab7fbef35..589f91b8302 100644 --- a/code/game/objects/items/weapons/scrolls.dm +++ b/code/game/objects/items/weapons/scrolls.dm @@ -56,7 +56,6 @@ if(thearea.tele_proof && !istype(thearea, /area/wizard_station)) to_chat(user, "A mysterious force disrupts your arcane spell matrix, and you remain where you are.") - return var/datum/effect/system/harmless_smoke_spread/smoke = new /datum/effect/system/harmless_smoke_spread() @@ -76,7 +75,6 @@ if(!L.len) to_chat(user, "The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry.") - return if(user && user.buckled) diff --git a/code/game/objects/items/weapons/shards.dm b/code/game/objects/items/weapons/shards.dm index a3c221d376c..4add062aabc 100644 --- a/code/game/objects/items/weapons/shards.dm +++ b/code/game/objects/items/weapons/shards.dm @@ -47,7 +47,6 @@ continue G.attackby(NG, user) to_chat(user, "You add the newly-formed glass to the stack. It now contains [NG.amount] sheet\s.") - qdel(src) ..() @@ -57,7 +56,6 @@ if (M.incorporeal_move || M.flying)//you are incorporal or flying..no shard stepping! return to_chat(M, "\red You step on \the [src]!") - playsound(src.loc, 'sound/effects/glass_step.ogg', 50, 1) // not sure how to handle metal shards with sounds if(ishuman(M)) var/mob/living/carbon/human/H = M diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm index 08586e876f1..86345b677ca 100644 --- a/code/game/objects/items/weapons/shields.dm +++ b/code/game/objects/items/weapons/shields.dm @@ -71,7 +71,6 @@ /obj/item/weapon/shield/energy/attack_self(mob/living/carbon/human/user) if(user.disabilities & CLUMSY && prob(50)) to_chat(user, "You beat yourself in the head with [src].") - user.take_organ_damage(5) active = !active icon_state = "eshield[active]" @@ -83,7 +82,6 @@ w_class = 4 playsound(user, 'sound/weapons/saberon.ogg', 35, 1) to_chat(user, "[src] is now active.") - else force = 3 throwforce = 3 @@ -91,7 +89,6 @@ w_class = 1 playsound(user, 'sound/weapons/saberoff.ogg', 35, 1) to_chat(user, "[src] can now be concealed.") - if(istype(user,/mob/living/carbon/human)) var/mob/living/carbon/human/H = user H.update_inv_l_hand() @@ -127,7 +124,6 @@ w_class = 4 slot_flags = SLOT_BACK to_chat(user, "You extend \the [src].") - else force = 3 throwforce = 3 @@ -135,7 +131,6 @@ w_class = 3 slot_flags = null to_chat(user, "[src] can now be concealed.") - if(istype(user,/mob/living/carbon/human)) var/mob/living/carbon/human/H = user H.update_inv_l_hand() @@ -163,11 +158,9 @@ src.active = !( src.active ) if (src.active) to_chat(user, "\blue The cloaking device is now active.") - src.icon_state = "shield1" else to_chat(user, "\blue The cloaking device is now inactive.") - src.icon_state = "shield0" src.add_fingerprint(user) return diff --git a/code/game/objects/items/weapons/soap.dm b/code/game/objects/items/weapons/soap.dm index 3c9a45fa59d..961547d362f 100644 --- a/code/game/objects/items/weapons/soap.dm +++ b/code/game/objects/items/weapons/soap.dm @@ -29,12 +29,10 @@ if(user.client && (target in user.client.screen)) to_chat(user, "You need to take that [target.name] off before 'cleaning' it.") - else user.visible_message("[user] begins to smear [src] on \the [target.name].") if(do_after(user, src.cleanspeed, target = target)) to_chat(user, "You 'clean' \the [target.name].") - if(istype(target, /turf/simulated)) new /obj/effect/decal/cleanable/blood/gibs/cleangibs(target) else if (istype(target,/mob/living/carbon)) diff --git a/code/game/objects/items/weapons/staff.dm b/code/game/objects/items/weapons/staff.dm index 5b6149f159f..e36bed7a473 100644 --- a/code/game/objects/items/weapons/staff.dm +++ b/code/game/objects/items/weapons/staff.dm @@ -30,7 +30,6 @@ user.flying = wielded ? 1 : 0 if(wielded) to_chat(user, "You hold \the [src] between your legs.") - user.say("QUID 'ITCH") animate(user, pixel_y = pixel_y + 10 , time = 10, loop = 1, easing = SINE_EASING) else @@ -43,7 +42,6 @@ if(wielded) to_chat(user, "You hold \the [src] between your legs.") - /obj/item/weapon/twohanded/staff/broom/attackby(var/obj/O, mob/user) if(istype(O, /obj/item/clothing/mask/horsehead)) new/obj/item/weapon/twohanded/staff/broom/horsebroom(get_turf(src)) diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index bfdeef880fa..6c59e98385f 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -43,7 +43,6 @@ attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(crit_fail) to_chat(user, "\red The Bluespace generator isn't working.") - return else if(istype(W, /obj/item/weapon/storage/backpack/holding) && !W.crit_fail) var/response = alert(user, "Are you sure you want to put the bag of holding inside another bag of holding?","Are you sure you want to die?","Yes","No") @@ -68,10 +67,8 @@ if (prob(src.reliability)) to_chat(user, "\red The Bluespace portal resists your attempt to add another item.")//light failure - else to_chat(user, "\red The Bluespace generator malfunctions!") - for (var/obj/O in src.contents) //it broke, delete what was in it qdel(O) crit_fail = 1 diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 707a5d06bec..350bf9c5e7a 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -94,7 +94,6 @@ if(slot==slot_head && contents.len) to_chat(M, "\red You need to empty the bag first!") - return 0 return ..() @@ -228,7 +227,6 @@ if(!istype(W,/obj/item/stack/sheet) || istype(W,/obj/item/stack/sheet/mineral/sandstone) || istype(W,/obj/item/stack/sheet/wood)) if(!stop_messages) to_chat(usr, "The snatcher does not accept [W].") - return 0 //I don't care, but the existing code rejects them for not being "sheets" *shrug* -Sayu var/current = 0 for(var/obj/item/stack/sheet/S in contents) @@ -236,7 +234,6 @@ if(capacity == current)//If it's full, you're done if(!stop_messages) to_chat(usr, "\red The snatcher is full.") - return 0 return 1 diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index af1e97bcd6a..daefa0db457 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -415,10 +415,8 @@ if (prob(src.reliability)) to_chat(user, "\red The Bluespace portal resists your attempt to add another item.")//light failure - else to_chat(user, "\red The Bluespace generator malfunctions!") - for (var/obj/O in src.contents) //it broke, delete what was in it qdel(O) crit_fail = 1 @@ -494,7 +492,6 @@ if (istype(target, /turf/unsimulated) || istype(target, /turf/simulated/shuttle) || istype(target, /obj/item/weapon/storage) || istype(target, /obj/structure/table) || istype(target, /obj/structure/closet)) return to_chat(user, "Planting explosives...") - user.visible_message("[user.name] is fiddling with their toolbelt.") if(ismob(target)) user.attack_log += "\[[time_stamp()]\] [user.real_name] tried planting [name] on [target:real_name] ([target:ckey])" @@ -513,7 +510,6 @@ user.visible_message("\red [user.name] finished planting an explosive on [target.name]!") target.overlays += image('icons/obj/assemblies.dmi', "plastic-explosive2") to_chat(user, "You sacrifice your belt for the sake of justice. Timer counting down from 15.") - spawn(150) if(target) if(ismob(target) || isobj(target)) diff --git a/code/game/objects/items/weapons/storage/bible.dm b/code/game/objects/items/weapons/storage/bible.dm index 7ba74274c59..3fa521a7451 100644 --- a/code/game/objects/items/weapons/storage/bible.dm +++ b/code/game/objects/items/weapons/storage/bible.dm @@ -10,7 +10,6 @@ suicide_act(mob/user) to_chat(viewers(user), "[user] stares into [src.name] and attempts to trascend understanding of the universe!") - return (user.dust()) @@ -55,17 +54,14 @@ if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") to_chat(user, "\red You don't have the dexterity to do this!") - return if(!chaplain) to_chat(user, "\red The book sizzles in your hands.") - user.take_organ_damage(0,10) return if ((CLUMSY in user.mutations) && prob(50)) to_chat(user, "\red The [src] slips out of your hand and hits your head.") - user.take_organ_damage(10) user.Paralyse(20) return @@ -76,22 +72,18 @@ if (M.stat !=2) /*if((M.mind in ticker.mode.cult) && (prob(20))) to_chat(M, "\red The power of [src.deity_name] clears your mind of heresy!") - to_chat(user, "\red You see how [M]'s eyes become clear, the cult no longer holds control over him!") - ticker.mode.remove_cultist(M.mind)*/ if ((istype(M, /mob/living/carbon/human) && prob(60))) bless(M) for(var/mob/O in viewers(M, null)) O.show_message(text("\red [] heals [] with the power of [src.deity_name]!", user, M), 1) to_chat(M, "\red May the power of [src.deity_name] compel you to be healed!") - playsound(src.loc, "punch", 25, 1, -1) else if(ishuman(M) && !istype(M:head, /obj/item/clothing/head/helmet)) M.adjustBrainLoss(10) to_chat(M, "\red You feel dumber.") - for(var/mob/O in viewers(M, null)) O.show_message(text("\red [] beats [] over the head with []!", user, M, src), 1) playsound(src.loc, "punch", 25, 1, -1) @@ -106,19 +98,16 @@ return if (istype(A, /turf/simulated/floor)) to_chat(user, "You hit the floor with the bible.") - if(user.mind && (user.mind.assigned_role == "Chaplain")) call(/obj/effect/rune/proc/revealrunes)(src) if(user.mind && (user.mind.assigned_role == "Chaplain")) if(A.reagents && A.reagents.has_reagent("water")) //blesses all the water in the holder to_chat(user, "You bless [A].") - var/water2holy = A.reagents.get_reagent_amount("water") A.reagents.del_reagent("water") A.reagents.add_reagent("holywater",water2holy) if(A.reagents && A.reagents.has_reagent("unholywater")) //yeah yeah, copy pasted code - sue me to_chat(user, "You purify [A].") - var/unholy2clean = A.reagents.get_reagent_amount("unholywater") A.reagents.del_reagent("unholywater") A.reagents.add_reagent("holywater",unholy2clean) diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index a1cada9b549..31ead836204 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -30,16 +30,13 @@ if(contents.len <= 0) to_chat(user, "There are no [src.icon_type]s left in the box.") - else if(contents.len == 1) to_chat(user, "There is one [src.icon_type] left in the box.") - else to_chat(user, "There are [src.contents.len] [src.icon_type]s in the box.") - /* * Donut Box */ @@ -146,11 +143,9 @@ switch(W:colourName) if("mime") to_chat(usr, "This crayon is too sad to be contained in this box.") - return if("rainbow") to_chat(usr, "This crayon is too powerful to be contained in this box.") - return ..() @@ -223,13 +218,11 @@ lace_cigarette(C) user.equip_to_slot_if_possible(C, slot_wear_mask) to_chat(user, "You take \a [C.name] out of the pack.") - update_icon() got_cig = 1 break if(!got_cig) to_chat(user, "There are no smokables in the pack!") - else ..() @@ -239,14 +232,12 @@ if(M.lit == 1) if(!stop_messages) to_chat(usr, "Putting a lit [W] in [src] probably isn't a good idea.") - return 0 if(istype(W, /obj/item/weapon/lighter)) var/obj/item/weapon/lighter/L = W if(L.lit == 1) if(!stop_messages) to_chat(usr, "Putting [W] in [src] while lit probably isn't a good idea.") - return 0 //if we get this far, handle the insertion checks as normal .=..() diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index c87af060e4f..a11d00dbccd 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -249,10 +249,8 @@ var/tmp_label = sanitize(input(user, "Enter a label for [name]","Label",label_text)) if(length(tmp_label) > MAX_NAME_LEN) to_chat(user, "The label can be at most [MAX_NAME_LEN] characters long.") - else to_chat(user, "You set the label to \"[tmp_label]\".") - label_text = tmp_label update_name_label() else diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm index 9ce695a7012..1dde63d198a 100644 --- a/code/game/objects/items/weapons/storage/lockbox.dm +++ b/code/game/objects/items/weapons/storage/lockbox.dm @@ -21,24 +21,20 @@ if (istype(W, /obj/item/weapon/card/id)) if(src.broken) to_chat(user, "\red It appears to be broken.") - return if(src.allowed(user)) src.locked = !( src.locked ) if(src.locked) src.icon_state = src.icon_locked to_chat(user, "\red You lock the [src.name]!") - return else src.icon_state = src.icon_closed to_chat(user, "\red You unlock the [src.name]!") - origin_tech = null //wipe out any origin tech if it's unlocked in any way so you can't double-dip tech levels at R&D. return else to_chat(user, "\red Access Denied") - else if((istype(W, /obj/item/weapon/card/emag) || istype(W, /obj/item/weapon/melee/energy/blade)) && !broken) emag_act(user) return @@ -46,14 +42,12 @@ ..() else to_chat(user, "\red Its locked!") - return show_to(mob/user as mob) if(locked) to_chat(user, "\red Its locked!") - else ..() return @@ -63,7 +57,6 @@ return ..() if(!stop_messages) to_chat(usr, "[src] is locked!") - return 0 /obj/item/weapon/storage/lockbox/emag_act(user as mob) @@ -73,7 +66,6 @@ desc = "It appears to be broken." icon_state = src.icon_broken to_chat(user, "You unlock \the [src].") - origin_tech = null //wipe out any origin tech if it's unlocked in any way so you can't double-dip tech levels at R&D. return diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm index 1a68163cbd7..59fac1b18c4 100644 --- a/code/game/objects/items/weapons/storage/secure.dm +++ b/code/game/objects/items/weapons/storage/secure.dm @@ -31,7 +31,6 @@ if(..(user, 1)) to_chat(user, text("The service panel is [src.open ? "open" : "closed"].")) - attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(locked) if ((istype(W, /obj/item/weapon/melee/energy/blade)) && (!src.emagged)) @@ -80,10 +79,8 @@ playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1) playsound(src.loc, "sparks", 50, 1) to_chat(user, "You slice through the lock on [src].") - else to_chat(user, "You short out the lock on [src].") - return @@ -148,7 +145,6 @@ return ..() if(!stop_messages) to_chat(usr, "[src] is locked!") - return 0 /obj/item/weapon/storage/secure/hear_talk(mob/living/M as mob, msg) @@ -177,7 +173,6 @@ attack_hand(mob/user as mob) if ((src.loc == user) && (src.locked == 1)) to_chat(usr, "\red [src] is locked and cannot be opened!") - else if ((src.loc == user) && (!src.locked)) playsound(src.loc, "rustle", 50, 1, -5) if (user.s_active) diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 8eeeadea09c..d92ad2399b2 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -236,7 +236,6 @@ if(contents.len >= storage_slots) if(!stop_messages) to_chat(usr, "[W] won't fit in [src], make some space!") - return 0 //Storage item is full if(can_hold.len) @@ -250,20 +249,17 @@ if (istype(W, /obj/item/weapon/hand_labeler)) return 0 to_chat(usr, "[src] cannot hold [W].") - return 0 for(var/A in cant_hold) //Check for specific items which this container can't hold. if(istype(W, text2path(A) )) if(!stop_messages) to_chat(usr, "[src] cannot hold [W].") - return 0 if (W.w_class > max_w_class) if(!stop_messages) to_chat(usr, "[W] is too big for this [src].") - return 0 var/sum_w_class = W.w_class @@ -273,19 +269,16 @@ if(sum_w_class > max_combined_w_class) if(!stop_messages) to_chat(usr, "[src] is full, make some space.") - return 0 if(W.w_class >= src.w_class && (istype(W, /obj/item/weapon/storage))) if(!istype(src, /obj/item/weapon/storage/backpack/holding)) //bohs should be able to hold backpacks again. The override for putting a boh in a boh is in backpack.dm. if(!stop_messages) to_chat(usr, "[src] cannot hold [W] as it's a storage item of the same size.") - return 0 //To prevent the stacking of same sized storage items. if(W.flags & NODROP) //SHOULD be handled in unEquip, but better safe than sorry. to_chat(usr, "\the [W] is stuck to your hand, you can't put it in \the [src]") - return 0 return 1 @@ -314,7 +307,6 @@ for(var/mob/M in viewers(usr, null)) if (M == usr) to_chat(usr, "You put the [W] into [src].") - else if (M in range(1)) //If someone is standing close enough, they can tell what it is... M.show_message("[usr] puts [W] into [src].") else if (W && W.w_class >= 3.0) //Otherwise they can only see large or normal items from a distance... @@ -368,7 +360,6 @@ if(isrobot(user)) to_chat(user, "\blue You're a robot. No.") - return 1//Robots can't interact with storage items. if(!can_be_inserted(W)) @@ -416,12 +407,10 @@ switch (collection_mode) if(1) to_chat(usr, "[src] now picks up all items in a tile at once.") - if(0) to_chat(usr, "[src] now picks up one item at a time.") - /obj/item/weapon/storage/verb/quick_empty() set name = "Empty Contents" set category = "Object" @@ -509,7 +498,6 @@ return // Now make the cardboard to_chat(user, "You fold [src] flat.") - new src.foldable(get_turf(src)) qdel(src) //BubbleWrap END diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm index a760475b9de..22e46163fa3 100644 --- a/code/game/objects/items/weapons/storage/toolbox.dm +++ b/code/game/objects/items/weapons/storage/toolbox.dm @@ -19,7 +19,6 @@ ..() if (src.type == /obj/item/weapon/storage/toolbox) to_chat(world, "BAD: [src] ([src.type]) spawned at [src.x] [src.y] [src.z]") - qdel(src) /obj/item/weapon/storage/toolbox/emergency diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index d180686998a..db834beeb45 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -56,28 +56,23 @@ ..(user) if(bcell) to_chat(user, "The baton is [round(bcell.percent())]% charged.") - if(!bcell) to_chat(user, "The baton does not have a power source installed.") - /obj/item/weapon/melee/baton/attackby(obj/item/weapon/W, mob/user, params) if(istype(W, /obj/item/weapon/stock_parts/cell)) var/obj/item/weapon/stock_parts/cell/C = W if(bcell) to_chat(user, "[src] already has a cell.") - else if(C.maxcharge < hitcost) to_chat(user, "[src] requires a higher capacity cell.") - return if(!user.unEquip(W)) return W.loc = src bcell = W to_chat(user, "You install a cell in [src].") - update_icon() else if(istype(W, /obj/item/weapon/screwdriver)) @@ -86,7 +81,6 @@ bcell.loc = get_turf(src.loc) bcell = null to_chat(user, "You remove the cell from the [src].") - status = 0 update_icon() return @@ -97,16 +91,13 @@ if(bcell && bcell.charge > hitcost) status = !status to_chat(user, "[src] is now [status ? "on" : "off"].") - playsound(loc, "sparks", 75, 1, -1) else status = 0 if(!bcell) to_chat(user, "[src] does not have a power source!") - else to_chat(user, "[src] is out of charge.") - update_icon() add_fingerprint(user) diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm index ae942d0df41..63346476021 100644 --- a/code/game/objects/items/weapons/swords_axes_etc.dm +++ b/code/game/objects/items/weapons/swords_axes_etc.dm @@ -11,10 +11,8 @@ */ /obj/item/weapon/banhammer/attack(mob/M as mob, mob/user as mob) to_chat(M, " You have been banned FOR NO REISIN by [user]") - to_chat(user, " You have BANNED [M]") - /* * Classic Baton */ @@ -36,7 +34,6 @@ add_fingerprint(user) if((CLUMSY in user.mutations) && prob(50)) to_chat(user, "You club yourself over the head.") - user.Weaken(3 * force) if(ishuman(user)) var/mob/living/carbon/human/H = user @@ -88,7 +85,6 @@ on = !on if(on) to_chat(user, "You extend the baton.") - icon_state = "telebaton_1" item_state = "nullrod" w_class = 4 //doesnt fit in backpack when its on for balance @@ -96,7 +92,6 @@ attack_verb = list("smacked", "struck", "cracked", "beaten") else to_chat(user, "You collapse the baton.") - icon_state = "telebaton_0" item_state = null //no sprite for concealment even when in hand slot_flags = SLOT_BELT diff --git a/code/game/objects/items/weapons/table_rack_parts.dm b/code/game/objects/items/weapons/table_rack_parts.dm index 6a1d65af07d..61c58ce9aa5 100644 --- a/code/game/objects/items/weapons/table_rack_parts.dm +++ b/code/game/objects/items/weapons/table_rack_parts.dm @@ -58,13 +58,11 @@ if (W:amount >= 4) new /obj/item/weapon/table_parts/reinforced( user.loc ) to_chat(user, "\blue You reinforce the [name].") - W:use(4) qdel(src) else if (W:amount < 4) to_chat(user, "\red You need at least four rods to do this.") - /obj/item/weapon/table_parts/attack_self(mob/user as mob) new /obj/structure/table( user.loc ) user.drop_item() diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm index 4d4e13324b1..68fe80fdbfb 100644 --- a/code/game/objects/items/weapons/tanks/jetpack.dm +++ b/code/game/objects/items/weapons/tanks/jetpack.dm @@ -30,7 +30,6 @@ if(air_contents.oxygen < 10) to_chat(user, text("\red The meter on the [src.name] indicates you are almost out of air!")) - playsound(user, 'sound/effects/alert.ogg', 50, 1) @@ -39,7 +38,6 @@ set category = "Object" src.stabilization_on = !( src.stabilization_on ) to_chat(usr, "You toggle the stabilization [stabilization_on? "on":"off"].") - return @@ -136,7 +134,6 @@ if(air_contents.carbon_dioxide < 10) to_chat(user, text("\red The meter on the [src.name] indicates you are almost out of air!")) - playsound(user, 'sound/effects/alert.ogg', 50, 1) @@ -146,7 +143,6 @@ /obj/item/weapon/tank/jetpack/rig/examine() to_chat(usr, "It's a jetpack. If you can see this, report it on the bug tracker.") - return 0 /obj/item/weapon/tank/jetpack/rig/allow_thrust(num, mob/living/user as mob) diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm index 18de0bc0e7f..6767b88ac0d 100644 --- a/code/game/objects/items/weapons/tanks/tank_types.dm +++ b/code/game/objects/items/weapons/tanks/tank_types.dm @@ -27,7 +27,6 @@ if(..(user, 0)) if(air_contents.oxygen < 10) to_chat(user, text("\red The meter on the [src.name] indicates you are almost out of air!")) - //playsound(usr, 'sound/effects/alert.ogg', 50, 1) @@ -73,10 +72,8 @@ if(..(user, 0)) if(air_contents.oxygen < 1 && loc==usr) to_chat(user, "\red The meter on the [src.name] indicates you are almost out of air!") - to_chat(user, sound('sound/effects/alert.ogg')) - /obj/item/weapon/tank/air/New() ..() @@ -127,10 +124,8 @@ if(..(user, 0)) if(air_contents.toxins < 0.2 && loc==usr) to_chat(user, text("\red The meter on the [src.name] indicates you are almost out of plasma!")) - to_chat(user, sound('sound/effects/alert.ogg')) - /* * Emergency Oxygen */ @@ -156,10 +151,8 @@ if(..(user, 0)) if(air_contents.oxygen < 0.2 && loc==usr) to_chat(user, text("\red The meter on the [src.name] indicates you are almost out of air!")) - to_chat(user, sound('sound/effects/alert.ogg')) - /obj/item/weapon/tank/emergency_oxygen/engi name = "extended-capacity emergency oxygen tank" icon_state = "emergency_engi" @@ -199,7 +192,6 @@ if(..(user, 0)) if(air_contents.nitrogen < 10) to_chat(user, text("\red The meter on the [src.name] indicates you are almost out of air!")) - //playsound(usr, 'sound/effects/alert.ogg', 50, 1) diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 9565cb736ab..46342d78a99 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -46,7 +46,6 @@ if (!in_range(src, user)) if (icon == src) to_chat(user, "\blue It's \a \icon[icon][src]! If you want any more information you'll need to get closer.") - return var/celsius_temperature = src.air_contents.temperature-T0C @@ -67,7 +66,6 @@ to_chat(user, "\blue \The \icon[icon][src] feels [descriptive]") - return /obj/item/weapon/tank/blob_act() @@ -170,7 +168,6 @@ location.internal = null location.internals.icon_state = "internal0" to_chat(usr, "\blue You close the tank release valve.") - if (location.internals) location.internals.icon_state = "internal0" else @@ -186,13 +183,11 @@ if(can_open_valve) location.internal = src to_chat(usr, "\blue You open \the [src] valve.") - if (location.internals) location.internals.icon_state = "internal1" else to_chat(usr, "\blue You need something to connect to \the [src].") - src.add_fingerprint(usr) return 1 @@ -239,7 +234,6 @@ message_admins("Explosive tank rupture! last key to touch the tank was [src.fingerprintslast] (JMP)") log_game("Explosive tank rupture! last key to touch the tank was [src.fingerprintslast] at [x], [y], [z]") // to_chat(world, "\blue[x],[y] tank is exploding: [pressure] kPa") - //Give the gas a chance to build up more pressure through reacting air_contents.react() air_contents.react() @@ -250,7 +244,6 @@ // to_chat(world, "\blue Exploding Pressure: [pressure] kPa, intensity: [range]") - explosion(epicenter, round(range*0.25), round(range*0.5), round(range), round(range*1.5)) if(istype(src.loc,/obj/item/device/transfer_valve)) qdel(src.loc) @@ -259,7 +252,6 @@ else if(pressure > TANK_RUPTURE_PRESSURE) // to_chat(world, "\blue[x],[y] tank is rupturing: [pressure] kPa, integrity [integrity]") - if(integrity <= 0) var/turf/simulated/T = get_turf(src) if(!T) @@ -272,7 +264,6 @@ else if(pressure > TANK_LEAK_PRESSURE) // to_chat(world, "\blue[x],[y] tank is leaking: [pressure] kPa, integrity [integrity]") - if(integrity <= 0) var/turf/simulated/T = get_turf(src) if(!T) diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm index 4d15aba974c..cbe3cdde29d 100644 --- a/code/game/objects/items/weapons/tanks/watertank.dm +++ b/code/game/objects/items/weapons/tanks/watertank.dm @@ -27,7 +27,6 @@ set category = "Object" if (usr.get_item_by_slot(slot_back) != src) to_chat(usr, "The watertank needs to be on your back to use.") - return if(usr.incapacitated()) return @@ -42,7 +41,6 @@ if(!user.put_in_hands(noz)) on = 0 to_chat(user, "You need a free hand to hold the mister.") - return noz.loc = user else @@ -128,7 +126,6 @@ /obj/item/weapon/reagent_containers/spray/mister/dropped(mob/user as mob) to_chat(user, "The mister snaps back onto the watertank.") - tank.on = 0 loc = tank @@ -180,7 +177,6 @@ amount_per_transfer_from_this = (amount_per_transfer_from_this == 10 ? 5 : 10) to_chat(user, "You [amount_per_transfer_from_this == 10 ? "remove" : "fix"] the nozzle. You'll now use [amount_per_transfer_from_this] units per spray.") - //ATMOS FIRE FIGHTING BACKPACK #define EXTINGUISHER 0 @@ -245,25 +241,21 @@ nozzle_mode = NANOFROST tank.icon_state = "waterbackpackatmos_1" to_chat(user, "Swapped to nanofrost launcher") - return if(NANOFROST) nozzle_mode = METAL_FOAM tank.icon_state = "waterbackpackatmos_2" to_chat(user, "Swapped to metal foam synthesizer") - return if(METAL_FOAM) nozzle_mode = EXTINGUISHER tank.icon_state = "waterbackpackatmos_0" to_chat(user, "Swapped to water extinguisher") - return return /obj/item/weapon/extinguisher/mini/nozzle/dropped(mob/user as mob) to_chat(user, "The nozzle snaps back onto the tank!") - tank.on = 0 loc = tank @@ -280,11 +272,9 @@ var/datum/reagents/R = reagents if(R.total_volume < 100) to_chat(user, "You need at least 100 units of water to use the nanofrost launcher!") - return if(nanofrost_cooldown) to_chat(user, "Nanofrost launcher is still recharging") - return nanofrost_cooldown = 1 R.remove_any(100) @@ -311,7 +301,6 @@ metal_synthesis_cooldown-- else to_chat(user, "Metal foam mix is still being synthesized.") - return /obj/effect/nanofrost_container diff --git a/code/game/objects/items/weapons/tape.dm b/code/game/objects/items/weapons/tape.dm index 2eed4d02cef..a6c7841e020 100644 --- a/code/game/objects/items/weapons/tape.dm +++ b/code/game/objects/items/weapons/tape.dm @@ -16,7 +16,6 @@ /obj/item/stack/tape_roll/attack_self(mob/user as mob) to_chat(user, "You remove a length of tape from [src].") - var/obj/item/weapon/ducttape/tape = new() user.put_in_hands(tape) */ @@ -74,7 +73,6 @@ to_chat(user, "You remove \the [initial(name)] from [stuck].") - user.unEquip(src) stuck.forceMove(get_turf(src)) user.put_in_hands(stuck) diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm index f0ecceabfe8..99567b5952a 100644 --- a/code/game/objects/items/weapons/teleportation.dm +++ b/code/game/objects/items/weapons/teleportation.dm @@ -50,7 +50,6 @@ Frequency: var/turf/current_location = get_turf(usr)//What turf is the user on? if(!current_location ||( current_location.z in config.admin_levels))//If turf was not found or they're on z level 2. to_chat(usr, "\The [src] is malfunctioning.") - return 1 if (href_list["refresh"]) @@ -110,7 +109,6 @@ Frequency: var/turf/current_location = get_turf(user)//What turf is the user on? if(!current_location||(current_location.z in config.admin_levels)||current_location.z>=7)//If turf was not found or they're on z level 2 or >7 which does not currently exist. to_chat(user, "\The [src] is malfunctioning.") - return var/list/L = list( ) for(var/obj/machinery/computer/teleporter/com in world) diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 8b5c0e3be2f..a187dc09b65 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -175,7 +175,6 @@ if(..(user, 0)) to_chat(user, "It contains [get_fuel()] unit\s of fuel out of [max_fuel].") - /obj/item/weapon/weldingtool/suicide_act(mob/user) user.visible_message("[user] welds \his every orifice closed! It looks like \he's trying to commit suicide..") return (FIRELOSS) @@ -250,15 +249,12 @@ user.visible_message("\The [user] patches some dents on \the [M]'s [S.name] with \the [src].") else if(S.open != 2) to_chat(user, "Need more welding fuel!") - return 1 else to_chat(user, "The damage is far too severe to patch over externally.") - return 1 else if(S.open != 2) to_chat(user, "Nothing to fix!") - else return ..() @@ -268,7 +264,6 @@ if(!welding) O.reagents.trans_to(src, max_fuel) to_chat(user, "[src] refueled.") - playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6) update_icon() return @@ -276,7 +271,6 @@ message_admins("[key_name_admin(user)] triggered a fueltank explosion.") log_game("[key_name(user)] triggered a fueltank explosion.") to_chat(user, "That was stupid of you.") - O.ex_act() return @@ -310,7 +304,6 @@ else if(M) to_chat(M, "\blue You need more welding fuel to complete this task.") - return 0 //Returns whether or not the welding tool is currently on. @@ -335,13 +328,11 @@ /obj/item/weapon/weldingtool/proc/toggle(mob/user, message = 0) if(!status) to_chat(user, "[src] can't be turned on while unsecured!") - return welding = !welding if(welding) if(get_fuel() >= 1) to_chat(user, "You switch [src] on.") - force = 15 damtype = "fire" hitsound = 'sound/items/welder.ogg' @@ -349,15 +340,12 @@ processing_objects |= src else to_chat(user, "You need more fuel!") - welding = 0 else if(!message) to_chat(user, "You switch [src] off.") - else to_chat(user, "[src] shuts off!") - force = 3 damtype = "brute" hitsound = "swing_hit" @@ -366,15 +354,12 @@ /obj/item/weapon/weldingtool/proc/flamethrower_screwdriver(obj/item/I, mob/user) if(welding) to_chat(user, "Turn it off first!") - return status = !status if(status) to_chat(user, "You resecure [src].") - else to_chat(user, "[src] can now be attached and modified.") - add_fingerprint(user) /obj/item/weapon/weldingtool/proc/flamethrower_rods(obj/item/I, mob/user) @@ -388,11 +373,9 @@ F.weldtool = src add_fingerprint(user) to_chat(user, "You add a rod to a welder, starting to build a flamethrower.") - user.put_in_hands(F) else to_chat(user, "You need one rod to start building a flamethrower!") - return /obj/item/weapon/weldingtool/largetank @@ -510,5 +493,4 @@ attack_self(mob/user as mob) open = !open to_chat(user, "\blue You [open?"open" : "close"] the conversion kit.") - update_icon() diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index 26444e0cef2..0e4f49de46a 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -44,10 +44,8 @@ user.update_inv_l_hand() if(isrobot(user)) to_chat(user, "You free up your module.") - else to_chat(user, "You are now carrying the [name] with one hand.") - if(unwieldsound) playsound(loc, unwieldsound, 50, 1) var/obj/item/weapon/twohanded/offhand/O = user.get_inactive_hand() @@ -61,11 +59,9 @@ var/mob/living/carbon/human/H = user if(H.species.is_small) to_chat(user, "It's too heavy for you to wield fully.") - return if(user.get_inactive_hand()) to_chat(user, "You need your other hand to be empty!") - return wielded = 1 force = force_wielded @@ -76,10 +72,8 @@ user.update_inv_l_hand() if(isrobot(user)) to_chat(user, "You dedicate your module to [name].") - else to_chat(user, "You grab the [name] with both hands.") - if (wieldsound) playsound(loc, wieldsound, 50, 1) var/obj/item/weapon/twohanded/offhand/O = new(user) ////Let's reserve his other hand~ @@ -92,7 +86,6 @@ //Cannot equip wielded items. if(wielded) to_chat(M, "Unwield the [name] first!") - return 0 return ..() @@ -146,7 +139,6 @@ /obj/item/weapon/twohanded/required/mob_can_equip(M as mob, slot) if(wielded) to_chat(M, "[src.name] is too cumbersome to carry with anything but your hands!") - return 0 return ..() @@ -233,7 +225,6 @@ ..() if((CLUMSY in user.mutations) && (wielded) &&prob(40)) to_chat(user, "\red You twirl around a bit before losing your balance and impaling yourself on the [src].") - user.take_organ_damage(20,25) return if((wielded) && prob(50)) @@ -278,13 +269,11 @@ if(hacked == 0) hacked = 1 to_chat(user, "2XRNBW_ENGAGE") - blade_color = "rainbow" update_icon() else to_chat(user, "It's starting to look like a triple rainbow - no, nevermind.") - //spears /obj/item/weapon/twohanded/spear icon_state = "spearglass0" @@ -313,7 +302,6 @@ /obj/item/weapon/organ/head/attackby(var/obj/item/weapon/W, var/mob/living/user, params) if(istype(W, /obj/item/weapon/twohanded/spear)) to_chat(user, "You stick the head onto the spear and stand it upright on the ground.") - var/obj/structure/headspear/HS = new /obj/structure/headspear(user.loc) var/matrix/M = matrix() src.transform = M @@ -329,7 +317,6 @@ /obj/item/weapon/twohanded/spear/attackby(var/obj/item/I, var/mob/living/user) if(istype(I, /obj/item/weapon/organ/head)) to_chat(user, "You stick the head onto the spear and stand it upright on the ground.") - var/obj/structure/headspear/HS = new /obj/structure/headspear(user.loc) var/matrix/M = matrix() I.transform = M diff --git a/code/game/objects/items/weapons/vending_items.dm b/code/game/objects/items/weapons/vending_items.dm index 13a1d15860e..9f22daf08f8 100644 --- a/code/game/objects/items/weapons/vending_items.dm +++ b/code/game/objects/items/weapons/vending_items.dm @@ -24,11 +24,9 @@ ..(user) if(charges) to_chat(user, "It can restock [charges] item(s).") - else to_chat(user, "It's empty!") - //NOTE I decided to go for about 1/3 of a machine's capacity /obj/item/weapon/vending_refill/boozeomat diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index f3453803635..57e22a3eef4 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -13,7 +13,6 @@ /obj/item/weapon/banhammer/suicide_act(mob/user) to_chat(viewers(user), "[user] is hitting \himself with the [src.name]! It looks like \he's trying to ban \himself from life.") - return (BRUTELOSS|FIRELOSS|TOXLOSS|OXYLOSS) /obj/item/weapon/nullrod @@ -33,7 +32,6 @@ suicide_act(mob/user) to_chat(viewers(user), "[user] is impaling \himself with the [src.name]! It looks like \he's trying to commit suicide.") - return (BRUTELOSS|FIRELOSS) /obj/item/weapon/nullrod/attack(mob/M as mob, mob/living/user as mob) //Paste from old-code to decult with a null rod. @@ -50,7 +48,6 @@ if ((CLUMSY in user.mutations) && prob(50)) to_chat(user, "\red The rod slips out of your hand and hits your head.") - user.take_organ_damage(10) user.Paralyse(20) return @@ -60,7 +57,6 @@ if(ishuman(M)) if(!M.mind.vampire.get_ability(/datum/vampire_passive/full)) to_chat(M, "The nullrod's power interferes with your own!") - M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2) ..() @@ -72,7 +68,6 @@ if(!transformed) // can't turn a sword into a sword. var/obj/item/S = new transform_into() to_chat(user, "You sheath the [src] into the [I]'s scabbard, transforming it into \a [S].") - user.unEquip(src) qdel(src) user.put_in_hands(S) @@ -104,7 +99,6 @@ suicide_act(mob/user) to_chat(viewers(user), "[user] is impaling \himself with the [src.name]! It looks like \he's trying to commit suicide.") - return(BRUTELOSS) /obj/item/weapon/sord/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) @@ -131,7 +125,6 @@ suicide_act(mob/user) to_chat(viewers(user), "[user] is falling on the [src.name]! It looks like \he's trying to commit suicide.") - return(BRUTELOSS) /obj/item/weapon/claymore/ceremonial @@ -155,7 +148,6 @@ suicide_act(mob/user) to_chat(viewers(user), "[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.") - return(BRUTELOSS) /obj/item/weapon/katana/IsShield() @@ -201,7 +193,6 @@ obj/item/weapon/wirerod/attackby(var/obj/item/I, mob/user as mob, params) user.put_in_hands(S) to_chat(user, "You fasten the glass shard to the top of the rod with the cable.") - qdel(I) qdel(src) @@ -214,7 +205,6 @@ obj/item/weapon/wirerod/attackby(var/obj/item/I, mob/user as mob, params) user.put_in_hands(P) to_chat(user, "You fasten the wirecutters to the top of the rod with the cable, prongs outward.") - qdel(I) qdel(src) diff --git a/code/game/objects/items/weapons/whetstone.dm b/code/game/objects/items/weapons/whetstone.dm index 009262c39ce..d19c411899f 100644 --- a/code/game/objects/items/weapons/whetstone.dm +++ b/code/game/objects/items/weapons/whetstone.dm @@ -14,34 +14,27 @@ /obj/item/weapon/whetstone/attackby(obj/item/I, mob/user, params) if(used) to_chat(user, "The whetstone is too worn to use again.") - return if(I.force >= max || I.throwforce >= max)//no esword sharpening to_chat(user, "[I] is much too powerful to sharpen further.") - return if(requires_sharpness && !I.edge) to_chat(user, "You can only sharpen items that are already sharp, such as knives.") - return if(istype(I, /obj/item/weapon/twohanded))//some twohanded items should still be sharpenable, but handle force differently. therefore i need this stuff var/obj/item/weapon/twohanded/TH = I if(TH.force_wielded >= max) to_chat(user, "[TH] is much too powerful to sharpen further.") - return if(TH.wielded) to_chat(user, "[TH] must be unwielded before it can be sharpened.") - return if(TH.force_wielded > initial(TH.force_wielded)) to_chat(user, "[TH] has already been refined before. It cannot be sharpened further.") - return TH.force_wielded = Clamp(TH.force_wielded + increment, 0, max)//wieldforce is increased since normal force wont stay if(I.force > initial(I.force)) to_chat(user, "[I] has already been refined before. It cannot be sharpened further.") - return user.visible_message("[user] sharpens [I] with [src]!", "You sharpen [I], making it much more deadly than before.") if(!requires_sharpness) diff --git a/code/game/objects/items/weapons/wires.dm b/code/game/objects/items/weapons/wires.dm index 98c2565cf72..abae807c80a 100644 --- a/code/game/objects/items/weapons/wires.dm +++ b/code/game/objects/items/weapons/wires.dm @@ -13,7 +13,6 @@ suicide_act(mob/user) to_chat(viewers(user), "\red [user] is strangling \himself with the [src.name]! It looks like \he's trying to commit suicide.") - return (OXYLOSS) @@ -30,10 +29,8 @@ if (src.laying) src.laying = 0 to_chat(user, "\blue You're done laying wire!") - else to_chat(user, "\blue You are not using this to lay wire...") - return diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index f9883fa1c9c..952a647f3aa 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -69,12 +69,10 @@ for(var/obj/O in range(0, src)) if(O.density == 1 && O != src && !istype(O, /obj/machinery/door/window)) //Ignores windoors, as those already block climbing, otherwise a windoor on the opposite side of a table would prevent climbing. to_chat(user, "\red You cannot climb [src], as it is blocked by \a [O]!") - return for(var/turf/T in range(0, src)) if(T.density == 1) to_chat(user, "\red You cannot climb [src], as it is blocked by \a [T]!") - return var/turf/T = src.loc if(!T || !istype(T)) return @@ -112,14 +110,12 @@ M.Weaken(5) to_chat(M, "\red You topple as \the [src] moves under you!") - if(prob(25)) var/damage = rand(15,30) var/mob/living/carbon/human/H = M if(!istype(H)) to_chat(H, "\red You land heavily!") - M.adjustBruteLoss(damage) return @@ -139,13 +135,11 @@ if(affecting) to_chat(M, "\red You land heavily on your [affecting.name]!") - affecting.take_damage(damage, 0) if(affecting.parent) affecting.parent.add_autopsy_data("Misadventure", damage) else to_chat(H, "\red You land heavily!") - H.adjustBruteLoss(damage) H.UpdateDamageIcon() @@ -159,13 +153,11 @@ return 0 if (user.restrained() || user.buckled) to_chat(user, "You need your hands and legs free for this.") - return 0 if (user.stat || user.paralysis || user.sleeping || user.lying || user.weakened) return 0 if (issilicon(user)) to_chat(user, "You need hands for this.") - return 0 return 1 diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm index 060da01f5e5..9251890dc6e 100644 --- a/code/game/objects/structures/artstuff.dm +++ b/code/game/objects/structures/artstuff.dm @@ -140,10 +140,8 @@ var/global/list/globalBlankCanvases[AMT_OF_CANVASES] if(in_range(user, src) && get_turf(src) && user.client && ishuman(user)) //Let only humans be the robust zoominators. I'm too spooked other mobs trying to use it may get broken huds. if(src.loc == user || get_turf(src) == get_turf(user)) to_chat(user, "[src] has to be on the ground to focus on it!") - return to_chat(user, "You focus on \the [src].") - user.client.screen = list() //This is because screen objects go way past the view bounds we set, therefore not allowing stretch to fit to zoom in properly. user.client.reset_stretch = winget(user.client, "mapwindow.map", "icon-size") //Remember previous icon-size user.client.view = 3 //Decrease view @@ -152,5 +150,4 @@ var/global/list/globalBlankCanvases[AMT_OF_CANVASES] else to_chat(user, "It is too far away.") - #undef AMT_OF_CANVASES \ No newline at end of file diff --git a/code/game/objects/structures/barsign.dm b/code/game/objects/structures/barsign.dm index e70050d348a..a1b4c51d702 100644 --- a/code/game/objects/structures/barsign.dm +++ b/code/game/objects/structures/barsign.dm @@ -51,11 +51,9 @@ /obj/structure/sign/barsign/attack_hand(mob/user as mob) if (!src.allowed(user)) to_chat(user, "Access denied.") - return if (broken) to_chat(user, "The controls seem unresponsive.") - return pick_sign() @@ -65,17 +63,14 @@ /obj/structure/sign/barsign/attackby(var/obj/item/I, var/mob/user) if(!allowed(user)) to_chat(user, "Access denied.") - return if( istype(I, /obj/item/weapon/screwdriver)) if(!panel_open) to_chat(user, "You open the maintenance panel.") - set_sign(new /datum/barsign/hiddensigns/signoff) panel_open = 1 else to_chat(user, "You close the maintenance panel.") - if(!broken && !emagged) set_sign(pick(barsigns)) else if(emagged) @@ -88,23 +83,19 @@ var/obj/item/stack/cable_coil/C = I if(emagged) //Emagged, not broken by EMP to_chat(user, "Sign has been damaged beyond repair!") - return else if(!broken) to_chat(user, "This sign is functioning properly!") - return if(C.use(2)) to_chat(user, "You replace the burnt wiring.") - broken = 0 else to_chat(user, "You need at least two lengths of cable!") - /obj/structure/sign/barsign/emp_act(severity) set_sign(new /datum/barsign/hiddensigns/empbarsign) broken = 1 @@ -115,10 +106,8 @@ /obj/structure/sign/barsign/emag_act(mob/user) if(broken || emagged) to_chat(user, "Nothing interesting happens!") - return to_chat(user, "You emag the barsign. Takeover in progress...") - sleep(100) //10 seconds set_sign(new /datum/barsign/hiddensigns/syndibarsign) emagged = 1 diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 1a247e06f88..f7e178716c5 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -170,16 +170,13 @@ LINEN BINS ..(user) if(amount < 1) to_chat(user, "There are no bed sheets in the bin.") - return if(amount == 1) to_chat(user, "There is one bed sheet in the bin.") - return to_chat(user, "There are [amount] bed sheets in the bin.") - /obj/structure/bedsheetbin/update_icon() switch(amount) if(0) icon_state = "linenbin-empty" @@ -194,7 +191,6 @@ LINEN BINS sheets.Add(I) amount++ to_chat(user, "You put [I] in [src].") - else if(amount && !hidden && I.w_class < 4) //make sure there's sheets to hide it among, make sure nothing else is hidden in there. user.drop_item() I.loc = src @@ -203,7 +199,6 @@ LINEN BINS - /obj/structure/bedsheetbin/attack_hand(mob/user as mob) if(amount >= 1) amount-- @@ -220,11 +215,9 @@ LINEN BINS user.put_in_hands(B) to_chat(user, "You take [B] out of [src].") - if(hidden) hidden.loc = user.loc to_chat(user, "[hidden] falls out of [B]!") - hidden = null @@ -245,7 +238,6 @@ LINEN BINS B.loc = loc to_chat(user, "You telekinetically remove [B] from [src].") - update_icon() if(hidden) diff --git a/code/game/objects/structures/coathanger.dm b/code/game/objects/structures/coathanger.dm index 5fb9bfa63e9..a91b5aa3564 100644 --- a/code/game/objects/structures/coathanger.dm +++ b/code/game/objects/structures/coathanger.dm @@ -26,7 +26,6 @@ update_icon() else to_chat(user, "You cannot hang [W] on [src]") - return ..() /obj/structure/coatrack/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index a7c2238976f..87457fd791d 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -136,7 +136,6 @@ /obj/structure/closet/proc/toggle(mob/user as mob) if(!(src.opened ? src.close() : src.open())) to_chat(user, "It won't budge!") - return // this should probably use dump_contents() @@ -195,7 +194,6 @@ if(E.rcell && (E.rcell.charge >= E.chargecost)) if(!(src.z in config.contact_levels)) to_chat(user, "The rapid-crate-sender can't locate any telepads!") - return if(E.mode == 0) if(!E.teleporting) @@ -214,7 +212,6 @@ E.pad = L[desc] playsound(E.loc, 'sound/machines/click.ogg', 50, 1) to_chat(user, "\blue Teleporting [src.name]...") - E.teleporting = 1 if(!do_after(user, 50, target = src)) E.teleporting = 0 @@ -222,7 +219,6 @@ E.teleporting = 0 if(user in contents) to_chat(user, "Error: User located in container--aborting for safety.") - playsound(E.loc, 'sound/machines/buzz-sigh.ogg', 50, 1) return var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread @@ -231,7 +227,6 @@ do_teleport(src, E.pad, 0) E.rcell.use(E.chargecost) to_chat(user, "Teleport successful. [round(E.rcell.charge/E.chargecost)] charge\s left.") - return else E.rand_x = rand(50,200) @@ -239,7 +234,6 @@ var/L = locate(E.rand_x, E.rand_y, 6) playsound(E.loc, 'sound/machines/click.ogg', 50, 1) to_chat(user, "\blue Teleporting [src.name]...") - E.teleporting = 1 if(!do_after(user, 50, target = src)) E.teleporting = 0 @@ -247,7 +241,6 @@ E.teleporting = 0 if(user in contents) to_chat(user, "Error: User located in container--aborting for safety.") - playsound(E.loc, 'sound/machines/buzz-sigh.ogg', 50, 1) return var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread @@ -256,11 +249,9 @@ do_teleport(src, L) E.rcell.use(E.chargecost) to_chat(user, "Teleport successful. [round(E.rcell.charge/E.chargecost)] charge\s left.") - return else to_chat(user, "Out of charges.") - return if(src.opened) @@ -272,7 +263,6 @@ var/obj/item/weapon/weldingtool/WT = W if(!WT.remove_fuel(0,user)) to_chat(user, "You need more welding fuel to complete this task.") - return new /obj/item/stack/sheet/metal(src.loc) for(var/mob/M in viewers(src)) @@ -291,11 +281,9 @@ var/obj/item/weapon/weldingtool/WT = W if(src == user.loc) to_chat(user, "You can not [welded?"unweld":"weld"] the locker from inside.") - return if(!WT.remove_fuel(0,user)) to_chat(user, "You need more welding fuel to complete this task.") - return src.welded = !src.welded src.update_icon() @@ -339,12 +327,10 @@ if(!src.open()) to_chat(user, "It won't budge!") - if(!lastbang) lastbang = 1 for (var/mob/M in hearers(src, null)) to_chat(M, text("BANG, bang!", max(0, 5 - get_dist(src, M)))) - spawn(30) lastbang = 0 @@ -358,7 +344,6 @@ if(!src.toggle()) to_chat(usr, "It won't budge!") - /obj/structure/closet/verb/verb_toggleopen() set src in oview(1) set category = null @@ -373,7 +358,6 @@ else to_chat(usr, "This mob type can't use this verb.") - /obj/structure/closet/update_icon()//Putting the welded stuff in updateicon() so it's easy to overwrite for special cases (Fridges, cabinets, and whatnot) overlays.Cut() if(!opened) @@ -406,7 +390,6 @@ L.changeNext_move(CLICK_CD_BREAKOUT) L.last_special = world.time + CLICK_CD_BREAKOUT to_chat(L, "You lean on the back of \the [src] and start pushing the door open. (this will take about [breakout_time] minutes)") - for(var/mob/O in viewers(usr.loc)) O.show_message("The [src] begins to shake violently!", 1) @@ -424,7 +407,6 @@ welded = 0 update_icon() to_chat(usr, "You successfully break out!") - for(var/mob/O in viewers(L.loc)) O.show_message("\the [usr] successfully broke out of \the [src]!", 1) if(istype(src.loc, /obj/structure/bigDelivery)) //nullspace ect.. read the comment above diff --git a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm index 756fd860361..824cff35ece 100644 --- a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm +++ b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm @@ -35,7 +35,6 @@ L.do_alert_animation(L) egged = 1 to_chat(alerted, sound('sound/machines/chime.ogg')) - ..() /mob/living/proc/do_alert_animation(atom/A) diff --git a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm index c67b4e7f60d..f74f603df54 100644 --- a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm +++ b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm @@ -24,12 +24,10 @@ if (isrobot(user) || src.locked) if(istype(O, /obj/item/device/multitool)) to_chat(user, "\red Resetting circuitry...") - playsound(user, 'sound/machines/lockreset.ogg', 50, 1) if(do_after(user, 20, target = src)) src.locked = 0 to_chat(user, " You disable the locking modules.") - update_icon() return else if(istype(O, /obj/item/weapon)) @@ -46,7 +44,6 @@ playsound(user, 'sound/effects/Glasshit.ogg', 100, 1) //We don't want this playing every time if(W.force < 15) to_chat(user, "\blue The cabinet's protective glass glances off the hit.") - else src.hitstaken++ if(src.hitstaken == 4) @@ -60,13 +57,11 @@ if(!fireaxe) if(O:wielded) to_chat(user, "\red Unwield the axe first.") - return fireaxe = O user.drop_item(O) src.contents += O to_chat(user, "\blue You place the fire axe back in the [src.name].") - update_icon() else if(src.smashed) @@ -90,16 +85,13 @@ return else to_chat(user, "\red Resetting circuitry...") - sleep(50) src.locked = 1 to_chat(user, "\blue You re-enable the locking modules.") - playsound(user, 'sound/machines/lockenable.ogg', 50, 1) if(do_after(user,20, target = src)) src.locked = 1 to_chat(user, " You re-enable the locking modules.") - return else localopened = !localopened @@ -121,14 +113,12 @@ if(src.locked) to_chat(user, "\red The cabinet won't budge!") - return if(localopened) if(fireaxe) user.put_in_hands(fireaxe) fireaxe = null to_chat(user, "\blue You take the fire axe from the [name].") - src.add_fingerprint(user) update_icon() else @@ -156,7 +146,6 @@ if(localopened && fireaxe) fireaxe.forceMove(loc) to_chat(user, "\blue You telekinetically remove the fire axe.") - fireaxe = null update_icon() return @@ -169,10 +158,8 @@ if (isrobot(usr) || src.locked || src.smashed) if(src.locked) to_chat(usr, "\red The cabinet won't budge!") - else if(src.smashed) to_chat(usr, "\blue The protective glass is broken!") - return localopened = !localopened @@ -190,28 +177,22 @@ usr.put_in_hands(fireaxe) fireaxe = null to_chat(usr, "\blue You take the Fire axe from the [name].") - else to_chat(usr, "\blue The [src.name] is empty.") - else to_chat(usr, "\blue The [src.name] is closed.") - update_icon() attack_ai(mob/user as mob) if(src.smashed) to_chat(user, "\red The security of the cabinet is compromised.") - return else locked = !locked if(locked) to_chat(user, "\red Cabinet locked.") - else to_chat(user, "\blue Cabinet unlocked.") - return update_icon() //Template: fireaxe[has fireaxe][is opened][hits taken][is smashed]. If you want the opening or closing animations, add "opening" or "closing" right after the numbers diff --git a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm index be590c3028e..1de1f8d8440 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm @@ -67,13 +67,11 @@ else if(istype(W, /obj/item/weapon/card/id)) if(src.broken) to_chat(user, "\red It appears to be broken.") - return var/obj/item/weapon/card/id/I = W if(!I || !I.registered_name) return if(src == user.loc) to_chat(user, "You can't reach the lock from inside.") - else if(src.allowed(user) || !src.registered_name || (istype(I) && (src.registered_name == I.registered_name))) //they can open all lockers, or nobody owns this, or they own this locker src.locked = !( src.locked ) @@ -89,10 +87,8 @@ src.desc = "Owned by [I.registered_name]." else to_chat(user, "\red Access Denied") - else if((istype(W, /obj/item/weapon/card/emag) || istype(W, /obj/item/weapon/melee/energy/blade)) && !broken) emag_act(user) else to_chat(user, "\red Access Denied") - return diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm index e756a8961c5..fc7563e6b3a 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm @@ -49,27 +49,22 @@ /obj/structure/closet/secure_closet/proc/togglelock(mob/user as mob) if(src.opened) to_chat(user, "Close the locker first.") - return if(src.broken) to_chat(user, "The locker appears to be broken.") - return if(user.loc == src) to_chat(user, "You can't reach the lock from inside.") - return if(src.allowed(user)) src.locked = !src.locked for(var/mob/O in viewers(user, 3)) if((O.client && !( O.blinded ))) to_chat(O, "The locker has been [locked ? null : "un"]locked by [user].") - update_icon() else to_chat(user, "Access Denied") - /obj/structure/closet/secure_closet/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(istype(W, /obj/item/weapon/rcs)) return ..() @@ -80,7 +75,6 @@ src.MouseDrop_T(W:affecting, user) //act like they were dragged onto the closet else to_chat(user, "The locker is too small to stuff [W:affecting] into!") - if(isrobot(user)) return user.drop_item() @@ -102,7 +96,6 @@ flick(icon_broken, src) to_chat(user, "You unlock \the [src].") - /obj/structure/closet/secure_closet/attack_hand(mob/user as mob) src.add_fingerprint(user) if(src.locked) @@ -124,7 +117,6 @@ else to_chat(usr, "This mob type can't use this verb.") - /obj/structure/closet/secure_closet/update_icon()//Putting the welded stuff in updateicon() so it's easy to overwrite for special cases (Fridges, cabinets, and whatnot) overlays.Cut() if(!opened) @@ -150,7 +142,6 @@ L.changeNext_move(CLICK_CD_BREAKOUT) L.last_special = world.time + CLICK_CD_BREAKOUT to_chat(L, "You lean on the back of \the [src] and start pushing the door open. (this will take about [breakout_time] minutes)") - for(var/mob/O in viewers(src)) O.show_message("The [src] begins to shake violently!", 1) @@ -176,7 +167,6 @@ welded = 0 update_icon() to_chat(usr, "\red You successfully break out!") - for(var/mob/O in viewers(L.loc)) O.show_message("\the [usr] successfully broke out of \the [src]!", 1) if(istype(src.loc, /obj/structure/bigDelivery)) //Do this to prevent contents from being opened into nullspace (read: bluespace) diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm index a96ce0b2ba8..a315e598819 100644 --- a/code/game/objects/structures/crates_lockers/closets/statue.dm +++ b/code/game/objects/structures/crates_lockers/closets/statue.dm @@ -68,7 +68,6 @@ for(var/mob/M in contents) S.mind.transfer_to(M) to_chat(M, "As the animating magic wears off you feel yourself coming back to your senses. You are yourself again!") - break qdel(S) diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 749ede4270c..e91df4762df 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -86,7 +86,6 @@ if(E.rcell && (E.rcell.charge >= E.chargecost)) if(!(src.z in config.player_levels)) to_chat(user, "The rapid-crate-sender can't locate any telepads!") - return if(E.mode == 0) if(!E.teleporting) @@ -105,7 +104,6 @@ E.pad = L[desc] playsound(E.loc, 'sound/machines/click.ogg', 50, 1) to_chat(user, "\blue Teleporting [src.name]...") - E.teleporting = 1 if(!do_after(user, 50, target = src)) E.teleporting = 0 @@ -117,7 +115,6 @@ do_teleport(src, E.pad, 0) E.rcell.use(E.chargecost) to_chat(user, "Teleport successful. [round(E.rcell.charge/E.chargecost)] charge\s left.") - return else E.rand_x = rand(50,200) @@ -125,7 +122,6 @@ var/L = locate(E.rand_x, E.rand_y, 6) playsound(E.loc, 'sound/machines/click.ogg', 50, 1) to_chat(user, "\blue Teleporting [src.name]...") - E.teleporting = 1 if(!do_after(user, 50, target = src)) E.teleporting = 0 @@ -137,11 +133,9 @@ do_teleport(src, L) E.rcell.use(E.chargecost) to_chat(user, "Teleport successful. [round(E.rcell.charge/E.chargecost)] charge\s left.") - return else to_chat(user, "Out of charges.") - return if(opened) @@ -149,7 +143,6 @@ return if(!user.drop_item()) //couldn't drop the item to_chat(user, "\The [W] is stuck to your hand, you cannot put it in \the [src]!") - return if(W) W.forceMove(loc) @@ -158,10 +151,8 @@ else if(istype(W, /obj/item/stack/cable_coil)) if(rigged) to_chat(user, "[src] is already rigged!") - return to_chat(user, "You rig [src].") - user.drop_item() qdel(W) rigged = 1 @@ -169,14 +160,12 @@ else if(istype(W, /obj/item/device/radio/electropack)) if(rigged) to_chat(user, "You attach [W] to [src].") - user.drop_item() W.forceMove(src) return else if(istype(W, /obj/item/weapon/wirecutters)) if(rigged) to_chat(user, "You cut away the wiring.") - playsound(loc, 'sound/items/Wirecutter.ogg', 100, 1) rigged = 0 return @@ -205,7 +194,6 @@ /obj/structure/closet/crate/attack_hand(mob/user as mob) if(manifest) to_chat(user, "You tear the manifest off of the crate.") - playsound(src.loc, 'sound/items/poster_ripped.ogg', 75, 1) manifest.forceMove(loc) if(ishuman(user)) @@ -266,23 +254,19 @@ /obj/structure/closet/crate/secure/proc/togglelock(mob/user as mob) if(src.opened) to_chat(user, "Close the crate first.") - return if(src.broken) to_chat(user, "The crate appears to be broken.") - return if(src.allowed(user)) src.locked = !src.locked for(var/mob/O in viewers(user, 3)) if((O.client && !( O.blinded ))) to_chat(O, "The crate has been [locked ? null : "un"]locked by [user].") - update_icon() else to_chat(user, "Access Denied") - /obj/structure/closet/crate/secure/verb/verb_togglelock() set src in oview(1) // One square distance set category = null @@ -297,11 +281,9 @@ else to_chat(usr, "This mob type can't use this verb.") - /obj/structure/closet/crate/secure/attack_hand(mob/user as mob) if(manifest) to_chat(user, "You tear the manifest off of the crate.") - playsound(src.loc, 'sound/items/poster_ripped.ogg', 75, 1) manifest.forceMove(loc) if(ishuman(user)) @@ -335,7 +317,6 @@ src.broken = 1 update_icon() to_chat(user, "You unlock \the [src].") - return /obj/structure/closet/crate/secure/emp_act(severity) diff --git a/code/game/objects/structures/crates_lockers/crittercrate.dm b/code/game/objects/structures/crates_lockers/crittercrate.dm index 5b432a63f00..6badf7a6535 100644 --- a/code/game/objects/structures/crates_lockers/crittercrate.dm +++ b/code/game/objects/structures/crates_lockers/crittercrate.dm @@ -36,7 +36,6 @@ if(src.loc == user.loc) to_chat(user, "It won't budge!") - toggle() else toggle() diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm index e413a558a9e..4f5eecd0f23 100644 --- a/code/game/objects/structures/crates_lockers/largecrate.dm +++ b/code/game/objects/structures/crates_lockers/largecrate.dm @@ -19,7 +19,6 @@ /obj/structure/largecrate/attack_hand(mob/user as mob) if(manifest) to_chat(user, "You tear the manifest off of the crate.") - playsound(src.loc, 'sound/items/poster_ripped.ogg', 75, 1) manifest.forceMove(loc) if(ishuman(user)) @@ -29,7 +28,6 @@ return else to_chat(user, "You need a crowbar to pry this open!") - return /obj/structure/largecrate/attackby(obj/item/weapon/W as obj, mob/user as mob, params) diff --git a/code/game/objects/structures/crates_lockers/walllocker.dm b/code/game/objects/structures/crates_lockers/walllocker.dm index f61584bc6af..d07ee623d38 100644 --- a/code/game/objects/structures/crates_lockers/walllocker.dm +++ b/code/game/objects/structures/crates_lockers/walllocker.dm @@ -31,11 +31,9 @@ return //activate emergency lockers. This fixes that. (Does this make sense, the AI can't call attack_hand, can it? --Mloc) if(!amount) to_chat(usr, "It's empty.") - return if(amount) to_chat(usr, "You take out some items from \the [src].") - for(var/path in spawnitems) new path(src.loc) amount-- diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index c1b3f9c6ca9..90a95253a96 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -33,7 +33,6 @@ var/global/list/captain_display_cases = list() circuit.forceMove(src) state++ to_chat(user, "You add the airlock electronics to the frame.") - playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) if(istype(W, /obj/item/weapon/crowbar)) new /obj/machinery/constructable_frame/machine_frame(T) @@ -41,7 +40,6 @@ var/global/list/captain_display_cases = list() G.amount = 5 qdel(src) to_chat(user, "You pry the glass out of the frame.") - playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1) return @@ -67,14 +65,12 @@ var/global/list/captain_display_cases = list() sensor = null state-- to_chat(user, "You pry the electronics out of the frame.") - playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1) if(isprox(W) && !isprox(sensor)) user.drop_item() sensor = W sensor.forceMove(src) to_chat(user, "You add the proximity sensor to the frame.") - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) if(pstate != state) @@ -131,14 +127,11 @@ var/global/list/captain_display_cases = list() /obj/structure/displaycase/examine(mob/user) ..(user) to_chat(user, "Peering through the glass, you see that it contains:") - if(occupant) to_chat(user, "\icon[occupant] \A [occupant].") - else to_chat(user, "Nothing.") - /obj/structure/displaycase/proc/dump() if(occupant) occupant.forceMove(get_turf(src)) @@ -221,15 +214,12 @@ var/global/list/captain_display_cases = list() var/obj/item/weapon/card/id/I = W if(!check_access(I)) to_chat(user, "Access denied.") - return locked = !locked if(!locked) to_chat(user, "\icon[src] \The [src] clicks as locks release, and it slowly opens for you.") - else to_chat(user, "\icon[src] You close \the [src] and swipe your card, locking it.") - update_icon() return if(istype(W,/obj/item/weapon/crowbar) && (!locked || destroyed)) @@ -270,16 +260,13 @@ var/global/list/captain_display_cases = list() else if(!locked) dump() to_chat(user, "You smash \the [W] into the delicate electronics at the bottom of the case, and deactivate the hover field.") - update_icon() else if(locked) to_chat(user, "It's locked, you can't put anything into it.") - return if(!occupant) to_chat(user, "You insert \the [W] into \the [src], and it floats as the hoverfield activates.") - user.drop_item() W.forceMove(src) occupant=W @@ -290,7 +277,6 @@ var/global/list/captain_display_cases = list() if(occupant) dump() to_chat(user, "You smash your fist into the delicate electronics at the bottom of the case, and deactivate the hover field.") - src.add_fingerprint(user) update_icon() else @@ -308,22 +294,18 @@ var/global/list/captain_display_cases = list() var/print = H.get_full_print() if(!ue) to_chat(user, "Your press your thumb against the fingerprint scanner, registering your identity with the case.") - ue = print return if(ue != print) to_chat(user, "Access denied.") - return if(occupant) to_chat(user, "Your press your thumb against the fingerprint scanner, and deactivate the hover field built into the case.") - dump() update_icon() else to_chat(src, "\icon[src] \The [src] is empty!") - else user.visible_message("[user.name] gently runs his hands over \the [src] in appreciation of its contents.", \ "You gently run your hands over \the [src] in appreciation of its contents.", \ diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index 9042147343a..dc697aa7df9 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -158,7 +158,6 @@ obj/structure/door_assembly/multi_tile/Move() if(do_after(user, 40, target = src)) if(!src || !WT.isOn()) return to_chat(user, "\blue You welded the [glass] plating off!") - var/M = text2path("/obj/item/stack/sheet/mineral/[glass]") new M(src.loc, 2) glass = 0 @@ -167,7 +166,6 @@ obj/structure/door_assembly/multi_tile/Move() if(do_after(user, 40, target = src)) if(!src || !WT.isOn()) return to_chat(user, "\blue You welded the glass panel out!") - new /obj/item/stack/sheet/rglass(src.loc) glass = 0 else if(!anchored) @@ -175,12 +173,10 @@ obj/structure/door_assembly/multi_tile/Move() if(do_after(user, 40, target = src)) if(!src || !WT.isOn()) return to_chat(user, "\blue You dissasembled the airlock assembly!") - new /obj/item/stack/sheet/metal(src.loc, 4) qdel(src) else to_chat(user, "\blue You need more welding fuel.") - return else if(istype(W, /obj/item/weapon/wrench) && state == 0) @@ -193,7 +189,6 @@ obj/structure/door_assembly/multi_tile/Move() if(do_after(user, 40, target = src)) if(!src) return to_chat(user, "\blue You [anchored? "un" : ""]secured the airlock assembly!") - anchored = !anchored else if(istype(W, /obj/item/stack/cable_coil) && state == 0 && anchored ) @@ -205,7 +200,6 @@ obj/structure/door_assembly/multi_tile/Move() src.state = 1 to_chat(user, "\blue You wire the Airlock!") - else if(istype(W, /obj/item/weapon/wirecutters) && state == 1 ) playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) user.visible_message("[user] cuts the wires from the airlock assembly.", "You start to cut the wires from airlock assembly.") @@ -213,7 +207,6 @@ obj/structure/door_assembly/multi_tile/Move() if(do_after(user, 40, target = src)) if(!src) return to_chat(user, "\blue You cut the airlock wires.!") - new/obj/item/stack/cable_coil(src.loc, 1) src.state = 0 @@ -226,7 +219,6 @@ obj/structure/door_assembly/multi_tile/Move() if(do_after(user, 40, target = src)) if(!src) return to_chat(user, "\blue You installed the airlock electronics!") - src.state = 2 src.name = "Near finished Airlock Assembly" src.electronics = W @@ -240,7 +232,6 @@ obj/structure/door_assembly/multi_tile/Move() if(do_after(user, 40, target = src)) if(!src) return to_chat(user, "\blue You removed the airlock electronics!") - src.state = 1 src.name = "Wired Airlock Assembly" var/obj/item/weapon/airlock_electronics/ae @@ -260,7 +251,6 @@ obj/structure/door_assembly/multi_tile/Move() user.visible_message("[user] adds [S.name] to the airlock assembly.", "You start to install [S.name] into the airlock assembly.") if(do_after(user, 40, target = src)) to_chat(user, "\blue You installed reinforced glass windows into the airlock assembly!") - S.use(1) glass = 1 else if(istype(S, /obj/item/stack/sheet/mineral) && S.sheettype) @@ -270,7 +260,6 @@ obj/structure/door_assembly/multi_tile/Move() user.visible_message("[user] adds [S.name] to the airlock assembly.", "You start to install [S.name] into the airlock assembly.") if(do_after(user, 40, target = src)) to_chat(user, "\blue You installed [M] plating into the airlock assembly!") - S.use(2) glass = "[M]" @@ -278,11 +267,9 @@ obj/structure/door_assembly/multi_tile/Move() playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) to_chat(user, "\blue Now finishing the airlock.") - if(do_after(user, 40, target = src)) if(!src) return to_chat(user, "\blue You finish the airlock!") - var/path if(istext(glass)) path = text2path("/obj/machinery/door/airlock/[glass]") diff --git a/code/game/objects/structures/electricchair.dm b/code/game/objects/structures/electricchair.dm index 7361fb20831..f5ab3cb14aa 100644 --- a/code/game/objects/structures/electricchair.dm +++ b/code/game/objects/structures/electricchair.dm @@ -41,10 +41,8 @@ return if(last_time + delay_time > world.time) to_chat(usr, "\The [src] is not ready yet!") - return to_chat(usr, "You activate \the [src].") - shock() return @@ -81,7 +79,6 @@ if(buckled_mob) buckled_mob.burn_skin(90) to_chat(buckled_mob, "You feel a deep shock course through your body!") - sleep(1) buckled_mob.burn_skin(90) sleep(5) diff --git a/code/game/objects/structures/engicart.dm b/code/game/objects/structures/engicart.dm index fd3140f857a..76dbc81ca43 100644 --- a/code/game/objects/structures/engicart.dm +++ b/code/game/objects/structures/engicart.dm @@ -19,7 +19,6 @@ I.loc = src updateUsrDialog() to_chat(user, "You put [I] into [src].") - return /obj/structure/engineeringcart/attackby(obj/item/I, mob/user, params) var/fail_msg = "There is already one of those in [src]." @@ -31,7 +30,6 @@ update_icon() else to_chat(user, fail_msg) - else if(istype(I, /obj/item/stack/sheet/metal)) if(!mymetal) put_in_cart(I, user) @@ -39,7 +37,6 @@ update_icon() else to_chat(user, fail_msg) - else if(istype(I, /obj/item/stack/sheet/plasteel)) if(!myplasteel) put_in_cart(I, user) @@ -47,7 +44,6 @@ update_icon() else to_chat(user, fail_msg) - else if(istype(I, /obj/item/device/flashlight)) if(!myflashlight) put_in_cart(I, user) @@ -55,7 +51,6 @@ update_icon() else to_chat(user, fail_msg) - else if(istype(I, /obj/item/weapon/storage/toolbox/mechanical)) if(!mybluetoolbox) put_in_cart(I, user) @@ -63,7 +58,6 @@ update_icon() else to_chat(user, fail_msg) - else if(istype(I, /obj/item/weapon/storage/toolbox/electrical)) if(!myyellowtoolbox) put_in_cart(I, user) @@ -71,7 +65,6 @@ update_icon() else to_chat(user, fail_msg) - else if(istype(I, /obj/item/weapon/storage/toolbox)) if(!myredtoolbox) put_in_cart(I, user) @@ -79,7 +72,6 @@ update_icon() else to_chat(user, fail_msg) - else if(istype(I, /obj/item/taperoll/engineering/)) if(!myengitape) put_in_cart(I, user) @@ -87,7 +79,6 @@ update_icon() else to_chat(user, fail_msg) - else if(istype(I, /obj/item/weapon/wrench)) if (!anchored && !isinspace()) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) @@ -106,7 +97,6 @@ else to_chat(usr, "You cannot interface your modules [src]!") - /obj/structure/engineeringcart/attack_hand(mob/user) user.set_machine(src) var/dat @@ -139,49 +129,41 @@ if(myglass) user.put_in_hands(myglass) to_chat(user, "You take [myglass] from [src].") - myglass = null if(href_list["metal"]) if(mymetal) user.put_in_hands(mymetal) to_chat(user, "You take [mymetal] from [src].") - mymetal = null if(href_list["plasteel"]) if(myplasteel) user.put_in_hands(myplasteel) to_chat(user, "You take [myplasteel] from [src].") - myplasteel = null if(href_list["flashlight"]) if(myflashlight) user.put_in_hands(myflashlight) to_chat(user, "You take [myflashlight] from [src].") - myflashlight = null if(href_list["bluetoolbox"]) if(mybluetoolbox) user.put_in_hands(mybluetoolbox) to_chat(user, "You take [mybluetoolbox] from [src].") - mybluetoolbox = null if(href_list["redtoolbox"]) if(myredtoolbox) user.put_in_hands(myredtoolbox) to_chat(user, "You take [myredtoolbox] from [src].") - myredtoolbox = null if(href_list["yellowtoolbox"]) if(myyellowtoolbox) user.put_in_hands(myyellowtoolbox) to_chat(user, "You take [myyellowtoolbox] from [src].") - myyellowtoolbox = null if(href_list["engitape"]) if(myengitape) user.put_in_hands(myengitape) to_chat(user, "You take [myengitape] from [src].") - myengitape = null update_icon() diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index 4f448aa4c7a..d0521d33f0e 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -18,7 +18,6 @@ contents += O has_extinguisher = O to_chat(user, "You place [O] in [src].") - else opened = !opened else @@ -36,12 +35,10 @@ temp = H.organs_by_name["l_hand"] if(temp && !temp.is_usable()) to_chat(user, "You try to move your [temp.name], but cannot!") - return if(has_extinguisher) user.put_in_hands(has_extinguisher) to_chat(user, "You take [has_extinguisher] from [src].") - has_extinguisher = null opened = 1 else @@ -52,7 +49,6 @@ if(has_extinguisher) has_extinguisher.loc = loc to_chat(user, "You telekinetically remove [has_extinguisher] from [src].") - has_extinguisher = null opened = 1 else diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index ceb6604db60..cbdce196c47 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -78,19 +78,16 @@ /obj/structure/falsewall/attackby(obj/item/weapon/W, mob/user, params) if(opening) to_chat(user, "You must wait until the door has stopped moving.") - return if(density) var/turf/T = get_turf(src) if(T.density) to_chat(user, "[src] is blocked!") - return if(istype(W, /obj/item/weapon/screwdriver)) if (!istype(T, /turf/simulated/floor)) to_chat(user, "[src] bolts must be tightened on the floor!") - return user.visible_message("[user] tightens some bolts on the wall.", "You tighten the bolts on the wall.") ChangeToWall() @@ -101,7 +98,6 @@ else to_chat(user, "You can't reach, close it first!") - if(istype(W, /obj/item/weapon/gun/energy/plasmacutter) || istype(W, /obj/item/weapon/pickaxe/drill/diamonddrill) || istype(W, /obj/item/weapon/pickaxe/drill/jackhammer) || istype(W, /obj/item/weapon/melee/energy/blade)) dismantle(user) diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index 3d62fcbc902..ab167113178 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -288,13 +288,11 @@ if(indestructable) //this bush marks the edge of the map, you can't destroy it to_chat(user, "\red You flail away at the undergrowth, but it's too thick here.") - else user.visible_message("\red [user] begins clearing away [src].","\red You begin clearing away [src].") spawn(rand(15,30)) if(get_dist(user,src) < 2) to_chat(user, "\blue You clear away [src].") - var/obj/item/stack/sheet/wood/W = new(src.loc) W.amount = rand(3,15) if(prob(50)) diff --git a/code/game/objects/structures/foodcart.dm b/code/game/objects/structures/foodcart.dm index 0bb65409cf1..e2df39180d9 100644 --- a/code/game/objects/structures/foodcart.dm +++ b/code/game/objects/structures/foodcart.dm @@ -27,7 +27,6 @@ I.loc = src updateUsrDialog() to_chat(user, "You put [I] into [src].") - return /obj/structure/foodcart/attackby(obj/item/I, mob/user, params) @@ -44,7 +43,6 @@ break; if(!success) to_chat(user, fail_msg) - else if(istype(I, /obj/item/weapon/reagent_containers/food/drinks)) var/success = 0 for(var/s=1,s<=6,s++) @@ -56,7 +54,6 @@ break; if(!success) to_chat(user, fail_msg) - else if(istype(I, /obj/item/weapon/wrench)) if (!anchored && !isinspace()) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) @@ -75,7 +72,6 @@ else to_chat(usr, "You cannot interface your modules [src]!") - /obj/structure/foodcart/attack_hand(mob/user) user.set_machine(src) var/dat @@ -117,73 +113,61 @@ if(food_slots[1]) user.put_in_hands(food_slots[1]) to_chat(user, "You take [food_slots[1]] from [src].") - food_slots[1] = null if(href_list["f2"]) if(food_slots[2]) user.put_in_hands(food_slots[2]) to_chat(user, "You take [food_slots[2]] from [src].") - food_slots[2] = null if(href_list["f3"]) if(food_slots[3]) user.put_in_hands(food_slots[3]) to_chat(user, "You take [food_slots[3]] from [src].") - food_slots[3] = null if(href_list["f4"]) if(food_slots[4]) user.put_in_hands(food_slots[4]) to_chat(user, "You take [food_slots[4]] from [src].") - food_slots[4] = null if(href_list["f5"]) if(food_slots[5]) user.put_in_hands(food_slots[5]) to_chat(user, "You take [food_slots[5]] from [src].") - food_slots[5] = null if(href_list["f6"]) if(food_slots[6]) user.put_in_hands(food_slots[6]) to_chat(user, "You take [food_slots[6]] from [src].") - food_slots[6] = null if(href_list["d1"]) if(drink_slots[1]) user.put_in_hands(drink_slots[1]) to_chat(user, "You take [drink_slots[1]] from [src].") - drink_slots[1] = null if(href_list["d2"]) if(drink_slots[2]) user.put_in_hands(drink_slots[2]) to_chat(user, "You take [drink_slots[2]] from [src].") - drink_slots[2] = null if(href_list["d3"]) if(drink_slots[3]) user.put_in_hands(drink_slots[3]) to_chat(user, "You take [drink_slots[3]] from [src].") - drink_slots[3] = null if(href_list["d4"]) if(drink_slots[4]) user.put_in_hands(drink_slots[4]) to_chat(user, "You take [drink_slots[4]] from [src].") - drink_slots[4] = null if(href_list["d5"]) if(drink_slots[5]) user.put_in_hands(drink_slots[5]) to_chat(user, "You take [drink_slots[5]] from [src].") - drink_slots[5] = null if(href_list["d6"]) if(drink_slots[6]) user.put_in_hands(drink_slots[6]) to_chat(user, "You take [drink_slots[6]] from [src].") - drink_slots[6] = null update_icon() //Not really needed without overlays, but keeping just in case diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index a295300fb03..5d047e3ec2f 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -33,75 +33,61 @@ if(anchored && !istype(src,/obj/structure/girder/displaced)) playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) to_chat(user, "\blue Now disassembling the girder") - if(do_after(user,40, target = src)) if(!src) return to_chat(user, "\blue You dissasembled the girder!") - refundMetal(metalUsed) qdel(src) else if(!anchored) playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) to_chat(user, "\blue Now securing the girder") - if(get_turf(user, 40)) to_chat(user, "\blue You secured the girder!") - new/obj/structure/girder( src.loc ) qdel(src) else if(istype(W, /obj/item/weapon/gun/energy/plasmacutter)) to_chat(user, "\blue Now slicing apart the girder") - if(do_after(user,30, target = src)) if(!src) return to_chat(user, "\blue You slice apart the girder!") - refundMetal(metalUsed) qdel(src) else if(istype(W, /obj/item/weapon/pickaxe/drill/diamonddrill)) to_chat(user, "\blue You drill through the girder!") - refundMetal(metalUsed) qdel(src) else if(istype(W, /obj/item/weapon/pickaxe/drill/jackhammer)) playsound(src.loc, 'sound/weapons/sonic_jackhammer.ogg', 100, 1) to_chat(user, "You Disintegrate the girder!") - refundMetal(metalUsed) qdel(src) else if(istype(W, /obj/item/weapon/screwdriver) && state == 2 && istype(src,/obj/structure/girder/reinforced)) playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) to_chat(user, "\blue Now unsecuring support struts") - if(do_after(user,40, target = src)) if(!src) return to_chat(user, "\blue You unsecured the support struts!") - state = 1 else if(istype(W, /obj/item/weapon/wirecutters) && istype(src,/obj/structure/girder/reinforced) && state == 1) playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) to_chat(user, "\blue Now removing support struts") - if(do_after(user,40, target = src)) if(!src) return to_chat(user, "\blue You removed the support struts!") - new/obj/structure/girder( src.loc ) qdel(src) else if(istype(W, /obj/item/weapon/crowbar) && state == 0 && anchored ) playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) to_chat(user, "\blue Now dislodging the girder") - if(do_after(user, 40, target = src)) if(!src) return to_chat(user, "\blue You dislodged the girder!") - new/obj/structure/girder/displaced( src.loc ) qdel(src) @@ -115,18 +101,15 @@ if(S.amount < 2) return S.use(2) to_chat(user, "\blue You create a false wall! Push on it to open or close the passage.") - new /obj/structure/falsewall (src.loc) qdel(src) else if(S.amount < 2) return ..() to_chat(user, "\blue Now adding plating...") - if (do_after(user,40, target = src)) if(!src || !S || S.amount < 2) return S.use(2) to_chat(user, "\blue You added the plating!") - var/turf/Tsrc = get_turf(src) Tsrc.ChangeTurf(/turf/simulated/wall) for(var/turf/simulated/wall/X in Tsrc.loc) @@ -139,19 +122,16 @@ if(S.amount < 2) return S.use(2) to_chat(user, "\blue You create a false wall! Push on it to open or close the passage.") - new /obj/structure/falsewall/reinforced (src.loc) qdel(src) else if (src.icon_state == "reinforced") //I cant believe someone would actually write this line of code... if(S.amount < 1) return ..() to_chat(user, "\blue Now finalising reinforced wall.") - if(do_after(user, 50, target = src)) if(!src || !S || S.amount < 1) return S.use(1) to_chat(user, "\blue Wall fully reinforced!") - var/turf/Tsrc = get_turf(src) Tsrc.ChangeTurf(/turf/simulated/wall/r_wall) for(var/turf/simulated/wall/r_wall/X in Tsrc.loc) @@ -161,12 +141,10 @@ else if(S.amount < 1) return ..() to_chat(user, "\blue Now reinforcing girders") - if (do_after(user,60, target = src)) if(!src || !S || S.amount < 1) return S.use(1) to_chat(user, "\blue Girders reinforced!") - new/obj/structure/girder/reinforced( src.loc ) qdel(src) return @@ -177,19 +155,16 @@ if(S.amount < 2) return S.use(2) to_chat(user, "\blue You create a false wall! Push on it to open or close the passage.") - var/F = text2path("/obj/structure/falsewall/[M]") new F (src.loc) qdel(src) else if(S.amount < 2) return ..() to_chat(user, "\blue Now adding plating...") - if (do_after(user,40, target = src)) if(!src || !S || S.amount < 2) return S.use(2) to_chat(user, "\blue You added the plating!") - var/turf/Tsrc = get_turf(src) Tsrc.ChangeTurf(text2path("/turf/simulated/wall/mineral/[M]")) for(var/turf/simulated/wall/mineral/X in Tsrc.loc) @@ -205,7 +180,6 @@ user.drop_item() P.loc = src.loc to_chat(user, "\blue You fit the pipe into the [src]!") - else ..() @@ -268,23 +242,18 @@ if(istype(W, /obj/item/weapon/wrench)) playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) to_chat(user, "\blue Now disassembling the girder") - if(do_after(user,40, target = src)) to_chat(user, "\blue You dissasembled the girder!") - dismantle() else if(istype(W, /obj/item/weapon/gun/energy/plasmacutter)) to_chat(user, "\blue Now slicing apart the girder") - if(do_after(user,30, target = src)) to_chat(user, "\blue You slice apart the girder!") - dismantle() else if(istype(W, /obj/item/weapon/pickaxe/drill/diamonddrill)) to_chat(user, "\blue You drill through the girder!") - dismantle() /obj/structure/cultgirder/proc/dismantle() diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 17d6d1b0262..9c1a9e6867a 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -171,21 +171,17 @@ dir_to_set = 4 else to_chat(user, "You can't reach.") - return //Only works for cardinal direcitons, diagonals aren't supposed to work like this. for(var/obj/structure/window/WINDOW in loc) if(WINDOW.dir == dir_to_set) to_chat(user, "There is already a window facing this way there.") - return to_chat(user, "You start placing the window.") - if(do_after(user,20, target = src)) if(!src) return //Grille destroyed while waiting for(var/obj/structure/window/WINDOW in loc) if(WINDOW.dir == dir_to_set)//checking this for a 2nd time to check if a window was made while we were waiting. to_chat(user, "There is already a window facing this way there.") - return var/obj/structure/window/WD if(istype(W,/obj/item/stack/sheet/rglass)) @@ -203,7 +199,6 @@ var/obj/item/stack/ST = W ST.use(1) to_chat(user, "You place the [WD] on [src].") - WD.update_icon() return //window placing end diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index d6a73d7f07c..299f776c4f7 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -8,7 +8,6 @@ /obj/item/inflatable/attack_self(mob/user) playsound(loc, 'sound/items/zip.ogg', 75, 1) to_chat(user, "\blue You inflate [src].") - var/obj/structure/inflatable/R = new /obj/structure/inflatable(user.loc) src.transfer_fingerprints_to(R) R.add_fingerprint(user) @@ -152,7 +151,6 @@ /obj/item/inflatable/door/attack_self(mob/user) playsound(loc, 'sound/items/zip.ogg', 75, 1) to_chat(user, "\blue You inflate [src].") - var/obj/structure/inflatable/door/R = new /obj/structure/inflatable/door(user.loc) src.transfer_fingerprints_to(R) R.add_fingerprint(user) @@ -265,7 +263,6 @@ /obj/item/inflatable/torn/attack_self(mob/user) to_chat(user, "The inflatable wall is too torn to be inflated!") - add_fingerprint(user) /obj/item/inflatable/door/torn @@ -276,7 +273,6 @@ /obj/item/inflatable/door/torn/attack_self(mob/user) to_chat(user, "The inflatable door is too torn to be inflated!") - add_fingerprint(user) /obj/item/weapon/storage/briefcase/inflatable diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 30a4080b3b4..9f8c92b6255 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -35,17 +35,14 @@ to_chat(user, "It has been upgraded with a floor buffer.") - /obj/structure/stool/bed/chair/janicart/attackby(obj/item/I, mob/user, params) if(istype(I, keytype)) to_chat(user, "Hold [I] in one of your hands while you drive this [callme].") - else if(istype(I, /obj/item/weapon/storage/bag/trash)) if(keytype == /obj/item/key/janitor) if(!user.drop_item()) return to_chat(user, "You hook the trashbag onto the [callme].") - I.loc = src mybag = I else if(istype(I, /obj/item/janiupgrade)) @@ -53,7 +50,6 @@ floorbuffer = 1 qdel(I) to_chat(user, "You upgrade the [callme] with the floor buffer.") - update_icon() /obj/structure/stool/bed/chair/janicart/update_icon() @@ -95,7 +91,6 @@ move_delay = 0 else to_chat(user, "You'll need the keys in one of your hands to drive this [callme].") - /obj/structure/stool/bed/chair/janicart/Bump(atom/A) if(buckled_mob && istype(A, /obj/machinery/door)) @@ -251,11 +246,9 @@ /obj/structure/janitorialcart/proc/wet_mop(obj/item/weapon/mop, mob/user) if(reagents.total_volume < 1) to_chat(user, "[src] is out of water!") - else reagents.trans_to(mop, 5) // to_chat(user, "You wet [mop] in [src].") - playsound(loc, 'sound/effects/slosh.ogg', 25, 1) /obj/structure/janitorialcart/proc/put_in_cart(obj/item/I, mob/user) @@ -263,7 +256,6 @@ I.loc = src updateUsrDialog() to_chat(user, "You put [I] into [src].") - return @@ -281,14 +273,12 @@ else to_chat(user, fail_msg) - else if(istype(I, /obj/item/weapon/storage/bag/trash)) if(!mybag) var/obj/item/weapon/storage/bag/trash/t=I t.janicart_insert(user, src) else to_chat(user, fail_msg) - else if(istype(I, /obj/item/weapon/reagent_containers/spray/cleaner)) if(!myspray) put_in_cart(I, user) @@ -296,14 +286,12 @@ update_icon() else to_chat(user, fail_msg) - else if(istype(I, /obj/item/device/lightreplacer)) if(!myreplacer) var/obj/item/device/lightreplacer/l=I l.janicart_insert(user,src) else to_chat(user, fail_msg) - else if(istype(I, /obj/item/weapon/caution)) if(signs < max_signs) put_in_cart(I, user) @@ -311,12 +299,10 @@ update_icon() else to_chat(user, "[src] can't hold any more signs.") - else if(istype(I, /obj/item/weapon/crowbar)) user.visible_message("[user] begins to empty the contents of [src].") if(do_after(user, 30, target = src)) to_chat(usr, "You empty the contents of [src]'s bucket onto the floor.") - reagents.reaction(src.loc) src.reagents.clear_reagents() else if(istype(I, /obj/item/weapon/wrench)) @@ -339,7 +325,6 @@ else to_chat(usr, "You cannot interface your modules [src]!") - /obj/structure/janitorialcart/attack_hand(mob/user) user.set_machine(src) var/dat @@ -368,25 +353,21 @@ if(mybag) user.put_in_hands(mybag) to_chat(user, "You take [mybag] from [src].") - mybag = null if(href_list["mop"]) if(mymop) user.put_in_hands(mymop) to_chat(user, "You take [mymop] from [src].") - mymop = null if(href_list["spray"]) if(myspray) user.put_in_hands(myspray) to_chat(user, "You take [myspray] from [src].") - myspray = null if(href_list["replacer"]) if(myreplacer) user.put_in_hands(myreplacer) to_chat(user, "You take [myreplacer] from [src].") - myreplacer = null if(href_list["sign"]) if(signs) @@ -394,7 +375,6 @@ if(Sign) user.put_in_hands(Sign) to_chat(user, "You take \a [Sign] from [src].") - signs-- else WARNING("Signs ([signs]) didn't match contents") diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index 7e61e34ccb4..d14b4bbda21 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -14,18 +14,15 @@ if(istype(I, /obj/item/weapon/wrench)) if(anchored) to_chat(user, "You unwrench [src] from the floor.") - anchored = 0 else to_chat(user, "You wrench [src] into place.") - anchored = 1 else if(istype(I, /obj/item/stack/rods)) var/obj/item/stack/rods/R = I if(R.get_amount() >= 4) R.use(4) to_chat(user, "You add spikes to the frame.") - new /obj/structure/kitchenspike(loc) add_fingerprint(user) qdel(src) @@ -49,20 +46,17 @@ playsound(loc, 'sound/items/Crowbar.ogg', 100, 1) if(do_after(user, 20, target = src)) to_chat(user, "You pry the spikes out of the frame.") - new /obj/item/stack/rods(loc, 4) new /obj/structure/kitchenspike_frame(loc) add_fingerprint(user) qdel(src) else to_chat(user, "You can't do that while something's on the spike!") - return if(!istype(G, /obj/item/weapon/grab) || !G.affecting) return if(buckled_mob) to_chat(user, "The spike already has something on it, finish collecting its meat first!") - else if(isliving(G.affecting)) if(!buckled_mob) @@ -72,7 +66,6 @@ qdel(G) return to_chat(user, "You can't use that on the spike!") - return /obj/structure/kitchenspike/proc/spike(var/mob/living/victim) @@ -131,7 +124,6 @@ if(!do_after(M, 1200, target = src)) if(M && M.buckled) to_chat(M, "You fail to free yourself!") - return if(!M.buckled) return diff --git a/code/game/objects/structures/lamarr_cage.dm b/code/game/objects/structures/lamarr_cage.dm index 66a3d9cbcb0..0f8cde25dbe 100644 --- a/code/game/objects/structures/lamarr_cage.dm +++ b/code/game/objects/structures/lamarr_cage.dm @@ -70,11 +70,9 @@ return else to_chat(usr, text("\blue You kick the lab cage.")) - for(var/mob/O in oviewers()) if ((O.client && !( O.blinded ))) to_chat(O, text("\red [] kicks the lab cage.", usr)) - src.health -= 2 healthcheck() return diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 55f25ed49cb..d7704265861 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -59,7 +59,6 @@ var/obj/item/weapon/weldingtool/WT = C if(WT.remove_fuel(0, user)) to_chat(user, "\blue Slicing lattice joints ...") - new /obj/item/stack/rods(src.loc) qdel(src) diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index 95c22d434f8..01c9442ea33 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -112,15 +112,12 @@ if(istype(W,/obj/item/weapon/pickaxe)) var/obj/item/weapon/pickaxe/digTool = W to_chat(user, "You start digging the [name].") - if(do_after(user,digTool.digspeed*hardness, target = src) && src) to_chat(user, "You finished digging.") - Dismantle() else if(istype(W,/obj/item/weapon)) //not sure, can't not just weapons get passed to this proc? hardness -= W.force/100 to_chat(user, "You hit the [name] with your [W.name]!") - CheckHardness() else attack_hand(user) diff --git a/code/game/objects/structures/misc.dm b/code/game/objects/structures/misc.dm index 77c5268ba7b..1b8737e1ddd 100644 --- a/code/game/objects/structures/misc.dm +++ b/code/game/objects/structures/misc.dm @@ -17,7 +17,6 @@ attack_hand(mob/user as mob) to_chat(user, "Civilians: NT is recruiting! Please head SOUTH to the NT Recruitment office to join the station's crew!") - /obj/structure/ninjatele name = "Long-Distance Teleportation Console" @@ -51,13 +50,10 @@ to_chat(user, "\blue VOID-Shift translocation successful") - if("No") to_chat(user, "\red Process aborted!") - return else - to_chat(user, "\red FĆAL �Rr�R: µ§er n¤t rec¤gnized, c-c¤ntr-r¤£§-£§ £¤cked.") - + to_chat(user, "\red FĆAL �Rr�R: ŧer nt recgnized, c-cntr-r䣧-ç äcked.") diff --git a/code/game/objects/structures/mop_bucket.dm b/code/game/objects/structures/mop_bucket.dm index 2bb20afb82d..c8e600c658d 100644 --- a/code/game/objects/structures/mop_bucket.dm +++ b/code/game/objects/structures/mop_bucket.dm @@ -25,17 +25,14 @@ if(..(user, 1)) to_chat(usr, text("\icon[] [] contains [] units of water left!", src, src.name, src.reagents.total_volume)) - /obj/structure/mopbucket/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if (istype(W, /obj/item/weapon/mop)) if (src.reagents.total_volume >= 2) src.reagents.trans_to(W, 2) to_chat(user, "\blue You wet the mop") - playsound(src.loc, 'sound/effects/slosh.ogg', 25, 1) if (src.reagents.total_volume < 1) to_chat(user, "\blue Out of water!") - return /obj/structure/mopbucket/ex_act(severity) diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 7b0ba512971..f9809b422ca 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -151,7 +151,6 @@ return to_chat(CM, "You attempt to slide yourself out of \the [src]...") - src.attack_hand(CM) @@ -194,7 +193,6 @@ for(var/mob/B in viewers(user, 3)) if ((B.client && !( B.blinded ))) to_chat(B, text("\red [] stuffs [] into []!", user, O, src)) - return /obj/structure/m_tray/Destroy() @@ -277,7 +275,6 @@ /obj/structure/crematorium/attack_hand(mob/user as mob) if (cremating) to_chat(usr, "\red It's locked.") - return if ((connected) && (locked == 0)) for(var/atom/movable/A as mob|obj in connected.loc) @@ -392,7 +389,6 @@ return to_chat(CM, "You attempt to slide yourself out of \the [src]...") - src.attack_hand(CM) /* @@ -434,7 +430,6 @@ for(var/mob/B in viewers(user, 3)) if ((B.client && !( B.blinded ))) to_chat(B, text("\red [] stuffs [] into []!", user, O, src)) - //Foreach goto(99) return @@ -452,7 +447,6 @@ C.cremate(user) else to_chat(usr, "\red Access denied.") - return /hook/Login/proc/update_morgue(var/client/client, var/mob/L) diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm index 81d36be51d9..9750d449bca 100644 --- a/code/game/objects/structures/musician.dm +++ b/code/game/objects/structures/musician.dm @@ -80,21 +80,17 @@ for(var/line in lines) // to_chat(world, line) - for(var/beat in splittext(lowertext(line), ",")) // to_chat(world, "beat: [beat]") - var/list/notes = splittext(beat, "/") for(var/note in splittext(notes[1], "-")) // to_chat(world, "note: [note]") - if(!playing || shouldStopPlaying(user))//If the instrument is playing, or special case playing = 0 return if(lentext(note) == 0) continue // to_chat(world, "Parse: [copytext(note,1,2)]") - var/cur_note = text2ascii(note) - 96 if(cur_note < 1 || cur_note > 7) continue @@ -177,13 +173,11 @@ tempo = sanitize_tempo(5) // default 120 BPM if(lines.len > 50) to_chat(usr, "Too many lines!") - lines.Cut(51) var/linenum = 1 for(var/l in lines) if(lentext(l) > 50) to_chat(usr, "Line [linenum] too long!") - lines.Remove(l) else linenum++ @@ -308,7 +302,6 @@ if (!anchored && !isinspace()) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) to_chat(user, " You begin to tighten \the [src] to the floor...") - if (do_after(user, 20, target = src)) user.visible_message( \ "[user] tightens \the [src]'s casters.", \ @@ -318,7 +311,6 @@ else if(anchored) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) to_chat(user, " You begin to loosen \the [src]'s casters...") - if (do_after(user, 40, target = src)) user.visible_message( \ "[user] loosens \the [src]'s casters.", \ diff --git a/code/game/objects/structures/noticeboard.dm b/code/game/objects/structures/noticeboard.dm index 12893155709..adc6fa4a4fa 100644 --- a/code/game/objects/structures/noticeboard.dm +++ b/code/game/objects/structures/noticeboard.dm @@ -26,11 +26,9 @@ notices++ icon_state = "nboard0[notices]" //update sprite to_chat(user, "You pin the paper to the noticeboard.") - else to_chat(user, "You reach to pin your paper to the board but hesitate. You are certain your paper will not be seen among the many others already attached.") - /obj/structure/noticeboard/attack_hand(user as mob) var/dat = "Noticeboard
      " for(var/obj/item/weapon/paper/P in src) @@ -69,7 +67,6 @@ else to_chat(usr, "You'll need something to write with!") - if(href_list["read"]) var/obj/item/weapon/paper/P = locate(href_list["read"]) if((P && P.loc == src)) diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index c34e36404cd..ec2ebc8848a 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -43,10 +43,8 @@ FLOOR SAFES if(user && canhear) if(tumbler_1_pos == tumbler_1_open) to_chat(user, "You hear a [pick("tonk", "krunk", "plunk")] from [src].") - if(tumbler_2_pos == tumbler_2_open) to_chat(user, "You hear a [pick("tink", "krink", "plink")] from [src].") - if(tumbler_1_pos == tumbler_1_open && tumbler_2_pos == tumbler_2_open) if(user) visible_message("[pick("Spring", "Sprang", "Sproing", "Clunk", "Krunk")]!") return 1 @@ -98,14 +96,12 @@ FLOOR SAFES if(href_list["open"]) if(check_unlocked()) to_chat(user, "You [open ? "close" : "open"] [src].") - open = !open update_icon() updateUsrDialog() return else to_chat(user, "You can't [open ? "close" : "open"] [src], the lock is engaged!") - return if(href_list["decrement"]) @@ -114,12 +110,10 @@ FLOOR SAFES tumbler_1_pos = decrement(tumbler_1_pos) if(canhear) to_chat(user, "You hear a [pick("clack", "scrape", "clank")] from [src].") - if(tumbler_1_pos == tumbler_2_pos + 37 || tumbler_1_pos == tumbler_2_pos - 35) tumbler_2_pos = decrement(tumbler_2_pos) if(canhear) to_chat(user, "You hear a [pick("click", "chink", "clink")] from [src].") - check_unlocked(user, canhear) updateUsrDialog() return @@ -130,12 +124,10 @@ FLOOR SAFES tumbler_1_pos = increment(tumbler_1_pos) if(canhear) to_chat(user, "You hear a [pick("clack", "scrape", "clank")] from [src].") - if(tumbler_1_pos == tumbler_2_pos - 37 || tumbler_1_pos == tumbler_2_pos + 35) tumbler_2_pos = increment(tumbler_2_pos) if(canhear) to_chat(user, "You hear a [pick("click", "chink", "clink")] from [src].") - check_unlocked(user, canhear) updateUsrDialog() return @@ -156,21 +148,17 @@ FLOOR SAFES space += I.w_class if(!user.drop_item()) to_chat(user, "\The [I] is stuck to your hand, you cannot put it in the safe!") - return I.loc = src to_chat(user, "You put [I] in [src].") - updateUsrDialog() return else to_chat(user, "[I] won't fit in [src].") - return else if(istype(I, /obj/item/clothing/accessory/stethoscope)) to_chat(user, "Hold [I] in one of your hands while you manipulate the dial!") - return diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index 82c8ed08829..24ea6b5a358 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -26,7 +26,6 @@ /obj/structure/sign/attackby(obj/item/tool as obj, mob/user as mob) //deconstruction if(istype(tool, /obj/item/weapon/screwdriver) && !istype(src, /obj/structure/sign/double)) to_chat(user, "You unfasten the sign with your [tool].") - var/obj/item/sign/S = new(src.loc) S.name = name S.desc = desc @@ -63,7 +62,6 @@ S.desc = desc S.icon_state = sign_state to_chat(user, "You fasten \the [S] with your [tool].") - qdel(src) else ..() diff --git a/code/game/objects/structures/spirit_board.dm b/code/game/objects/structures/spirit_board.dm index cb26f8ca054..cb29dec1926 100644 --- a/code/game/objects/structures/spirit_board.dm +++ b/code/game/objects/structures/spirit_board.dm @@ -17,12 +17,10 @@ if(A) to_chat(O, "\blue Someone has begun playing with a [src.name] in [A.name]!. (Teleport)") - /obj/structure/spirit_board/examine(mob/user) ..(user) to_chat(user, "[initial(desc)] The planchette is sitting at \"[planchette]\".") - /obj/structure/spirit_board/attack_hand(mob/user as mob) if(..()) return @@ -72,7 +70,6 @@ if(light_amount > 2) to_chat(M, "It's too bright here to use [src.name]!") - return 0 //mobs in range check @@ -81,13 +78,11 @@ if(L.ckey && L.client) if((world.time - L.client.inactivity) < (world.time - 300) || L.stat != CONSCIOUS || L.restrained())//no playing with braindeads or corpses or handcuffed dudes. to_chat(M, "[L] doesn't seem to be paying attention...") - else users_in_range++ if(users_in_range < 2) to_chat(M, "There aren't enough people to use the [src.name]!") - return 0 return 1 \ No newline at end of file diff --git a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm index 859b4ba0186..3f5decad98e 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm @@ -35,7 +35,6 @@ if(!do_after(M, 1200, target = src)) if(M && M.buckled) to_chat(M, "You fail to escape \the [src]!") - return if(!M.buckled) return diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index d61c34e48bc..ecf2324673d 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -119,11 +119,9 @@ /obj/item/roller_holder/attack_self(mob/user as mob) if(!held) to_chat(user, " The rack is empty.") - return to_chat(user, "You deploy the roller bed.") - var/obj/structure/stool/bed/roller/R = new /obj/structure/stool/bed/roller(user.loc) R.add_fingerprint(user) qdel(held) diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index b41ed314674..621f3a9d78e 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -22,7 +22,6 @@ var/obj/item/assembly/shock_kit/SK = W if(!SK.status) to_chat(user, "[SK] is not ready to be attached!") - return user.drop_item() var/obj/structure/stool/bed/chair/e_chair/E = new /obj/structure/stool/bed/chair/e_chair(src.loc) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 90d8b578b83..ad478bb3893 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -200,11 +200,9 @@ var/obj/item/weapon/grab/G = I if(G.affecting.buckled) to_chat(user, "[G.affecting] is buckled to [G.affecting.buckled]!") - return 0 if(G.state < GRAB_AGGRESSIVE) to_chat(user, "You need a better grip to do that!") - return 0 if(!G.confirm()) return 0 @@ -224,7 +222,6 @@ if (istype(W, /obj/item/weapon/wrench)) to_chat(user, "\blue Now disassembling table") - playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user,50, target = src)) destroy() @@ -283,7 +280,6 @@ if(!flip(get_cardinal_dir(usr,src))) to_chat(usr, "It won't budge.") - return usr.visible_message("[usr] flips \the [src]!") @@ -301,7 +297,6 @@ if (!unflip()) to_chat(usr, "It won't budge.") - return @@ -389,7 +384,6 @@ if (istype(I, /obj/item/weapon/wrench)) to_chat(user, "\blue Now disassembling the wooden table") - playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) sleep(50) new /obj/item/weapon/table_parts/wood( src.loc ) @@ -441,7 +435,6 @@ if (istype(W, /obj/item/weapon/wrench)) to_chat(user, "\blue Now disassembling the wooden table") - playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) sleep(50) new /obj/item/weapon/table_parts/wood( src.loc ) @@ -490,27 +483,22 @@ var/obj/item/stack/sheet/glass/G = I if(G.amount >= 2) to_chat(user, "You start to add the glass to \the [src].") - if(do_after(user, 10, target = src)) G.use(2) to_chat(user, "You add the glass to \the [src].") - playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) new /obj/structure/table/glass(loc) qdel(src) else to_chat(user, "You don't have enough glass! You need at least 2 sheets.") - return if(iswrench(I)) to_chat(user, "You start to deconstruct \the [src].") - playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) if(do_after(user, 10, target = src)) playsound(src.loc, 'sound/items/Deconstruct.ogg', 75, 1) to_chat(user, "You dismantle \the [src].") - new /obj/item/stack/sheet/metal(loc) new /obj/item/stack/sheet/metal(loc) qdel(src) @@ -546,7 +534,6 @@ if (istype(I, /obj/item/weapon/wrench)) to_chat(user, "\blue Now disassembling the glass table") - playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) sleep(50) new /obj/item/weapon/table_parts/glass( src.loc ) @@ -609,21 +596,17 @@ if(WT.remove_fuel(0, user)) if(src.status == 2) to_chat(user, "\blue Now weakening the reinforced table") - playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) if (do_after(user, 50, target = src)) if(!src || !WT.isOn()) return to_chat(user, "\blue Table weakened") - src.status = 1 else to_chat(user, "\blue Now strengthening the reinforced table") - playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) if (do_after(user, 50, target = src)) if(!src || !WT.isOn()) return to_chat(user, "\blue Table strengthened") - src.status = 2 return return diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm index fcfa8161a75..ab1c2830933 100644 --- a/code/game/objects/structures/tank_dispenser.dm +++ b/code/game/objects/structures/tank_dispenser.dm @@ -50,10 +50,8 @@ oxytanks.Add(I) oxygentanks++ to_chat(user, "You put [I] in [src].") - else to_chat(user, "[src] is full.") - updateUsrDialog() return if(istype(I, /obj/item/weapon/tank/plasma)) @@ -63,20 +61,16 @@ platanks.Add(I) plasmatanks++ to_chat(user, "You put [I] in [src].") - else to_chat(user, "[src] is full.") - updateUsrDialog() return if(istype(I, /obj/item/weapon/wrench)) if(anchored) to_chat(user, "You lean down and unwrench [src].") - anchored = 0 else to_chat(user, "You wrench [src] into place.") - anchored = 1 return @@ -95,7 +89,6 @@ O = new /obj/item/weapon/tank/oxygen(loc) O.loc = loc to_chat(usr, "You take [O] out of [src].") - oxygentanks-- update_icon() if(href_list["plasma"]) @@ -108,7 +101,6 @@ P = new /obj/item/weapon/tank/plasma(loc) P.loc = loc to_chat(usr, "You take [P] out of [src].") - plasmatanks-- update_icon() add_fingerprint(usr) diff --git a/code/game/objects/structures/target_stake.dm b/code/game/objects/structures/target_stake.dm index b3bbcce9c2b..504b2abfa80 100644 --- a/code/game/objects/structures/target_stake.dm +++ b/code/game/objects/structures/target_stake.dm @@ -31,7 +31,6 @@ W.layer = 3.1 pinned_target = W to_chat(user, "You slide the target into the stake.") - return attack_hand(mob/user as mob) @@ -46,10 +45,8 @@ if(!user.get_active_hand()) user.put_in_hands(pinned_target) to_chat(user, "You take the target out of the stake.") - else pinned_target.loc = get_turf(user) to_chat(user, "You take the target out of the stake.") - pinned_target = null \ No newline at end of file diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm index c8efd45a075..93ad848c4f6 100644 --- a/code/game/objects/structures/transit_tubes/station.dm +++ b/code/game/objects/structures/transit_tubes/station.dm @@ -37,7 +37,6 @@ for(var/obj/structure/transit_tube_pod/pod in loc) if(pod.contents.len) to_chat(AM, "") - return else if(!pod.moving && pod.dir in directions()) AM.forceMove(pod) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 42dfe596d1d..3fcfc0ef4bf 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -29,7 +29,6 @@ if(cistern && !open) if(!contents.len) to_chat(user, "The cistern is empty.") - return else var/obj/item/I = pick(contents) @@ -38,7 +37,6 @@ else I.loc = get_turf(src) to_chat(user, "You find [I] in the cistern.") - w_items -= I.w_class return @@ -53,7 +51,6 @@ /obj/structure/toilet/attackby(obj/item/I, mob/living/user, params) if(istype(I, /obj/item/weapon/crowbar)) to_chat(user, "You start to [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]...") - playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 50, 1) if(do_after(user, 30, target = src)) user.visible_message("[user] [cistern ? "replaces the lid on the cistern" : "lifts the lid off the cistern"]!", "You [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]!", "You hear grinding porcelain.") @@ -68,7 +65,6 @@ if(RG.is_open_container()) RG.reagents.add_reagent("toiletwater", min(RG.volume - RG.reagents.total_volume, RG.amount_per_transfer_from_this)) to_chat(user, "You fill [RG] from [src]. Gross.") - return if(istype(I, /obj/item/weapon/grab)) @@ -81,7 +77,6 @@ if(G.state >= GRAB_AGGRESSIVE) if(GM.loc != get_turf(src)) to_chat(user, "[GM] needs to be on [src]!") - return if(!swirlie) if(open) @@ -103,24 +98,19 @@ else to_chat(user, "You need a tighter grip!") - if(cistern) if(I.w_class > 3) to_chat(user, "[I] does not fit!") - return if(w_items + I.w_class > 5) to_chat(user, "The cistern is full!") - return if(!user.drop_item()) to_chat(user, "\The [I] is stuck to your hand, you cannot put it in the cistern!") - return I.loc = src w_items += I.w_class to_chat(user, "You carefully place [I] into the cistern.") - return @@ -144,7 +134,6 @@ if(G.state >= GRAB_AGGRESSIVE) if(GM.loc != get_turf(src)) to_chat(user, "[GM.name] needs to be on [src].") - return user.changeNext_move(CLICK_CD_MELEE) playsound(src.loc, 'sound/effects/bang.ogg', 25, 1) @@ -154,7 +143,6 @@ to_chat(user, "You need a tighter grip!") - /obj/machinery/shower name = "shower" desc = "The HS-451. Installed in the 2550s by the Nanotrasen Hygiene Division." @@ -194,10 +182,8 @@ /obj/machinery/shower/attackby(obj/item/I as obj, mob/user as mob, params) if(I.type == /obj/item/device/analyzer) to_chat(user, "The water temperature seems to be [watertemp].") - if(istype(I, /obj/item/weapon/wrench)) to_chat(user, "You begin to adjust the temperature valve with the [I].") - if(do_after(user, 50, target = src)) switch(watertemp) if("normal") @@ -267,7 +253,6 @@ L.ExtinguishMob() L.fire_stacks = -20 //Douse ourselves with water to avoid fire more easily to_chat(L, "You've been drenched in water!") - if(iscarbon(O)) var/mob/living/carbon/M = O if(M.r_hand) @@ -359,13 +344,11 @@ if(watertemp == "freezing") //C.bodytemperature = max(80, C.bodytemperature - 80) to_chat(C, "The water is freezing!") - return if(watertemp == "boiling") //C.bodytemperature = min(500, C.bodytemperature + 35) C.adjustFireLoss(5) to_chat(C, "The water is searing!") - return @@ -403,12 +386,10 @@ temp = H.organs_by_name["l_hand"] if(temp && !temp.is_usable()) to_chat(user, "You try to move your [temp.name], but cannot!") - return if(busy) to_chat(user, "Someone's already washing here.") - return var/selected_area = parse_zone(user.zone_sel.selecting) var/washing_face = 0 @@ -441,7 +422,6 @@ /obj/structure/sink/attackby(obj/item/O, mob/user, params) if(busy) to_chat(user, "Someone's already washing here!") - return if(!(istype(O))) diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 99bd41d7040..529dbb447a8 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -83,7 +83,6 @@ obj/structure/windoor_assembly/Destroy() if(do_after(user, 40, target = src)) if(!src || !WT.isOn()) return to_chat(user, "You dissasembled the windoor assembly!") - var/obj/item/stack/sheet/rglass/RG = new (get_turf(src), 5) RG.add_fingerprint(user) if(secure) @@ -98,7 +97,6 @@ obj/structure/windoor_assembly/Destroy() for(var/obj/machinery/door/window/WD in src.loc) if(WD.dir == src.dir) to_chat(user, "There is already a windoor in that location.") - return playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) user.visible_message("[user] secures the windoor assembly to the floor.", "You start to secure the windoor assembly to the floor.") @@ -109,10 +107,8 @@ obj/structure/windoor_assembly/Destroy() for(var/obj/machinery/door/window/WD in src.loc) if(WD.dir == src.dir) to_chat(user, "There is already a windoor in that location.") - return to_chat(user, "You've secured the windoor assembly!") - src.anchored = 1 if(src.secure) src.name = "secure anchored windoor assembly" @@ -128,7 +124,6 @@ obj/structure/windoor_assembly/Destroy() if(!src || !src.anchored) return to_chat(user, "You've unsecured the windoor assembly!") - src.anchored = 0 if(src.secure) src.name = "secure windoor assembly" @@ -140,18 +135,15 @@ obj/structure/windoor_assembly/Destroy() var/obj/item/stack/sheet/plasteel/P = W if(P.amount < 2) to_chat(user, "You need more plasteel to do this.") - return to_chat(user, "You start to reinforce the windoor with plasteel.") - if(do_after(user,40, target = src)) if(!src || secure) return P.use(2) to_chat(user, "You reinforce the windoor.") - src.secure = 1 if(src.anchored) src.name = "secure anchored windoor assembly" @@ -168,7 +160,6 @@ obj/structure/windoor_assembly/Destroy() var/obj/item/stack/cable_coil/CC = W CC.use(1) to_chat(user, "You wire the windoor!") - src.state = "02" if(src.secure) src.name = "secure wired windoor assembly" @@ -189,7 +180,6 @@ obj/structure/windoor_assembly/Destroy() return to_chat(user, "You cut the windoor wires!") - new/obj/item/stack/cable_coil(get_turf(user), 1) src.state = "01" if(src.secure) @@ -209,7 +199,6 @@ obj/structure/windoor_assembly/Destroy() W.loc = src.loc return to_chat(user, "You've installed the airlock electronics!") - src.name = "near finished windoor assembly" src.electronics = W else @@ -227,7 +216,6 @@ obj/structure/windoor_assembly/Destroy() if(!src || !electronics) return to_chat(user, "You've removed the airlock electronics!") - src.name = "wired windoor assembly" var/obj/item/weapon/airlock_electronics/ae ae = electronics @@ -249,7 +237,6 @@ obj/structure/windoor_assembly/Destroy() else if(istype(W, /obj/item/weapon/crowbar)) if(!src.electronics) to_chat(usr, "The assembly is missing electronics.") - return usr << browse(null, "window=windoor_access") playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) @@ -262,7 +249,6 @@ obj/structure/windoor_assembly/Destroy() density = 1 //Shouldn't matter but just incase to_chat(user, "You finish the windoor!") - if(secure) var/obj/machinery/door/window/brigdoor/windoor = new /obj/machinery/door/window/brigdoor(src.loc) if(src.facing == "l") @@ -323,7 +309,6 @@ obj/structure/windoor_assembly/Destroy() return if (src.anchored) to_chat(usr, "It is fastened to the floor; therefore, you can't rotate it!") - return 0 //if(src.state != "01") //update_nearby_tiles(need_rebuild=1) //Compel updates before @@ -347,12 +332,10 @@ obj/structure/windoor_assembly/Destroy() if(src.facing == "l") to_chat(usr, "The windoor will now slide to the right.") - src.facing = "r" else src.facing = "l" to_chat(usr, "The windoor will now slide to the left.") - update_icon() return diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index a0a3e91cdaa..eecfc4ac408 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -211,24 +211,20 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f state = 3 - state playsound(loc, 'sound/items/Screwdriver.ogg', 75, 1) to_chat(user, (state == 1 ? "You have unfastened the window from the frame." : "You have fastened the window to the frame.")) - else if(reinf && state == 0) anchored = !anchored update_nearby_icons() playsound(loc, 'sound/items/Screwdriver.ogg', 75, 1) to_chat(user, (anchored ? "You have fastened the frame to the floor." : "You have unfastened the frame from the floor.")) - else if(!reinf) anchored = !anchored update_nearby_icons() playsound(loc, 'sound/items/Screwdriver.ogg', 75, 1) to_chat(user, (anchored ? "You have fastened the window to the floor." : "You have unfastened the window.")) - else if(istype(W, /obj/item/weapon/crowbar) && reinf && state <= 1) state = 1 - state playsound(loc, 'sound/items/Crowbar.ogg', 75, 1) to_chat(user, (state ? "You have pried the window into the frame." : "You have pried the window out of the frame.")) - else if(istype(W, /obj/item/weapon/wrench) && !anchored && health > 7) //Disassemble deconstructed window into parts playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) for(var/i=0;iYou have disassembled the window.") - disassembled = 1 density = 0 air_update_turf(1) @@ -294,7 +289,6 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f if(anchored) to_chat(usr, "It is fastened to the floor therefore you can't rotate it!") - return 0 dir = turn(dir, 90) @@ -314,7 +308,6 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f if(anchored) to_chat(usr, "It is fastened to the floor therefore you can't rotate it!") - return 0 dir = turn(dir, 270) diff --git a/code/game/response_team.dm b/code/game/response_team.dm index 9ded0a7102d..89e968c23b8 100644 --- a/code/game/response_team.dm +++ b/code/game/response_team.dm @@ -20,17 +20,14 @@ var/send_emergency_team if(!ticker) to_chat(usr, "\red The game hasn't started yet!") - return if(ticker.current_state == 1) to_chat(usr, "\red The round hasn't started yet!") - return if(send_emergency_team) to_chat(usr, "\red Central Command has already dispatched an emergency response team!") - return if(alert("Do you want to dispatch an Emergency Response Team?",,"Yes","No") != "Yes") @@ -43,7 +40,6 @@ var/send_emergency_team if(send_emergency_team) to_chat(usr, "\red Central Command has already dispatched an emergency response team!") - return var/ert_type = pick_ert_type() @@ -81,33 +77,27 @@ var/send_emergency_team if(!istype(usr,/mob/dead/observer) && !istype(usr,/mob/new_player)) to_chat(usr, "You need to be an observer or new player to use this.") - return if(!send_emergency_team) to_chat(usr, "No emergency response team is currently being sent.") - return if(jobban_isbanned(usr, "Emergency Response Team")) to_chat(usr, "You are jobbanned from the emergency reponse team!") - return var/player_age_check = check_client_age(usr.client, responseteam_age) if(player_age_check && config.use_age_restriction_for_antags) to_chat(usr, "This role is not yet available to you. You need to wait another [player_age_check] days.") - return if(src.has_enabled_antagHUD == 1 && config.antag_hud_restricted) to_chat(usr, "\blue Upon using the antagHUD you forfeited the ability to join the round.") - return if(response_team_members.len > 6) to_chat(usr, "The emergency response team is already full!") - return for (var/obj/effect/landmark/L in landmarks_list) diff --git a/code/game/sound.dm b/code/game/sound.dm index 83422072932..264b5f93565 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -95,14 +95,12 @@ var/const/FALLOFF_SOUNDS = 0.5 S.environment = 2 to_chat(src, S) - /client/proc/playtitlemusic() if(!ticker || !ticker.login_music || config.disable_lobby_music) return if(prefs.sound & SOUND_LOBBY) to_chat(src, sound(ticker.login_music, repeat = 0, wait = 0, volume = 85, channel = 1))// MAD JAMS - /proc/get_rand_frequency() return rand(32000, 55000) //Frequency stuff only works with 45kbps oggs. diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 92f81302629..f150be57ba6 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -153,18 +153,14 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3"," broken = 0 burnt = 0 to_chat(user, "You remove the broken plating.") - else if(istype(src, /turf/simulated/floor/wood)) to_chat(user, "You forcefully pry off the planks, destroying them in the process.") - else if(!builtin_tile) to_chat(user, "You are unable to pry up \the [src] with a crowbar.") - return 1 else to_chat(user, "You remove \the [builtin_tile.singular_name].") - builtin_tile.loc = src builtin_tile = null //deassociate tile, it no longer belongs to this turf make_plating() diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm index ed15e8a23bf..0a569d91378 100644 --- a/code/game/turfs/simulated/floor/fancy_floor.dm +++ b/code/game/turfs/simulated/floor/fancy_floor.dm @@ -15,7 +15,6 @@ if(broken || burnt) return to_chat(user, "You unscrew the planks.") - new floor_tile(src) make_plating() playsound(src, 'sound/items/Screwdriver.ogg', 80, 1) @@ -44,7 +43,6 @@ new /obj/item/weapon/ore/glass(src) new /obj/item/weapon/ore/glass(src) //Make some sand if you shovel grass to_chat(user, "You shovel the grass.") - make_plating() /turf/simulated/floor/carpet diff --git a/code/game/turfs/simulated/floor/light_floor.dm b/code/game/turfs/simulated/floor/light_floor.dm index 3ee2d78813d..f221494414f 100644 --- a/code/game/turfs/simulated/floor/light_floor.dm +++ b/code/game/turfs/simulated/floor/light_floor.dm @@ -69,10 +69,8 @@ state = LIGHTFLOOR_ON update_icon() to_chat(user, "You replace the light bulb.") - else to_chat(user, "The light bulb seems fine, no need to replace it.") - if(istype(C,/obj/item/device/multitool)) if(state != 0) if(state < LIGHTFLOOR_PURPLE) @@ -80,8 +78,6 @@ else state = LIGHTFLOOR_ON to_chat(user, "You change \the [src]'s light bulb color.") - update_icon() else to_chat(user, "\The [src]'s light bulb appears to have burned out.") - diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index 7890b8a180a..2a239ea04ee 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -28,23 +28,19 @@ if(istype(C, /obj/item/stack/rods)) if(broken || burnt) to_chat(user, "Repair the plating first!") - return 1 var/obj/item/stack/rods/R = C if (R.get_amount() < 2) to_chat(user, "You need two rods to make a reinforced floor!") - return 1 else to_chat(user, "You begin reinforcing the floor...") - if(do_after(user, 30, target = src)) if (R.get_amount() >= 2 && !istype(src, /turf/simulated/floor/engine)) ChangeTurf(/turf/simulated/floor/engine) playsound(src, 'sound/items/Deconstruct.ogg', 80, 1) R.use(2) to_chat(user, "You reinforce the floor.") - return 1 else if(istype(C, /obj/item/stack/tile)) @@ -56,7 +52,6 @@ playsound(src, 'sound/weapons/Genhit.ogg', 50, 1) else to_chat(user, "This section is too damaged to support a tile! Use a welder to fix the damage.") - return 1 else if(istype(C, /obj/item/weapon/weldingtool)) @@ -64,7 +59,6 @@ if( welder.isOn() && (broken || burnt) ) if(welder.remove_fuel(0,user)) to_chat(user, "You fix some dents on the broken plating.") - playsound(src, 'sound/items/Welder.ogg', 80, 1) icon_state = icon_plating burnt = 0 @@ -111,7 +105,6 @@ return if(istype(C, /obj/item/weapon/wrench)) to_chat(user, "You begin removing rods...") - playsound(src, 'sound/items/Ratchet.ogg', 80, 1) if(do_after(user, 30, target = src)) if(!istype(src, /turf/simulated/floor/engine)) @@ -232,7 +225,6 @@ if(!broken && isscrewdriver(C)) to_chat(user, "You unscrew the catwalk's rods.") - new /obj/item/stack/rods(src, 1) ReplaceWithLattice() for(var/direction in cardinal) diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 514da6e3f02..8f1dded0a6e 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -48,23 +48,18 @@ if(!damage) to_chat(user, "It looks fully intact.") - else var/dam = damage / damage_cap if(dam <= 0.3) to_chat(user, "It looks slightly damaged.") - else if(dam <= 0.6) to_chat(user, "It looks moderately damaged.") - else to_chat(user, "It looks heavily damaged.") - if(rotting) to_chat(user, "There is fungus growing on [src].") - /turf/simulated/wall/proc/update_icon() if(!damage_overlays[1]) //list hasn't been populated generate_overlays() @@ -239,7 +234,6 @@ F.icon_state = "wall_thermite" to_chat(user, "The thermite starts melting through the wall.") - spawn(100) if(O) qdel(O) // F.sd_LumReset() //TODO: ~Carn @@ -254,15 +248,12 @@ if(M.environment_smash == 3) dismantle_wall(1) to_chat(M, "You smash through the wall.") - else to_chat(M, text("You smash against the wall.")) - take_damage(rand(25, 75)) return to_chat(M, "\blue You push the wall but nothing happens!") - return /turf/simulated/wall/attack_hand(mob/user as mob) @@ -271,29 +262,24 @@ if (prob(hardness) || rotting) playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1) to_chat(user, text("You smash through the wall.")) - user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) dismantle_wall(1) return else playsound(src, 'sound/effects/bang.ogg', 50, 1) to_chat(user, text("You punch the wall.")) - return if(rotting) if(hardness <= 10) to_chat(user, "This wall feels rather unstable.") - return else to_chat(user, "The wall crumbles under your touch.") - dismantle_wall() return to_chat(user, "You push the wall but nothing happens!") - playsound(src, 'sound/weapons/Genhit.ogg', 25, 1) src.add_fingerprint(user) ..() @@ -303,7 +289,6 @@ user.changeNext_move(CLICK_CD_MELEE) if (!user.IsAdvancedToolUser()) to_chat(user, "You don't have the dexterity to do this!") - return //get the user's location @@ -314,7 +299,6 @@ var/obj/item/weapon/weldingtool/WT = W if(WT.remove_fuel(0,user)) to_chat(user, "You burn away the fungi with \the [WT].") - playsound(src, 'sound/items/Welder.ogg', 10, 1) for(var/obj/effect/E in src) if(E.name == "Wallrot") qdel(E) @@ -322,7 +306,6 @@ return else if(!is_sharp(W) && W.force >= 10 || W.force >= 20) to_chat(user, "\The [src] crumbles away under the force of your [W.name].") - src.dismantle_wall(1) return @@ -343,7 +326,6 @@ EB.spark_system.start() to_chat(user, "You slash \the [src] with \the [EB]; the thermite ignites!") - playsound(src, "sparks", 50, 1) playsound(src, 'sound/weapons/blade1.ogg', 50, 1) @@ -362,42 +344,34 @@ if(WT.remove_fuel(0,user)) if(response == "Repair") to_chat(user, "You start repairing the damage to [src].") - playsound(src, 'sound/items/Welder.ogg', 100, 1) if(do_after(user, max(5, damage / 5), target = src) && WT && WT.isOn()) to_chat(user, "You finish repairing the damage to [src].") - take_damage(-damage) else if(response == "Dismantle") to_chat(user, "You begin slicing through the outer plating.") - playsound(src, 'sound/items/Welder.ogg', 100, 1) if(do_after(user, 100, target = src) && WT && WT.isOn()) to_chat(user, "You remove the outer plating.") - dismantle_wall() else to_chat(user, "You stop slicing through [src].") - return else to_chat(user, "You need more welding fuel to complete this task.") - return else if(istype(W, /obj/item/weapon/gun/energy/plasmacutter)) to_chat(user, "You begin slicing through the outer plating.") - playsound(src, 'sound/items/Welder.ogg', 100, 1) if(do_after(user, mineral == "diamond" ? 120 : 60, target = src)) to_chat(user, "You remove the outer plating.") - dismantle_wall() visible_message("[user] slices apart \the [src]!","You hear metal being sliced apart.") @@ -406,10 +380,8 @@ to_chat(user, "You begin to drill though the wall.") - if(do_after(user, mineral == "diamond" ? 120 : 60, target = src)) to_chat(user, "Your drill tears though the last of the reinforced plating.") - dismantle_wall() visible_message("[user] drills through \the [src]!","You hear the grinding of metal.") @@ -417,10 +389,8 @@ to_chat(user, "You begin to disintegrates the wall.") - if(do_after(user, mineral == "diamond" ? 60 : 30, target = src)) to_chat(user, "Your jackhammer disintegrate the reinforced plating.") - dismantle_wall() visible_message("[user] disintegrates \the [src]!","You hear the grinding of metal.") @@ -429,7 +399,6 @@ EB.spark_system.start() to_chat(user, "You stab \the [EB] into the wall and begin to slice it apart.") - playsound(src, "sparks", 50, 1) if(do_after(user, mineral == "diamond" ? 140 : 70, target = src)) diff --git a/code/game/turfs/simulated/walls_reinforced.dm b/code/game/turfs/simulated/walls_reinforced.dm index 882b03f9136..1d792647042 100644 --- a/code/game/turfs/simulated/walls_reinforced.dm +++ b/code/game/turfs/simulated/walls_reinforced.dm @@ -17,7 +17,6 @@ user.changeNext_move(CLICK_CD_MELEE) if (!user.IsAdvancedToolUser()) to_chat(user, "You don't have the dexterity to do this!") - return //get the user's location @@ -28,7 +27,6 @@ var/obj/item/weapon/weldingtool/WT = W if( WT.remove_fuel(0,user) ) to_chat(user, "You burn away the fungi with \the [WT].") - playsound(src, 'sound/items/Welder.ogg', 10, 1) for(var/obj/effect/E in src) if(E.name == "Wallrot") qdel(E) @@ -36,7 +34,6 @@ return else if(!is_sharp(W) && W.force >= 10 || W.force >= 20) to_chat(user, "\The [src] crumbles away under the force of your [W.name].") - src.dismantle_wall() return @@ -57,7 +54,6 @@ EB.spark_system.start() to_chat(user, "You slash \the [src] with \the [EB]; the thermite ignites!") - playsound(src, "sparks", 50, 1) playsound(src, 'sound/weapons/blade1.ogg', 50, 1) @@ -66,23 +62,19 @@ else if(istype(W, /obj/item/weapon/melee/energy/blade)) to_chat(user, "This wall is too thick to slice through. You will need to find a different path.") - return if(damage && istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W if(WT.remove_fuel(0,user)) to_chat(user, "You start repairing the damage to [src].") - playsound(src, 'sound/items/Welder.ogg', 100, 1) if(do_after(user, max(5, damage / 5), target = src) && WT && WT.isOn()) to_chat(user, "You finish repairing the damage to [src].") - take_damage(-damage) return else to_chat(user, "You need more welding fuel to complete this task.") - return @@ -95,20 +87,17 @@ update_icon() new /obj/item/stack/rods(src) to_chat(user, "You cut the outer grille.") - return if(1) if (istype(W, /obj/item/weapon/screwdriver)) to_chat(user, "You begin removing the support lines.") - playsound(src, 'sound/items/Screwdriver.ogg', 100, 1) if(do_after(user, 40, target = src) && d_state == 1) d_state = 2 update_icon() to_chat(user, "You remove the support lines.") - return //REPAIRING (replacing the outer grille for cosmetic damage) @@ -119,17 +108,14 @@ update_icon() src.icon_state = "r_wall" to_chat(user, "You replace the outer grille.") - else to_chat(user, "You don't have enough rods for that!") - if(2) if(istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W if(WT.remove_fuel(0,user)) to_chat(user, "You begin slicing through the metal cover.") - playsound(src, 'sound/items/Welder.ogg', 100, 1) if(do_after(user, 60, target = src) && d_state == 2) @@ -137,48 +123,40 @@ update_icon() to_chat(user, "You press firmly on the cover, dislodging it.") - else to_chat(user, "You need more welding fuel to complete this task.") - return if(istype(W, /obj/item/weapon/gun/energy/plasmacutter)) to_chat(user, "You begin slicing through the metal cover.") - playsound(src, 'sound/items/Welder.ogg', 100, 1) if(do_after(user, 40, target = src) && d_state == 2) d_state = 3 update_icon() to_chat(user, "You press firmly on the cover, dislodging it.") - return if(3) if(istype(W, /obj/item/weapon/crowbar)) to_chat(user, "You struggle to pry off the cover.") - playsound(src, 'sound/items/Crowbar.ogg', 100, 1) if(do_after(user, 100, target = src) && d_state == 3) d_state = 4 update_icon() to_chat(user, "You pry off the cover.") - return if(4) if(istype(W, /obj/item/weapon/wrench)) to_chat(user, "You start loosening the anchoring bolts which secure the support rods to their frame.") - playsound(src, 'sound/items/Ratchet.ogg', 100, 1) if(do_after(user, 40, target = src) && d_state == 4) d_state = 5 update_icon() to_chat(user, "You remove the bolts anchoring the support rods.") - return if(5) @@ -186,7 +164,6 @@ var/obj/item/weapon/weldingtool/WT = W if(WT.remove_fuel(0,user)) to_chat(user, "You begin slicing through the support rods.") - playsound(src, 'sound/items/Welder.ogg', 100, 1) if(do_after(user, 100, target = src) && d_state == 5) @@ -194,15 +171,12 @@ update_icon() new /obj/item/stack/rods(src) to_chat(user, "The support rods drop out as you cut them loose from the frame.") - else to_chat(user, "You need more welding fuel to complete this task.") - return if(istype(W, /obj/item/weapon/gun/energy/plasmacutter)) to_chat(user, "You begin slicing through the support rods.") - playsound(src, 'sound/items/Welder.ogg', 100, 1) if(do_after(user, 70, target = src) && d_state == 5) @@ -210,18 +184,15 @@ update_icon() new /obj/item/stack/rods( src ) to_chat(user, "The support rods drop out as you cut them loose from the frame.") - return if(6) if(istype(W, /obj/item/weapon/crowbar)) to_chat(user, "You struggle to pry off the outer sheath.") - playsound(src, 'sound/items/Crowbar.ogg', 100, 1) if(do_after(user, 100, target = src) && d_state == 6) to_chat(user, "You pry off the outer sheath.") - dismantle_wall() return @@ -231,19 +202,15 @@ if(istype(W, /obj/item/weapon/pickaxe/drill/diamonddrill)) to_chat(user, "You begin to drill though the wall.") - if(do_after(user, 200, target = src)) to_chat(user, "Your drill tears through the last of the reinforced plating.") - dismantle_wall() if(istype(W,/obj/item/weapon/pickaxe/drill/jackhammer)) to_chat(user, "You begin to disintegrate the wall.") - if(do_after(user, 100, target = src)) to_chat(user, "Your sonic jackhammer disintegrates the reinforced plating.") - dismantle_wall() //REPAIRING @@ -252,11 +219,9 @@ to_chat(user, "You begin patching-up the wall with \a [MS].") - if(do_after(user, max(20 * d_state, 100), target = src) && d_state) if(!MS.use(1)) to_chat(user, "You don't have enough metal for that!") - return d_state = 0 @@ -265,7 +230,6 @@ to_chat(user, "You repair the last of the damage.") - //APC else if(istype(W,/obj/item/mounted)) return diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index f8da6e361f2..58f6e4a41d9 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -39,22 +39,18 @@ if(L) if(R.use(1)) to_chat(user, "You begin constructing catwalk...") - playsound(src, 'sound/weapons/Genhit.ogg', 50, 1) qdel(L) ChangeTurf(/turf/simulated/floor/plating/airless/catwalk) else to_chat(user, "You need two rods to build a catwalk!") - return if(R.use(1)) to_chat(user, "Constructing support lattice...") - playsound(src, 'sound/weapons/Genhit.ogg', 50, 1) ReplaceWithLattice() else to_chat(user, "You need one rod to build a lattice.") - return if(istype(C, /obj/item/stack/tile/plasteel)) @@ -65,15 +61,12 @@ qdel(L) playsound(src, 'sound/weapons/Genhit.ogg', 50, 1) to_chat(user, "You build a floor.") - ChangeTurf(/turf/simulated/floor/plating) else to_chat(user, "You need one floor tile to build a floor!") - else to_chat(user, "The plating is going to need some support! Place metal rods first.") - /turf/space/Entered(atom/movable/A as mob|obj) ..() @@ -115,11 +108,8 @@ /* //debug to_chat(world, "Src.z = [src.z] in global map X = [cur_x], Y = [cur_y]") - to_chat(world, "Target Z = [target_z]") - to_chat(world, "Next X = [next_x]") - //debug */ if(target_z) @@ -143,11 +133,8 @@ /* //debug to_chat(world, "Src.z = [src.z] in global map X = [cur_x], Y = [cur_y]") - to_chat(world, "Target Z = [target_z]") - to_chat(world, "Next X = [next_x]") - //debug */ if(target_z) @@ -170,11 +157,8 @@ /* //debug to_chat(world, "Src.z = [src.z] in global map X = [cur_x], Y = [cur_y]") - to_chat(world, "Next Y = [next_y]") - to_chat(world, "Target Z = [target_z]") - //debug */ if(target_z) @@ -198,11 +182,8 @@ /* //debug to_chat(world, "Src.z = [src.z] in global map X = [cur_x], Y = [cur_y]") - to_chat(world, "Next Y = [next_y]") - to_chat(world, "Target Z = [target_z]") - //debug */ if(target_z) diff --git a/code/game/vehicles/spacepods/equipment.dm b/code/game/vehicles/spacepods/equipment.dm index f3678e57701..734216657ce 100644 --- a/code/game/vehicles/spacepods/equipment.dm +++ b/code/game/vehicles/spacepods/equipment.dm @@ -1,13 +1,11 @@ /obj/item/device/spacepod_equipment/weaponry/proc/fire_weapons() if(my_atom.next_firetime > world.time) to_chat(usr, "Your weapons are recharging.") - return var/turf/firstloc var/turf/secondloc if(!my_atom.equipment_system || !my_atom.equipment_system.weapon_system) to_chat(usr, "Missing equipment or weapons.") - my_atom.verbs -= text2path("[type]/proc/fire_weapons") return my_atom.battery.use(shot_cost) diff --git a/code/game/vehicles/spacepods/parts.dm b/code/game/vehicles/spacepods/parts.dm index a70c203fd3c..0747f1c5a14 100644 --- a/code/game/vehicles/spacepods/parts.dm +++ b/code/game/vehicles/spacepods/parts.dm @@ -60,12 +60,10 @@ var/list/linkedparts = find_square() if(!linkedparts) to_chat(user, "You cannot assemble a pod frame because you do not have the necessary assembly.") - return var/obj/structure/spacepod_frame/pod = new /obj/structure/spacepod_frame(src.loc) pod.dir = src.dir to_chat(user, "You strut the pod frame together.") - R.use(10) for(var/obj/item/pod_parts/pod_frame/F in linkedparts) if(1 == turn(F.dir, -F.link_angle)) //if the part links north during construction, as the bottom left part always does @@ -75,7 +73,6 @@ playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1) if(istype(O, /obj/item/weapon/wrench)) to_chat(user, "You [!anchored ? "secure \the [src] in place." : "remove the securing bolts."]") - anchored = !anchored density = anchored playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1) @@ -86,7 +83,6 @@ set src in oview(1) if(anchored) to_chat(usr, "\The [src] is securely bolted!") - return 0 src.dir = turn(src.dir, -90) return 1 diff --git a/code/game/vehicles/spacepods/pod_fabricator.dm b/code/game/vehicles/spacepods/pod_fabricator.dm index 3452c95f851..948491c6d29 100644 --- a/code/game/vehicles/spacepods/pod_fabricator.dm +++ b/code/game/vehicles/spacepods/pod_fabricator.dm @@ -500,7 +500,6 @@ return 1 else to_chat(user, "You can't load \the [name] while it's opened.") - return 1 if(istype(W, /obj/item/stack)) @@ -527,11 +526,9 @@ if(being_built) to_chat(user, "\The [src] is currently processing. Please wait until completion.") - return if(res_max_amount - resources[material] < MINERAL_MATERIAL_AMOUNT) //overstuffing the fabricator to_chat(user, "\The [src] [material2name(material)] storage is full.") - return var/obj/item/stack/sheet/stack = W var/sname = "[stack.name]" @@ -542,13 +539,11 @@ resources[material] += transfer_amount * MINERAL_MATERIAL_AMOUNT stack.use(transfer_amount) to_chat(user, "You insert [transfer_amount] [sname] sheet\s into \the [src].") - sleep(10) updateUsrDialog() overlays -= "fab-load-[material2name(material)]" //No matter what the overlay shall still be deleted else to_chat(user, "\The [src] cannot hold any more [sname] sheet\s.") - return /obj/machinery/spod_part_fabricator/proc/material2name(var/ID) diff --git a/code/game/vehicles/spacepods/spacepod.dm b/code/game/vehicles/spacepods/spacepod.dm index 63ed986856c..95ef15b1922 100644 --- a/code/game/vehicles/spacepods/spacepod.dm +++ b/code/game/vehicles/spacepods/spacepod.dm @@ -147,7 +147,6 @@ deal_damage(15) playsound(src.loc, 'sound/weapons/slash.ogg', 50, 1, -1) to_chat(user, "\red You slash at \the [src]!") - visible_message("\red The [user] slashes at [src.name]'s armor!") return @@ -162,20 +161,16 @@ S.channel = 0 //Any channel S.volume = 50 to_chat(occupant, S) - if(occupant2) to_chat(occupant2, S) - if(occupant && oldhealth > health && !health) var/sound/S = sound('sound/effects/engine_alert1.ogg') S.wait = 0 S.channel = 0 S.volume = 50 to_chat(occupant, S) - if(occupant2) to_chat(occupant2, S) - if(!health) spawn(0) if(occupant) @@ -183,13 +178,11 @@ if(occupant2) to_chat(occupant2, "Critical damage to the vessel detected, core explosion imminent!") - for(var/i = 10, i >= 0; --i) if(occupant) to_chat(occupant, "[i]") if(occupant2) to_chat(occupant2, "[i]") - if(i == 0) explosion(loc, 2, 4, 8) qdel(src) @@ -213,12 +206,10 @@ H.forceMove(get_turf(src)) H.ex_act(severity + 1) to_chat(H, "You are forcefully thrown from \the [src]!") - if(H2) H2.forceMove(get_turf(src)) H2.ex_act(severity + 1) to_chat(H2, "You are forcefully thrown from \the [src]!") - qdel(ion_trail) qdel(src) if(2) @@ -237,7 +228,6 @@ to_chat(occupant2, "The pod console flashes 'Heavy EMP WAVE DETECTED'.")//warn the occupants - if(battery) battery.charge = max(0, battery.charge - 5000) //Cell EMP act is too weak, this pod needs to be sapped. src.deal_damage(100) @@ -251,7 +241,6 @@ if(occupant2) to_chat(occupant2, "The pod console flashes 'EMP WAVE DETECTED'.")//warn the occupants - deal_damage(40) if(battery) battery.charge = max(0, battery.charge - 2500) //Cell EMP act is too weak, this pod needs to be sapped. @@ -264,15 +253,12 @@ hatch_open = !hatch_open playsound(loc, 'sound/items/Crowbar.ogg', 50, 1) to_chat(user, "You [hatch_open ? "open" : "close"] the maintenance hatch.") - if(istype(W, /obj/item/weapon/stock_parts/cell)) if(!hatch_open) to_chat(user, "\red The maintenance hatch is closed!") - return if(battery) to_chat(user, "The pod already has a battery.") - return user.drop_item(W) battery = W @@ -281,20 +267,16 @@ if(istype(W, /obj/item/device/spacepod_equipment)) if(!hatch_open) to_chat(user, "\red The maintenance hatch is closed!") - return if(!equipment_system) to_chat(user, "The pod has no equipment datum, yell at pomf") - return if(istype(W, /obj/item/device/spacepod_equipment/weaponry)) if(equipment_system.weapon_system) to_chat(user, "The pod already has a weapon system, remove it first.") - return else to_chat(user, "You insert \the [W] into the equipment system.") - user.drop_item(W) W.forceMove(src) equipment_system.weapon_system = W @@ -304,11 +286,9 @@ if(istype(W, /obj/item/device/spacepod_equipment/misc)) if(equipment_system.misc_system) to_chat(user, "The pod already has a miscellaneous system, remove it first.") - return else to_chat(user, "You insert \the [W] into the equipment system.") - user.drop_item(W) W.forceMove(src) equipment_system.misc_system = W @@ -317,11 +297,9 @@ if(istype(W, /obj/item/device/spacepod_equipment/cargo)) if(equipment_system.cargo_system) to_chat(user, "The pod already has a cargo system, remove it first.") - return else to_chat(user, "You insert \the [W] into the cargo system.") - user.drop_item(W) W.forceMove(src) equipment_system.cargo_system = W @@ -331,33 +309,27 @@ if(istype(W, /obj/item/weapon/weldingtool)) if(!hatch_open) to_chat(user, "\red You must open the maintenance hatch before attempting repairs.") - return var/obj/item/weapon/weldingtool/WT = W if(!WT.isOn()) to_chat(user, "\red The welder must be on for this task.") - return if (health < initial(health)) to_chat(user, "\blue You start welding the spacepod...") - playsound(loc, 'sound/items/Welder.ogg', 50, 1) if(do_after(user, 20, target = src)) if(!src || !WT.remove_fuel(3, user)) return repair_damage(10) to_chat(user, "\blue You mend some [pick("dents","bumps","damage")] with \the [WT]") - else to_chat(user, "\blue \The [src] is fully repaired!") - /obj/spacepod/attack_hand(mob/user as mob) if(!hatch_open) return ..() if(!equipment_system || !istype(equipment_system)) to_chat(user, "The pod has no equpment datum, or is the wrong type, yell at pomf.") - return var/list/possible = list() if(battery) @@ -379,60 +351,49 @@ if("Energy Cell") if(user.put_in_any_hand_if_possible(battery)) to_chat(user, "You remove \the [battery] from the space pod") - battery = null if("Weapon System") SPE = equipment_system.weapon_system if(user.put_in_any_hand_if_possible(SPE)) to_chat(user, "You remove \the [SPE] from the equipment system.") - SPE.removed(user) SPE.my_atom = null equipment_system.weapon_system = null else to_chat(user, "You need an open hand to do that.") - if("Misc. System") SPE = equipment_system.misc_system if(user.put_in_any_hand_if_possible(SPE)) to_chat(user, "You remove \the [SPE] from the equipment system.") - SPE.removed(user) SPE.my_atom = null equipment_system.misc_system = null else to_chat(user, "You need an open hand to do that.") - if("Cargo System") SPE = equipment_system.cargo_system if(user.put_in_any_hand_if_possible(SPE)) to_chat(user, "You remove \the [SPE] from the equipment system.") - SPE.removed(user) SPE.my_atom = null equipment_system.cargo_system = null else to_chat(user, "You need an open hand to do that.") - /* if("engine system") SPE = equipment_system.engine_system if(user.put_in_any_hand_if_possible(SPE)) to_chat(user, "You remove \the [SPE] from the equipment system.") - equipment_system.engine_system = null else to_chat(user, "You need an open hand to do that.") - if("shield system") SPE = equipment_system.shield_system if(user.put_in_any_hand_if_possible(SPE)) to_chat(user, "You remove \the [SPE] from the equipment system.") - equipment_system.shield_system = null else to_chat(user, "You need an open hand to do that.") - */ return @@ -491,7 +452,6 @@ return use_internal_tank = !use_internal_tank to_chat(occupant, "Now taking air from [use_internal_tank?"internal airtank":"environment"].") - return /obj/spacepod/proc/add_cabin() @@ -567,7 +527,6 @@ if(M != user && M.stat == DEAD && allow2enter) if(occupant2 && !occupant) to_chat(usr, "You can't put a corpse into the driver's seat!") - return 0 if(!occupant2) visible_message("[user.name] starts loading [M.name] into the pod!") @@ -583,19 +542,15 @@ var/obj/item/device/spacepod_equipment/cargo/ore/C = equipment_system.cargo_system if(!C.box) to_chat(user, "You begin loading \the [O] into \the [src]'s [equipment_system.cargo_system]") - if(do_after(user, 40, target = src)) C.box = O O.forceMove(C) to_chat(user, "You load \the [O] into \the [src]'s [equipment_system.cargo_system]!") - else to_chat(user, "You fail to load \the [O] into \the [src]'s [equipment_system.cargo_system]") - else to_chat(user, "\The [src] already has \an [C.box]") - /obj/spacepod/verb/enter_pod(mob/user = usr) set category = "Object" set name = "Enter Pod" @@ -606,7 +561,6 @@ if(get_dist(src, user) > 2 || get_dist(usr, user) > 1) to_chat(usr, "They are too far away to put inside") - return if(!istype(user)) @@ -621,13 +575,11 @@ if(fukkendisk) to_chat(user, "The nuke-disk is locking the door every time you try to open it. You get the feeling that it doesn't want to go into the spacepod.") - return 0 for(var/mob/living/carbon/slime/S in range(1,usr)) if(S.Victim == user) to_chat(user, "You're too busy getting your life sucked out of you.") - return 0 move_inside(user) @@ -649,11 +601,9 @@ playsound(src, 'sound/machines/windowdoor.ogg', 50, 1) else to_chat(user, "[occupant] was faster. Try better next time, loser.") - else to_chat(user, "You stop entering \the [src].") - else if(!occupant2) visible_message("[user] starts to climb into \the [src].") if(do_after(user, 40, target = src)) @@ -665,14 +615,11 @@ playsound(src, 'sound/machines/windowdoor.ogg', 50, 1) else to_chat(user, "[occupant] was faster. Try better next time, loser.") - else to_chat(user, "You stop entering \the [src].") - else to_chat(user, "You can't fit in \the [src], it's full!") - /obj/spacepod/proc/occupant_sanity_check() if(occupant) if(!ismob(occupant)) @@ -715,20 +662,16 @@ if(1) if(occupant2) to_chat(occupant2, "[occupant.name] climbs out of the pod!") - occupant.forceMove(src.loc) occupant = null to_chat(user, "You climb out of \the [src].") - if(2) if(occupant) to_chat(occupant, "[occupant2.name] climbs out of the pod!") - occupant2.forceMove(src.loc) occupant2 = null to_chat(user, "You climb out of \the [src].") - /obj/spacepod/verb/exit_pod2() set name = "Eject Secondary Seat" set category = "Spacepod" @@ -738,19 +681,15 @@ if(!occupant2) to_chat(usr, "There is no one in the second seat.") - return if(usr == occupant2) to_chat(usr, "How do you plan to do that? The eject button is out of reach.") - return if(usr == occupant) to_chat(usr, "You eject [occupant2.name].") - to_chat(occupant2, "\The [src] ejects you forcefully!") - inertia_dir = 0 occupant2.forceMove(src.loc) occupant2 = null @@ -763,14 +702,12 @@ if(CheckIfOccupant2(usr)) if(!allow2enter) to_chat(usr, "You can't [allow2enter ? "lock" : "unlock"] the doors from your seat.") - return allow2enter = !allow2enter to_chat(usr, "You [allow2enter ? "unlock" : "lock"] the doors.") - /obj/spacepod/verb/toggleDoors() set name = "Toggle Nearby Pod Doors" set category = "Spacepod" @@ -792,11 +729,9 @@ P.close() return 1 to_chat(usr, "Access denied.") - return to_chat(usr, "You are not close to any pod doors.") - return @@ -808,7 +743,6 @@ set src = usr.loc if(!equipment_system.weapon_system) to_chat(usr, "\The [src] has no weapons!") - return equipment_system.weapon_system.fire_weapons() @@ -820,7 +754,6 @@ set src = usr.loc if(!equipment_system.cargo_system) to_chat(usr, "\The [src] has no cargo system!") - return equipment_system.cargo_system.unload() @@ -838,7 +771,6 @@ else set_light(0) to_chat(occupant, "Toggled lights [lights ? "on" : "off"].") - return /obj/spacepod/proc/enter_after(delay as num, var/mob/user as mob, var/numticks = 5) @@ -932,19 +864,14 @@ else if(!battery) to_chat(user, "No energy cell detected.") - else if(battery.charge < 1) to_chat(user, "Not enough charge left.") - else if(!health) to_chat(user, "She's dead, Jim") - else if(empcounter != 0) to_chat(user, "The pod control interface isn't responding. The console indicates [empcounter] seconds before reboot.") - else to_chat(user, "Unknown error has occurred, yell at the coders.") - return 0 battery.charge = max(0, battery.charge - 1) next_move = world.time + move_delay diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index 69fc81e195b..48bb773c453 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -12,7 +12,6 @@ var/global/admin_ooc_colour = "#b82e00" return if(IsGuestKey(key)) to_chat(src, "Guests may not use OOC.") - return msg = trim(sanitize(copytext(msg, 1, MAX_MESSAGE_LEN))) @@ -21,27 +20,22 @@ var/global/admin_ooc_colour = "#b82e00" if(!(prefs.toggles & CHAT_OOC)) to_chat(src, "You have OOC muted.") - return if(!check_rights(R_ADMIN|R_MOD,0)) if(!config.ooc_allowed) to_chat(src, "OOC is globally muted.") - return if(!config.dooc_allowed && (mob.stat == DEAD)) to_chat(usr, "OOC for dead mobs has been turned off.") - return if(prefs.muted & MUTE_OOC) to_chat(src, "You cannot use OOC (muted).") - return if(handle_spam_prevention(msg, MUTE_OOC)) return if(findtext(msg, "byond://")) to_chat(src, "Advertising other servers is not allowed.") - log_admin("[key_name(src)] has attempted to advertise in OOC: [msg]") message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]") return @@ -78,16 +72,13 @@ var/global/admin_ooc_colour = "#b82e00" display_name = holder.fakekey to_chat(C, "OOC: [display_name]: [msg]") - /proc/toggle_ooc() config.ooc_allowed = ( !config.ooc_allowed ) if (config.ooc_allowed) to_chat(world, "The OOC channel has been globally enabled!") - else to_chat(world, "The OOC channel has been globally disabled!") - /proc/auto_toggle_ooc(var/on) if(config.auto_toggle_ooc_during_round && config.ooc_allowed != on) toggle_ooc() @@ -132,7 +123,6 @@ var/global/admin_ooc_colour = "#b82e00" prefs.save_preferences(src) to_chat(usr, "Your OOC color has been set to [new_ooccolor].") - feedback_add_details("admin_verb","OC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/resetcolorooc() @@ -146,7 +136,6 @@ var/global/admin_ooc_colour = "#b82e00" prefs.save_preferences(src) to_chat(usr, "Your OOC color has been reset.") - feedback_add_details("admin_verb","ROC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/looc(msg as text) @@ -158,7 +147,6 @@ var/global/admin_ooc_colour = "#b82e00" return if(IsGuestKey(key)) to_chat(src, "Guests may not use OOC.") - return msg = trim(sanitize(copytext(msg, 1, MAX_MESSAGE_LEN))) @@ -167,27 +155,22 @@ var/global/admin_ooc_colour = "#b82e00" if(!(prefs.toggles & CHAT_LOOC)) to_chat(src, "You have LOOC muted.") - return if(!check_rights(R_ADMIN|R_MOD,0)) if(!config.looc_allowed) to_chat(src, "LOOC is globally muted.") - return if(!config.dooc_allowed && (mob.stat == DEAD)) to_chat(usr, "LOOC for dead mobs has been turned off.") - return if(prefs.muted & MUTE_OOC) to_chat(src, "You cannot use LOOC (muted).") - return if(handle_spam_prevention(msg,MUTE_OOC)) return if(findtext(msg, "byond://")) to_chat(src, "Advertising other servers is not allowed.") - log_admin("[key_name(src)] has attempted to advertise in LOOC: [msg]") message_admins("[key_name_admin(src)] has attempted to advertise in LOOC: [msg]") return @@ -234,7 +217,6 @@ var/global/admin_ooc_colour = "#b82e00" if(send) to_chat(target, "LOOC[prefix]: [display_name][admin_stuff]: [msg]") - /mob/proc/get_looc_source() return src diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm index 78da8e2169f..5d91c835ea0 100644 --- a/code/game/verbs/suicide.dm +++ b/code/game/verbs/suicide.dm @@ -54,23 +54,19 @@ if (stat == DEAD) to_chat(src, "You're already dead!") - return if (!ticker) to_chat(src, "You can't commit suicide before the game starts!") - return // No more borergrief, one way or the other if(has_brain_worms()) to_chat(src, "You try to bring yourself to commit suicide, but - something prevents you!") - return if (suiciding) to_chat(src, "You're already committing suicide! Be patient!") - return var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No") @@ -85,7 +81,6 @@ return to_chat(viewers(src), "[src] [pick(species.suicide_messages)] It looks like they're trying to commit suicide.") - do_suicide(0) updatehealth() @@ -95,17 +90,14 @@ if (stat == 2) to_chat(src, "You're already dead!") - return if (!ticker) to_chat(src, "You can't commit suicide before the game starts!") - return if (suiciding) to_chat(src, "You're already committing suicide! Be patient!") - return var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No") @@ -113,7 +105,6 @@ if(confirm == "Yes") suiciding = 1 to_chat(viewers(loc), "\red [src]'s brain is growing dull and lifeless. It looks like it's lost the will to live.") - spawn(50) death(0) suiciding = 0 @@ -124,12 +115,10 @@ if (stat == 2) to_chat(src, "You're already dead!") - return if (suiciding) to_chat(src, "You're already committing suicide! Be patient!") - return var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No") @@ -137,7 +126,6 @@ if(confirm == "Yes") suiciding = 1 to_chat(viewers(src), "\red [src] is powering down. It looks like \he's trying to commit suicide.") - //put em at -175 adjustOxyLoss(max(maxHealth * 2 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) updatehealth() @@ -147,12 +135,10 @@ if (stat == 2) to_chat(src, "You're already dead!") - return if (suiciding) to_chat(src, "You're already committing suicide! Be patient!") - return var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No") @@ -160,7 +146,6 @@ if(confirm == "Yes") suiciding = 1 to_chat(viewers(src), "\red [src] is powering down. It looks like \he's trying to commit suicide.") - //put em at -175 adjustOxyLoss(max(maxHealth * 2 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) updatehealth() @@ -182,18 +167,15 @@ else to_chat(src, "Aborting suicide attempt.") - /mob/living/carbon/alien/humanoid/verb/suicide() set hidden = 1 if (stat == 2) to_chat(src, "You're already dead!") - return if (suiciding) to_chat(src, "You're already committing suicide! Be patient!") - return var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No") @@ -201,7 +183,6 @@ if(confirm == "Yes") suiciding = 1 to_chat(viewers(src), "\red [src] is thrashing wildly! It looks like \he's trying to commit suicide.") - //put em at -175 adjustOxyLoss(max(175 - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) updatehealth() @@ -211,12 +192,10 @@ set hidden = 1 if (stat == 2) to_chat(src, "You're already dead!") - return if (suiciding) to_chat(src, "You're already committing suicide! Be patient!") - return var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No") diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm index 5e4a871b4bb..3be9262d1ad 100644 --- a/code/game/verbs/who.dm +++ b/code/game/verbs/who.dm @@ -65,7 +65,6 @@ msg += "Total Players: [length(Lines)]" to_chat(src, msg) - /client/verb/adminwho() set category = "Admin" set name = "Adminwho" @@ -129,4 +128,3 @@ msg = "Current Admins ([num_admins_online]):\n" + msg + "\nCurrent Mods/Mentors ([num_mods_online]):\n" + modmsg to_chat(src, msg) - diff --git a/code/modules/admin/DB ban/functions.dm b/code/modules/admin/DB ban/functions.dm index b638a6f8a9c..dbf88292f3a 100644 --- a/code/modules/admin/DB ban/functions.dm +++ b/code/modules/admin/DB ban/functions.dm @@ -94,7 +94,6 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration = if(blockselfban) if(a_ckey == ckey) to_chat(usr, "You cannot apply this ban type on yourself.") - return var/who @@ -120,14 +119,12 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration = var/adm_bans = text2num(adm_query.item[1]) if(adm_bans >= MAX_ADMIN_BANS_PER_ADMIN) to_chat(usr, "You already logged [MAX_ADMIN_BANS_PER_ADMIN] admin ban(s) or more. Do not abuse this function!") - return var/sql = "INSERT INTO [format_table_name("ban")] (`id`,`bantime`,`serverip`,`bantype`,`reason`,`job`,`duration`,`rounds`,`expiration_time`,`ckey`,`computerid`,`ip`,`a_ckey`,`a_computerid`,`a_ip`,`who`,`adminwho`,`edits`,`unbanned`,`unbanned_datetime`,`unbanned_ckey`,`unbanned_computerid`,`unbanned_ip`) VALUES (null, Now(), '[serverip]', '[bantype_str]', '[reason]', '[job]', [(duration)?"[duration]":"0"], [(rounds)?"[rounds]":"0"], Now() + INTERVAL [(duration>0) ? duration : 0] MINUTE, '[ckey]', '[computerid]', '[ip]', '[a_ckey]', '[a_computerid]', '[a_ip]', '[who]', '[adminwho]', '', null, null, null, null, null)" var/DBQuery/query_insert = dbcon.NewQuery(sql) query_insert.Execute() to_chat(usr, "\blue Ban saved to database.") - message_admins("[key_name_admin(usr)] has added a [bantype_str] for [ckey] [(job)?"([job])":""] [(duration > 0)?"([duration] minutes)":""] with the reason: \"[reason]\" to the ban database.",1) if(announceinirc) @@ -196,19 +193,16 @@ datum/admins/proc/DB_ban_unban(var/ckey, var/bantype, var/job = "") if(ban_number == 0) to_chat(usr, "\red Database update failed due to no bans fitting the search criteria. If this is not a legacy ban you should contact the database admin.") - return if(ban_number > 1) to_chat(usr, "\red Database update failed due to multiple bans fitting the search criteria. Note down the ckey, job and current time and contact the database admin.") - return if(istext(ban_id)) ban_id = text2num(ban_id) if(!isnum(ban_id)) to_chat(usr, "\red Database update failed due to a ban ID mismatch. Contact the database admin.") - return DB_ban_unban_by_id(ban_id) @@ -219,7 +213,6 @@ datum/admins/proc/DB_ban_edit(var/banid = null, var/param = null) if(!isnum(banid) || !istext(param)) to_chat(usr, "Cancelled") - return var/DBQuery/query = dbcon.NewQuery("SELECT ckey, duration, reason FROM [format_table_name("ban")] WHERE id = [banid]") @@ -236,7 +229,6 @@ datum/admins/proc/DB_ban_edit(var/banid = null, var/param = null) reason = query.item[3] else to_chat(usr, "Invalid ban id. Contact the database admin") - return reason = sql_sanitize_text(reason) @@ -249,7 +241,6 @@ datum/admins/proc/DB_ban_edit(var/banid = null, var/param = null) value = sql_sanitize_text(value) if(!value) to_chat(usr, "Cancelled") - return var/DBQuery/update_query = dbcon.NewQuery("UPDATE [format_table_name("ban")] SET reason = '[value]', edits = CONCAT(edits,'- [eckey] changed ban reason from \\\"[reason]\\\" to \\\"[value]\\\"
      ') WHERE id = [banid]") @@ -260,7 +251,6 @@ datum/admins/proc/DB_ban_edit(var/banid = null, var/param = null) value = input("Insert the new duration (in minutes) for [pckey]'s ban", "New Duration", "[duration]", null) as null|num if(!isnum(value) || !value) to_chat(usr, "Cancelled") - return var/DBQuery/update_query = dbcon.NewQuery("UPDATE [format_table_name("ban")] SET duration = [value], edits = CONCAT(edits,'- [eckey] changed ban duration from [duration] to [value]
      '), expiration_time = DATE_ADD(bantime, INTERVAL [value] MINUTE) WHERE id = [banid]") @@ -272,11 +262,9 @@ datum/admins/proc/DB_ban_edit(var/banid = null, var/param = null) return else to_chat(usr, "Cancelled") - return else to_chat(usr, "Cancelled") - return datum/admins/proc/DB_ban_unban_by_id(var/id) @@ -300,12 +288,10 @@ datum/admins/proc/DB_ban_unban_by_id(var/id) if(ban_number == 0) to_chat(usr, "\red Database update failed due to a ban id not being present in the database.") - return if(ban_number > 1) to_chat(usr, "\red Database update failed due to multiple bans having the same ID. Contact the database admin.") - return if(!src.owner || !istype(src.owner, /client)) @@ -343,7 +329,6 @@ datum/admins/proc/DB_ban_unban_by_id(var/id) establish_db_connection() if(!dbcon.IsConnected()) to_chat(usr, "\red Failed to establish database connection") - return var/output = "
      " diff --git a/code/modules/admin/NewBan.dm b/code/modules/admin/NewBan.dm index 9421c1e8102..64e6ad6dec4 100644 --- a/code/modules/admin/NewBan.dm +++ b/code/modules/admin/NewBan.dm @@ -107,26 +107,18 @@ var/savefile/Banlist Banlist.cd = "/base" if ( Banlist.dir.Find("[ckey][computerid]") ) to_chat(usr, text("\red Ban already exists.")) - return 0 else Banlist.dir.Add("[ckey][computerid]") Banlist.cd = "/base/[ckey][computerid]" to_chat(Banlist["key"], ckey) - to_chat(Banlist["id"], computerid) - to_chat(Banlist["ip"], address) - to_chat(Banlist["reason"], reason) - to_chat(Banlist["bannedby"], bannedby) - to_chat(Banlist["temp"], temp) - if (temp) to_chat(Banlist["minutes"], bantimestamp) - if(!temp) add_note(ckey, "Permanently banned - [reason]", null, bannedby, 0) else @@ -220,23 +212,16 @@ var/savefile/Banlist Banlist.dir.Add("trash[i]trashid[i]") Banlist.cd = "/base/trash[i]trashid[i]" to_chat(Banlist["key"], "trash[i]") - else Banlist.cd = "/base" Banlist.dir.Add("[last]trashid[i]") Banlist.cd = "/base/[last]trashid[i]" to_chat(Banlist["key"], last) - to_chat(Banlist["id"], "trashid[i]") - to_chat(Banlist["reason"], "Trashban[i].") - to_chat(Banlist["temp"], a) - to_chat(Banlist["minutes"], CMinutes + rand(1,2000)) - to_chat(Banlist["bannedby"], "trashmin") - last = "trash[i]" Banlist.cd = "/base" diff --git a/code/modules/admin/ToRban.dm b/code/modules/admin/ToRban.dm index 9f0cb711547..77e49877259 100644 --- a/code/modules/admin/ToRban.dm +++ b/code/modules/admin/ToRban.dm @@ -36,11 +36,9 @@ if(!cleaned) continue F[cleaned] << 1 to_chat(F["last_update"], world.realtime) - diary << "ToR data updated!" if(usr) to_chat(usr, "ToRban updated.") - return 1 diary << "ToR data update aborted: no data." return 0 @@ -76,19 +74,15 @@ if(choice) F.dir.Remove(choice) to_chat(src, "Address removed") - if("remove all") to_chat(src, "[TORFILE] was [fdel(TORFILE)?"":"not "]removed.") - if("find") var/input = input(src,"Please input an IP address to search for:","Find ToR ban",null) as null|text if(input) if(ToRban_isbanned(input)) to_chat(src, "Address is a known ToR address") - else to_chat(src, "Address is not a known ToR address") - return #undef TORFILE diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index ae25bc50c72..932fcef0807 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -11,7 +11,6 @@ var/global/nologevent = 0 if(R_SERVER & C.holder.rights) to_chat(C, msg) - /proc/msg_admin_attack(var/text) //Toggleable Attack Messages log_attack(text) if(!nologevent) @@ -24,7 +23,6 @@ var/global/nologevent = 0 to_chat(C, msg) - ///////////////////////////////////////////////////////////////////////////////////////////////Panels /datum/admins/proc/show_player_panel(var/mob/M in mob_list) @@ -34,7 +32,6 @@ var/global/nologevent = 0 if(!M) to_chat(usr, "You seem to be selecting a mob that doesn't exist anymore.") - return if(!check_rights(R_ADMIN|R_MOD)) @@ -474,9 +471,7 @@ var/global/nologevent = 0 dat+="I'm sorry to break your immersion. This shit's bugged. Report this bug to Agouri, polyxenitopalidou@gmail.com" // to_chat(world, "Channelname: [src.admincaster_feed_channel.channel_name] [src.admincaster_feed_channel.author]") - // to_chat(world, "Msg: [src.admincaster_feed_message.author] [src.admincaster_feed_message.body]") - usr << browse(dat, "window=admincaster_main;size=400x600") onclose(usr, "admincaster_main") @@ -552,7 +547,6 @@ var/global/nologevent = 0 message = adminscrub(message,500) message = replacetext(message, "\n", "
      ") // required since we're putting it in a

      tag to_chat(world, "[usr.client.holder.fakekey ? "Administrator" : usr.key] Announces:

      [message]

      ") - log_admin("Announce: [key_name(usr)] : [message]") feedback_add_details("admin_verb","A") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -579,10 +573,8 @@ var/global/nologevent = 0 config.looc_allowed = !(config.looc_allowed) if (config.looc_allowed) to_chat(world, "The LOOC channel has been globally enabled!") - else to_chat(world, "The LOOC channel has been globally disabled!") - log_and_message_admins("toggled LOOC.") feedback_add_details("admin_verb","TLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -597,10 +589,8 @@ var/global/nologevent = 0 config.dsay_allowed = !(config.dsay_allowed) if (config.dsay_allowed) to_chat(world, "Deadchat has been globally enabled!") - else to_chat(world, "Deadchat has been globally disabled!") - log_admin("[key_name(usr)] toggled deadchat.") message_admins("[key_name_admin(usr)] toggled deadchat.", 1) feedback_add_details("admin_verb","TDSAY") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc @@ -637,7 +627,6 @@ var/global/nologevent = 0 return 1 else to_chat(usr, "Error: Start Now: Game has already started.") - return 0 /datum/admins/proc/toggleenter() @@ -651,10 +640,8 @@ var/global/nologevent = 0 enter_allowed = !( enter_allowed ) if (!( enter_allowed )) to_chat(world, "New players may no longer enter the game.") - else to_chat(world, "New players may now enter the game.") - log_admin("[key_name(usr)] toggled new player game entering.") message_admins("[key_name_admin(usr)] toggled new player game entering.", 1) world.update_status() @@ -671,10 +658,8 @@ var/global/nologevent = 0 config.allow_ai = !( config.allow_ai ) if (!( config.allow_ai )) to_chat(world, "The AI job is no longer chooseable.") - else to_chat(world, "The AI job is chooseable now.") - message_admins("[key_name_admin(usr)] toggled AI allowed.") log_admin("[key_name(usr)] toggled AI allowed.") world.update_status() @@ -691,10 +676,8 @@ var/global/nologevent = 0 abandon_allowed = !( abandon_allowed ) if (abandon_allowed) to_chat(world, "You may now respawn.") - else to_chat(world, "You may no longer respawn :(") - message_admins("[key_name_admin(usr)] toggled respawn to [abandon_allowed ? "On" : "Off"].", 1) log_admin("[key_name(usr)] toggled respawn to [abandon_allowed ? "On" : "Off"].") world.update_status() @@ -729,11 +712,9 @@ var/global/nologevent = 0 going = !( going ) if (!( going )) to_chat(world, "The game start has been delayed.") - log_admin("[key_name(usr)] delayed the game.") else to_chat(world, "The game will start soon.") - log_admin("[key_name(usr)] removed the delay.") feedback_add_details("admin_verb","DELAY") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -822,11 +803,9 @@ var/global/nologevent = 0 if(!istype(M)) to_chat(usr, "This can only be used on instances of type /mob") - return if(!M.mind) to_chat(usr, "This mob has no mind!") - return M.mind.edit_memory() @@ -843,10 +822,8 @@ var/global/nologevent = 0 guests_allowed = !( guests_allowed ) if (!( guests_allowed )) to_chat(world, "Guests may no longer enter the game.") - else to_chat(world, "Guests may now enter the game.") - log_admin("[key_name(usr)] toggled guests game entering [guests_allowed?"":"dis"]allowed.") message_admins("\blue [key_name_admin(usr)] toggled guests game entering [guests_allowed?"":"dis"]allowed.", 1) feedback_add_details("admin_verb","TGU") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -857,33 +834,27 @@ var/global/nologevent = 0 ai_number++ if(isAI(S)) to_chat(usr, "AI [key_name(S, usr)]'s laws:") - else if(isrobot(S)) var/mob/living/silicon/robot/R = S to_chat(usr, "CYBORG [key_name(S, usr)]'s [R.connected_ai?"(Slaved to: [R.connected_ai])":"(Independent)"] laws:") - else if (ispAI(S)) var/mob/living/silicon/pai/P = S to_chat(usr, "pAI [key_name(S, usr)]'s laws:") to_chat(usr, "[P.pai_law0]") if(P.pai_laws) to_chat(usr, "[P.pai_laws]") - continue // Skip showing normal silicon laws for pAIs - they don't have any else to_chat(usr, "SILICON [key_name(S, usr)]'s laws:") - if (S.laws == null) to_chat(usr, "[key_name(S, usr)]'s laws are null. Contact a coder.") - else S.laws.show_laws(usr) if(!ai_number) to_chat(usr, "No AI's located.")//Just so you know the thing is actually working and not just ignoring you. - log_admin("[key_name(usr)] checked the AI laws") message_admins("[key_name_admin(usr)] checked the AI laws") @@ -964,7 +935,6 @@ var/gamma_ship_location = 1 // 0 = station , 1 = space continue if(message) to_chat(C, message) - kicked_client_names.Add("[C.ckey]") del(C) return kicked_client_names diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm index 8b7125608d7..7f709f431ba 100644 --- a/code/modules/admin/admin_investigate.dm +++ b/code/modules/admin/admin_investigate.dm @@ -25,7 +25,6 @@ if(!F) return to_chat(F, "[time_stamp()] \ref[src] ([x],[y],[z]) || [src] [message]
      ") - //ADMINVERBS /client/proc/investigate_show( subject in list("hrefs","notes","pda","singulo","atmos","watchlist","ntsl","gold core","cult", "experimentor", "wires") ) set name = "Investigate" @@ -36,7 +35,6 @@ var/F = investigate_subject2file(subject) if(!F) to_chat(src, "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed.") - return src << browse(F,"window=investigate[subject];size=800x300") @@ -46,18 +44,15 @@ src << browse(href_logfile,"window=investigate[subject];size=800x300") else to_chat(src, "Error: admin_investigate: No href logfile found.") - return else to_chat(src, "Error: admin_investigate: Href Logging is not on.") - return if("pda") //general one-round-only stuff var/F = investigate_subject2file(subject) if(!F) to_chat(src, "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed.") - return src << browse(F,"window=investigate[subject];size=800x300") @@ -65,7 +60,6 @@ var/F = investigate_subject2file(subject) if(!F) to_chat(src, "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed.") - return src << browse(F,"window=investigate[subject];size=800x300") @@ -73,7 +67,6 @@ var/F = investigate_subject2file(subject) if(!F) to_chat(src, "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed.") - return src << browse(F,"window=investigate[subject];size=800x300") @@ -81,7 +74,6 @@ var/F = investigate_subject2file(subject) if(!F) to_chat(src, "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed.") - return src << browse(F,"window=investigate[subject];size=800x300") @@ -89,7 +81,6 @@ var/F = investigate_subject2file(subject) if(!F) to_chat(src, "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed.") - return src << browse(F,"window=investigate[subject];size=800x300") @@ -97,7 +88,6 @@ var/F = investigate_subject2file(subject) if(!F) to_chat(src, "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed.") - return src << browse(F,"window=investigate[subject];size=800x300") diff --git a/code/modules/admin/admin_memo.dm b/code/modules/admin/admin_memo.dm index 5c6abd131c7..3a1fec11bb4 100644 --- a/code/modules/admin/admin_memo.dm +++ b/code/modules/admin/admin_memo.dm @@ -5,7 +5,6 @@ return if(!dbcon.IsConnected()) to_chat(src, "Failed to establish database connection.") - return var/memotask = input(usr,"Choose task.","Memo") in list("Show","Write","Edit","Remove") if(!memotask) @@ -19,7 +18,6 @@ return if(!dbcon.IsConnected()) to_chat(src, "Failed to establish database connection.") - return var/sql_ckey = sanitizeSQL(src.ckey) switch(task) @@ -31,7 +29,6 @@ return if(query_memocheck.NextRow()) to_chat(src, "You already have set a memo.") - return var/memotext = input(src,"Write your Memo","Memo") as message if(!memotext) @@ -57,7 +54,6 @@ memolist += "[lkey]" if(!memolist.len) to_chat(src, "No memos found in database.") - return var/target_ckey = input(src, "Select whose memo to edit", "Select memo") as null|anything in memolist if(!target_ckey) @@ -105,7 +101,6 @@ output += "
      [memotext]
      " if(!output && !silent) to_chat(src, "No memos found in database.") - return src << output if("Remove") @@ -120,7 +115,6 @@ memolist += "[ckey]" if(!memolist.len) to_chat(src, "No memos found in database.") - return var/target_ckey = input(src, "Select whose memo to delete", "Select memo") as null|anything in memolist if(!target_ckey) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index d3f0cd336bc..ca20df573ec 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -259,7 +259,6 @@ var/list/admin_verbs_proccall = list ( verbs += /client/proc/show_verbs to_chat(src, "Almost all of your adminverbs have been hidden.") - feedback_add_details("admin_verb","TAVVH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return @@ -274,7 +273,6 @@ var/list/admin_verbs_proccall = list ( add_admin_verbs() to_chat(src, "All of your adminverbs are now visible.") - feedback_add_details("admin_verb","TAVVS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/admin_ghost() @@ -293,7 +291,6 @@ var/list/admin_verbs_proccall = list ( feedback_add_details("admin_verb","P") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! else if(istype(mob,/mob/new_player)) to_chat(src, "Error: Aghost: Can't admin-ghost whilst in the lobby. Join or observe first.") - else //ghostize var/mob/body = mob @@ -315,13 +312,11 @@ var/list/admin_verbs_proccall = list ( if(mob.invisibility == INVISIBILITY_OBSERVER) mob.invisibility = initial(mob.invisibility) to_chat(mob, "Invisimin off. Invisibility reset.") - //TODO: Make some kind of indication for the badmin that they are currently invisible else mob.invisibility = INVISIBILITY_OBSERVER to_chat(mob, "Invisimin on. You are now as invisible as a ghost.") - /client/proc/player_panel() set name = "Player Panel" set category = "Admin" @@ -480,7 +475,6 @@ var/list/admin_verbs_proccall = list ( if(!warned_ckey || !istext(warned_ckey)) return if(warned_ckey in admin_datums) to_chat(usr, "Error: warn(): You can't warn admins.") - return var/datum/preferences/D @@ -490,7 +484,6 @@ var/list/admin_verbs_proccall = list ( if(!D) to_chat(src, "Error: warn(): No such ckey found.") - return if(++D.warns >= MAX_WARNS) //uh ohhhh...you'reee iiiiin trouuuubble O:) @@ -499,7 +492,6 @@ var/list/admin_verbs_proccall = list ( message_admins("[key_name_admin(src)] has warned [key_name_admin(C)] resulting in a [AUTOBANTIME] minute ban") log_admin("[key_name(src)] has warned [key_name(C)] resulting in a [AUTOBANTIME] minute ban") to_chat(C, "You have been autobanned due to a warning by [ckey].
      This is a temporary ban, it will be removed in [AUTOBANTIME] minutes.") - del(C) else message_admins("[key_name_admin(src)] has warned [warned_ckey] resulting in a [AUTOBANTIME] minute ban") @@ -509,7 +501,6 @@ var/list/admin_verbs_proccall = list ( else if(C) to_chat(C, "You have been formally warned by an administrator.
      Further warnings will result in an autoban.
      ") - message_admins("[key_name_admin(src)] has warned [key_name_admin(C)]. They have [MAX_WARNS-D.warns] strikes remaining.") log_admin("[key_name(src)] has warned [key_name(C)]. They have [MAX_WARNS-D.warns] strikes remaining.") else @@ -653,11 +644,9 @@ var/list/admin_verbs_proccall = list ( if(air_processing_killed) air_processing_killed = 0 to_chat(usr, "Enabled air processing.") - else air_processing_killed = 1 to_chat(usr, "Disabled air processing.") - feedback_add_details("admin_verb","KA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] used 'kill air'.") message_admins("\blue [key_name_admin(usr)] used 'kill air'.", 1) @@ -675,7 +664,6 @@ var/list/admin_verbs_proccall = list ( verbs += /client/proc/readmin deadmins += ckey to_chat(src, "You are now a normal player.") - feedback_add_details("admin_verb","DAS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/readmin() @@ -699,7 +687,6 @@ var/list/admin_verbs_proccall = list ( if(!dbcon.IsConnected()) message_admins("Warning, MySQL database is not connected.") to_chat(src, "Warning, MYSQL database is not connected.") - return var/sql_ckey = sanitizeSQL(ckey) var/DBQuery/query = dbcon.NewQuery("SELECT rank FROM [format_table_name("admin")] WHERE ckey = '[sql_ckey]'") @@ -711,7 +698,6 @@ var/list/admin_verbs_proccall = list ( if(admin_ranks[rank] == null) error("Error while re-adminning [src], admin rank ([rank]) does not exist.") to_chat(src, "Error while re-adminning, admin rank ([rank]) does not exist.") - return D = new(rank, admin_ranks[rank], ckey) @@ -725,11 +711,9 @@ var/list/admin_verbs_proccall = list ( var/flags = query.item[3] if(!admin_ckey) to_chat(src, "Error while re-adminning, ckey [admin_ckey] was not found in the admin database.") - return if(admin_rank == "Removed") //This person was de-adminned. They are only in the admin list for archive purposes. to_chat(src, "Error while re-adminning, ckey [admin_ckey] is not an admin.") - return if(istext(flags)) @@ -745,7 +729,6 @@ var/list/admin_verbs_proccall = list ( return else to_chat(src, "You are already an admin.") - verbs -= /client/proc/readmin deadmins -= ckey return @@ -761,12 +744,10 @@ var/list/admin_verbs_proccall = list ( if(config.log_hrefs) config.log_hrefs = 0 to_chat(src, "Stopped logging hrefs") - else config.log_hrefs = 1 to_chat(src, "Started logging hrefs") - /client/proc/check_ai_laws() set name = "Check AI Laws" set category = "Admin" @@ -840,7 +821,6 @@ var/list/admin_verbs_proccall = list ( if(!H.client) to_chat(usr, "Only mobs with clients can alter their own appearance.") - return switch(alert("Do you wish for [H] to be allowed to select non-whitelisted races?","Alter Mob Appearance","Yes","No","Cancel")) @@ -865,7 +845,6 @@ var/list/admin_verbs_proccall = list ( jobs += J.title if (!jobs.len) to_chat(usr, "There are no fully staffed jobs.") - return var/job = input("Please select job slot to free", "Free Job Slot") as null|anything in jobs if (job) @@ -884,11 +863,9 @@ var/list/admin_verbs_proccall = list ( prefs.save_preferences(src) if (prefs.toggles & CHAT_ATTACKLOGS) to_chat(usr, "You now will get attack log messages") - else to_chat(usr, "You now won't get attack log messages") - /client/proc/toggledrones() set name = "Toggle Maintenance Drones" set category = "Server" @@ -911,11 +888,9 @@ var/list/admin_verbs_proccall = list ( prefs.save_preferences(src) if (prefs.toggles & CHAT_DEBUGLOGS) to_chat(usr, "You now will get debug log messages") - else to_chat(usr, "You now won't get debug log messages") - /client/proc/man_up(mob/T as mob in mob_list) set category = "Admin" set name = "Man Up" @@ -925,10 +900,8 @@ var/list/admin_verbs_proccall = list ( return to_chat(T, "Man up and deal with it.") - to_chat(T, "Move on.") - log_admin("[key_name(usr)] told [key_name(T)] to man up and deal with it.") message_admins("[key_name_admin(usr)] told [key_name(T)] to man up and deal with it.") @@ -945,9 +918,7 @@ var/list/admin_verbs_proccall = list ( if(confirm == "Yes") for (var/mob/T as mob in mob_list) to_chat(T, "
      Man up.
      Deal with it.

      Move on.

      ") - to_chat(T, 'sound/voice/ManUp1.ogg') - log_admin("[key_name(usr)] told everyone to man up and deal with it.") message_admins("[key_name_admin(usr)] told everyone to man up and deal with it.") diff --git a/code/modules/admin/banappearance.dm b/code/modules/admin/banappearance.dm index 80cc4839956..7244e1152af 100644 --- a/code/modules/admin/banappearance.dm +++ b/code/modules/admin/banappearance.dm @@ -34,7 +34,6 @@ DEBUG for(var/s in appearance_keylist) to_chat(world, s) - /mob/verb/reload_appearances() set name = "reload appearances" @@ -72,7 +71,6 @@ DEBUG var/savefile/S=new("data/appearance_full.ban") to_chat(S["keys[0]"], appearance_keylist) - /proc/appearance_unban(mob/M) appearance_remove("[M.ckey]") appearance_savebanfile() diff --git a/code/modules/admin/banjob.dm b/code/modules/admin/banjob.dm index c2123489299..34365264674 100644 --- a/code/modules/admin/banjob.dm +++ b/code/modules/admin/banjob.dm @@ -42,7 +42,6 @@ DEBUG for(var/s in jobban_keylist) to_chat(world, s) - /mob/verb/reload_jobbans() set name = "reload jobbans" @@ -95,7 +94,6 @@ DEBUG var/savefile/S=new("data/job_full.ban") to_chat(S["keys[0]"], jobban_keylist) - /proc/jobban_unban(mob/M, rank) jobban_remove("[M.ckey] - [rank]") jobban_savebanfile() diff --git a/code/modules/admin/buildmode.dm b/code/modules/admin/buildmode.dm index fb1a9f6356e..cc53ef0ba62 100644 --- a/code/modules/admin/buildmode.dm +++ b/code/modules/admin/buildmode.dm @@ -150,79 +150,45 @@ switch(mode) if(BASIC_BUILDMODE) to_chat(user, "***********************************************************") - to_chat(user, "Left Mouse Button = Construct / Upgrade") - to_chat(user, "Right Mouse Button = Deconstruct / Delete / Downgrade") - to_chat(user, "Left Mouse Button + ctrl = R-Window") - to_chat(user, "Left Mouse Button + alt = Airlock") - to_chat(user, "") - to_chat(user, "Use the button in the upper left corner to") - to_chat(user, "change the direction of built objects.") - to_chat(user, "***********************************************************") - if(ADV_BUILDMODE) to_chat(user, "***********************************************************") - to_chat(user, "Right Mouse Button on buildmode button = Set object type") - to_chat(user, "Left Mouse Button on turf/obj = Place objects") - to_chat(user, "Right Mouse Button = Delete objects") - to_chat(user, "") - to_chat(user, "Use the button in the upper left corner to") - to_chat(user, "change the direction of built objects.") - to_chat(user, "***********************************************************") - if(VAR_BUILDMODE) to_chat(user, "***********************************************************") - to_chat(user, "Right Mouse Button on buildmode button = Select var(type) & value") - to_chat(user, "Left Mouse Button on turf/obj/mob = Set var(type) & value") - to_chat(user, "Right Mouse Button on turf/obj/mob = Reset var's value") - to_chat(user, "***********************************************************") - if(THROW_BUILDMODE) to_chat(user, "***********************************************************") - to_chat(user, "Left Mouse Button on turf/obj/mob = Select") - to_chat(user, "Right Mouse Button on turf/obj/mob = Throw") - to_chat(user, "***********************************************************") - if(AREA_BUILDMODE) to_chat(user, "***********************************************************") - to_chat(user, "Left Mouse Button on turf/obj/mob = Select corner") - to_chat(user, "Right Mouse Button on buildmode button = Select generator") - to_chat(user, "***********************************************************") - if(COPY_BUILDMODE) to_chat(user, "***********************************************************") - to_chat(user, "Left Mouse Button on obj/turf/mob = Spawn a Copy of selected target") - to_chat(user, "Right Mouse Button on obj/mob = Select target to copy") - to_chat(user, "***********************************************************") - /datum/click_intercept/buildmode/proc/change_settings(mob/user) switch(mode) if(BASIC_BUILDMODE) @@ -386,7 +352,6 @@ object.vars[varholder] = valueholder else to_chat(user, "[initial(object.name)] does not have a var called '[varholder]'") - if(right_click) if(object.vars.Find(varholder)) log_admin("Build Mode: [key_name(user)] modified [object.name]'s [varholder] to [valueholder]") @@ -394,7 +359,6 @@ else to_chat(user, "[initial(object.name)] does not have a var called '[varholder]'") - if(THROW_BUILDMODE) if(left_click) if(isturf(object)) @@ -414,7 +378,6 @@ if(cornerA && cornerB) if(!generator_path) to_chat(user, "Select generator type first.") - else var/datum/mapGenerator/G = new generator_path G.defineRegion(cornerA.loc,cornerB.loc,1) @@ -432,5 +395,4 @@ else if(right_click) if(ismovableatom(object)) // No copying turfs for now. to_chat(user, "[object] set as template.") - stored = object diff --git a/code/modules/admin/create_poll.dm b/code/modules/admin/create_poll.dm index 16fa5b0db84..9baa17b73ad 100644 --- a/code/modules/admin/create_poll.dm +++ b/code/modules/admin/create_poll.dm @@ -5,7 +5,6 @@ return if(!dbcon.IsConnected()) to_chat(src, "Failed to establish database connection.") - return var/returned = create_poll_function() if(returned) @@ -28,7 +27,6 @@ message_admins("[key_name_admin(usr)] has created a new server poll. Poll Type: [polltype] - Admin Only: [adminonly ? "Yes" : "No"]
      Question: [question]") else to_chat(src, "Poll question created without any options, poll will be deleted.") - var/DBQuery/query_del_poll = dbcon.NewQuery("DELETE FROM [format_table_name("poll_question")] WHERE id = [returned]") if(!query_del_poll.Execute()) var/err = query_del_poll.ErrorMsg() @@ -66,7 +64,6 @@ endtime = query_validate_time.item[1] if(!endtime) to_chat(src, "Datetime entered is invalid.") - return var/DBQuery/query_time_later = dbcon.NewQuery("SELECT TIMESTAMP('[endtime]') < NOW()") if(!query_time_later.Execute()) @@ -77,7 +74,6 @@ var/checklate = text2num(query_time_later.item[1]) if(checklate) to_chat(src, "Datetime entered is not later than current server time.") - return var/adminonly switch(alert("Admin only poll?",,"Yes","No","Cancel")) @@ -137,7 +133,6 @@ return pollid if(minval >= maxval) to_chat(src, "Minimum rating value can't be more than maximum rating value") - return pollid descmin = input("Optional: Set description for minimum rating","Minimum rating description") as message|null if(descmin) diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index c34ad32c2d1..3849317b03e 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -49,7 +49,6 @@ proc/admin_proc() if(!check_rights(R_ADMIN)) return to_chat(world, "you have enough rights!") - NOTE: it checks usr! not src! So if you're checking somebody's rank in a proc which they did not call you will have to do something like if(client.holder.rights & R_ADMIN) yourself. */ @@ -62,14 +61,12 @@ you will have to do something like if(client.holder.rights & R_ADMIN) yourself. else if(show_msg) to_chat(user, "Error: You do not have sufficient rights to do that. You require one of the following flags:[rights2text(rights_required," ")].") - else if(user.client.holder) return 1 else if(show_msg) to_chat(user, "Error: You are not an admin.") - return 0 //probably a bit iffy - will hopefully figure out a better solution @@ -82,7 +79,6 @@ you will have to do something like if(client.holder.rights & R_ADMIN) yourself. if( (usr.client.holder.rights & other.holder.rights) == other.holder.rights ) return 1 //we have all the rights they have and more to_chat(usr, "Error: Cannot proceed. They have more or equal rights to us.") - return 0 /client/proc/deadmin() diff --git a/code/modules/admin/machine_upgrade.dm b/code/modules/admin/machine_upgrade.dm index 79cfac4d63a..463ef13de0c 100644 --- a/code/modules/admin/machine_upgrade.dm +++ b/code/modules/admin/machine_upgrade.dm @@ -7,7 +7,6 @@ if(!istype(M)) to_chat(usr, "This can only be used on subtypes of /obj/machinery.") - return var/new_rating = input("Enter new rating:","Num") as num diff --git a/code/modules/admin/newbanjob.dm b/code/modules/admin/newbanjob.dm index aa9a755b107..71d61567962 100644 --- a/code/modules/admin/newbanjob.dm +++ b/code/modules/admin/newbanjob.dm @@ -142,27 +142,19 @@ var/savefile/Banlistjob Banlistjob.cd = "/base" if ( Banlistjob.dir.Find("[ckey][computerid][rank]") ) to_chat(usr, text("\red Banjob already exists.")) - return 0 else Banlistjob.dir.Add("[ckey][computerid][rank]") Banlistjob.cd = "/base/[ckey][computerid][rank]" to_chat(Banlistjob["key"], ckey) - to_chat(Banlistjob["id"], computerid) - to_chat(Banlistjob["rank"], rank) - to_chat(Banlistjob["reason"], reason) - to_chat(Banlistjob["bannedby"], bannedby) - to_chat(Banlistjob["temp"], temp) - if (temp) to_chat(Banlistjob["minutes"], bantimestamp) - return 1 /proc/RemoveBanjob(foldername) @@ -228,29 +220,21 @@ var/savefile/Banlistjob /*/datum/admins/proc/permjobban(ckey, computerid, reason, bannedby, temp, minutes, rank) if(AddBanjob(ckey, computerid, reason, usr.ckey, 0, 0, job)) to_chat(M, "\redYou have been banned from [job] by [usr.client.ckey].\nReason: [reason].") - to_chat(M, "\red This is a permanent ban.") - if(config.banappeals) to_chat(M, "\red To try to resolve this matter head to [config.banappeals]") - else to_chat(M, "\red No ban appeals URL has been set.") - log_admin("[usr.client.ckey] has banned from [job] [ckey].\nReason: [reason]\nThis is a permanent ban.") message_admins("\blue[usr.client.ckey] has banned from [job] [ckey].\nReason: [reason]\nThis is a permanent ban.") /datum/admins/proc/timejobban(ckey, computerid, reason, bannedby, temp, minutes, rank) if(AddBanjob(ckey, computerid, reason, usr.ckey, 1, mins, job)) to_chat(M, "\redYou have been jobbanned from [job] by [usr.client.ckey].\nReason: [reason].") - to_chat(M, "\red This is a temporary ban, it will be removed in [mins] minutes.") - if(config.banappeals) to_chat(M, "\red To try to resolve this matter head to [config.banappeals]") - else to_chat(M, "\red No ban appeals URL has been set.") - log_admin("[usr.client.ckey] has jobbanned from [job] [ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.") message_admins("\blue[usr.client.ckey] has banned from [job] [ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.")*/ //////////////////////////////////// DEBUG //////////////////////////////////// @@ -270,23 +254,16 @@ var/savefile/Banlistjob Banlistjob.dir.Add("trash[i]trashid[i]") Banlistjob.cd = "/base/trash[i]trashid[i]" to_chat(Banlistjob["key"], "trash[i]") - else Banlistjob.cd = "/base" Banlistjob.dir.Add("[last]trashid[i]") Banlistjob.cd = "/base/[last]trashid[i]" to_chat(Banlistjob["key"], last) - to_chat(Banlistjob["id"], "trashid[i]") - to_chat(Banlistjob["reason"], "Trashban[i].") - to_chat(Banlistjob["temp"], a) - to_chat(Banlistjob["minutes"], CMinutes + rand(1,2000)) - to_chat(Banlistjob["bannedby"], "trashmin") - last = "trash[i]" Banlistjob.cd = "/base" diff --git a/code/modules/admin/permissionverbs/permissionedit.dm b/code/modules/admin/permissionverbs/permissionedit.dm index 9d4cd3f0071..d91f04aa4df 100644 --- a/code/modules/admin/permissionverbs/permissionedit.dm +++ b/code/modules/admin/permissionverbs/permissionedit.dm @@ -64,7 +64,6 @@ if(!dbcon.IsConnected()) to_chat(usr, "\red Failed to establish database connection") - return if(!adm_ckey || !new_rank) @@ -93,7 +92,6 @@ var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `test`.[format_table_name("admin_log")] (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Added new admin [adm_ckey] to rank [new_rank]');") log_query.Execute() to_chat(usr, "\blue New admin added.") - else if(!isnull(admin_id) && isnum(admin_id)) var/DBQuery/insert_query = dbcon.NewQuery("UPDATE [format_table_name("admin")] SET rank = '[new_rank]' WHERE id = [admin_id]") @@ -102,7 +100,6 @@ log_query.Execute() to_chat(usr, "\blue Admin rank changed.") - /datum/admins/proc/log_admin_permission_modification(var/adm_ckey, var/new_permission) if(config.admin_legacy_system) return @@ -116,7 +113,6 @@ establish_db_connection() if(!dbcon.IsConnected()) to_chat(usr, "\red Failed to establish database connection") - return if(!adm_ckey || !new_permission) @@ -151,14 +147,12 @@ var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `test`.[format_table_name("admin_log")] (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Removed permission [rights2text(new_permission)] (flag = [new_permission]) to admin [adm_ckey]');") log_query.Execute() to_chat(usr, "\blue Permission removed.") - else //This admin doesn't have this permission, so we are adding it. var/DBQuery/insert_query = dbcon.NewQuery("UPDATE [format_table_name("admin")] SET flags = '[admin_rights | new_permission]' WHERE id = [admin_id]") insert_query.Execute() var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `test`.[format_table_name("admin_log")] (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Added permission [rights2text(new_permission)] (flag = [new_permission]) to admin [adm_ckey]')") log_query.Execute() to_chat(usr, "\blue Permission added.") - /datum/admins/proc/updateranktodb(ckey,newrank) establish_db_connection() diff --git a/code/modules/admin/sql_notes.dm b/code/modules/admin/sql_notes.dm index 16507468bdb..df02b6f0c9c 100644 --- a/code/modules/admin/sql_notes.dm +++ b/code/modules/admin/sql_notes.dm @@ -3,7 +3,6 @@ return if(!dbcon.IsConnected()) to_chat(usr, "Failed to establish database connection.") - return if(!target_ckey) var/new_ckey = ckey(input(usr,"Who would you like to add a note for?","Enter a ckey",null) as text|null) @@ -17,7 +16,6 @@ return if(!query_find_ckey.NextRow()) to_chat(usr, "[new_ckey] has not been seen before, you can only add notes to known players.") - return else target_ckey = new_ckey @@ -56,7 +54,6 @@ var/adminckey if(!dbcon.IsConnected()) to_chat(usr, "Failed to establish database connection.") - return if(!note_id) return @@ -84,7 +81,6 @@ return if(!dbcon.IsConnected()) to_chat(usr, "Failed to establish database connection.") - return if(!note_id) return diff --git a/code/modules/admin/stickyban.dm b/code/modules/admin/stickyban.dm index e88ecaf70de..a772edc2608 100644 --- a/code/modules/admin/stickyban.dm +++ b/code/modules/admin/stickyban.dm @@ -23,7 +23,6 @@ if (get_stickyban_from_ckey(ckey)) to_chat(usr, "Error: Can not add a stickyban: User already has a current sticky ban") - if (data["reason"]) ban["message"] = data["reason"] else @@ -45,13 +44,11 @@ var/ban = get_stickyban_from_ckey(ckey) if (!ban) to_chat(usr, "Error: No sticky ban for [ckey] found!") - return if (alert("Are you sure you want to remove the sticky ban on [ckey]?","Are you sure","Yes","No") == "No") return if (!get_stickyban_from_ckey(ckey)) to_chat(usr, "Error: The ban disappeared.") - return world.SetConfig("ban", ckey, null) @@ -68,7 +65,6 @@ var/ban = get_stickyban_from_ckey(ckey) if (!ban) to_chat(usr, "Error: No sticky ban for [ckey] found!") - return var/found = 0 @@ -80,7 +76,6 @@ if (!found) to_chat(usr, "Error: [alt] is not linked to [ckey]'s sticky ban!") - return if (alert("Are you sure you want to disassociate [alt] from [ckey]'s sticky ban? \nNote: Nothing stops byond from re-linking them","Are you sure","Yes","No") == "No") @@ -90,7 +85,6 @@ ban = get_stickyban_from_ckey(ckey) if (!ban) to_chat(usr, "Error: The ban disappeared.") - return found = 0 @@ -102,7 +96,6 @@ if (!found) to_chat(usr, "Error: [alt] link to [ckey]'s sticky ban disappeared.") - return world.SetConfig("ban",ckey,list2stickyban(ban)) @@ -117,7 +110,6 @@ var/ban = get_stickyban_from_ckey(ckey) if (!ban) to_chat(usr, "Error: No sticky ban for [ckey] found!") - return var/oldreason = ban["message"] var/reason = input(usr,"Reason","Reason","[ban["message"]]") as text|null @@ -127,7 +119,6 @@ ban = get_stickyban_from_ckey(ckey) if (!ban) to_chat(usr, "Error: The ban disappeared.") - return ban["message"] = "[reason]" diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 6b122a48ee8..49a06ac5947 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -19,14 +19,10 @@ to_chat(C, 'sound/effects/adminhelp.ogg') - to_chat(C, "- AdminHelp Rejected! -") - to_chat(C, "Your admin help was rejected.") - to_chat(C, "Please try to be calm, clear, and descriptive in admin helps, do not assume the admin has seen any related events, and clearly state the names of anybody you are reporting. If you asked a question, please ensure it was clear what you were asking.") - message_admins("[key_name_admin(usr)] rejected [key_name_admin(C.mob)]'s admin help") log_admin("[key_name(usr)] rejected [key_name(C.mob)]'s admin help") @@ -39,43 +35,35 @@ log_admin("[key_name(usr)] has spawned a traitor.") if(!src.makeTraitors()) to_chat(usr, "\red Unfortunately there weren't enough candidates available.") - if("2") log_admin("[key_name(usr)] has spawned a changeling.") if(!src.makeChanglings()) to_chat(usr, "\red Unfortunately there weren't enough candidates available.") - if("3") log_admin("[key_name(usr)] has spawned revolutionaries.") if(!src.makeRevs()) to_chat(usr, "\red Unfortunately there weren't enough candidates available.") - if("4") log_admin("[key_name(usr)] has spawned a cultists.") if(!src.makeCult()) to_chat(usr, "\red Unfortunately there weren't enough candidates available.") - if("5") log_admin("[key_name(usr)] has spawned a malf AI.") if(!src.makeMalfAImode()) to_chat(usr, "\red Unfortunately there weren't enough candidates available.") - if("6") log_admin("[key_name(usr)] has spawned a wizard.") if(!src.makeWizard()) to_chat(usr, "\red Unfortunately there weren't enough candidates available.") - if("7") log_admin("[key_name(usr)] has spawned vampires.") if(!src.makeVampires()) to_chat(usr, "\red Unfortunately there weren't enough candidates available.") - if("8") log_admin("[key_name(usr)] has spawned vox raiders.") if(!src.makeVoxRaiders()) to_chat(usr, "\red Unfortunately there weren't enough candidates available.") - else if(href_list["dbsearchckey"] || href_list["dbsearchadmin"] || href_list["dbsearchip"] || href_list["dbsearchcid"] || href_list["dbsearchbantype"]) var/adminckey = href_list["dbsearchadmin"] var/playerckey = href_list["dbsearchckey"] @@ -115,45 +103,38 @@ if(BANTYPE_PERMA) if(!banckey || !banreason) to_chat(usr, "Not enough parameters (Requires ckey and reason)") - return banduration = null banjob = null if(BANTYPE_TEMP) if(!banckey || !banreason || !banduration) to_chat(usr, "Not enough parameters (Requires ckey, reason and duration)") - return banjob = null if(BANTYPE_JOB_PERMA) if(!banckey || !banreason || !banjob) to_chat(usr, "Not enough parameters (Requires ckey, reason and job)") - return banduration = null if(BANTYPE_JOB_TEMP) if(!banckey || !banreason || !banjob || !banduration) to_chat(usr, "Not enough parameters (Requires ckey, reason and job)") - return if(BANTYPE_APPEARANCE) if(!banckey || !banreason) to_chat(usr, "Not enough parameters (Requires ckey and reason)") - return banduration = null banjob = null if(BANTYPE_ADMIN_PERMA) if(!banckey || !banreason) to_chat(usr, "Not enough parameters (Requires ckey and reason)") - return banduration = null banjob = null if(BANTYPE_ADMIN_TEMP) if(!banckey || !banreason || !banduration) to_chat(usr, "Not enough parameters (Requires ckey, reason and duration)") - return banjob = null @@ -192,7 +173,6 @@ if(!new_ckey) return if(new_ckey in admin_datums) to_chat(usr, "Error: Topic 'editrights': [new_ckey] is already an admin") - return adm_ckey = new_ckey task = "rank" @@ -200,7 +180,6 @@ adm_ckey = ckey(href_list["ckey"]) if(!adm_ckey) to_chat(usr, "Error: Topic 'editrights': No valid ckey") - return var/datum/admins/D = admin_datums[adm_ckey] @@ -234,7 +213,6 @@ new_rank = ckeyEx(new_rank) if(!new_rank) to_chat(usr, "Error: Topic 'editrights': Invalid rank") - return if(config.admin_legacy_system) if(admin_ranks.len) @@ -329,7 +307,6 @@ var/mob/M = locate(href_list["mob"]) if(!ismob(M)) to_chat(usr, "This can only be used on instances of type /mob") - return var/delmob = 0 @@ -424,13 +401,9 @@ message_admins("\blue [key_name_admin(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [duration]", 1) Banlist.cd = "/base/[banfolder]" to_chat(Banlist["reason"], reason) - to_chat(Banlist["temp"], temp) - to_chat(Banlist["minutes"], minutes) - to_chat(Banlist["bannedby"], usr.ckey) - Banlist.cd = "/base" feedback_inc("ban_edit",1) unbanpanel() @@ -443,18 +416,15 @@ var/mob/M = locate(href_list["appearanceban"]) if(!ismob(M)) to_chat(usr, "This can only be used on instances of type /mob") - return if(!M.ckey) //sanity to_chat(usr, "This mob has no ckey") - return var/banreason = appearance_isbanned(M) if(banreason) /* if(!config.ban_legacy_system) to_chat(usr, "Unfortunately, database based unbanning cannot be done through this panel") - DB_ban_panel(M.ckey) return */ switch(alert("Reason: '[banreason]' Remove appearance ban?","Please Confirm","Yes","No")) @@ -467,7 +437,6 @@ message_admins("\blue [key_name_admin(usr)] removed [key_name_admin(M)]'s appearance ban", 1) to_chat(M, "\red[usr.client.ckey] has removed your appearance ban.") - else switch(alert("Appearance ban [M.ckey]?",,"Yes","No", "Cancel")) if("Yes") var/reason = input(usr,"Please state the reason","Reason") as message|null @@ -481,17 +450,12 @@ add_note(M.ckey, "Appearance banned - [reason]", null, usr, 0) message_admins("\blue [key_name_admin(usr)] appearance banned [key_name_admin(M)]", 1) to_chat(M, "\redYou have been appearance banned by [usr.client.ckey].") - to_chat(M, "\red The reason is: [reason]") - to_chat(M, "\red Appearance ban can be lifted only upon request.") - if(config.banappeals) to_chat(M, "\red To try to resolve this matter head to [config.banappeals]") - else to_chat(M, "\red No ban appeals URL has been set.") - if("No") return @@ -501,16 +465,13 @@ var/mob/M = locate(href_list["jobban2"]) if(!ismob(M)) to_chat(usr, "This can only be used on instances of type /mob") - return if(!M.ckey) //sanity to_chat(usr, "This mob has no ckey") - return if(!job_master) to_chat(usr, "Job Master has not been setup!") - return var/dat = "" @@ -835,7 +796,6 @@ var/mob/M = locate(href_list["jobban4"]) if(!ismob(M)) to_chat(usr, "This can only be used on instances of type /mob") - return if(M != usr) //we can jobban ourselves @@ -845,7 +805,6 @@ if(!job_master) to_chat(usr, "Job Master has not been setup!") - return //get jobs for department if specified, otherwise just returnt he one job in a list. @@ -915,7 +874,6 @@ if("Yes") if(config.ban_legacy_system) to_chat(usr, "\red Your server is using the legacy banning system, which does not support temporary job bans. Consider upgrading. Aborting ban.") - return var/mins = input(usr,"How long (in minutes)?","Ban time",1440) as num|null if(!mins) @@ -939,11 +897,8 @@ add_note(M.ckey, "Banned from [msg] - [reason]", null, usr, 0) message_admins("\blue [key_name_admin(usr)] banned [key_name_admin(M)] from [msg] for [mins] minutes", 1) to_chat(M, "\redYou have been jobbanned by [usr.client.ckey] from: [msg].") - to_chat(M, "\red The reason is: [reason]") - to_chat(M, "\red This jobban will be lifted in [mins] minutes.") - href_list["jobban2"] = 1 // lets it fall through and refresh return 1 if("No") @@ -962,11 +917,8 @@ add_note(M.ckey, "Banned from [msg] - [reason]", null, usr, 0) message_admins("\blue [key_name_admin(usr)] banned [key_name_admin(M)] from [msg]", 1) to_chat(M, "\redYou have been jobbanned by [usr.client.ckey] from: [msg].") - to_chat(M, "\red The reason is: [reason]") - to_chat(M, "\red Jobban can be lifted only upon request.") - href_list["jobban2"] = 1 // lets it fall through and refresh return 1 if("Cancel") @@ -977,7 +929,6 @@ if(joblist.len) //at least 1 banned job exists in joblist so we have stuff to unban. if(!config.ban_legacy_system) to_chat(usr, "Unfortunately, database based unbanning cannot be done through this panel") - DB_ban_panel(M.ckey) return var/msg @@ -999,7 +950,6 @@ if(msg) message_admins("\blue [key_name_admin(usr)] unbanned [key_name_admin(M)] from [msg]", 1) to_chat(M, "\redYou have been un-jobbanned by [usr.client.ckey] from [msg].") - href_list["jobban2"] = 1 // lets it fall through and refresh return 1 return 0 //we didn't do anything! @@ -1010,7 +960,6 @@ if(!check_if_greater_rights_than(M.client)) return to_chat(M, "\red You have been kicked from the server") - log_admin("[key_name(usr)] booted [key_name(M)].") message_admins("\blue [key_name_admin(usr)] booted [key_name_admin(M)].", 1) //M.client = null @@ -1095,18 +1044,14 @@ AddBan(M.ckey, M.computer_id, reason, usr.ckey, 1, mins) ban_unban_log_save("[usr.client.ckey] has banned [M.ckey]. - Reason: [reason] - This will be removed in [mins] minutes.") to_chat(M, "\redYou have been banned by [usr.client.ckey].\nReason: [reason].") - to_chat(M, "\red This is a temporary ban, it will be removed in [mins] minutes.") - feedback_inc("ban_tmp",1) DB_ban_record(BANTYPE_TEMP, M, mins, reason) feedback_inc("ban_tmp_mins",mins) if(config.banappeals) to_chat(M, "\red To try to resolve this matter head to [config.banappeals]") - else to_chat(M, "\red No ban appeals URL has been set.") - log_admin("[key_name(usr)] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.") message_admins("\blue [key_name_admin(usr)] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.") @@ -1123,15 +1068,11 @@ if("No") AddBan(M.ckey, M.computer_id, reason, usr.ckey, 0, 0) to_chat(M, "\redYou have been banned by [usr.client.ckey].\nReason: [reason].") - to_chat(M, "\red This is a permanent ban.") - if(config.banappeals) to_chat(M, "\red To try to resolve this matter head to [config.banappeals]") - else to_chat(M, "\red No ban appeals URL has been set.") - ban_unban_log_save("[usr.client.ckey] has permabanned [M.ckey]. - Reason: [reason] - This is a permanent ban.") log_admin("[key_name(usr)] has banned [M.ckey].\nReason: [reason]\nThis is a permanent ban.") message_admins("\blue[key_name_admin(usr)] has banned [M.ckey].\nReason: [reason]\nThis is a permanent ban.") @@ -1238,7 +1179,6 @@ log_admin("[key_name(usr)] set the mode as [master_mode].") message_admins("\blue [key_name_admin(usr)] set the mode as [master_mode].", 1) to_chat(world, "\blue The mode is now: [master_mode]") - Game() // updates the main game menu world.save_mode(master_mode) .(href, list("c_mode"=1)) @@ -1262,7 +1202,6 @@ var/mob/living/carbon/human/H = locate(href_list["monkeyone"]) if(!istype(H)) to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") - return log_admin("[key_name(usr)] attempting to monkeyize [key_name(H)]") @@ -1276,7 +1215,6 @@ var/mob/living/carbon/human/H = locate(href_list["corgione"]) if(!istype(H)) to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") - return log_admin("[key_name(usr)] attempting to corgize [key_name(H)]") @@ -1290,7 +1228,6 @@ if(!ismob(M)) to_chat(usr, "this can only be used on instances of type /mob") - var/speech = input("What will [key_name(M)] say?.", "Force speech", "")// Don't need to sanitize, since it does that in say(), we also trust our admins. if(!speech) return M.say(speech) @@ -1307,11 +1244,9 @@ var/mob/M = locate(href_list["sendtoprison"]) if(!ismob(M)) to_chat(usr, "This can only be used on instances of type /mob") - return if(istype(M, /mob/living/silicon/ai)) to_chat(usr, "This cannot be used on instances of type /mob/living/silicon/ai") - return var/turf/prison_cell = pick(prisonwarp) @@ -1342,7 +1277,6 @@ prisoner.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(prisoner), slot_shoes) to_chat(M, "\red You have been sent to the prison station!") - log_admin("[key_name(usr)] sent [key_name(M)] to the prison station.") message_admins("\blue [key_name_admin(usr)] sent [key_name_admin(M)] to the prison station.", 1) @@ -1354,12 +1288,10 @@ if(!isobserver(M)) to_chat(usr, "You can only send ghost players back to the Lobby.") - return if(!M.client) to_chat(usr, "[M] doesn't seem to have an active client.") - return if(alert(usr, "Send [key_name(M)] back to Lobby?", "Message", "Yes", "No") != "Yes") @@ -1381,11 +1313,9 @@ var/mob/M = locate(href_list["tdome1"]) if(!ismob(M)) to_chat(usr, "This can only be used on instances of type /mob") - return if(istype(M, /mob/living/silicon/ai)) to_chat(usr, "This cannot be used on instances of type /mob/living/silicon/ai") - return for(var/obj/item/I in M) @@ -1400,7 +1330,6 @@ M.loc = pick(tdome1) spawn(50) to_chat(M, "\blue You have been sent to the Thunderdome.") - log_admin("[key_name(usr)] has sent [key_name(M)] to the thunderdome. (Team 1)") message_admins("[key_name_admin(usr)] has sent [key_name_admin(M)] to the thunderdome. (Team 1)", 1) @@ -1413,11 +1342,9 @@ var/mob/M = locate(href_list["tdome2"]) if(!ismob(M)) to_chat(usr, "This can only be used on instances of type /mob") - return if(istype(M, /mob/living/silicon/ai)) to_chat(usr, "This cannot be used on instances of type /mob/living/silicon/ai") - return for(var/obj/item/I in M) @@ -1432,7 +1359,6 @@ M.loc = pick(tdome2) spawn(50) to_chat(M, "\blue You have been sent to the Thunderdome.") - log_admin("[key_name(usr)] has sent [key_name(M)] to the thunderdome. (Team 2)") message_admins("[key_name_admin(usr)] has sent [key_name_admin(M)] to the thunderdome. (Team 2)", 1) @@ -1445,11 +1371,9 @@ var/mob/M = locate(href_list["tdomeadmin"]) if(!ismob(M)) to_chat(usr, "This can only be used on instances of type /mob") - return if(istype(M, /mob/living/silicon/ai)) to_chat(usr, "This cannot be used on instances of type /mob/living/silicon/ai") - return M.Paralyse(5) @@ -1457,7 +1381,6 @@ M.loc = pick(tdomeadmin) spawn(50) to_chat(M, "\blue You have been sent to the Thunderdome.") - log_admin("[key_name(usr)] has sent [key_name(M)] to the thunderdome. (Admin.)") message_admins("[key_name_admin(usr)] has sent [key_name_admin(M)] to the thunderdome. (Admin.)", 1) @@ -1470,11 +1393,9 @@ var/mob/M = locate(href_list["tdomeobserve"]) if(!ismob(M)) to_chat(usr, "This can only be used on instances of type /mob") - return if(istype(M, /mob/living/silicon/ai)) to_chat(usr, "This cannot be used on instances of type /mob/living/silicon/ai") - return for(var/obj/item/I in M) @@ -1493,7 +1414,6 @@ M.loc = pick(tdomeobserve) spawn(50) to_chat(M, "\blue You have been sent to the Thunderdome.") - log_admin("[key_name(usr)] has sent [key_name(M)] to the thunderdome. (Observer.)") message_admins("[key_name_admin(usr)] has sent [key_name_admin(M)] to the thunderdome. (Observer.)", 1) @@ -1506,11 +1426,9 @@ var/mob/M = locate(href_list["aroomwarp"]) if(!ismob(M)) to_chat(usr, "This can only be used on instances of type /mob") - return if(istype(M, /mob/living/silicon/ai)) to_chat(usr, "This cannot be used on instances of type /mob/living/silicon/ai") - return M.Paralyse(5) @@ -1518,7 +1436,6 @@ M.loc = pick(aroomwarp) spawn(50) to_chat(M, "\blue You have been sent to the Admin Room!.") - log_admin("[key_name(usr)] has sent [key_name(M)] to the Admin Room") message_admins("[key_name_admin(usr)] has sent [key_name_admin(M)] to the Admin Room", 1) @@ -1529,7 +1446,6 @@ var/mob/living/L = locate(href_list["revive"]) if(!istype(L)) to_chat(usr, "This can only be used on instances of type /mob/living") - return L.revive() @@ -1542,7 +1458,6 @@ var/mob/living/carbon/human/H = locate(href_list["makeai"]) if(!istype(H)) to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") - return message_admins("\red Admin [key_name_admin(usr)] AIized [key_name_admin(H)]!", 1) @@ -1564,7 +1479,6 @@ var/mob/living/carbon/human/H = locate(href_list["makealien"]) if(!istype(H)) to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") - return usr.client.cmd_admin_alienize(H) @@ -1575,7 +1489,6 @@ var/mob/living/carbon/human/H = locate(href_list["makeslime"]) if(!istype(H)) to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") - return usr.client.cmd_admin_slimeize(H) @@ -1586,7 +1499,6 @@ var/mob/living/carbon/human/H = locate(href_list["makesuper"]) if(!istype(H)) to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") - return usr.client.cmd_admin_super(H) @@ -1597,7 +1509,6 @@ var/mob/living/carbon/human/H = locate(href_list["makerobot"]) if(!istype(H)) to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") - return usr.client.cmd_admin_robotize(H) @@ -1608,7 +1519,6 @@ var/mob/M = locate(href_list["makeanimal"]) if(istype(M, /mob/new_player)) to_chat(usr, "This cannot be used on instances of type /mob/new_player") - return usr.client.cmd_admin_animalize(M) @@ -1619,7 +1529,6 @@ var/mob/dead/observer/G = locate(href_list["incarn_ghost"]) if(!istype(G)) to_chat(usr, "This will only work on /mob/dead/observer") - log_admin("[key_name(G)] was incarnated by [key_name(src.owner)]") message_admins("[key_name_admin(G)] was incarnated by [key_name_admin(src.owner)]") G.incarnate_ghost() @@ -1630,7 +1539,6 @@ var/mob/living/carbon/human/H = locate(href_list["togmutate"]) if(!istype(H)) to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") - return var/block=text2num(href_list["block"]) //testing("togmutate([href_list["block"]] -> [block])") @@ -1687,7 +1595,6 @@ var/mob/M = locate(href_list["adminmoreinfo"]) if(!ismob(M)) to_chat(usr, "This can only be used on instances of type /mob") - return var/location_description = "" @@ -1728,25 +1635,18 @@ else gender_description = "[M.gender]" to_chat(src.owner, "Info about [M.name]: ") - to_chat(src.owner, "Mob type = [M.type]; Gender = [gender_description] Damage = [health_description]") - to_chat(src.owner, "Name = [M.name]; Real_name = [M.real_name]; Mind_name = [M.mind?"[M.mind.name]":""]; Key = [M.key];") - to_chat(src.owner, "Location = [location_description];") - to_chat(src.owner, "[special_role_description]") - to_chat(src.owner, "(PM) (PP) (VV) (SM) (FLW) (CA)") - else if(href_list["adminspawncookie"]) if(!check_rights(R_ADMIN|R_EVENT)) return var/mob/living/carbon/human/H = locate(href_list["adminspawncookie"]) if(!ishuman(H)) to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") - return H.equip_to_slot_or_del( new /obj/item/weapon/reagent_containers/food/snacks/cookie(H), slot_l_hand ) @@ -1765,14 +1665,12 @@ feedback_inc("admin_cookies_spawned",1) to_chat(H, "\blue Your prayers have been answered!! You received the best cookie!") - else if(href_list["BlueSpaceArtillery"]) if(!check_rights(R_ADMIN|R_EVENT)) return var/mob/living/M = locate(href_list["BlueSpaceArtillery"]) if(!isliving(M)) to_chat(usr, "This can only be used on instances of type /mob/living") - return if(alert(src.owner, "Are you sure you wish to hit [key_name(M)] with Bluespace Artillery?", "Confirm Firing?" , "Yes" , "No") != "Yes") @@ -1780,7 +1678,6 @@ if(BSACooldown) to_chat(src.owner, "Standby. Reload cycle in progress. Gunnery crews ready in five seconds!") - return BSACooldown = 1 @@ -1788,7 +1685,6 @@ BSACooldown = 0 to_chat(M, "You've been hit by bluespace artillery!") - log_admin("[key_name(M)] has been hit by Bluespace Artillery fired by [key_name(src.owner)]") message_admins("[key_name_admin(M)] has been hit by Bluespace Artillery fired by [key_name_admin(src.owner)]") @@ -1819,23 +1715,19 @@ var/mob/living/carbon/human/H = locate(href_list["CentcommReply"]) if(!istype(H)) to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") - return if(!istype(H.l_ear, /obj/item/device/radio/headset) && !istype(H.r_ear, /obj/item/device/radio/headset)) to_chat(usr, "The person you are trying to contact is not wearing a headset") - return var/input = input(src.owner, "Please enter a message to reply to [key_name(H)] via their headset.","Outgoing message from Centcomm", "") if(!input) return to_chat(src.owner, "You sent [input] to [H] via a secure channel.") - log_admin("[key_name(src.owner)] replied to [key_name(H)]'s Centcomm message with the message [input].") message_admins("[key_name_admin(src.owner)] replied to [key_name_admin(H)]'s Centcom message with: \"[input]\"") to_chat(H, "You hear something crackle in your headset for a moment before a voice speaks. \"Please stand by for a message from Central Command. Message as follows. [input]. Message ends.\"") - else if(href_list["SyndicateReply"]) if(!check_rights(R_ADMIN)) return @@ -1843,46 +1735,37 @@ var/mob/living/carbon/human/H = locate(href_list["SyndicateReply"]) if(!istype(H)) to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") - return if(H.stat != 0) to_chat(usr, "The person you are trying to contact is not conscious.") - return if(!istype(H.l_ear, /obj/item/device/radio/headset) && !istype(H.r_ear, /obj/item/device/radio/headset)) to_chat(usr, "The person you are trying to contact is not wearing a headset") - return var/input = input(src.owner, "Please enter a message to reply to [key_name(H)] via their headset.","Outgoing message from The Syndicate", "") if(!input) return to_chat(src.owner, "You sent [input] to [H] via a secure channel.") - log_admin("[src.owner] replied to [key_name(H)]'s Syndicate message with the message [input].") to_chat(H, "You hear something crackle in your headset for a moment before a voice speaks. \"Please stand by for a message from your benefactor. Message as follows, agent. [input]. Message ends.\"") - else if(href_list["HONKReply"]) var/mob/living/carbon/human/H = locate(href_list["HONKReply"]) if(!istype(H)) to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") - return if(!istype(H.l_ear, /obj/item/device/radio/headset) && !istype(H.r_ear, /obj/item/device/radio/headset)) to_chat(usr, "The person you are trying to contact is not wearing a headset") - return var/input = input(src.owner, "Please enter a message to reply to [key_name(H)] via their headset.","Outgoing message from HONKplanet", "") if(!input) return to_chat(src.owner, "You sent [input] to [H] via a secure channel.") - log_admin("[src.owner] replied to [key_name(H)]'s HONKplanet message with the message [input].") to_chat(H, "You hear something crackle in your headset for a moment before a voice speaks. \"Please stand by for a message from your HONKbrothers. Message as follows, HONK. [input]. Message ends, HONK.\"") - else if(href_list["ErtReply"]) if(!check_rights(R_ADMIN)) return @@ -1891,25 +1774,20 @@ var/mob/living/carbon/human/H = locate(href_list["ErtReply"]) if(!istype(H)) to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") - return if(H.stat != 0) to_chat(usr, "The person you are trying to contact is not conscious.") - return if(!istype(H.l_ear, /obj/item/device/radio/headset) && !istype(H.r_ear, /obj/item/device/radio/headset)) to_chat(usr, "The person you are trying to contact is not wearing a headset") - return var/input = input(src.owner, "Please enter a reason for denying [key_name(H)]'s ERT request.","Outgoing message from CentComm", "") if(!input) return to_chat(src.owner, "You sent [input] to [H] via a secure channel.") - log_admin("[src.owner] denied [key_name(H)]'s ERT request with the message [input].") to_chat(H, "You hear something crackle in your headset for a moment before a voice speaks. \"Your ERT request has been denied for the following reasons: [input]. Message ends.\"") - else src.owner.response_team() @@ -1939,7 +1817,6 @@ else to_chat(usr, "\red The faxed item is not viewable. This is probably a bug, and should be reported on the tracker: [fax.type]") - else if (href_list["AdminFaxViewPage"]) if(!check_rights(R_ADMIN)) return @@ -2071,7 +1948,6 @@ if(destination != "All Departments") if(!fax.receivefax(P)) to_chat(src.owner, "\red Message transmission failed.") - return else for(var/obj/machinery/photocopier/faxmachine/F in allfaxes) @@ -2080,7 +1956,6 @@ if(!F.receivefax(P)) to_chat(src.owner, "\red Message transmission to [F.department] failed.") - var/datum/fax/admin/A = new /datum/fax/admin() A.name = P.name A.from_department = faxtype @@ -2095,12 +1970,10 @@ A.sent_at = world.time to_chat(src.owner, "\blue Message transmitted successfully.") - if(notify == "Yes") var/mob/living/carbon/human/H = sender if(istype(H) && H.stat == CONSCIOUS && (istype(H.l_ear, /obj/item/device/radio/headset) || istype(H.r_ear, /obj/item/device/radio/headset))) to_chat(sender, "Your headset pings, notifying you that a reply to your fax has arrived.") - if(sender) log_admin("[key_name(src.owner)] replied to a fax message from [key_name(sender)]: [input]") message_admins("[key_name_admin(src.owner)] replied to a fax message from [key_name_admin(sender)] (VIEW).", 1) @@ -2156,7 +2029,6 @@ var/mob/M = locate(href_list["traitor"]) if(!ismob(M)) to_chat(usr, "This can only be used on instances of type /mob.") - return show_traitor_panel(M) @@ -2226,7 +2098,6 @@ if("inhand") if (!iscarbon(usr) && !isrobot(usr)) to_chat(usr, "Can only spawn in hand when you're a carbon mob or cyborg.") - where = "onfloor" target = usr @@ -2239,11 +2110,9 @@ if("inmarked") if(!marked_datum) to_chat(usr, "You don't have any object marked. Abandoning spawn.") - return else if(!istype(marked_datum,/atom)) to_chat(usr, "The object you have marked cannot be used as a target. Target must be of type /atom. Abandoning spawn.") - return else target = marked_datum @@ -2309,7 +2178,6 @@ else to_chat(usr, "You may only use this when the game is running.") - else if(href_list["memoeditlist"]) if(!check_rights(R_SERVER)) return var/sql_key = sanitizeSQL("[href_list["memoeditlist"]]") @@ -2387,7 +2255,6 @@ if("gravity") if(!(ticker && ticker.mode)) to_chat(usr, "Please wait until the game starts! Not sure how it will work otherwise.") - return gravity_is_on = !gravity_is_on for(var/area/A in world) @@ -2550,13 +2417,10 @@ /* if("shockwave") ok = 1 to_chat(world, "\red ALERT: STATION STRESS CRITICAL") - sleep(60) to_chat(world, "\red ALERT: STATION STRESS CRITICAL. TOLERABLE LEVELS EXCEEDED!") - sleep(80) to_chat(world, "\red ALERT: STATION STRUCTURAL STRESS CRITICAL. SAFETY MECHANISMS FAILED!") - sleep(40) for(var/mob/M in world) shake_camera(M, 400, 1) @@ -2611,7 +2475,6 @@ if("floorlava") if(floorIsLava) to_chat(usr, "The floor is lava already.") - return feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","LF") @@ -2669,7 +2532,6 @@ feedback_add_details("admin_secrets_fun_used","RET") for(var/mob/living/carbon/human/H in player_list) to_chat(H, "\red You suddenly feel stupid.") - H.setBrainLoss(60) message_admins("[key_name_admin(usr)] made everybody retarded") if("fakeguns") @@ -2691,7 +2553,6 @@ W.item_color = "schoolgirl" message_admins("[key_name_admin(usr)] activated Japanese Animes mode") to_chat(world, sound('sound/AI/animes.ogg')) - if("eagles")//SCRAW feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","EgL") @@ -2799,7 +2660,6 @@ if (ok) to_chat(world, text("A secret has been activated by []!", usr.key)) - else if(href_list["secretsadmin"]) if(!check_rights(R_ADMIN)) return @@ -2877,7 +2737,6 @@ if (ok) to_chat(world, text("A secret has been activated by []!", usr.key)) - else if(href_list["secretscoder"]) if(!check_rights(R_DEBUG)) return diff --git a/code/modules/admin/verbs/BrokenInhands.dm b/code/modules/admin/verbs/BrokenInhands.dm index dd135db1c50..e0fb1a46913 100644 --- a/code/modules/admin/verbs/BrokenInhands.dm +++ b/code/modules/admin/verbs/BrokenInhands.dm @@ -32,7 +32,5 @@ var/F = file("broken_hand_icons.txt") fdel(F) to_chat(F, text) - to_chat(world, "Completed and written to [F]") - diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index b8fafe55e93..0b0b8991aa1 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -27,7 +27,6 @@ // to_chat(world, query_text) - var/list/query_list = SDQL2_tokenize(query_text) if(!query_list || query_list.len < 1) @@ -149,10 +148,8 @@ d.vars[v] = vals[v] catch(var/exception/e) to_chat(usr, "A runtime error has occured during the execution of your query and your query has been aborted.") - to_chat(usr, "[e]") - /proc/SDQL_parse(list/query_list) var/datum/SDQL_parser/parser = new() var/list/querys = list() @@ -178,7 +175,6 @@ querys_pos++ else //There was an error so don't run anything, and tell the user which query has errored. to_chat(usr, "Parsing error on [querys_pos]\th query. Nothing was executed.") - return list() query_tree = list() do_parse = 0 @@ -200,28 +196,22 @@ for(var/item in query_tree) if(istype(item, /list)) to_chat(usr, "[spaces](") - SDQL_testout(item, indent + 1) to_chat(usr, "[spaces])") - else to_chat(usr, "[spaces][item]") - if(!isnum(item) && query_tree[item]) if(istype(query_tree[item], /list)) to_chat(usr, "[spaces] (") - SDQL_testout(query_tree[item], indent + 2) to_chat(usr, "[spaces] )") - else to_chat(usr, "[spaces] [query_tree[item]]") - /proc/SDQL_from_objs(list/tree) if("world" in tree) return list(world) @@ -331,7 +321,6 @@ result = (result || val) else to_chat(usr, "SDQL2: Unknown op [op]") - result = null else result = val @@ -400,12 +389,10 @@ else if(expression[start] == "\[" && start < expression.len) if(lowertext(copytext(expression[start + 1], 1, 3)) != "0x") to_chat(usr, "Invalid ref syntax: [expression[start + 1]]") - return null v = locate("\[[expression[start + 1]]\]") if(!v) to_chat(usr, "Invalid ref: [expression[start + 1]]") - return null start++ else @@ -462,7 +449,6 @@ else if(char == "'") if(word != "") to_chat(usr, "SDQL2: You have an error in your SDQL syntax, unexpected ' in query: \"[query_text]\" following \"[word]\". Please check your syntax, and try again.") - return null word = "'" @@ -483,7 +469,6 @@ if(i > len) to_chat(usr, "SDQL2: You have an error in your SDQL syntax, unmatched ' in query: \"[query_text]\". Please check your syntax, and try again.") - return null query_list += "[word]'" @@ -492,7 +477,6 @@ else if(char == "\"") if(word != "") to_chat(usr, "SDQL2: You have an error in your SDQL syntax, unexpected \" in query: \"[query_text]\" following \"[word]\". Please check your syntax, and try again.") - return null word = "\"" @@ -513,7 +497,6 @@ if(i > len) to_chat(usr, "SDQL2: You have an error in your SDQL syntax, unmatched \" in query: \"[query_text]\". Please check your syntax, and try again.") - return null query_list += "[word]\"" diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm b/code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm index e564876c39f..b1b2c28e276 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm @@ -61,7 +61,6 @@ /datum/SDQL_parser/proc/parse_error(error_message) error = 1 to_chat(usr, "SQDL2 Parsing Error: [error_message]") - return query.len + 1 /datum/SDQL_parser/proc/parse() diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 936fd7b3404..ffebb5ce698 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -10,7 +10,6 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," //handle muting and automuting if(prefs.muted & MUTE_ADMINHELP) to_chat(src, "Error: Admin-PM: You cannot send adminhelps (Muted).") - return adminhelped = 1 //Determines if they get the message to reply by clicking the name. @@ -114,22 +113,17 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," for(var/client/X in mentorholders + modholders + adminholders) if(X.prefs.sound & SOUND_ADMINHELP) to_chat(X, 'sound/effects/adminhelp.ogg') - to_chat(X, msg) - if("Adminhelp") msg = "[selected_type]: [key_name(src, 1, 1, selected_type)] (?) (PP) (VV) (SM) ([admin_jump_link(mob, "holder")]) (CA) (REJT) [ai_found ? " (CL)" : ""]: [msg]" for(var/client/X in modholders + adminholders) if(X.prefs.sound & SOUND_ADMINHELP) to_chat(X, 'sound/effects/adminhelp.ogg') - to_chat(X, msg) - //show it to the person adminhelping too to_chat(src, "[selected_type]
      : [original_msg]") - var/admin_number_present = adminholders.len - admin_number_afk log_admin("[selected_type]: [key_name(src)]: [original_msg] - heard by [admin_number_present] non-AFK admins.") if(admin_number_present <= 0) diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm index 98d24ed5526..2194fb20bf3 100644 --- a/code/modules/admin/verbs/adminjump.dm +++ b/code/modules/admin/verbs/adminjump.dm @@ -20,7 +20,6 @@ var/turf/T = pick_n_take(turfs) if(!T) to_chat(src, "Nowhere to jump to!") - return admin_forcemove(usr, T) @@ -59,7 +58,6 @@ else to_chat(A, "This mob is not located in the game world.") - /client/proc/jumptocoord(tx as num, ty as num, tz as num) set category = "Admin" set name = "Jump to Coordinate" @@ -88,7 +86,6 @@ var/selection = input("Please, select a player!", "Admin Jumping", null, null) as null|anything in sortKey(keys) if(!selection) to_chat(src, "No keys found.") - return var/mob/M = selection:mob log_admin("[key_name(usr)] jumped to [key_name(M)]") diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 2bb2450d1ea..ad5006611af 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -4,7 +4,6 @@ set name = "Admin PM Mob" if(!holder) to_chat(src, "Error: Admin-PM-Context: Only administrators may use this command.") - return if( !ismob(M) || !M.client ) return cmd_admin_pm(M.client,null) @@ -16,7 +15,6 @@ set name = "Admin PM Name" if(!holder) to_chat(src, "Error: Admin-PM-Panel: Only administrators may use this command.") - return var/list/client/targets[0] for(var/client/T) @@ -40,7 +38,6 @@ set name = "Admin PM Key" if(!holder) to_chat(src, "Error: Admin-PM-Panel: Only administrators may use this command.") - return var/list/client/targets[0] for(var/client/T) @@ -64,7 +61,6 @@ /client/proc/cmd_admin_pm(whom, msg, type = "PM") if(prefs.muted & MUTE_ADMINHELP) to_chat(src, "Error: Private-Message: You are unable to use PM-s (muted).") - return var/client/C @@ -78,7 +74,6 @@ if(!C) if(holder) to_chat(src, "Error: Private-Message: Client not found.") - else adminhelp(msg) //admin we are replying to left. adminhelp instead return @@ -87,7 +82,6 @@ //send a warning to admins, but have a delay popup for mods if(holder.rights & R_ADMIN) to_chat(src, "\red Simultaneous PMs warning: that player has been PM'd in the last [config.simultaneous_pm_warning_timeout / 10] seconds by: [C.ckey_last_pm]") - else if(alert("That player has been PM'd in the last [config.simultaneous_pm_warning_timeout / 10] seconds by: [C.ckey_last_pm]","Simultaneous PMs warning","Continue","Cancel") == "Cancel") return*/ @@ -101,7 +95,6 @@ if(!C) if(holder) to_chat(src, "Error: Admin-PM: Client not found.") - else adminhelp(msg) //admin we are replying to has vanished, adminhelp instead return @@ -133,7 +126,6 @@ else if(!C.holder) to_chat(src, "Error: Admin-PM: Non-admin to non-admin PM communication is forbidden.") - return var/recieve_message = "" @@ -142,7 +134,6 @@ recieve_message = "-- Click the [recieve_pm_type]'s name to reply --\n" if(C.adminhelped) to_chat(C, recieve_message) - C.adminhelped = 0 //AdminPM popup for ApocStation and anybody else who wants to use it. Set it with POPUP_ADMIN_PM in config.txt ~Carn @@ -160,10 +151,8 @@ recieve_message = "[type] from-[recieve_pm_type][key_name(src, C, C.holder ? 1 : 0, type)]: [msg]" to_chat(C, recieve_message) - to_chat(src, "[send_pm_type][type] to-[key_name(C, src, holder ? 1 : 0, type)]: [msg]") - /*if(holder && !C.holder) C.last_pm_recieved = world.time C.ckey_last_pm = ckey*/ @@ -173,7 +162,6 @@ if(C.prefs.sound & SOUND_ADMINHELP) to_chat(C, 'sound/effects/adminhelp.ogg') - log_admin("PM: [key_name(src)]->[key_name(C)]: [msg]") //we don't use message_admins here because the sender/receiver might get it too for(var/client/X in admins) @@ -185,20 +173,16 @@ if("Mentorhelp") if(check_rights(R_ADMIN|R_MOD|R_MENTOR, 0, X.mob)) to_chat(X, "[type]: [key_name(src, X, 0, type)]->[key_name(C, X, 0, type)]: [msg]") - if("Adminhelp") if(check_rights(R_ADMIN|R_MOD, 0, X.mob)) to_chat(X, "[type]: [key_name(src, X, 0, type)]->[key_name(C, X, 0, type)]: [msg]") - else if(check_rights(R_ADMIN|R_MOD, 0, X.mob)) to_chat(X, "[type]: [key_name(src, X, 0, type)]->[key_name(C, X, 0, type)]: [msg]") - /client/proc/cmd_admin_irc_pm() if(prefs.muted & MUTE_ADMINHELP) to_chat(src, "Error: Private-Message: You are unable to use PM-s (muted).") - return var/msg = input(src,"Message:", "Private message to admins on IRC / 400 character limit") as text|null @@ -210,20 +194,16 @@ if(length(msg) > 400) // TODO: if message length is over 400, divide it up into seperate messages, the message length restriction is based on IRC limitations. Probably easier to do this on the bots ends. to_chat(src, "\red Your message was not sent because it was more then 400 characters find your message below for ease of copy/pasting") - to_chat(src, "\blue [msg]") - return send2adminirc("PlayerPM from [key_name(src)]: [html_decode(msg)]") to_chat(src, "IRC PM to-IRC-Admins: [msg]") - log_admin("PM: [key_name(src)]->IRC: [msg]") for(var/client/X in admins) if(X == src) continue if(check_rights(R_ADMIN|R_MOD|R_MENTOR, 0, X.mob)) to_chat(X, "PM: [key_name(src, X, 0)]->IRC-Admins: \blue [msg]") - diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm index 2cd44302a1d..3f116b0a0d5 100644 --- a/code/modules/admin/verbs/adminsay.dm +++ b/code/modules/admin/verbs/adminsay.dm @@ -14,7 +14,6 @@ if(R_ADMIN & C.holder.rights) to_chat(C, "ADMIN: [key_name(usr, 1)] ([admin_jump_link(mob, "holder")]): [msg]") - feedback_add_details("admin_verb","M") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_mod_say(msg as text) @@ -38,5 +37,4 @@ if(check_rights(R_ADMIN|R_MOD, 0, C.mob)) to_chat(C, "MOD: [key_name(usr, 1)] ([admin_jump_link(mob, C.holder)]): [msg]") - feedback_add_details("admin_verb","MS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! \ No newline at end of file diff --git a/code/modules/admin/verbs/antag-ooc.dm b/code/modules/admin/verbs/antag-ooc.dm index de28cfab042..cc33f7948f4 100644 --- a/code/modules/admin/verbs/antag-ooc.dm +++ b/code/modules/admin/verbs/antag-ooc.dm @@ -17,5 +17,4 @@ to_chat(M, "AOOC: [display_name]: [msg]") - log_ooc("(ANTAG) [key] : [msg]") diff --git a/code/modules/admin/verbs/atmosdebug.dm b/code/modules/admin/verbs/atmosdebug.dm index f6f7f985fea..e1225275e17 100644 --- a/code/modules/admin/verbs/atmosdebug.dm +++ b/code/modules/admin/verbs/atmosdebug.dm @@ -4,7 +4,6 @@ set background = 1 if(!src.holder) to_chat(src, "Only administrators may use this command.") - return feedback_add_details("admin_verb","CP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -12,27 +11,22 @@ return to_chat(usr, "Checking for disconnected pipes...") - //all plumbing - yes, some things might get stated twice, doesn't matter. for (var/obj/machinery/atmospherics/plumbing in world) if (plumbing.nodealert) to_chat(usr, "Unconnected [plumbing.name] located at [plumbing.x],[plumbing.y],[plumbing.z] ([get_area(plumbing.loc)])") - //Manifolds for (var/obj/machinery/atmospherics/pipe/manifold/pipe in world) if (!pipe.node1 || !pipe.node2 || !pipe.node3) to_chat(usr, "Unconnected [pipe.name] located at [pipe.x],[pipe.y],[pipe.z] ([get_area(pipe.loc)])") - //Pipes for (var/obj/machinery/atmospherics/pipe/simple/pipe in world) if (!pipe.node1 || !pipe.node2) to_chat(usr, "Unconnected [pipe.name] located at [pipe.x],[pipe.y],[pipe.z] ([get_area(pipe.loc)])") - to_chat(usr, "Checking for overlapping pipes...") - next_turf: for(var/turf/T in world) for(var/dir in cardinal) @@ -42,17 +36,14 @@ check++ if(check > 1) to_chat(usr, "Overlapping pipe ([pipe.name]) located at [T.x],[T.y],[T.z] ([get_area(T)])") - continue next_turf to_chat(usr, "Done") - /client/proc/powerdebug() set category = "Mapping" set name = "Check Power" if(!src.holder) to_chat(src, "Only administrators may use this command.") - return feedback_add_details("admin_verb","CPOW") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -62,9 +53,7 @@ var/obj/structure/cable/C = PN.cables[1] to_chat(usr, "Powernet with no nodes! (number [PN.number]) - example cable at [C.x], [C.y], [C.z] in area [get_area(C.loc)]") - if (!PN.cables || (PN.cables.len < 10)) if(PN.cables && (PN.cables.len > 1)) var/obj/structure/cable/C = PN.cables[1] to_chat(usr, "Powernet with fewer than 10 cables! (number [PN.number]) - example cable at [C.x], [C.y], [C.z] in area [get_area(C.loc)]") - diff --git a/code/modules/admin/verbs/custom_event.dm b/code/modules/admin/verbs/custom_event.dm index 93a8dd8abac..350ed9a8737 100644 --- a/code/modules/admin/verbs/custom_event.dm +++ b/code/modules/admin/verbs/custom_event.dm @@ -5,7 +5,6 @@ if(!holder) to_chat(src, "Only administrators may use this command.") - return var/input = input(usr, "Enter the description of the custom event. Be descriptive. To cancel the event, make this blank or hit cancel.", "Custom Event", custom_event_msg) as message|null @@ -21,14 +20,10 @@ custom_event_msg = input to_chat(world, "

      Custom Event

      ") - to_chat(world, "

      A custom event is starting. OOC Info:

      ") - to_chat(world, "[html_encode(custom_event_msg)]") - to_chat(world, "
      ") - // normal verb for players to view info /client/verb/cmd_view_custom_event() set category = "OOC" @@ -36,16 +31,10 @@ if(!custom_event_msg || custom_event_msg == "") to_chat(src, "There currently is no known custom event taking place.") - to_chat(src, "Keep in mind: it is possible that an admin has not properly set this.") - return to_chat(src, "

      Custom Event

      ") - to_chat(src, "

      A custom event is taking place. OOC Info:

      ") - to_chat(src, "[html_encode(custom_event_msg)]") - to_chat(src, "
      ") - diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm index a2663d0ba53..74596c333cc 100644 --- a/code/modules/admin/verbs/deadsay.dm +++ b/code/modules/admin/verbs/deadsay.dm @@ -11,12 +11,10 @@ if(prefs.muted & MUTE_DEADCHAT) to_chat(src, "You cannot send DSAY messages (muted).") - return if(!(prefs.toggles & CHAT_DEAD)) to_chat(src, "You have deadchat muted.") - return if (handle_spam_prevention(msg,MUTE_DEADCHAT)) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index f5ff82bc040..ddc3b4456e6 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -73,7 +73,6 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(targetselected && !hascall(target,procname)) to_chat(usr, "Error: callproc(): target has no such call [procname].") - return var/list/lst = get_callproc_args() @@ -83,7 +82,6 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(targetselected) if(!target) to_chat(usr, "Error: callproc(): owner of proc no longer exists.") - return message_admins("[key_name_admin(src)] called [target]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].") log_admin("[key_name(src)] called [target]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].") @@ -95,7 +93,6 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that returnval = call(procname)(arglist(lst)) // Pass the lst as an argument list to the proc to_chat(usr, "[procname] returned: [returnval ? returnval : "null"]") - feedback_add_details("admin_verb","APC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/callproc_datum(var/A as null|area|mob|obj|turf) @@ -111,7 +108,6 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(!hascall(A,procname)) to_chat(usr, "Error: callproc_datum(): target has no such call [procname].") - return var/list/lst = get_callproc_args() @@ -120,7 +116,6 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(!A || !IsValidSrc(A)) to_chat(usr, "Error: callproc_datum(): owner of proc no longer exists.") - return message_admins("[key_name_admin(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]") log_admin("[key_name(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]") @@ -129,7 +124,6 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that var/returnval = call(A,procname)(arglist(lst)) // Pass the lst as an argument list to the proc to_chat(usr, "[procname] returned: [returnval ? returnval : "null"]") - feedback_add_details("admin_verb","DPC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/get_callproc_args() @@ -513,59 +507,41 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that var/list/areas_without_camera = areas_all - areas_with_camera to_chat(world, "AREAS WITHOUT AN APC:") - for(var/areatype in areas_without_APC) to_chat(world, "* [areatype]") - to_chat(world, "AREAS WITHOUT AN AIR ALARM:") - for(var/areatype in areas_without_air_alarm) to_chat(world, "* [areatype]") - to_chat(world, "AREAS WITH TOO MANY APCS:") - for(var/areatype in areas_with_multiple_APCs) to_chat(world, "* [areatype]") - to_chat(world, "AREAS WITH TOO MANY AIR ALARMS:") - for(var/areatype in areas_with_multiple_air_alarms) to_chat(world, "* [areatype]") - to_chat(world, "AREAS WITHOUT A REQUEST CONSOLE:") - for(var/areatype in areas_without_RC) to_chat(world, "* [areatype]") - to_chat(world, "AREAS WITHOUT ANY LIGHTS:") - for(var/areatype in areas_without_light) to_chat(world, "* [areatype]") - to_chat(world, "AREAS WITHOUT A LIGHT SWITCH:") - for(var/areatype in areas_without_LS) to_chat(world, "* [areatype]") - to_chat(world, "AREAS WITHOUT ANY INTERCOMS:") - for(var/areatype in areas_without_intercom) to_chat(world, "* [areatype]") - to_chat(world, "AREAS WITHOUT ANY CAMERAS:") - for(var/areatype in areas_without_camera) to_chat(world, "* [areatype]") - /client/proc/cmd_admin_dress(var/mob/living/carbon/human/M in mob_list) set category = "Event" set name = "Select equipment" @@ -1191,30 +1167,22 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that switch(input("Which list?") in list("Players","Admins","Mobs","Living Mobs","Dead Mobs","Silicons","Clients","Respawnable Mobs")) if("Players") to_chat(usr, jointext(player_list,",")) - if("Admins") to_chat(usr, jointext(admins,",")) - if("Mobs") to_chat(usr, jointext(mob_list,",")) - if("Living Mobs") to_chat(usr, jointext(living_mob_list,",")) - if("Dead Mobs") to_chat(usr, jointext(dead_mob_list,",")) - if("Silicons") to_chat(usr, jointext(silicon_mob_list,",")) - if("Clients") to_chat(usr, jointext(clients,",")) - if("Respawnable Mobs") to_chat(usr, jointext(respawnable_list,",")) - /client/proc/cmd_admin_toggle_block(var/mob/M,var/block) if(!check_rights(R_SPAWN)) return diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm index abef5d0e08a..70505b8abdf 100644 --- a/code/modules/admin/verbs/diagnostics.dm +++ b/code/modules/admin/verbs/diagnostics.dm @@ -16,10 +16,8 @@ burning = 1 to_chat(usr, "\blue @[target.x],[target.y]: O:[GM.oxygen] T:[GM.toxins] N:[GM.nitrogen] C:[GM.carbon_dioxide] w [GM.temperature] Kelvin, [GM.return_pressure()] kPa [(burning)?("\red BURNING"):(null)]") - for(var/datum/gas/trace_gas in GM.trace_gases) to_chat(usr, "[trace_gas.type]: [trace_gas.moles]") - message_admins("[key_name_admin(usr)] has checked the air status of [T]") log_admin("[key_name(usr)] has checked the air status of [T]") @@ -133,10 +131,8 @@ return to_chat(usr, "Jobbans active in this round.") - for(var/t in jobban_keylist) to_chat(usr, "[t]") - message_admins("[key_name_admin(usr)] has printed the jobban log") log_admin("[key_name(usr)] has printed the jobban log") @@ -154,11 +150,9 @@ return to_chat(usr, "Jobbans active in this round.") - for(var/t in jobban_keylist) if(findtext(t, filter)) to_chat(usr, "[t]") - message_admins("[key_name_admin(usr)] has searched the jobban log for [filter]") log_admin("[key_name(usr)] has searched the jobban log for [filter]") diff --git a/code/modules/admin/verbs/dice.dm b/code/modules/admin/verbs/dice.dm index e77ef3c65fe..4df6e3107a0 100644 --- a/code/modules/admin/verbs/dice.dm +++ b/code/modules/admin/verbs/dice.dm @@ -14,11 +14,9 @@ if(alert("Do you want to inform the world about your game?",,"Yes", "No") == "Yes") to_chat(world, "

      The dice have been rolled by Gods!

      ") - var/result = roll(dice) if(alert("Do you want to inform the world about the result?",,"Yes", "No") == "Yes") to_chat(world, "

      Gods rolled [dice], result is [result]

      ") - message_admins("[key_name_admin(src)] rolled dice [dice], result is [result]", 1) \ No newline at end of file diff --git a/code/modules/admin/verbs/freeze.dm b/code/modules/admin/verbs/freeze.dm index e17e70ce637..f6d31d6bede 100644 --- a/code/modules/admin/verbs/freeze.dm +++ b/code/modules/admin/verbs/freeze.dm @@ -11,7 +11,6 @@ var/global/list/frozen_mob_list = list() set name = "Freeze" if(!holder) to_chat(src, "Error: Freeze: Only administrators may use this command.") - return if(!istype(M)) return if(!check_rights(R_ADMIN)) return @@ -28,7 +27,6 @@ var/global/list/frozen_mob_list = list() /mob/living/proc/admin_Freeze(var/client/admin) if(istype(admin)) to_chat(src, "You have been frozen by [key_name(admin)]") - message_admins("[key_name_admin(admin)] froze [key_name_admin(src)]") log_admin("[key_name(admin)] froze [key_name(src)]") @@ -45,7 +43,6 @@ var/global/list/frozen_mob_list = list() /mob/living/proc/admin_unFreeze(var/client/admin) if(istype(admin)) to_chat(src, "You have been unfrozen by [key_name(admin)]") - message_admins("\blue [key_name_admin(admin)] unfroze [key_name_admin(src)]") log_admin("[key_name(admin)] unfroze [key_name(src)]") @@ -89,12 +86,10 @@ var/global/list/frozen_mob_list = list() set name = "Freeze Mech" if(!holder) to_chat(src, "Only administrators may use this command.") - return var/obj/mecha/M = O if(!istype(M,/obj/mecha)) to_chat(src, "\red This can only be used on Mechs!") - return else if(usr) @@ -107,7 +102,6 @@ var/global/list/frozen_mob_list = list() if(M.occupant) M.removeVerb(/obj/mecha/verb/eject) to_chat(M.occupant, "You have been frozen by [key]") - message_admins("\blue [key_name_admin(usr)] froze [key_name(M.occupant)] in a [M.name]") log_admin("[key_name(usr)] froze [key_name(M.occupant)] in a [M.name]") else @@ -119,7 +113,6 @@ var/global/list/frozen_mob_list = list() if(M.occupant) M.addVerb(/obj/mecha/verb/eject) to_chat(M.occupant, "You have been unfrozen by [key]") - message_admins("\blue [key_name_admin(usr)] unfroze [key_name(M.occupant)] in a [M.name]") log_admin("[key_name(usr)] unfroze [M.occupant.name]/[M.occupant.ckey] in a [M.name]") else diff --git a/code/modules/admin/verbs/getlogs.dm b/code/modules/admin/verbs/getlogs.dm index fe1e0bdf416..48507a55352 100644 --- a/code/modules/admin/verbs/getlogs.dm +++ b/code/modules/admin/verbs/getlogs.dm @@ -25,18 +25,15 @@ if(!src.holder) to_chat(src, "Only Admins may use this command.") - return var/client/target = input(src,"Choose somebody to grant access to the server's runtime logs (permissions expire at the end of each round):","Grant Permissions",null) as null|anything in clients if(!istype(target,/client)) to_chat(src, "Error: giveruntimelog(): Client not found.") - return target.verbs |= /client/proc/getruntimelog to_chat(target, "You have been granted access to runtime logs. Please use them responsibly or risk being banned.") - return @@ -58,7 +55,6 @@ src << ftp(file(path)) to_chat(src, "Attempting to send file, this may take a fair few minutes if the file is very large.") - return @@ -80,7 +76,6 @@ src << ftp(file(path)) to_chat(src, "Attempting to send file, this may take a fair few minutes if the file is very large.") - return @@ -114,7 +109,6 @@ else to_chat(src, "Error: view_atk_log(): File not found/Invalid path([path]).") - return usr << run(file(path)) diff --git a/code/modules/admin/verbs/honksquad.dm b/code/modules/admin/verbs/honksquad.dm index a2377a2c3a6..75fc6af84d9 100644 --- a/code/modules/admin/verbs/honksquad.dm +++ b/code/modules/admin/verbs/honksquad.dm @@ -6,15 +6,12 @@ var/global/sent_honksquad = 0 /client/proc/honksquad() if(!ticker) to_chat(usr, "The game hasn't started yet!") - return if(world.time < 6000) to_chat(usr, "There are [(6000-world.time)/10] seconds remaining before it may be called.") - return if(sent_honksquad == 1) to_chat(usr, "Clown Planet has already dispatched a HONKsquad.") - return if(alert("Do you want to send in the HONKsquad? Once enabled, this is irreversible.",,"Yes","No")!="Yes") return @@ -29,7 +26,6 @@ var/global/sent_honksquad = 0 if(sent_honksquad) to_chat(usr, "Looks like someone beat you to it. HONK.") - return sent_honksquad = 1 @@ -70,7 +66,6 @@ var/global/sent_honksquad = 0 to_chat(new_honksquad, "\blue You are a HONKsquad. [!honk_leader_selected?"commando":"LEADER"] in the service of Clown Planet. You are called in cases of exteme low levels of HONK. You are NOT authorized to kill. \nYour current mission is: \red[input]") - honksquad_number-- diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index 0dac4624f51..c59cd417c91 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -189,7 +189,6 @@ var/list/admin_verbs_show_debug_verbs = list( atom_list += A to_chat(world, "There are [count] objects of type [type_path] on z-level [num_level].") - feedback_add_details("admin_verb","mOBJZ") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/count_objects_all() @@ -211,5 +210,4 @@ var/list/admin_verbs_show_debug_verbs = list( count++ to_chat(world, "There are [count] objects of type [type_path] in the game world.") - feedback_add_details("admin_verb","mOBJ") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/massmodvar.dm b/code/modules/admin/verbs/massmodvar.dm index 701ff9e0ad8..185d513d2fc 100644 --- a/code/modules/admin/verbs/massmodvar.dm +++ b/code/modules/admin/verbs/massmodvar.dm @@ -31,7 +31,6 @@ for(var/p in forbidden_varedit_object_types) if( istype(O,p) ) to_chat(usr, "It is forbidden to edit this object's variables.") - return var/list/names = list() @@ -58,51 +57,41 @@ if(isnull(var_value)) to_chat(usr, "Unable to determine variable type.") - else if(isnum(var_value)) to_chat(usr, "Variable appears to be NUM.") - default = "num" dir = 1 else if(istext(var_value)) to_chat(usr, "Variable appears to be TEXT.") - default = "text" else if(isloc(var_value)) to_chat(usr, "Variable appears to be REFERENCE.") - default = "reference" else if(isicon(var_value)) to_chat(usr, "Variable appears to be ICON.") - var_value = "\icon[var_value]" default = "icon" else if(istype(var_value,/atom) || istype(var_value,/datum)) to_chat(usr, "Variable appears to be TYPE.") - default = "type" else if(istype(var_value,/list)) to_chat(usr, "Variable appears to be LIST.") - default = "list" else if(istype(var_value,/client)) to_chat(usr, "Variable appears to be CLIENT.") - default = "cancel" else to_chat(usr, "Variable appears to be FILE.") - default = "file" to_chat(usr, "Variable contains: [var_value]") - if(dir) switch(var_value) if(1) @@ -126,7 +115,6 @@ if(dir) to_chat(usr, "If a direction, direction is: [dir]") - var/class = input("What kind of variable?","Variable Type",default) as null|anything in list("text", "num","type","icon","file","edit referenced object","restore to default") diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm index 2e7ced5f038..966e584f15e 100644 --- a/code/modules/admin/verbs/modifyvariables.dm +++ b/code/modules/admin/verbs/modifyvariables.dm @@ -19,7 +19,6 @@ var/list/forbidden_varedit_object_types = list( if (ticker == null) to_chat(src, "Game hasn't started yet.") - else src.modify_variables(ticker) feedback_add_details("admin_verb","ETV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -56,7 +55,6 @@ var/list/forbidden_varedit_object_types = list( if(!var_value) to_chat(src, "[type_text] is not a valid path!") - if("reference") var_value = input("Select reference:","Reference") as null|mob|obj|turf|area in world @@ -110,7 +108,6 @@ var/list/forbidden_varedit_object_types = list( if(!var_value) to_chat(src, "[type_text] is not a valid path!") - if("reference") var_value = input("Select reference:","Reference") as mob|obj|turf|area in world @@ -140,7 +137,6 @@ var/list/forbidden_varedit_object_types = list( if(!istype(L,/list)) to_chat(src, "Not a List.") - if(L.len > 1000) var/confirm = alert(src, "The list you're trying to edit is very long, continuing may crash the server.", "Warning", "Continue", "Abort") if(confirm != "Continue") @@ -155,7 +151,6 @@ var/list/forbidden_varedit_object_types = list( assoc = 1 //This is pretty weak test but i can't think of anything else to_chat(usr, "List appears to be associative.") - var/list/names = null if(!assoc) names = sortList(L) @@ -188,14 +183,12 @@ var/list/forbidden_varedit_object_types = list( default = variable_to_type(variable) to_chat(usr, "Variable contains: [variable]") - if(default == "num") dir = dir2text(variable) if(dir) to_chat(usr, "If a direction, direction is: [dir]") - var/class = "text" var/list/allowed_types = list("text", "num","type", "type from text", "reference","mob reference", "icon","file","list","edit referenced object","restore to default","DELETE FROM LIST") if(src.holder && src.holder.marked_datum) @@ -284,12 +277,10 @@ var/list/forbidden_varedit_object_types = list( for(var/p in forbidden_varedit_object_types) if( istype(O,p) ) to_chat(usr, "It is forbidden to edit this object's variables.") - return if(istype(O, /client) && (param_var_name == "ckey" || param_var_name == "key")) to_chat(usr, "You cannot edit ckeys on client objects.") - return var/class @@ -299,7 +290,6 @@ var/list/forbidden_varedit_object_types = list( if(param_var_name) if(!param_var_name in O.vars) to_chat(src, "A variable with this name ([param_var_name]) doesn't exist in this atom ([O])") - return if(param_var_name == "holder" || (param_var_name in locked)) @@ -341,13 +331,11 @@ var/list/forbidden_varedit_object_types = list( var_value = "\icon[var_value]" to_chat(usr, "Variable contains: [var_value]") - if(dir) dir = dir2text(var_value) if(dir) to_chat(usr, "If a direction, direction is: [dir]") - var/list/allowed_types = list("text", "num","type","reference","mob reference", "path", "matrix", "icon","file","list","edit referenced object","restore to default") if(src.holder && src.holder.marked_datum) allowed_types += "marked datum ([holder.marked_datum.type])" @@ -415,7 +403,6 @@ var/list/forbidden_varedit_object_types = list( var/var_new = text2path(path_text) if(!var_new && path_text != null) // So aborting doesn't bother the VVer to_chat(usr, "[path_text] does not appear to be a valid path.") - return O.vars[variable] = var_new @@ -424,7 +411,6 @@ var/list/forbidden_varedit_object_types = list( var/var_new = text2matrix(matrix_text) if(!var_new && matrix_text != null) to_chat(usr, "[matrix_text] is not a valid matrix string.") - return O.vars[variable] = var_new var_as_text = "matrix([matrix_text])" @@ -464,62 +450,50 @@ var/list/forbidden_varedit_object_types = list( var/class if(isnull(variable)) to_chat(usr, "Unable to determine variable type.") - class = null else if(isnum(variable)) to_chat(usr, "Variable appears to be NUM.") - class = "num" else if(istext(variable)) to_chat(usr, "Variable appears to be TEXT.") - class = "text" else if(isloc(variable)) to_chat(usr, "Variable appears to be REFERENCE.") - class = "reference" else if(isicon(variable)) to_chat(usr, "Variable appears to be ICON.") - variable = "\icon[variable]" class = "icon" else if(istype(variable,/matrix)) to_chat(usr, "Variable appears to be MATRIX") - class = "matrix" else if(istype(variable,/atom) || istype(variable,/datum)) to_chat(usr, "Variable appears to be TYPE.") - class = "type" else if(istype(variable,/list)) to_chat(usr, "Variable appears to be LIST.") - class = "list" else if(istype(variable,/client)) to_chat(usr, "Variable appears to be CLIENT.") - class = "cancel" else if(ispath(variable)) to_chat(usr, "Variable appears to be PATH.") - class = "path" else if(isfile(variable)) to_chat(usr, "Variable appears to be FILE.") - class = "file" else to_chat(usr, "Variable type is UNKNOWN.") - class = null return class \ No newline at end of file diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index a5f97673afc..022cd29105a 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -379,7 +379,6 @@ client/proc/one_click_antag() to_chat(new_syndicate_commando, "\blue You are an Elite Syndicate. [!syndicate_leader_selected?"commando":"LEADER"] in the service of the Syndicate. \nYour current mission is: \red [input]") - numagents-- if(numagents >= 6) return 0 @@ -484,10 +483,8 @@ client/proc/one_click_antag() new_vox.key = theghost.key to_chat(new_vox, "\blue You are a Vox Primalis, fresh out of the Shoal. Your ship has arrived at the Tau Ceti system hosting the NSV Exodus... or was it the Luna? NSS? Utopia? Nobody is really sure, but everyong is raring to start pillaging! Your current goal is: \red [input]") - to_chat(new_vox, "\red Don't forget to turn on your nitrogen internals!") - raiders-- if(raiders > max_raiders) return 0 @@ -617,7 +614,6 @@ client/proc/one_click_antag() teamOneMembers-- to_chat(newMember, "You are a member of the GREEN Thunderdome team! Gear up and help your team destroy the red team!") - if(L.name == "tdome2") if(teamTwoMembers<=0) break @@ -639,7 +635,6 @@ client/proc/one_click_antag() newMember.key = theghost.key teamTwoMembers-- to_chat(newMember, "You are a member of the RED Thunderdome team! Gear up and help your team destroy the green team!") - else return 0 return 1 \ No newline at end of file diff --git a/code/modules/admin/verbs/onlyone.dm b/code/modules/admin/verbs/onlyone.dm index 052b00b69e4..61c7b4f5790 100644 --- a/code/modules/admin/verbs/onlyone.dm +++ b/code/modules/admin/verbs/onlyone.dm @@ -22,11 +22,9 @@ H.mind.objectives += hijack_objective to_chat(H, "You are a Highlander. Kill all other Highlanders. There can be only one.") - var/obj_count = 1 for(var/datum/objective/OBJ in H.mind.objectives) to_chat(H, "Objective #[obj_count]: [OBJ.explanation_text]") - obj_count++ for (var/obj/item/I in H) @@ -59,7 +57,6 @@ nologevent = 1 to_chat(world, sound('sound/music/THUNDERDOME.ogg')) - /client/proc/only_me() if(!ticker) alert("The game hasn't started yet!") @@ -77,11 +74,9 @@ H.mind.objectives += hijack_objective to_chat(H, "You are the multiverse summoner. Activate your blade to summon copies of yourself from another universe to fight by your side.") - var/obj_count = 1 for(var/datum/objective/OBJ in H.mind.objectives) to_chat(H, "Objective #[obj_count]: [OBJ.explanation_text]") - obj_count++ var/obj/item/slot_item_ID = H.get_item_by_slot(slot_wear_id) @@ -107,4 +102,3 @@ log_admin("[key_name(usr)] used there can be only me.") nologevent = 1 to_chat(world, sound('sound/music/THUNDERDOME.ogg')) - diff --git a/code/modules/admin/verbs/onlyoneteam.dm b/code/modules/admin/verbs/onlyoneteam.dm index cdf276d03a6..6d5c11e3a4b 100644 --- a/code/modules/admin/verbs/onlyoneteam.dm +++ b/code/modules/admin/verbs/onlyoneteam.dm @@ -23,7 +23,6 @@ to_chat(H, "You are part of the [station_name()] dodgeball tournament. Throw dodgeballs at crewmembers wearing a different color than you. OOC: Use THROW on an EMPTY-HAND to catch thrown dodgeballs.") - H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(H), slot_l_ear) H.equip_to_slot_or_del(new /obj/item/weapon/beach_ball/dodgeball(H), slot_r_hand) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes) @@ -77,15 +76,12 @@ var/mob/A = H.LAssailant if((H in team_alpha) && (A in team_alpha)) to_chat(A, "He's on your team!") - return else if((H in team_bravo) && (A in team_bravo)) to_chat(A, "He's on your team!") - return else if(!A in team_alpha && !A in team_bravo) to_chat(A, "You're not part of the dodgeball game, sorry!") - return else playsound(src, 'sound/items/dodgeball.ogg', 50, 1) diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index 442478229f6..c363ed51d72 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -19,7 +19,6 @@ var/list/sounds_cache = list() if(M.client.prefs.sound & SOUND_MIDI) to_chat(M, uploaded_sound) - feedback_add_details("admin_verb","PGS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -89,11 +88,9 @@ var/list/sounds_cache = list() if(M.client.midis) to_chat(M, 'cubanpetetime.ogg') - for(var/mob/living/carbon/human/CP in world) if(CP.real_name=="Cuban Pete" && CP.key!="Rosham") to_chat(CP, "Your body can't contain the rhumba beat") - CP.gib() @@ -108,7 +105,6 @@ var/list/sounds_cache = list() to_chat(M, 'bananaphone.ogg') - client/proc/space_asshole() set category = "Event" set name = "Space Asshole" @@ -120,7 +116,6 @@ client/proc/space_asshole() to_chat(M, 'sound/music/space_asshole.ogg') - client/proc/honk_theme() set category = "Event" set name = "Honk" @@ -130,4 +125,3 @@ client/proc/honk_theme() if(M.client) if(M.client.midis) to_chat(M, 'honk_theme.ogg')*/ - diff --git a/code/modules/admin/verbs/possess.dm b/code/modules/admin/verbs/possess.dm index 208a69df52e..54d39d5a5fa 100644 --- a/code/modules/admin/verbs/possess.dm +++ b/code/modules/admin/verbs/possess.dm @@ -5,7 +5,6 @@ if(istype(O,/obj/singularity)) if(config.forbid_singulo_possession) to_chat(usr, "It is forbidden to possess singularities.") - return var/turf/T = get_turf(O) diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index f70940e9ae8..0ef6a64373f 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -8,7 +8,6 @@ if(usr.client) if(usr.client.prefs.muted & MUTE_PRAY) to_chat(usr, "\red You cannot pray (muted).") - return if(src.client.handle_spam_prevention(msg,MUTE_PRAY)) return @@ -20,10 +19,8 @@ if(check_rights(R_EVENT,0,X.mob)) to_chat(X, msg) - to_chat(usr, "Your prayers have been received by the gods.") - feedback_add_details("admin_verb","PR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //log_admin("HELP: [key_name(src)]: [msg]") @@ -35,7 +32,6 @@ if(R_EVENT & X.holder.rights) to_chat(X, msg) - /proc/Syndicate_announce(var/text , var/mob/Sender) var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN)) msg = "\blue SYNDICATE: [key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender, "holder")]) (CA) (BSA) (REPLY): [msg]" @@ -44,7 +40,6 @@ if(check_rights(R_EVENT,0,X.mob)) to_chat(X, msg) - /proc/HONK_announce(var/text , var/mob/Sender) var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN)) msg = "\blue HONK: [key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender, "holder")]) (CA) (BSA) (RPLY): [msg]" @@ -53,7 +48,6 @@ if(R_EVENT & X.holder.rights) to_chat(X, msg) - /proc/ERT_Announce(var/text , var/mob/Sender) var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN)) msg = "\blue ERT REQUEST: [key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender, "holder")]) (CA) (BSA) (REPLY): [msg]" @@ -62,7 +56,6 @@ if(check_rights(R_EVENT,0,X.mob)) to_chat(X, msg) - /proc/Nuke_request(text , mob/Sender) var/nuke_code = get_nuke_code() var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN)) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 71afd3eeb0b..c236432e9d2 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -40,7 +40,6 @@ prisoner.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(prisoner), slot_shoes) spawn(50) to_chat(M, "\red You have been sent to the prison station!") - log_admin("[key_name(usr)] sent [key_name(M)] to the prison station.") message_admins("\blue [key_name_admin(usr)] sent [key_name_admin(M)] to the prison station.", 1) feedback_add_details("admin_verb","PRISON") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -64,7 +63,6 @@ if(usr.client.holder) to_chat(M, "\bold You hear a voice in your head... \italic [msg]") - log_admin("SubtlePM: [key_name(usr)] -> [key_name(M)] : [msg]") message_admins("\blue \bold SubtleMessage: [key_name_admin(usr)] -> [key_name_admin(M)] : [msg]", 1) feedback_add_details("admin_verb","SMS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -95,14 +93,12 @@ if(missing_ages) to_chat(src, "Some accounts did not have proper ages set in their clients. This function requires database to be present") - if(msg != "") src << browse(msg, "window=Player_age_check") else to_chat(src, "No matches for that age range found.") - /client/proc/cmd_admin_world_narrate() // Allows administrators to fluff events a little easier -- TLE set category = "Event" set name = "Global Narrate" @@ -115,7 +111,6 @@ if (!msg) return to_chat(world, "[msg]") - log_admin("GlobalNarrate: [key_name(usr)] : [msg]") message_admins("\blue \bold GlobalNarrate: [key_name_admin(usr)]: [msg]
      ", 1) feedback_add_details("admin_verb","GLN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -139,7 +134,6 @@ return to_chat(M, msg) - log_admin("DirectNarrate: [key_name(usr)] to ([key_name(M)]): [msg]") message_admins("\blue \bold DirectNarrate: [key_name_admin(usr)] to ([key_name_admin(M)]): [msg]
      ", 1) feedback_add_details("admin_verb","DIRN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -154,7 +148,6 @@ M.status_flags ^= GODMODE to_chat(usr, "\blue Toggled [(M.status_flags & GODMODE) ? "ON" : "OFF"]") - log_admin("[key_name(usr)] has toggled [key_name(M)]'s nodamage to [(M.status_flags & GODMODE) ? "On" : "Off"]") message_admins("[key_name_admin(usr)] has toggled [key_name_admin(M)]'s nodamage to [(M.status_flags & GODMODE) ? "On" : "Off"]", 1) feedback_add_details("admin_verb","GOD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -169,11 +162,9 @@ proc/cmd_admin_mute(mob/M as mob, mute_type, automute = 0) return if(!check_rights(R_ADMIN|R_MOD)) to_chat(usr, "Error: cmd_admin_mute: You don't have permission to do this.") - return if(!M.client) to_chat(usr, "Error: cmd_admin_mute: This mob doesn't have a client tied to it.") - if(!M.client) return @@ -195,7 +186,6 @@ proc/cmd_admin_mute(mob/M as mob, mute_type, automute = 0) log_admin("SPAM AUTOMUTE: [muteunmute] [key_name(M)] from [mute_string]") message_admins("SPAM AUTOMUTE: [muteunmute] [key_name_admin(M)] from [mute_string].", 1) to_chat(M, "You have been [muteunmute] from [mute_string] by the SPAM AUTOMUTE system. Contact an admin.") - feedback_add_details("admin_verb","AUTOMUTE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return @@ -209,7 +199,6 @@ proc/cmd_admin_mute(mob/M as mob, mute_type, automute = 0) log_admin("[key_name(usr)] has [muteunmute] [key_name(M)] from [mute_string]") message_admins("[key_name_admin(usr)] has [muteunmute] [key_name_admin(M)] from [mute_string].", 1) to_chat(M, "You have been [muteunmute] from [mute_string].") - feedback_add_details("admin_verb","MUTE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_add_random_ai_law() @@ -247,10 +236,8 @@ proc/cmd_admin_mute(mob/M as mob, mute_type, automute = 0) g.antagHUD = 0 // Disable it on those that have it enabled g.has_enabled_antagHUD = 2 // We'll allow them to respawn to_chat(g, "\red The Administrator has disabled AntagHUD ") - config.antag_hud_allowed = 0 to_chat(src, "\red AntagHUD usage has been disabled") - action = "disabled" else for(var/mob/dead/observer/g in get_ghosts()) @@ -258,13 +245,11 @@ proc/cmd_admin_mute(mob/M as mob, mute_type, automute = 0) g.verbs += /mob/dead/observer/verb/toggle_antagHUD to_chat(g, "\blue The Administrator has enabled AntagHUD ")// Notify all observers they can now use AntagHUD - config.antag_hud_allowed = 1 action = "enabled" to_chat(src, "\blue AntagHUD usage has been enabled") - log_admin("[key_name(usr)] has [action] antagHUD usage for observers") message_admins("Admin [key_name_admin(usr)] has [action] antagHUD usage for observers", 1) @@ -280,24 +265,19 @@ proc/cmd_admin_mute(mob/M as mob, mute_type, automute = 0) if(config.antag_hud_restricted) for(var/mob/dead/observer/g in get_ghosts()) to_chat(g, "\blue The administrator has lifted restrictions on joining the round if you use AntagHUD") - action = "lifted restrictions" config.antag_hud_restricted = 0 to_chat(src, "\blue AntagHUD restrictions have been lifted") - else for(var/mob/dead/observer/g in get_ghosts()) to_chat(g, "\red The administrator has placed restrictions on joining the round if you use AntagHUD") - to_chat(g, "\red Your AntagHUD has been disabled, you may choose to re-enabled it but will be under restrictions ") - g.antagHUD = 0 g.has_enabled_antagHUD = 0 action = "placed restrictions" config.antag_hud_restricted = 1 to_chat(src, "\red AntagHUD restrictions have been enabled") - log_admin("[key_name(usr)] has [action] on joining the round if they use AntagHUD") message_admins("Admin [key_name_admin(usr)] has [action] on joining the round if they use AntagHUD", 1) @@ -326,7 +306,6 @@ Traitors and the like can also be revived with the previous role mostly intact. if(!G_found)//If a ghost was not found. to_chat(usr, "There is no active key like that in the game or the person is not currently a ghost.") - return if(G_found.mind && !G_found.mind.active) //mind isn't currently in use by someone/something @@ -351,7 +330,6 @@ Traitors and the like can also be revived with the previous role mostly intact. G_found.mind.transfer_to(new_xeno) //be careful when doing stuff like this! I've already checked the mind isn't in use new_xeno.key = G_found.key to_chat(new_xeno, "You have been fully respawned. Enjoy the game.") - message_admins("\blue [key_name_admin(usr)] has respawned [new_xeno.key] as a filthy xeno.", 1) return //all done. The ghost is auto-deleted @@ -458,7 +436,6 @@ Traitors and the like can also be revived with the previous role mostly intact. to_chat(new_character, "You have been fully respawned. Enjoy the game.") - feedback_add_details("admin_verb","RSPCH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return new_character @@ -477,7 +454,6 @@ Traitors and the like can also be revived with the previous role mostly intact. ckey = input("Pick the player you want to respawn as a xeno.", "Suitable Candidates") as null|anything in candidates else to_chat(usr, "Error: create_xeno(): no suitable candidates.") - if(!istext(ckey)) return 0 var/alien_caste = input(usr, "Please choose which caste to spawn.","Pick a caste",null) as null|anything in list("Queen","Hunter","Sentinel","Drone","Larva") @@ -510,7 +486,6 @@ Traitors and the like can also be revived with the previous role mostly intact. if(!any) if(notify) to_chat(src, "There doesn't appear to be any ghosts for you to select.") - return for(var/mob/M in mobs) @@ -586,7 +561,6 @@ Traitors and the like can also be revived with the previous role mostly intact. if("No") to_chat(world, "\red [from] available at all communications consoles.") - for (var/obj/machinery/computer/communications/C in machines) if(! (C.stat & (BROKEN|NOPOWER) ) ) var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( C.loc ) @@ -607,7 +581,6 @@ Traitors and the like can also be revived with the previous role mostly intact. if("No") to_chat(world, "\red New Nanotrasen Update available at all communication consoles.") - for (var/obj/machinery/computer/communications/C in machines) if(! (C.stat & (BROKEN|NOPOWER) ) ) var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( C.loc ) @@ -618,7 +591,6 @@ Traitors and the like can also be revived with the previous role mostly intact. C.messagetext.Add(P.info) // to_chat(world, sound('sound/AI/commandreport.ogg')) - log_admin("[key_name(src)] has created a communications report: [input]") message_admins("[key_name_admin(src)] has created a communications report", 1) feedback_add_details("admin_verb","CCR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -651,7 +623,6 @@ Traitors and the like can also be revived with the previous role mostly intact. if(job_master) for(var/datum/job/job in job_master.occupations) to_chat(src, "[job.title]: [job.total_positions]") - feedback_add_details("admin_verb","LFS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_explosion(atom/O as obj|mob|turf in view()) @@ -758,7 +729,6 @@ Traitors and the like can also be revived with the previous role mostly intact. var/list/L = M.get_contents() for(var/t in L) to_chat(usr, "[t]") - feedback_add_details("admin_verb","CC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/toggle_view_range() @@ -841,10 +811,8 @@ Traitors and the like can also be revived with the previous role mostly intact. return to_chat(usr, text("\red Attack Log for []", mob)) - for(var/t in M.attack_log) to_chat(usr, t) - feedback_add_details("admin_verb","ATTL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -858,14 +826,12 @@ Traitors and the like can also be revived with the previous role mostly intact. if (ticker && ticker.mode) to_chat(usr, "Nope you can't do this, the game's already started. This only works before rounds!") - return if(ticker.random_players) ticker.random_players = 0 message_admins("Admin [key_name_admin(usr)] has disabled \"Everyone is Special\" mode.", 1) to_chat(usr, "Disabled.") - return @@ -879,10 +845,8 @@ Traitors and the like can also be revived with the previous role mostly intact. if(notifyplayers == "Yes") to_chat(world, "\blue Admin [usr.key] has forced the players to have completely random identities!") - to_chat(usr, "Remember: you can always disable the randomness by using the verb again, assuming the round hasn't started yet.") - ticker.random_players = 1 feedback_add_details("admin_verb","MER") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -897,12 +861,10 @@ Traitors and the like can also be revived with the previous role mostly intact. if(!config.allow_random_events) config.allow_random_events = 1 to_chat(usr, "Random events enabled") - message_admins("Admin [key_name_admin(usr)] has enabled random events.", 1) else config.allow_random_events = 0 to_chat(usr, "Random events disabled") - message_admins("Admin [key_name_admin(usr)] has disabled random events.", 1) feedback_add_details("admin_verb","TRE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -917,13 +879,11 @@ Traitors and the like can also be revived with the previous role mostly intact. if(ticker.mode.ert_disabled) ticker.mode.ert_disabled = 0 to_chat(usr, "\blue ERT has been Enabled.") - log_admin("Admin [key_name(src)] has enabled ERT calling.") message_admins("Admin [key_name_admin(usr)] has enabled ERT calling.", 1) else ticker.mode.ert_disabled = 1 to_chat(usr, "\red ERT has been Disabled.") - log_admin("Admin [key_name(src)] has disabled ERT calling.") message_admins("Admin [key_name_admin(usr)] has disabled ERT calling.", 1) diff --git a/code/modules/admin/verbs/striketeam.dm b/code/modules/admin/verbs/striketeam.dm index ed201afbc1c..a5b98bc888c 100644 --- a/code/modules/admin/verbs/striketeam.dm +++ b/code/modules/admin/verbs/striketeam.dm @@ -6,11 +6,9 @@ var/global/sent_strike_team = 0 /client/proc/strike_team() if(!ticker) to_chat(usr, "The game hasn't started yet!") - return if(sent_strike_team == 1) to_chat(usr, "CentComm is already sending a team.") - return if(alert("Do you want to send in the CentComm death squad? Once enabled, this is irreversible.",,"Yes","No")!="Yes") return @@ -25,7 +23,6 @@ var/global/sent_strike_team = 0 if(sent_strike_team) to_chat(usr, "Looks like someone beat you to it.") - return sent_strike_team = 1 @@ -76,7 +73,6 @@ var/global/sent_strike_team = 0 to_chat(new_commando, "\blue You are a Special Ops. [!leader_selected?"commando":"LEADER"] in the service of Central Command. Check the table ahead for detailed instructions.\nYour current mission is: \red[input]") - commando_number-- //Spawns the rest of the commando gear. diff --git a/code/modules/admin/verbs/striketeam_syndicate.dm b/code/modules/admin/verbs/striketeam_syndicate.dm index fec7441299c..6131962b881 100644 --- a/code/modules/admin/verbs/striketeam_syndicate.dm +++ b/code/modules/admin/verbs/striketeam_syndicate.dm @@ -8,7 +8,6 @@ var/global/sent_syndicate_strike_team = 0 set desc = "Spawns a squad of commandos in the Syndicate Mothership if you want to run an admin event." if(!src.holder) to_chat(src, "Only administrators may use this command.") - return if(!ticker) alert("The game hasn't started yet!") @@ -29,7 +28,6 @@ var/global/sent_syndicate_strike_team = 0 if(sent_syndicate_strike_team) to_chat(src, "Looks like someone beat you to it.") - return sent_syndicate_strike_team = 1 @@ -82,7 +80,6 @@ var/global/sent_syndicate_strike_team = 0 to_chat(new_syndicate_commando, "\blue You are an Elite Syndicate. [!syndicate_leader_selected?"commando":"LEADER"] in the service of the Syndicate. \nYour current mission is: \red[input]") - syndicate_commando_number-- //Spawns the rest of the commando gear. diff --git a/code/modules/admin/verbs/ticklag.dm b/code/modules/admin/verbs/ticklag.dm index aec66031cc4..cabf767b620 100644 --- a/code/modules/admin/verbs/ticklag.dm +++ b/code/modules/admin/verbs/ticklag.dm @@ -22,4 +22,3 @@ to_chat(src, "\red Error: ticklag(): Invalid world.ticklag value. No changes made.") - diff --git a/code/modules/admin/verbs/tripAI.dm b/code/modules/admin/verbs/tripAI.dm index 358dbb46ce0..6c95873a7da 100644 --- a/code/modules/admin/verbs/tripAI.dm +++ b/code/modules/admin/verbs/tripAI.dm @@ -4,23 +4,19 @@ if(ticker.current_state > GAME_STATE_PREGAME) to_chat(usr, "This option is currently only usable during pregame. This may change at a later date.") - return if(job_master && ticker) var/datum/job/job = job_master.GetJob("AI") if(!job) to_chat(usr, "Unable to locate the AI job") - return if(ticker.triai) ticker.triai = 0 to_chat(usr, "Only one AI will be spawned at round start.") - message_admins("\blue [key_name_admin(usr)] has toggled off triple AIs at round start.", 1) else ticker.triai = 1 to_chat(usr, "There will be an AI Triumvirate at round start.") - message_admins("\blue [key_name_admin(usr)] has toggled on triple AIs at round start.", 1) return diff --git a/code/modules/admin/watchlist.dm b/code/modules/admin/watchlist.dm index a3368f060ea..1ac267f1037 100644 --- a/code/modules/admin/watchlist.dm +++ b/code/modules/admin/watchlist.dm @@ -13,14 +13,12 @@ return if(!query_watchfind.NextRow()) to_chat(usr, "[new_ckey] has not been seen before, you can only add known players.") - return else target_ckey = new_ckey var/target_sql_ckey = sanitizeSQL(target_ckey) if(check_watchlist(target_sql_ckey)) to_chat(usr, "[target_sql_ckey] is already on the watchlist.") - return var/reason = input(usr,"Please state the reason","Reason") as message|null if(!reason) diff --git a/code/modules/arcade/arcade_base.dm b/code/modules/arcade/arcade_base.dm index 8922f7ce787..2835d2451e3 100644 --- a/code/modules/arcade/arcade_base.dm +++ b/code/modules/arcade/arcade_base.dm @@ -24,21 +24,16 @@ ..(user) if(freeplay) to_chat(user, "Someone enabled freeplay on this machine!") - else if(token_price) to_chat(user, "\The [src.name] costs [token_price] credits per play.") - if(!tokens) to_chat(user, "\The [src.name] has no available play credits. Better feed the machine!") - else if(tokens == 1) to_chat(user, "\The [src.name] has only 1 play credit left!") - else to_chat(user, "\The [src.name] has [tokens] play credits!") - /obj/machinery/arcade/attack_hand(mob/user as mob) if(..()) if(in_use && src == user.machine) //this one checks if they fell down/died and closes the game @@ -53,7 +48,6 @@ return if(!tokens && !freeplay) to_chat(user, "\The [src.name] doesn't have enough credits to play! Pay first!") - return if(!in_use && (tokens || freeplay)) in_use = 1 @@ -62,7 +56,6 @@ if(in_use) if(src != user.machine) to_chat(user, "Someone else is already playing this machine, please wait your turn!") - return /obj/machinery/arcade/attackby(var/obj/item/O as obj, var/mob/user as mob, params) @@ -70,7 +63,6 @@ playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) panel_open = !panel_open to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.") - update_icon() return if(!freeplay) @@ -93,7 +85,6 @@ /obj/machinery/arcade/proc/pay_with_cash(var/obj/item/weapon/spacecash/cashmoney, var/mob/user) if(cashmoney.get_total() < token_price) to_chat(user, "\icon[cashmoney] That is not enough money.") - return 0 visible_message("[usr] inserts a credit chip into [src].") var/left = cashmoney.get_total() - token_price @@ -108,12 +99,10 @@ var/datum/money_account/customer_account = attempt_account_access_nosec(I.associated_account_number) if (!customer_account) to_chat(user, "Error: Unable to access account. Please contact technical support if problem persists.") - return 0 if(customer_account.suspended) to_chat(user, "Unable to access account: account suspended.") - return 0 // Have the customer punch in the PIN before checking if there's enough money. Prevents people from figuring out acct is @@ -124,12 +113,10 @@ if(!customer_account) to_chat(user, "Unable to access account: incorrect credentials.") - return 0 if(token_price > customer_account.money) to_chat(user, "Insufficient funds in account.") - return 0 else // Okay to move the money at this point diff --git a/code/modules/arcade/prize_counter.dm b/code/modules/arcade/prize_counter.dm index 0b789f02b46..5f66881cea6 100644 --- a/code/modules/arcade/prize_counter.dm +++ b/code/modules/arcade/prize_counter.dm @@ -39,13 +39,11 @@ qdel(T) else to_chat(user, "\The [T] seems stuck to your hand!") - return if(istype(O, /obj/item/weapon/screwdriver) && anchored) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) panel_open = !panel_open to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.") - update_icon() return if(panel_open) @@ -182,11 +180,9 @@ td.cost.toomuch { return if(!global_prizes.PlaceOrder(src, itemID)) to_chat(usr, "Unable to complete the exchange.") - else to_chat(usr, "You've successfully purchased the item.") - interact(usr) return diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm index a7a688a9d50..9a61921764d 100644 --- a/code/modules/assembly/assembly.dm +++ b/code/modules/assembly/assembly.dm @@ -115,7 +115,6 @@ holder = new/obj/item/device/assembly_holder(get_turf(src)) if(holder.attach(A,src,user)) to_chat(user, "\blue You attach \the [A] to \the [src]!") - return 1 return 0 @@ -129,10 +128,8 @@ if(istype(W, /obj/item/weapon/screwdriver)) if(toggle_secure()) to_chat(user, "\blue \The [src] is ready!") - else to_chat(user, "\blue \The [src] can now be attached!") - return ..() return @@ -148,12 +145,10 @@ if((in_range(src, user) || loc == user)) if(secured) to_chat(user, "\The [src] is ready!") - else to_chat(user, "\The [src] can be attached!") - attack_self(mob/user as mob) if(!user) return 0 user.set_machine(src) diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm index 50f39995fe0..3bf0775473c 100644 --- a/code/modules/assembly/bomb.dm +++ b/code/modules/assembly/bomb.dm @@ -31,7 +31,6 @@ to_chat(user, "You disassemble [src].") - bombassembly.loc = user.loc bombassembly.master = null bombassembly = null @@ -48,12 +47,10 @@ bombers += "[key_name(user)] welded a single tank bomb. Temperature: [bombtank.air_contents.temperature-T0C]" msg_admin_attack("[key_name_admin(user)] welded a single tank bomb. Temperature: [bombtank.air_contents.temperature-T0C]") to_chat(user, "A pressure hole has been bored to [bombtank] valve. \The [bombtank] can now be ignited.") - else status = 0 bombers += "[key_name(user)] unwelded a single tank bomb. Temperature: [bombtank.air_contents.temperature-T0C]" to_chat(user, "The hole has been closed.") - add_fingerprint(user) ..() diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index bc718f8cbfc..6333fbca635 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -71,12 +71,10 @@ if ((in_range(src, user) || src.loc == user)) if (src.secured) to_chat(user, "\The [src] is ready!") - else to_chat(user, "\The [src] can be attached!") - HasProximity(atom/movable/AM as mob|obj) if(a_left) a_left.HasProximity(AM) @@ -143,17 +141,14 @@ if(istype(W, /obj/item/weapon/screwdriver)) if(!a_left || !a_right) to_chat(user, "\red BUG:Assembly part missing, please report this!") - return a_left.toggle_secure() a_right.toggle_secure() secured = !secured if(secured) to_chat(user, "\blue \The [src] is ready!") - else to_chat(user, "\blue \The [src] can now be taken apart!") - update_icon() return else @@ -166,7 +161,6 @@ if(src.secured) if(!a_left || !a_right) to_chat(user, "\red Assembly part missing!") - return if(istype(a_left,a_right.type))//If they are the same type it causes issues due to window code switch(alert("Which side would you like to use?",,"Left","Right")) diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index 8d169b1dac5..e78060ea63e 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -13,7 +13,6 @@ if(armed) to_chat(user, "It looks like it's armed.") - activate() if(..()) armed = !armed @@ -22,7 +21,6 @@ var/mob/living/carbon/human/user = usr if(((user.getBrainLoss() >= 60 || (CLUMSY in user.mutations)) && prob(50))) to_chat(user, "Your hand slips, setting off the trigger.") - pulse(0) update_icon() if(usr) @@ -71,7 +69,6 @@ attack_self(mob/living/user as mob) if(!armed) to_chat(user, "You arm [src].") - else if(((user.getBrainLoss() >= 60 || (CLUMSY in user.mutations)) && prob(50))) var/which_hand = "l_hand" @@ -82,7 +79,6 @@ "You accidentally trigger [src]!") return to_chat(user, "You disarm [src].") - armed = !armed update_icon() playsound(user.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3) @@ -147,4 +143,3 @@ layer = TURF_LAYER+0.2 to_chat(usr, "You hide [src].") - diff --git a/code/modules/assembly/shock_kit.dm b/code/modules/assembly/shock_kit.dm index 9d661d7f2f3..6c5c9e4e5bb 100644 --- a/code/modules/assembly/shock_kit.dm +++ b/code/modules/assembly/shock_kit.dm @@ -32,7 +32,6 @@ if(istype(W, /obj/item/weapon/screwdriver)) status = !status to_chat(user, "[src] is now [status ? "secured" : "unsecured"]!") - add_fingerprint(user) return diff --git a/code/modules/atmos_automation/implementation/digital_valves.dm b/code/modules/atmos_automation/implementation/digital_valves.dm index e79d27ab88e..ce778a58aa1 100644 --- a/code/modules/atmos_automation/implementation/digital_valves.dm +++ b/code/modules/atmos_automation/implementation/digital_valves.dm @@ -38,7 +38,6 @@ valves|=V.id_tag if(valves.len==0) to_chat(usr, "Unable to find any digital valves on this frequency.") - return valve = input("Select a valve:", "Sensor Data", valve) as null|anything in valves parent.updateUsrDialog() diff --git a/code/modules/atmos_automation/implementation/emitters.dm b/code/modules/atmos_automation/implementation/emitters.dm index 91f8398acc0..c0b04399385 100644 --- a/code/modules/atmos_automation/implementation/emitters.dm +++ b/code/modules/atmos_automation/implementation/emitters.dm @@ -36,7 +36,6 @@ emitters|=E.id_tag if(emitters.len==0) to_chat(usr, "Unable to find any emitters on this frequency.") - return emitter = input("Select an emitter:", "Emitter", emitter) as null|anything in emitters parent.updateUsrDialog() diff --git a/code/modules/atmos_automation/implementation/vent_pump.dm b/code/modules/atmos_automation/implementation/vent_pump.dm index 6a6f3ca6d9b..7601d89f0c3 100644 --- a/code/modules/atmos_automation/implementation/vent_pump.dm +++ b/code/modules/atmos_automation/implementation/vent_pump.dm @@ -47,7 +47,6 @@ else for(var/obj/machinery/atmospherics/binary/dp_vent_pump/I in world) // to_chat(world, "test") - if(!isnull(I.id_tag) && I.frequency == parent.frequency) injector_names |= I.id_tag diff --git a/code/modules/awaymissions/bluespaceartillery.dm b/code/modules/awaymissions/bluespaceartillery.dm index 3baf9764d6a..670d8143390 100644 --- a/code/modules/awaymissions/bluespaceartillery.dm +++ b/code/modules/awaymissions/bluespaceartillery.dm @@ -12,7 +12,6 @@ /obj/machinery/computer/artillerycontrol/attack_ai(user as mob) to_chat(user, "Access denied.") - return /obj/machinery/computer/artillerycontrol/attack_hand(user as mob) diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm index cba145b8075..39ac1f49676 100644 --- a/code/modules/awaymissions/gateway.dm +++ b/code/modules/awaymissions/gateway.dm @@ -98,11 +98,9 @@ obj/machinery/gateway/centerstation/process() awaygate = locate(/obj/machinery/gateway/centeraway) in world if(!awaygate) to_chat(user, "Error: No destination found.") - return if(world.time < wait) to_chat(user, "Error: Warpspace triangulation in progress. Estimated time to completion: [round(((wait - world.time) / 10) / 60)] minutes.") - return for(var/obj/machinery/gateway/G in linked) @@ -152,7 +150,6 @@ obj/machinery/gateway/centerstation/process() /obj/machinery/gateway/centerstation/attackby(obj/item/device/W as obj, mob/user as mob, params) if(istype(W,/obj/item/device/multitool)) to_chat(user, "\black The gate is already calibrated, there is no work for you to do here.") - return /////////////////////////////////////Away//////////////////////// @@ -208,7 +205,6 @@ obj/machinery/gateway/centerstation/process() stationgate = locate(/obj/machinery/gateway/centerstation) in world if(!stationgate) to_chat(user, "Error: No destination found.") - return for(var/obj/machinery/gateway/G in linked) @@ -251,7 +247,6 @@ obj/machinery/gateway/centerstation/process() for(var/obj/item/weapon/implant/exile/E in M)//Checking that there is an exile implant in the contents if(E.imp_in == M)//Checking that it's actually implanted vs just in their pocket to_chat(M, "The station gate has detected your exile implant and is blocking your entry.") - return 1 return 0 @@ -259,10 +254,8 @@ obj/machinery/gateway/centerstation/process() if(istype(W,/obj/item/device/multitool)) if(calibrated) to_chat(user, "The gate is already calibrated, there is no work for you to do here.") - return else to_chat(user, "Recalibration successful!: This gate's systems have been fine tuned. Travel to this gate will now be on target.") - calibrated = 1 return diff --git a/code/modules/awaymissions/maploader/writer.dm b/code/modules/awaymissions/maploader/writer.dm index 212ef92c972..44151c60e02 100644 --- a/code/modules/awaymissions/maploader/writer.dm +++ b/code/modules/awaymissions/maploader/writer.dm @@ -37,7 +37,6 @@ dmm_suite{ } var/saved_map = file("[map_name].dmm") to_chat(saved_map, file_text) - return saved_map } write_map(var/turf/t1 as turf, var/turf/t2 as turf, var/flags as num){ diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm index d4d60b53574..d28d67f1f35 100644 --- a/code/modules/awaymissions/mission_code/wildwest.dm +++ b/code/modules/awaymissions/mission_code/wildwest.dm @@ -56,21 +56,17 @@ if(chargesa <= 0) to_chat(user, "The Wish Granter lies silent.") - return else if(!istype(user, /mob/living/carbon/human)) to_chat(user, "You feel a dark stirring inside of the Wish Granter, something you want nothing of. Your instincts are better than any man's.") - return else if(is_special_character(user)) to_chat(user, "Even to a heart as dark as yours, you know nothing good will come of this. Something instinctual makes you pull away.") - else if (!insistinga) to_chat(user, "Your first touch makes the Wish Granter stir, listening to you. Are you really sure you want to do this?") - insistinga++ else @@ -80,9 +76,7 @@ switch(wish) if("Power") to_chat(user, "Your wish is granted, but at a terrible cost...") - to_chat(user, "The Wish Granter punishes you for your selfishness, claiming your soul and warping your body to match the darkness in your heart.") - user.mutations.Add(LASER) user.mutations.Add(RESIST_COLD) user.mutations.Add(XRAY) @@ -90,88 +84,62 @@ var/mob/living/carbon/human/human = user if(human.species.name != "Shadow") to_chat(user, "\red Your flesh rapidly mutates!") - to_chat(user, "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.") - to_chat(user, "\red Your body reacts violently to light. \green However, it naturally heals in darkness.") - to_chat(user, "Aside from your new traits, you are mentally unchanged and retain your prior obligations.") - human.set_species("Shadow") user.regenerate_icons() if("Wealth") to_chat(user, "Your wish is granted, but at a terrible cost...") - to_chat(user, "The Wish Granter punishes you for your selfishness, claiming your soul and warping your body to match the darkness in your heart.") - new /obj/structure/closet/syndicate/resources/everything(loc) if(ishuman(user)) var/mob/living/carbon/human/human = user if(human.species.name != "Shadow") to_chat(user, "\red Your flesh rapidly mutates!") - to_chat(user, "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.") - to_chat(user, "\red Your body reacts violently to light. \green However, it naturally heals in darkness.") - to_chat(user, "Aside from your new traits, you are mentally unchanged and retain your prior obligations.") - human.set_species("Shadow") user.regenerate_icons() if("Immortality") to_chat(user, "Your wish is granted, but at a terrible cost...") - to_chat(user, "The Wish Granter punishes you for your selfishness, claiming your soul and warping your body to match the darkness in your heart.") - user.verbs += /mob/living/carbon/proc/immortality if(ishuman(user)) var/mob/living/carbon/human/human = user if(human.species.name != "Shadow") to_chat(user, "\red Your flesh rapidly mutates!") - to_chat(user, "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.") - to_chat(user, "\red Your body reacts violently to light. \green However, it naturally heals in darkness.") - to_chat(user, "Aside from your new traits, you are mentally unchanged and retain your prior obligations.") - human.set_species("Shadow") user.regenerate_icons() if("To Kill") to_chat(user, "Your wish is granted, but at a terrible cost...") - to_chat(user, "The Wish Granter punishes you for your wickedness, claiming your soul and warping your body to match the darkness in your heart.") - ticker.mode.traitors += user.mind user.mind.special_role = "traitor" var/datum/objective/hijack/hijack = new hijack.owner = user.mind user.mind.objectives += hijack to_chat(user, "Your inhibitions are swept away, the bonds of loyalty broken, you are free to murder as you please!") - var/obj_count = 1 for(var/datum/objective/OBJ in user.mind.objectives) to_chat(user, "Objective #[obj_count]: [OBJ.explanation_text]") - obj_count++ if(ishuman(user)) var/mob/living/carbon/human/human = user if(human.species.name != "Shadow") to_chat(user, "\red Your flesh rapidly mutates!") - to_chat(user, "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.") - to_chat(user, "\red Your body reacts violently to light. \green However, it naturally heals in darkness.") - to_chat(user, "Aside from your new traits, you are mentally unchanged and retain your prior obligations.") - human.set_species("Shadow") user.regenerate_icons() if("Peace") to_chat(user, "Whatever alien sentience that the Wish Granter possesses is satisfied with your wish. There is a distant wailing as the last of the Faithless begin to die, then silence.") - to_chat(user, "You feel as if you just narrowly avoided a terrible fate...") - for(var/mob/living/simple_animal/hostile/faithless/F in world) F.health = -10 F.stat = 2 @@ -205,7 +173,6 @@ if(istype(M, /mob/living/carbon/human)) for(var/mob/O in viewers(world.view, src.loc)) to_chat(O, "[M] triggered the \icon[src] [src]") - triggered = 1 call(src,triggerproc)(M) @@ -227,11 +194,9 @@ var/mob/living/carbon/C = usr if(!C.stat) to_chat(C, "You're not dead yet!") - return to_chat(C, "Death is not your end!") - spawn(rand(800,1200)) if(C.stat == DEAD) dead_mob_list -= C @@ -248,7 +213,6 @@ C.heal_overall_damage(C.getBruteLoss(), C.getFireLoss()) C.reagents.clear_reagents() to_chat(C, "You have regenerated.") - C.visible_message("[usr] appears to wake from the dead, having healed all wounds.") C.update_canmove() return 1 \ No newline at end of file diff --git a/code/modules/awaymissions/trigger.dm b/code/modules/awaymissions/trigger.dm index 06b7419a973..2a41eee85c3 100644 --- a/code/modules/awaymissions/trigger.dm +++ b/code/modules/awaymissions/trigger.dm @@ -5,7 +5,6 @@ /obj/effect/step_trigger/message/Trigger(mob/M as mob) if(M.client) to_chat(M, "[message]") - if(once) qdel(src) diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm index a4bcdf921fc..33254cc7d2d 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/client/asset_cache.dm @@ -93,7 +93,6 @@ You can set verify to TRUE if you want send() to sleep until the client has the return 0 if (unreceived.len >= ASSET_CACHE_TELL_CLIENT_AMOUNT) to_chat(client, "Sending Resources...") - for(var/asset in unreceived) if (asset in asset_cache) client << browse_rsc(asset_cache[asset], asset) diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index c9296cd84d8..31db10045f0 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -29,7 +29,6 @@ #if defined(TOPIC_DEBUGGING) to_chat(world, "[src]'s Topic: [href] destined for [hsrc].") - #endif if(href_list["nano_err"]) //nano throwing errors @@ -38,10 +37,8 @@ - if(href_list["asset_cache_confirm_arrival"]) // to_chat(src, "ASSET JOB [href_list["asset_cache_confirm_arrival"]] ARRIVED.") - var/job = text2num(href_list["asset_cache_confirm_arrival"]) completed_asset_jobs += job return @@ -70,11 +67,9 @@ if(href_list["irc_msg"]) if(!holder && received_irc_pm < world.time - 6000) //Worse they can do is spam IRC for 10 minutes to_chat(usr, "You are no longer able to use this, it's been more then 10 minutes since an admin on IRC has responded to you") - return if(mute_irc) to_chat(usr, "") - return cmd_admin_irc_pm() return @@ -85,7 +80,6 @@ if(config && config.log_hrefs && href_logfile) to_chat(href_logfile, "[time2text(world.timeofday,"hh:mm")] [src] (usr:[usr]) || [hsrc ? "[hsrc] " : ""][href]
      ") - switch(href_list["karmashop"]) if("tab") karma_tab = text2num(href_list["tab"]) @@ -98,7 +92,6 @@ if("1") if(karma <5) to_chat(usr, "You do not have enough karma!") - return else src.DB_job_unlock("Barber",5) @@ -106,7 +99,6 @@ if("2") if(karma <5) to_chat(usr, "You do not have enough karma!") - return else src.DB_job_unlock("Brig Physician",5) @@ -114,7 +106,6 @@ if("3") if(karma <30) to_chat(usr, "You do not have enough karma!") - return else src.DB_job_unlock("Nanotrasen Representative",30) @@ -122,7 +113,6 @@ if("5") if(karma <30) to_chat(usr, "You do not have enough karma!") - return else src.DB_job_unlock("Blueshield",30) @@ -130,7 +120,6 @@ if("6") if(karma <30) to_chat(usr, "You do not have enough karma!") - return else src.DB_job_unlock("Mechanic",30) @@ -138,7 +127,6 @@ if("7") if(karma <45) to_chat(usr, "You do not have enough karma!") - return else src.DB_job_unlock("Magistrate",45) @@ -146,7 +134,6 @@ if("9") if(karma <30) to_chat(usr, "You do not have enough karma!") - return else src.DB_job_unlock("Security Pod Pilot",30) @@ -157,7 +144,6 @@ if("1") if(karma <15) to_chat(usr, "You do not have enough karma!") - return else src.DB_species_unlock("Machine",15) @@ -165,7 +151,6 @@ if("2") if(karma <30) to_chat(usr, "You do not have enough karma!") - return else src.DB_species_unlock("Kidan",30) @@ -173,7 +158,6 @@ if("3") if(karma <30) to_chat(usr, "You do not have enough karma!") - return else src.DB_species_unlock("Grey",30) @@ -181,7 +165,6 @@ if("4") if(karma <45) to_chat(usr, "You do not have enough karma!") - return else src.DB_species_unlock("Vox",45) @@ -189,7 +172,6 @@ if("5") if(karma <45) to_chat(usr, "You do not have enough karma!") - return else src.DB_species_unlock("Slime People",45) @@ -197,7 +179,6 @@ if("6") if(karma <100) to_chat(usr, "You do not have enough karma!") - return else src.DB_species_unlock("Plasmaman",100) @@ -228,12 +209,10 @@ src.last_message_count++ if(src.last_message_count >= SPAM_TRIGGER_AUTOMUTE) to_chat(src, "\red You have exceeded the spam filter limit for identical messages. An auto-mute was applied.") - cmd_admin_mute(src.mob, mute_type, 1) return 1 if(src.last_message_count >= SPAM_TRIGGER_WARNING) to_chat(src, "\red You are nearing the spam filter limit for identical messages.") - return 0 else last_message = message @@ -244,14 +223,12 @@ /client/AllowUpload(filename, filelength) if(filelength > UPLOAD_LIMIT) to_chat(src, "Error: AllowUpload(): File Upload too large. Upload Limit: [UPLOAD_LIMIT/1024]KiB.") - return 0 /* //Don't need this at the moment. But it's here if it's needed later. //Helps prevent multiple files being uploaded at once. Or right after eachother. var/time_to_wait = fileaccess_timer - world.time if(time_to_wait > 0) to_chat(src, "Error: AllowUpload(): Spam prevention. Please wait [round(time_to_wait/10)] seconds.") - return 0 fileaccess_timer = world.time + FTPDELAY */ return 1 @@ -281,7 +258,6 @@ to_chat(src, "\red If the title screen is black, resources are still downloading. Please be patient until the title screen appears.") - clients += src directory[ckey] = src @@ -303,14 +279,10 @@ if(custom_event_msg && custom_event_msg != "") to_chat(src, "

      Custom Event

      ") - to_chat(src, "

      A custom event is taking place. OOC Info:

      ") - to_chat(src, "[html_encode(custom_event_msg)]") - to_chat(src, "
      ") - if( (world.address == address || !address) && !host ) host = key world.update_status() @@ -331,7 +303,6 @@ if (ckey in clientmessages) for (var/message in clientmessages[ckey]) to_chat(src, message) - clientmessages.Remove(ckey) @@ -346,7 +317,6 @@ to_chat(src, "Unable to access asset cache browser, if you are using a custom skin file, please allow DS to download the updated version, if you are not, then make a bug report. This is not a critical issue but can cause issues with resource downloading, as it is impossible to know when extra resources arrived to you.") - ////////////// //DISCONNECT// ////////////// @@ -463,4 +433,3 @@ if(lang.flags & RESTRICTED) message += " (RESTRICTED)" to_chat(world, "[message]") - diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 7692f051621..4f28c69cf96 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -263,7 +263,6 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts var/ind = 0 for(var/name in organ_data) // to_chat(world, "[ind] \ [organ_data.len]") - var/status = organ_data[name] var/organ_name = null switch(name) @@ -675,7 +674,6 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if (!isnum(desiredLvl)) to_chat(user, "\red UpdateJobPreference - desired level was not a number. Please notify coders!") - ShowChoices(user) return @@ -1061,7 +1059,6 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts else to_chat(user, "Invalid name. Your name should be at least 2 and at most [MAX_NAME_LEN] characters long. It may only contain the characters A-Z, a-z, -, ' and .") - if("age") var/new_age = input(user, "Choose your character's age:\n([AGE_MIN]-[AGE_MAX])", "Character Preference") as num|null if(new_age) @@ -1587,7 +1584,6 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if(r != cleaned_r) // up to no good message_admins("[user] attempted an href exploit! (This could have possibly lead to a \"Bobby Tables\" exploit, so they're probably up to no good). String: [r] ID: [last_id] IP: [last_ip]") to_chat(user, "Stop right there, criminal scum") - else be_special ^= r @@ -1604,11 +1600,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts sound ^= SOUND_LOBBY if(sound & SOUND_LOBBY) to_chat(user, sound(ticker.login_music, repeat = 0, wait = 0, volume = 85, channel = 1)) - else to_chat(user, sound(null, repeat = 0, wait = 0, volume = 85, channel = 1)) - if("ghost_ears") toggles ^= CHAT_GHOSTEARS diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm index 341efffcb69..afb70577dd0 100644 --- a/code/modules/client/preferences_toggles.dm +++ b/code/modules/client/preferences_toggles.dm @@ -5,7 +5,6 @@ set desc = ".Toggle Between seeing all mob speech, and only speech of nearby mobs" prefs.toggles ^= CHAT_GHOSTEARS to_chat(src, "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTEARS) ? "see all speech in the world" : "only see speech from nearby mobs"].") - prefs.save_preferences(src) feedback_add_details("admin_verb","TGE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -15,7 +14,6 @@ set desc = ".Toggle Between seeing all mob emotes, and only emotes of nearby mobs" prefs.toggles ^= CHAT_GHOSTSIGHT to_chat(src, "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTSIGHT) ? "see all emotes in the world" : "only see emotes from nearby mobs"].") - prefs.save_preferences(src) feedback_add_details("admin_verb","TGS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -25,7 +23,6 @@ set desc = ".Toggle between hearing all radio chatter, or only from nearby speakers" prefs.toggles ^= CHAT_GHOSTRADIO to_chat(src, "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTRADIO) ? "hear all radio chat in the world" : "only hear from nearby speakers"].") - prefs.save_preferences(src) feedback_add_details("admin_verb","TGR") @@ -37,7 +34,6 @@ prefs.toggles ^= CHAT_RADIO prefs.save_preferences(src) to_chat(usr, "You will [(prefs.toggles & CHAT_RADIO) ? "now" : "no longer"] see radio chatter from radios or speakers") - feedback_add_details("admin_verb","THR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/toggleadminhelpsound() @@ -48,7 +44,6 @@ prefs.sound ^= SOUND_ADMINHELP prefs.save_preferences(src) to_chat(usr, "You will [(prefs.sound & SOUND_ADMINHELP) ? "now" : "no longer"] hear a sound when adminhelps arrive.") - feedback_add_details("admin_verb","AHS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/deadchat() // Deadchat toggle is usable by anyone. @@ -60,11 +55,9 @@ if(src.holder) to_chat(src, "You will [(prefs.toggles & CHAT_DEAD) ? "now" : "no longer"] see deadchat.") - else to_chat(src, "As a ghost, you will [(prefs.toggles & CHAT_DEAD) ? "now" : "no longer"] see deadchat.") - feedback_add_details("admin_verb","TDV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/toggleprayers() @@ -74,7 +67,6 @@ prefs.toggles ^= CHAT_PRAYER prefs.save_preferences(src) to_chat(src, "You will [(prefs.toggles & CHAT_PRAYER) ? "now" : "no longer"] see prayerchat.") - feedback_add_details("admin_verb","TP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/togglescoreboard() @@ -84,7 +76,6 @@ prefs.toggles ^= DISABLE_SCOREBOARD prefs.save_preferences(src) to_chat(src, "You will [(prefs.toggles & DISABLE_SCOREBOARD) ? "no longer" : "now"] see the end of round scoreboard.") - feedback_add_details("admin_verb","TScoreboard") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/togglekarmareminder() @@ -94,7 +85,6 @@ prefs.toggles ^= DISABLE_KARMA_REMINDER prefs.save_preferences(src) to_chat(src, "You will [(prefs.toggles & DISABLE_KARMA_REMINDER) ? "no longer" : "now"] see the end of round karma reminder.") - feedback_add_details("admin_verb","TKarmabugger") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/toggletitlemusic() @@ -105,16 +95,13 @@ prefs.save_preferences(src) if(prefs.sound & SOUND_LOBBY) to_chat(src, "You will now hear music in the game lobby.") - if(istype(mob, /mob/new_player)) playtitlemusic() else to_chat(src, "You will no longer hear music in the game lobby.") - if(istype(mob, /mob/new_player)) to_chat(src, sound(null, repeat = 0, wait = 0, volume = 85, channel = 1))// stop the jamsz - feedback_add_details("admin_verb","TLobby") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/togglemidis() @@ -125,15 +112,12 @@ prefs.save_preferences(src) if(prefs.sound & SOUND_MIDI) to_chat(src, "You will now hear any sounds uploaded by admins.") - else var/sound/break_sound = sound(null, repeat = 0, wait = 0, channel = 777) break_sound.priority = 250 to_chat(src, break_sound)//breaks the client's sound output on channel 777 - to_chat(src, "You will no longer hear sounds uploaded by admins; any currently playing midis have been disabled.") - feedback_add_details("admin_verb","TMidi") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/listen_ooc() @@ -143,7 +127,6 @@ prefs.toggles ^= CHAT_OOC prefs.save_preferences(src) to_chat(src, "You will [(prefs.toggles & CHAT_OOC) ? "now" : "no longer"] see messages on the OOC channel.") - feedback_add_details("admin_verb","TOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -154,7 +137,6 @@ prefs.toggles ^= CHAT_LOOC prefs.save_preferences(src) to_chat(src, "You will [(prefs.toggles & CHAT_LOOC) ? "now" : "no longer"] see messages on the LOOC channel.") - feedback_add_details("admin_verb","TLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -166,12 +148,9 @@ prefs.save_preferences(src) if(prefs.sound & SOUND_AMBIENCE) to_chat(src, "You will now hear ambient sounds.") - else to_chat(src, "You will no longer hear ambient sounds.") - to_chat(src, sound(null, repeat = 0, wait = 0, volume = 0, channel = 1)) - feedback_add_details("admin_verb","TAmbi") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/Toggle_Buzz() //No more headaches because headphones bump up shipambience.ogg to insanity levels. @@ -182,12 +161,9 @@ prefs.save_preferences(src) if(prefs.sound & SOUND_BUZZ) to_chat(src, "You will now hear ambient white noise.") - else to_chat(src, "You will no longer hear ambient white noise.") - to_chat(src, sound(null, repeat = 0, wait = 0, volume = 0, channel = 2)) - feedback_add_details("admin_verb","TBuzz") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -199,14 +175,10 @@ prefs.save_preferences(src) if(prefs.sound & SOUND_HEARTBEAT) to_chat(src, "You will now hear heartbeat sounds.") - else to_chat(src, "You will no longer hear heartbeat sounds.") - to_chat(src, sound(null, repeat = 0, wait = 0, volume = 0, channel = 1)) - to_chat(src, sound(null, repeat = 0, wait = 0, volume = 0, channel = 2)) - feedback_add_details("admin_verb","Thb") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! // This needs a toggle because you people are awful and spammed terrible music @@ -218,10 +190,8 @@ prefs.save_preferences(src) if(prefs.toggles & SOUND_INSTRUMENTS) to_chat(src, "You will now hear people playing musical instruments.") - else to_chat(src, "You will no longer hear musical instruments.") - feedback_add_details("admin_verb","TInstru") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/toggle_media() @@ -232,7 +202,6 @@ prefs.sound ^= SOUND_STREAMING prefs.save_preferences(src) to_chat(usr, "You will [(prefs.sound & SOUND_STREAMING) ? "now" : "no longer"] hear streamed media.") - if(!media) return if(prefs.sound & SOUND_STREAMING) media.update_music() diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index a179d56db14..a5749ca40d0 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -52,7 +52,6 @@ if(!wearable) to_chat(M, "\red Your species cannot wear [src].") - return 0 return 1 @@ -202,7 +201,6 @@ BLIND // can't see anything update_icon() else to_chat(user, "[src] have already been clipped!") - return else ..() @@ -216,18 +214,15 @@ BLIND // can't see anything if (user.stat || user.restrained()) return if(has_sensor >= 2) to_chat(user, "The controls are locked.") - return 0 if(has_sensor <= 0) to_chat(user, "This suit does not have any sensors.") - return 0 var/list/modes = list("Off", "Binary sensors", "Vitals tracker", "Tracking beacon") var/switchMode = input("Select a sensor mode:", "Suit Sensor Mode", modes[sensor_mode + 1]) in modes if(get_dist(user, src) > 1) to_chat(user, "You have moved too far away.") - return sensor_mode = modes.Find(switchMode) - 1 @@ -235,16 +230,12 @@ BLIND // can't see anything switch(sensor_mode) if(0) to_chat(user, "You disable your suit's remote sensing equipment.") - if(1) to_chat(user, "Your suit will now report whether you are live or dead.") - if(2) to_chat(user, "Your suit will now report your vital lifesigns.") - if(3) to_chat(user, "Your suit will now report your vital lifesigns as well as your coordinate position.") - if(istype(user,/mob/living/carbon/human)) var/mob/living/carbon/human/H = user if(H.w_uniform == src) @@ -313,7 +304,6 @@ BLIND // can't see anything gas_transfer_coefficient = initial(gas_transfer_coefficient) permeability_coefficient = initial(permeability_coefficient) to_chat(user, "You push \the [src] back into place.") - mask_adjusted = 0 slot_flags = initial(slot_flags) if(flags_inv != initial(flags_inv)) @@ -335,7 +325,6 @@ BLIND // can't see anything else icon_state += "_up" to_chat(user, "You push \the [src] out of the way.") - gas_transfer_coefficient = null permeability_coefficient = null mask_adjusted = 1 @@ -405,7 +394,6 @@ BLIND // can't see anything user.visible_message("[user] crushes the [M] into the bottom of [src], extinguishing it.","You crush the [M] into the bottom of [src], extinguishing it.") else // Match has been previously lit and extinguished. to_chat(user, "The [M] has already been extinguished.") - return if(istype(I, /obj/item/weapon/wirecutters)) @@ -424,7 +412,6 @@ BLIND // can't see anything update_icon() else to_chat(user, "[src] have already had their toes cut open!") - return else ..() @@ -477,7 +464,6 @@ BLIND // can't see anything if(adjust_flavour) flavour = "[copytext(adjust_flavour, 3, lentext(adjust_flavour) + 1)] up" //Trims off the 'un' at the beginning of the word. unzip -> zip, unbutton->button. to_chat(user, "You [flavour] \the [src].") - suit_adjusted = 0 //Suit is no longer adjusted. else var/flavour = "open" @@ -486,7 +472,6 @@ BLIND // can't see anything if(adjust_flavour) flavour = "[adjust_flavour]" to_chat(user, "You [flavour] \the [src].") - suit_adjusted = 1 //Suit's adjusted. else if(user.canUnEquip(src)) //Checks to see if the item can be unequipped. If so, lets shred. Otherwise, struggle and fail. @@ -504,13 +489,11 @@ BLIND // can't see anything else to_chat(user, "You yank and pull at \the [src] with your [pick("excessive", "extreme", "insane", "monstrous", "ridiculous", "unreal", "stupendous")] [pick("power", "strength")], however you are unable to change its state!")//Yep, that's all they get. Avoids having to snowflake in a cooldown. - return user.update_inv_wear_suit() else to_chat(user, "You attempt to button up the velcro on \the [src], before promptly realising how retarded you are.") - /obj/item/clothing/suit/verb/openjacket(var/mob/user) //The verb you can use to adjust jackets. set name = "Open/Close Jacket" set category = "Object" @@ -619,7 +602,6 @@ BLIND // can't see anything else to_chat(user, "You cannot attach more accessories of this type to [src].") - if(accessories.len) for(var/obj/item/clothing/accessory/A in accessories) A.attackby(I, user, params) @@ -662,22 +644,17 @@ BLIND // can't see anything switch(src.sensor_mode) if(0) to_chat(user, "Its sensors appear to be disabled.") - if(1) to_chat(user, "Its binary life sensors appear to be enabled.") - if(2) to_chat(user, "Its vital tracker appears to be enabled.") - if(3) to_chat(user, "Its vital tracker and tracking beacon appear to be enabled.") - if(accessories.len) for(var/obj/item/clothing/accessory/A in accessories) to_chat(user, "\A [A] is attached to it.") - /obj/item/clothing/under/verb/rollsuit() set name = "Roll Down Jumpsuit" set category = "Object" @@ -688,14 +665,12 @@ BLIND // can't see anything if(copytext(item_color,-2) != "_d") basecolor = item_color to_chat(usr, "DEBUG:[basecolor]") - if(basecolor + "_d_s" in icon_states('icons/mob/uniform.dmi')) item_color = item_color == "[basecolor]" ? "[basecolor]_d" : "[basecolor]" usr.update_inv_w_uniform() else to_chat(usr, "You cannot roll down the uniform!") - /obj/item/clothing/under/proc/remove_accessory(mob/user, obj/item/clothing/accessory/A) if(!(A in accessories)) return diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 2a5cb6d554e..521b934d34a 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -25,12 +25,10 @@ if(istype(O, /obj/item/clothing/glasses/regular)) if(prescription) to_chat(H, "You can't possibly imagine how adding more lenses would improve \the [name].") - return H.unEquip(O) O.loc = src // Store the glasses for later removal to_chat(H, "You fit \the [name] with lenses from \the [O].") - prescription = 1 name = "prescription [name]" return @@ -39,7 +37,6 @@ if(!G) G = new(get_turf(H)) to_chat(H, "You salvage the prescription lenses from \the [name].") - prescription = 0 name = initial(name) H.put_in_hands(G) @@ -270,7 +267,6 @@ to_chat(usr, "The moment is gone.") - /obj/item/clothing/glasses/sunglasses/reagent name = "sunscanners" desc = "Strangely ancient technology used to help provide rudimentary eye color. Outfitted with apparatus to scan individual reagents." @@ -329,7 +325,6 @@ flags_inv |= HIDEEYES icon_state = initial(icon_state) to_chat(usr, "You flip the [src] down to protect your eyes.") - flash_protect = 2 tint = initial(tint) //better than istype else @@ -338,7 +333,6 @@ flags_inv &= ~HIDEEYES icon_state = "[initial(icon_state)]up" to_chat(usr, "You push the [src] up out of your face.") - flash_protect = 0 tint = 0 @@ -399,7 +393,6 @@ if(istype(src.loc, /mob/living/carbon/human)) var/mob/living/carbon/human/M = src.loc to_chat(M, "\red The Optical Thermal Scanner overloads and blinds you!") - if(M.glasses == src) M.eye_blind = 3 M.eye_blurry = 5 diff --git a/code/modules/clothing/gloves/rings.dm b/code/modules/clothing/gloves/rings.dm index a1a2c04bd5f..4a0af4392fa 100644 --- a/code/modules/clothing/gloves/rings.dm +++ b/code/modules/clothing/gloves/rings.dm @@ -22,17 +22,14 @@ examine(mob/user) ..(user) to_chat(user, "This one is made of [material].") - if(stud) to_chat(user, "It is adorned with a single gem.") - /obj/item/clothing/gloves/ring/attackby(obj/item/I as obj, mob/user as mob, params) if(istype(I, /obj/item/stack/sheet/mineral/diamond)) var/obj/item/stack/sheet/mineral/diamond/D = I if(stud) to_chat(usr, "The [src] already has a gem.") - else if(D.amount >= 1) D.use(1) @@ -40,7 +37,6 @@ update_icon() to_chat(usr, "You socket the diamond into the [src].") - // s'pensive /obj/item/clothing/gloves/ring/silver name = "silver ring" diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index aa5d722d056..5dc555a10d7 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -15,7 +15,6 @@ if(!isturf(user.loc)) to_chat(user, "You cannot turn the light on while in this [user.loc]")//To prevent some lighting anomalities. - return on = !on icon_state = "hardhat[on]_[item_color]" diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 463c2eb2861..eb38be7395d 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -26,7 +26,6 @@ icon_state = "[initial(icon_state)][up ? "up" : ""]" to_chat(user, "[up ? alt_toggle_message : toggle_message] \the [src]") - user.update_inv_head() if(active_sound) diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 50bb85e5cc4..e1bfc0c1282 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -59,7 +59,6 @@ flags_inv |= (HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE) icon_state = initial(icon_state) to_chat(usr, "You flip the [src] down to protect your eyes.") - flash_protect = 2 tint = 2 else @@ -68,7 +67,6 @@ flags_inv &= ~(HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE) icon_state = "[initial(icon_state)]up" to_chat(usr, "You push the [src] up out of your face.") - flash_protect = 0 tint = 0 usr.update_inv_head() //so our mob-overlays update @@ -133,13 +131,11 @@ src.icon_state = "ushankaup" src.item_state = "ushankaup" to_chat(user, "You raise the ear flaps on the ushanka.") - else src.icon_state = "ushankadown" src.item_state = "ushankadown" to_chat(user, "You lower the ear flaps on the ushanka.") - /* * Pumpkin head */ diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index b9c88bcc11e..e14057b32b1 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -20,11 +20,9 @@ if(src.flipped) icon_state = "[item_color]soft_flipped" to_chat(usr, "You flip the hat backwards.") - else icon_state = "[item_color]soft" to_chat(usr, "You flip the hat back in normal position.") - usr.update_inv_head() //so our mob-overlays update /obj/item/clothing/head/soft/red diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 3ccfe44cc39..b13c2968f34 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -46,7 +46,6 @@ flags_inv |= (HIDEEYES) icon_state = initial(icon_state) to_chat(usr, "You flip the [src] down to protect your eyes.") - flash_protect = 2 tint = 2 else @@ -55,7 +54,6 @@ flags_inv &= ~(HIDEEYES) icon_state = "[initial(icon_state)]up" to_chat(usr, "You push the [src] up out of your face.") - flash_protect = 0 tint = 0 usr.update_inv_wear_mask() //so our mob-overlays update @@ -113,7 +111,6 @@ if(src && choice && !M.stat && in_range(M,src)) icon_state = options[choice] to_chat(M, "Your Clown Mask has now morphed into [choice], all praise the Honk Mother!") - return 1 /obj/item/clothing/mask/gas/clownwiz @@ -251,23 +248,18 @@ switch(aggressiveness) if(1) to_chat(user, "\blue You set the restrictor to the middle position.") - aggressiveness = 2 if(2) to_chat(user, "\blue You set the restrictor to the last position.") - aggressiveness = 3 if(3) to_chat(user, "\blue You set the restrictor to the first position.") - aggressiveness = 1 if(4) to_chat(user, "\red You adjust the restrictor but nothing happens, probably because its broken.") - else if(istype(W, /obj/item/weapon/wirecutters)) if(aggressiveness != 4) to_chat(user, "\red You broke it!") - aggressiveness = 4 else ..() @@ -279,7 +271,6 @@ if(safety) safety = 0 to_chat(user, "You silently fry [src]'s vocal circuit with the cryptographic sequencer.") - else return diff --git a/code/modules/clothing/masks/voice.dm b/code/modules/clothing/masks/voice.dm index 887518ab906..190804d1a92 100644 --- a/code/modules/clothing/masks/voice.dm +++ b/code/modules/clothing/masks/voice.dm @@ -17,7 +17,6 @@ changer.active = !changer.active to_chat(usr, "You [changer.active ? "enable" : "disable"] the voice-changing module in \the [src].") - /obj/item/clothing/mask/gas/voice/verb/Set_Voice(name as text) set category = "Object" set src in usr @@ -27,7 +26,6 @@ changer.voice = voice to_chat(usr, "You are now mimicking [changer.voice].") - /obj/item/clothing/mask/gas/voice/New() ..() changer = new(src) \ No newline at end of file diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index 6b6a047fc0b..48b9ffa7589 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -20,7 +20,6 @@ magpulse = !magpulse icon_state = "[magboot_state][magpulse]" to_chat(user, "You [magpulse ? "enable" : "disable"] the mag-pulse traction system.") - user.update_inv_shoes() //so our mob-overlays update user.update_gravity(user.mob_has_gravity()) @@ -32,7 +31,6 @@ to_chat(user, "Its mag-pulse traction system appears to be [magpulse ? "enabled" : "disabled"].") - /obj/item/clothing/shoes/magboots/advance desc = "Advanced magnetic boots that have a lighter magnetic pull, placing less burden on the wearer." name = "advanced magboots" diff --git a/code/modules/clothing/spacesuits/alien.dm b/code/modules/clothing/spacesuits/alien.dm index d576902a43e..d5fcbdf3251 100644 --- a/code/modules/clothing/spacesuits/alien.dm +++ b/code/modules/clothing/spacesuits/alien.dm @@ -206,7 +206,6 @@ magpulse = 0 flags |= NODROP to_chat(user, "You relax your deathgrip on the flooring.") - else //make sure these can only be used when equipped. if(!ishuman(user)) @@ -214,7 +213,6 @@ var/mob/living/carbon/human/H = user if (H.shoes != src) to_chat(user, "You will have to put on the [src] before you can do that.") - return @@ -222,10 +220,8 @@ magpulse = 1 flags &= ~NODROP //kinda hard to take off magclaws when you are gripping them tightly. to_chat(user, "You dig your claws deeply into the flooring, bracing yourself.") - to_chat(user, "It would be hard to take off the [src] without relaxing your grip first.") - //In case they somehow come off while enabled. /obj/item/clothing/shoes/magboots/vox/dropped(mob/user as mob) ..() @@ -241,7 +237,6 @@ to_chat(user, "It would be hard to take these off without relaxing your grip first.")//theoretically this message should only be seen by the wearer when the claws are equipped. - /obj/item/clothing/suit/space/eva/vox name = "Vox EVA Suit" icon_state = "voxspace" diff --git a/code/modules/clothing/spacesuits/breaches.dm b/code/modules/clothing/spacesuits/breaches.dm index cd46fd580d9..a7f8baf7a7a 100644 --- a/code/modules/clothing/spacesuits/breaches.dm +++ b/code/modules/clothing/spacesuits/breaches.dm @@ -56,7 +56,6 @@ var/global/list/breach_burn_descriptors = list( if(!can_breach || !breaches || !breaches.len || !damage) to_chat(user, "There are no breaches to repair on \the [src].") - return var/list/valid_breaches = list() @@ -67,7 +66,6 @@ var/global/list/breach_burn_descriptors = list( if(!valid_breaches.len) to_chat(user, "There are no breaches to repair on \the [src].") - return var/amount_left = amount @@ -181,12 +179,10 @@ var/global/list/breach_burn_descriptors = list( if(istype(src.loc,/mob/living)) to_chat(user, "\red How do you intend to patch a hardsuit while someone is wearing it?") - return if(!damage || !burn_damage) to_chat(user, "There is no surface damage on \the [src] to repair.") - return var/obj/item/stack/sheet/P = W @@ -202,18 +198,15 @@ var/global/list/breach_burn_descriptors = list( if(istype(src.loc,/mob/living)) to_chat(user, "\red How do you intend to patch a hardsuit while someone is wearing it?") - return if (!damage || ! brute_damage) to_chat(user, "There is no structural damage on \the [src] to repair.") - return var/obj/item/weapon/weldingtool/WT = W if(!WT.remove_fuel(5)) to_chat(user, "\red You need more welding fuel to repair this suit.") - return repair_breaches(BRUTE, 3, user) @@ -226,4 +219,3 @@ var/global/list/breach_burn_descriptors = list( if(can_breach && breaches && breaches.len) for(var/datum/breach/B in breaches) to_chat(user, "\red It has \a [B.descriptor].") - diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm index 46bd28dc368..334e659302b 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -62,7 +62,6 @@ if(1) if(user && ishuman(user) && (user.wear_suit == src)) to_chat(user, "Elecrtromagnetic pulse detected, shutting down systems to preserve integrity...") - deactivate() /obj/item/clothing/suit/space/chronos/proc/chronowalk(var/mob/living/carbon/human/user) @@ -133,32 +132,23 @@ if(user && ishuman(user)) if(user.wear_suit == src) to_chat(user, "\nChronosuitMK4 login: root") - to_chat(user, "Password:\n") - to_chat(user, "root@ChronosuitMK4# chronowalk4 --start\n") - if(user.head && istype(user.head, /obj/item/clothing/head/helmet/space/chronos)) to_chat(user, "\[ ok \] Mounting /dev/helmet") - helmet = user.head helmet.flags |= NODROP helmet.suit = src src.flags |= NODROP to_chat(user, "\[ ok \] Starting brainwave scanner") - to_chat(user, "\[ ok \] Starting ui display driver") - to_chat(user, "\[ ok \] Initializing chronowalk4-view") - new_camera(user) processing_objects.Add(src) activated = 1 else to_chat(user, "\[ fail \] Mounting /dev/helmet") - to_chat(user, "FATAL: Unable to locate /dev/helmet. Aborting...") - cooldown = world.time + cooldowntime activating = 0 return 0 @@ -170,24 +160,18 @@ if(user && ishuman(user)) if(user.wear_suit == src) to_chat(user, "\nroot@ChronosuitMK4# chronowalk4 --stop\n") - if(camera) to_chat(user, "\[ ok \] Sending TERM signal to chronowalk4-view")//yes I know they aren't a different color when shutting down, but they were too similar at a glance - qdel(camera) if(helmet) to_chat(user, "\[ ok \] Stopping ui display driver") - to_chat(user, "\[ ok \] Stopping brainwave scanner") - to_chat(user, "\[ ok \] Unmounting /dev/helmet") - helmet.flags &= ~NODROP helmet.suit = null helmet = null to_chat(user, "logout") - src.flags &= ~NODROP cooldown = world.time + cooldowntime * 1.5 activated = 0 diff --git a/code/modules/clothing/spacesuits/ert.dm b/code/modules/clothing/spacesuits/ert.dm index cece5f9b414..4015f107e51 100644 --- a/code/modules/clothing/spacesuits/ert.dm +++ b/code/modules/clothing/spacesuits/ert.dm @@ -19,12 +19,10 @@ camera.c_tag = user.name to_chat(user, "\blue User scanned as [camera.c_tag]. Camera activated.") - /obj/item/clothing/head/helmet/space/rig/ert/examine(mob/user) if(..(user, 1)) to_chat(user, "This helmet has a built-in camera. It's [camera ? "" : "in"]active.") - /obj/item/clothing/suit/space/rig/ert name = "emergency response team suit" desc = "A suit worn by members of the Nanotrasen Emergency Response Team. Armoured, space ready, and fire resistant." diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index 0b434a2aab2..8e3fdefbb65 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -24,7 +24,6 @@ ..(user) to_chat(user, "There are [extinguishes_left] extinguisher canisters left in this suit.") - /obj/item/clothing/suit/space/eva/plasmaman/proc/Extinguish(var/mob/user) var/mob/living/carbon/human/H=user if(extinguishes_left) @@ -34,7 +33,6 @@ next_extinguish = world.time + extinguish_cooldown extinguishes_left-- to_chat(H, "Your suit automatically extinguishes the fire.") - H.ExtinguishMob() /obj/item/clothing/head/helmet/space/eva/plasmaman @@ -54,7 +52,6 @@ if(!isturf(user.loc)) to_chat(user, "You cannot turn the light on while in this [user.loc].")//To prevent some lighting anomalities. - return toggle_light(user) diff --git a/code/modules/clothing/spacesuits/rig.dm b/code/modules/clothing/spacesuits/rig.dm index 4fd0961910a..72a32c1e0cb 100644 --- a/code/modules/clothing/spacesuits/rig.dm +++ b/code/modules/clothing/spacesuits/rig.dm @@ -33,7 +33,6 @@ if(!isturf(user.loc)) to_chat(user, "You cannot turn the light on while in this [user.loc].")//To prevent some lighting anomalities. - return toggle_light(user) @@ -107,10 +106,8 @@ if(attached_helmet && helmet) if(H.head) to_chat(M, "You are unable to deploy your suit's helmet as \the [H.head] is in the way.") - else to_chat(M, "Your suit's helmet deploys with a hiss.") - //TODO: Species check, skull damage for forcing an unfitting helmet on? helmet.forceMove(H) H.equip_to_slot(helmet, slot_head) @@ -119,10 +116,8 @@ if(attached_boots && boots) if(H.shoes) to_chat(M, "You are unable to deploy your suit's magboots as \the [H.shoes] are in the way.") - else to_chat(M, "Your suit's boots deploy with a hiss.") - boots.forceMove(H) H.equip_to_slot(boots, slot_shoes) boots.flags |= NODROP @@ -158,7 +153,6 @@ if(!helmet) to_chat(usr, "There is no helmet installed.") - return var/mob/living/carbon/human/H = usr @@ -172,11 +166,9 @@ H.unEquip(helmet) helmet.loc = src to_chat(H, "You retract your hardsuit helmet.") - else if(H.head) to_chat(H, "You cannot deploy your helmet while wearing another helmet.") - return //TODO: Species check, skull damage for forcing an unfitting helmet on? helmet.loc = H @@ -184,7 +176,6 @@ H.equip_to_slot(helmet, slot_head) helmet.flags |= NODROP to_chat(H, "You deploy your hardsuit helmet, sealing you off from the world.") - H.update_inv_head() /obj/item/clothing/suit/space/rig/attackby(obj/item/W as obj, mob/user as mob, params) @@ -193,25 +184,20 @@ if(istype(src.loc,/mob/living)) to_chat(user, "How do you propose to modify a hardsuit while it is being worn?") - return if(istype(W,/obj/item/weapon/screwdriver)) if(!helmet) to_chat(user, "\The [src] does not have a helmet installed.") - else to_chat(user, "You detach \the [helmet] from \the [src]'s helmet mount.") - helmet.loc = get_turf(src) src.helmet = null return if(!boots) to_chat(user, "\The [src] does not have any boots installed.") - else to_chat(user, "You detach \the [boots] from \the [src]'s boot mounts.") - boots.loc = get_turf(src) boots = null return @@ -219,14 +205,11 @@ else if(istype(W,/obj/item/clothing/head/helmet/space)) if(!attached_helmet) to_chat(user, "\The [src] does not have a helmet mount.") - return if(helmet) to_chat(user, "\The [src] already has a helmet installed.") - else to_chat(user, "You attach \the [W] to \the [src]'s helmet mount.") - user.drop_item() W.loc = src src.helmet = W @@ -235,15 +218,12 @@ else if(istype(W,/obj/item/clothing/shoes/magboots)) if(!attached_boots) to_chat(user, "\The [src] does not have boot mounts.") - return if(boots) to_chat(user, "\The [src] already has magboots installed.") - else to_chat(user, "You attach \the [W] to \the [src]'s boot mounts.") - user.drop_item() W.loc = src boots = W @@ -327,13 +307,11 @@ if(!isturf(user.loc)) to_chat(user, "You cannot toggle your helmet while in this [user.loc].")//To prevent some lighting anomalities. - return on = !on if(on) to_chat(user, "You switch your helmet to travel mode. It will allow you to stand in zero pressure environments, at the cost of speed and armor.") - name = "blood-red hardsuit helmet" desc = "A dual-mode advanced helmet designed for work in special operations. It is in travel mode. Property of Gorlex Marauders." flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | THICKMATERIAL | NODROP @@ -342,7 +320,6 @@ set_light(brightness_on) else to_chat(user, "You switch your helmet to combat mode. You will take damage in zero pressure environments, but you are more suited for a fight.") - name = "blood-red hardsuit helmet (combat)" desc = "A dual-mode advanced helmet designed for work in special operations. It is in combat mode. Property of Gorlex Marauders." flags = BLOCKHAIR | THICKMATERIAL | NODROP @@ -374,7 +351,6 @@ on = !on if(on) to_chat(user, "You switch your hardsuit to travel mode. It will allow you to stand in zero pressure environments, at the cost of speed and armor.") - name = "blood-red hardsuit" desc = "A dual-mode advanced hardsuit designed for work in special operations. It is in travel mode. Property of Gorlex Marauders." slowdown = 1 @@ -383,7 +359,6 @@ cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS else to_chat(user, "You switch your hardsuit to combat mode. You will take damage in zero pressure environments, but you are more suited for a fight.") - name = "blood-red hardsuit (combat)" desc = "A dual-mode advanced hardsuit designed for work in special operations. It is in combat mode. Property of Gorlex Marauders." slowdown = 0 diff --git a/code/modules/clothing/spacesuits/rig/modules/combat.dm b/code/modules/clothing/spacesuits/rig/modules/combat.dm index b555fdd2050..2473fd24eb8 100644 --- a/code/modules/clothing/spacesuits/rig/modules/combat.dm +++ b/code/modules/clothing/spacesuits/rig/modules/combat.dm @@ -52,11 +52,9 @@ if(accepted_item.charges >= 5) to_chat(user, "Another grenade of that type will not fit into the module.") - return 0 to_chat(user, "You slot \the [input_device] into the suit module.") - user.unEquip(input_device) qdel(input_device) accepted_item.charges++ @@ -74,7 +72,6 @@ if(!charge_selected) to_chat(H, "You have not selected a grenade type.") - return 0 var/datum/rig_charge/charge = charges[charge_selected] @@ -84,7 +81,6 @@ if(charge.charges <= 0) to_chat(H, "Insufficient grenades!") - return 0 charge.charges-- @@ -191,7 +187,6 @@ if(M.l_hand && M.r_hand) to_chat(M, "Your hands are full.") - deactivate() return @@ -244,12 +239,10 @@ else if(H.l_hand && H.r_hand) to_chat(H, "Your hands are full.") - else var/obj/item/new_weapon = new fabrication_type() new_weapon.forceMove(H) to_chat(H, "You quickly fabricate \a [new_weapon].") - H.put_in_hands(new_weapon) return 1 diff --git a/code/modules/clothing/spacesuits/rig/modules/computer.dm b/code/modules/clothing/spacesuits/rig/modules/computer.dm index 6059173f090..468141b6628 100644 --- a/code/modules/clothing/spacesuits/rig/modules/computer.dm +++ b/code/modules/clothing/spacesuits/rig/modules/computer.dm @@ -16,13 +16,11 @@ if(!usr.loc || !usr.loc.loc || !istype(usr.loc.loc, /obj/item/rig_module)) to_chat(usr, "You are not loaded into a hardsuit.") - return var/obj/item/rig_module/module = usr.loc.loc if(!module.holder) to_chat(usr, "Your module is not installed in a hardsuit.") - return module.holder.ui_interact(usr, nano_state = contained_state) @@ -163,10 +161,8 @@ if(integrated_ai && !integrated_ai.stat) if(user) to_chat(user, "You cannot eject your currently stored AI. Purge it manually.") - return 0 to_chat(user, "You purge the remaining scraps of data from your previous AI, freeing it for use.") - if(integrated_ai) integrated_ai.ghostize() qdel(integrated_ai) @@ -214,10 +210,8 @@ ai.forceMove(src) ai_card = ai to_chat(ai_mob, "You have been transferred to \the [holder]'s [src].") - to_chat(user, "You load [ai_mob] into \the [holder]'s [src].") - integrated_ai = ai_mob if(!(locate(integrated_ai) in ai_card)) @@ -225,10 +219,8 @@ eject_ai() else to_chat(user, "There is no active AI within \the [ai].") - else to_chat(user, "There is no active AI within \the [ai].") - update_verb_holder() /obj/item/rig_module/datajack @@ -266,19 +258,15 @@ if(istype(input_device,/obj/item/weapon/disk/tech_disk)) to_chat(user, "You slot the disk into [src].") - var/obj/item/weapon/disk/tech_disk/disk = input_device if(disk.stored) if(load_data(disk.stored)) to_chat(user, "Download successful; disk erased.") - disk.stored = null else to_chat(user, "The disk is corrupt. It is useless to you.") - else to_chat(user, "The disk is blank. It is useless to you.") - return 1 // I fucking hate R&D code. This typecheck spam would be totally unnecessary in a sane setup. @@ -296,15 +284,12 @@ if(!incoming_files || !incoming_files.known_tech || !incoming_files.known_tech.len) to_chat(user, "Memory failure. There is nothing accessible stored on this terminal.") - else // Maybe consider a way to drop all your data into a target repo in the future. if(load_data(incoming_files.known_tech)) to_chat(user, "Download successful; local and remote repositories synchronized.") - else to_chat(user, "Scan complete. There is nothing useful stored on this terminal.") - return 1 return 0 @@ -385,7 +370,6 @@ if(interfaced_with) if(holder && holder.wearer) to_chat(holder.wearer, "Your power sink retracts as the module deactivates.") - drain_complete() interfaced_with = null total_power_drained = 0 @@ -418,7 +402,6 @@ return 0 to_chat(H, "You begin draining power from [target]!") - interfaced_with = target drain_loc = interfaced_with.loc @@ -451,19 +434,16 @@ if(!holder.cell) to_chat(H, "Your power sink flashes an error; there is no cell in your rig.") - drain_complete(H) return if(!interfaced_with || !interfaced_with.Adjacent(H) || !(interfaced_with.loc == drain_loc)) to_chat(H, "Your power sink retracts into its casing.") - drain_complete(H) return if(holder.cell.fully_charged()) to_chat(H, "Your power sink flashes an amber light; your rig cell is full.") - drain_complete(H) return @@ -472,7 +452,6 @@ var/target_drained = interfaced_with.drain_power(0,0,to_drain) if(target_drained <= 0) to_chat(H, "Your power sink flashes a red light; there is no power left in [interfaced_with].") - drain_complete(H) return @@ -485,10 +464,8 @@ if(!interfaced_with) to_chat(if(M) M, "Total power drained: [round(total_power_drained/1000)]kJ.") - else to_chat(if(M) M, "Total power drained from [interfaced_with]: [round(total_power_drained/1000)]kJ.") - interfaced_with.drain_power(0,1,0) // Damage the victim. drain_loc = null diff --git a/code/modules/clothing/spacesuits/rig/modules/modules.dm b/code/modules/clothing/spacesuits/rig/modules/modules.dm index ae790b74f6b..e64084a0beb 100644 --- a/code/modules/clothing/spacesuits/rig/modules/modules.dm +++ b/code/modules/clothing/spacesuits/rig/modules/modules.dm @@ -58,33 +58,27 @@ switch(damage) if(0) to_chat(usr, "It is undamaged.") - if(1) to_chat(usr, "It is badly damaged.") - if(2) to_chat(usr, "It is almost completely destroyed.") - /obj/item/rig_module/attackby(obj/item/W as obj, mob/user as mob) if(istype(W,/obj/item/stack/nanopaste)) if(damage == 0) to_chat(user, "There is no damage to mend.") - return to_chat(user, "You start mending the damaged portions of \the [src]...") - if(!do_after(user,30, target = src) || !W || !src) return var/obj/item/stack/nanopaste/paste = W damage = 0 to_chat(user, "You mend the damage to [src] with [W].") - paste.use(1) return @@ -93,27 +87,22 @@ switch(damage) if(0) to_chat(user, "There is no damage to mend.") - return if(2) to_chat(user, "There is no damage that you are capable of mending with such crude tools.") - return var/obj/item/stack/cable_coil/cable = W if(!cable.amount >= 5) to_chat(user, "You need five units of cable to repair \the [src].") - return to_chat(user, "You start mending the damaged portions of \the [src]...") - if(!do_after(user, 30, target = src) || !W || !src) return damage = 1 to_chat(user, "You mend some of damage to [src] with [W], but you will need more advanced tools to fix it completely.") - cable.use(5) return ..() @@ -154,32 +143,26 @@ if(damage >= 2) to_chat(usr, "The [interface_name] is damaged beyond use!") - return 0 if(world.time < next_use) to_chat(usr, "You cannot use the [interface_name] again so soon.") - return 0 if(!holder || (!(holder.flags & NODROP))) to_chat(usr, "The suit is not initialized.") - return 0 if(usr.lying || usr.stat || usr.stunned || usr.paralysis || usr.weakened) to_chat(usr, "You cannot use the suit in this state.") - return 0 if(holder.wearer && holder.wearer.lying) to_chat(usr, "The suit cannot function while the wearer is prone.") - return 0 if(holder.security_check_enabled && !holder.check_suit_access(usr)) to_chat(usr, "Access denied.") - return 0 if(!holder.check_power_cost(usr, use_power_cost, 0, src, (istype(usr,/mob/living/silicon ? 1 : 0) ) ) ) diff --git a/code/modules/clothing/spacesuits/rig/modules/ninja.dm b/code/modules/clothing/spacesuits/rig/modules/ninja.dm index 5db07ba037c..40e64add719 100644 --- a/code/modules/clothing/spacesuits/rig/modules/ninja.dm +++ b/code/modules/clothing/spacesuits/rig/modules/ninja.dm @@ -38,7 +38,6 @@ var/mob/living/carbon/human/H = holder.wearer to_chat(H, "You are now invisible to normal detection.") - H.invisibility = INVISIBILITY_LEVEL_TWO anim(get_turf(H), H, 'icons/effects/effects.dmi', "electricity",null,20,null) @@ -53,7 +52,6 @@ var/mob/living/carbon/human/H = holder.wearer to_chat(H, "You are now visible.") - H.invisibility = 0 anim(get_turf(H), H,'icons/mob/mob.dmi',,"uncloak",,H.dir) @@ -105,7 +103,6 @@ if(!istype(H.loc, /turf)) to_chat(H, "You cannot teleport out of your current location.") - return 0 var/turf/T @@ -116,12 +113,10 @@ /*if(!T || T.density) to_chat(H, "You cannot teleport into solid walls.") - return 0*///Who the fuck cares? Ninjas in walls are cool. if(T.z in config.admin_levels) to_chat(H, "You cannot use your teleporter on this Z-level.") - return 0 phase_out(H,get_turf(H)) diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm index 7d68a18986a..087b34dd756 100644 --- a/code/modules/clothing/spacesuits/rig/modules/utility.dm +++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm @@ -165,7 +165,6 @@ if(!input_item.reagents || !input_item.reagents.total_volume) to_chat(user, "\The [input_item] is empty.") - return 0 // Magical chemical filtration system, do not question it. @@ -188,10 +187,8 @@ if(total_transferred) to_chat(user, "You transfer [total_transferred] units into the suit reservoir.") - else to_chat(user, "None of the reagents seem suitable.") - return 1 /obj/item/rig_module/chem_dispenser/engage(atom/target) @@ -203,7 +200,6 @@ if(!charge_selected) to_chat(H, "You have not selected a chemical type.") - return 0 var/datum/rig_charge/charge = charges[charge_selected] @@ -214,7 +210,6 @@ var/chems_to_use = 10 if(charge.charges <= 0) to_chat(H, "Insufficient chems!") - return 0 else if(charge.charges < chems_to_use) chems_to_use = charge.charges @@ -230,9 +225,7 @@ if(target_mob != H) to_chat(H, "You inject [target_mob] with [chems_to_use] unit\s of [charge.display_name].") - to_chat(target_mob, "You feel a rushing in your veins as [chems_to_use] unit\s of [charge.display_name] [chems_to_use == 1 ? "is" : "are"] injected.") - target_mob.reagents.add_reagent(charge.display_name, chems_to_use) charge.charges -= chems_to_use @@ -307,19 +300,16 @@ active = 1 voice_holder.active = 1 to_chat(usr, "You enable the speech synthesiser.") - if("Disable") active = 0 voice_holder.active = 0 to_chat(usr, "You disable the speech synthesiser.") - if("Set Name") var/raw_choice = sanitize(input(usr, "Please enter a new name.") as text|null, MAX_NAME_LEN) if(!raw_choice) return 0 voice_holder.voice = raw_choice to_chat(usr, "You are now mimicking [voice_holder.voice].") - return 1 /obj/item/rig_module/maneuvering_jets @@ -446,11 +436,9 @@ if(device == iastamp) device = deniedstamp to_chat(holder.wearer, "Switched to denied stamp.") - else if(device == deniedstamp) device = iastamp to_chat(holder.wearer, "Switched to internal affairs stamp.") - return 1 /obj/item/rig_module/welding_tank @@ -485,11 +473,9 @@ fill_welder(W) else to_chat(holder.wearer, "Your welding tank is out of fuel!") - else to_chat(holder.wearer, "You need to have a welding tool in one of your hands to dispense fuel.") - /obj/item/rig_module/welding_tank/proc/fill_welder(var/obj/item/weapon/weldingtool/W) if(!istype(W)) return 0 @@ -498,11 +484,9 @@ if(get_fuel() >= W.max_fuel) reagents.trans_to(W, W.max_fuel) to_chat(holder.wearer, "Your [holder] dispenses some of the contents of the welding fuel tank into \the [W].") - else reagents.trans_to(W, W.max_fuel) to_chat(holder.wearer, "You hear a faint dripping as your hardsuit welding tank completely empties.") - W.update_icon() /obj/item/rig_module/welding_tank/proc/get_fuel() diff --git a/code/modules/clothing/spacesuits/rig/modules/vision.dm b/code/modules/clothing/spacesuits/rig/modules/vision.dm index f4db1864ffc..9fc960cdbce 100644 --- a/code/modules/clothing/spacesuits/rig/modules/vision.dm +++ b/code/modules/clothing/spacesuits/rig/modules/vision.dm @@ -161,7 +161,6 @@ // Don't cycle if this engage() is being called by activate(). if(starting_up) to_chat(holder.wearer, "You activate your visual sensors.") - return 1 if(vision_modes.len > 1) @@ -171,10 +170,8 @@ vision = vision_modes[vision_index] to_chat(holder.wearer, "You cycle your sensors to [vision.mode] mode.") - else to_chat(holder.wearer, "Your sensors only have one mode.") - return 1 /obj/item/rig_module/vision/New() diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index d44baeab2d4..066c4893f73 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -83,22 +83,17 @@ /obj/item/weapon/rig/examine() to_chat(usr, "This is \icon[src][src.name].") - to_chat(usr, "[src.desc]") - if(wearer) for(var/obj/item/piece in list(helmet,gloves,chest,boots)) if(!piece || piece.loc != wearer) continue to_chat(usr, "\icon[piece] \The [piece] [piece.gender == PLURAL ? "are" : "is"] deployed.") - if(src.loc == usr) to_chat(usr, "The maintenance panel is [open ? "open" : "closed"].") - to_chat(usr, "Hardsuit systems are [offline ? "offline" : "online"].") - /obj/item/weapon/rig/New() ..() @@ -221,7 +216,6 @@ if(seal_delay && !do_after(user, seal_delay, target = M)) if(user) to_chat(user, "You must remain still while the suit is adjusting the components.") - failed_to_seal = 1 if(!M) @@ -240,7 +234,6 @@ if(!istype(M) || !istype(piece) || !istype(compare_piece) || !msg_type) if(M) to_chat(M, "You must remain still while the suit is adjusting the components.") - failed_to_seal = 1 break @@ -253,19 +246,15 @@ switch(msg_type) if("boots") to_chat(M, "\The [piece] [!seal_target ? "seal around your feet" : "relax their grip on your legs"].") - M.update_inv_shoes() if("gloves") to_chat(M, "\The [piece] [!seal_target ? "tighten around your fingers and wrists" : "become loose around your fingers"].") - M.update_inv_gloves() if("chest") to_chat(M, "\The [piece] [!seal_target ? "cinches tight again your chest" : "releases your chest"].") - M.update_inv_wear_suit() if("helmet") to_chat(M, "\The [piece] hisses [!seal_target ? "closed" : "open"].") - M.update_inv_head() if(helmet) helmet.update_light(wearer) @@ -304,7 +293,6 @@ flags |= NODROP to_chat(M, "Your entire suit [!(flags & NODROP) ? "loosens as the components relax" : "tightens around you as the components lock into place"].") - if(!(flags & NODROP)) for(var/obj/item/rig_module/module in installed_modules) module.deactivate() @@ -341,16 +329,12 @@ if(flags & NODROP) if (offline_slowdown < 3) to_chat(wearer, "Your suit beeps stridently, and suddenly goes dead.") - else to_chat(wearer, "Your suit beeps stridently, and suddenly you're wearing a leaden mass of metal and plastic composites instead of a powered suit.") - if(offline_vision_restriction == 1) to_chat(wearer, "The suit optics flicker and die, leaving you with restricted vision.") - else if(offline_vision_restriction == 2) to_chat(wearer, "The suit optics drop out completely, drowning you in darkness.") - if(!offline) offline = 1 if(istype(wearer) && wearer.wearing_rig) @@ -406,7 +390,6 @@ if(fail_msg) to_chat(user, "[fail_msg]") - return 0 // This is largely for cancelling stealth and whatever. @@ -533,12 +516,10 @@ return 0 else if(!src.allowed(user)) to_chat(user, "Unauthorized user. Access denied.") - return 0 else if(!ai_override_enabled) to_chat(user, "Synthetic access disabled. Please consult hardware provider.") - return 0 return 1 @@ -589,7 +570,6 @@ if(ai && ai.client && !ai.stat) to_chat(ai, "[message]") - /obj/item/weapon/rig/equipped(mob/living/carbon/human/M) ..() spawn(1) //equipped() is called BEFORE the item is actually set as the slot @@ -655,7 +635,6 @@ if(istype(holder)) if(use_obj && check_slot == use_obj) to_chat(H, "Your [use_obj.name] [use_obj.gender == PLURAL ? "retract" : "retracts"] swiftly.") - use_obj.flags &= ~NODROP holder.unEquip(use_obj, 1) use_obj.forceMove(src) @@ -664,7 +643,6 @@ if(check_slot) if(check_slot != use_obj) to_chat(H, "You are unable to deploy \the [piece] as \the [check_slot] [check_slot.gender == PLURAL ? "are" : "is"] in the way.") - return else use_obj.forceMove(H) @@ -673,7 +651,6 @@ use_obj.forceMove(src) else to_chat(H, "Your [use_obj.name] [use_obj.gender == PLURAL ? "deploy" : "deploys"] swiftly.") - use_obj.flags |= NODROP if(piece == "helmet" && helmet) @@ -790,20 +767,16 @@ if(wearer) if(dam_module.damage >= 2) to_chat(wearer, "The [source] has disabled your [dam_module.interface_name]!") - else to_chat(wearer, "The [source] has damaged your [dam_module.interface_name]!") - dam_module.deactivate() /obj/item/weapon/rig/proc/malfunction_check(var/mob/living/carbon/human/user) if(malfunction_delay) if(offline) to_chat(user, "The suit is completely unresponsive.") - else to_chat(user, "ERROR: Hardware fault. Rebooting interface...") - return 1 return 0 @@ -828,23 +801,19 @@ var/obj/item/rig_module/ai_container/module = user.loc.loc if(!istype(module) || module.damage >= 2) to_chat(user, "Your host module is unable to interface with the suit.") - return 0 if(offline || !cell || !cell.charge || locked_down) if(user) to_chat(user, "Your host rig is unpowered and unresponsive.") - return 0 if(!wearer || wearer.back != src) if(user) to_chat(user, "Your host rig is not being worn.") - return 0 if(!wearer.stat && !control_overridden && !ai_override_enabled) if(user) to_chat(user, "You are locked out of the suit servo controller.") - return 0 return 1 @@ -854,7 +823,6 @@ wearer.lay_down() to_chat(user, "\The [wearer] is now [wearer.resting ? "resting" : "getting up"].") - /obj/item/weapon/rig/proc/forced_move(var/direction, var/mob/user) // Why is all this shit in client/Move()? Who knows? @@ -894,14 +862,12 @@ if(M.pulling == wearer) if(!M.restrained() && M.stat == 0 && M.canmove && wearer.Adjacent(M)) to_chat(user, "Your host is restrained! They can't move!") - return 0 else M.stop_pulling() if(wearer.pinned.len) to_chat(src, "Your host is pinned to a wall by [wearer.pinned[1]]!") - return 0 // AIs are a bit slower than regular and ignore move intent. diff --git a/code/modules/clothing/spacesuits/rig/rig_attackby.dm b/code/modules/clothing/spacesuits/rig/rig_attackby.dm index 26912b6c005..b89c59cf837 100644 --- a/code/modules/clothing/spacesuits/rig/rig_attackby.dm +++ b/code/modules/clothing/spacesuits/rig/rig_attackby.dm @@ -15,35 +15,29 @@ if(subverted) locked = 0 to_chat(user, "It looks like the locking system has been shorted out.") - return if((!req_access || !req_access.len) && (!req_one_access || !req_one_access.len)) locked = 0 to_chat(user, "\The [src] doesn't seem to have a locking mechanism.") - return if(security_check_enabled && !src.allowed(user)) to_chat(user, "Access denied.") - return locked = !locked to_chat(user, "You [locked ? "lock" : "unlock"] \the [src] access panel.") - return else if(istype(W,/obj/item/weapon/crowbar)) if(!open && locked) to_chat(user, "The access panel is locked shut.") - return open = !open to_chat(user, "You [open ? "open" : "close"] the access panel.") - return if(open) @@ -54,21 +48,18 @@ wires.Interact(user) else to_chat(user, "You can't reach the wiring.") - return // Air tank. if(istype(W,/obj/item/weapon/tank)) //Todo, some kind of check for suits without integrated air supplies. if(air_supply) to_chat(user, "\The [src] already has a tank installed.") - return user.unEquip(W) air_supply = W W.forceMove(src) to_chat(user, "You slot [W] into [src] and tighten the connecting valve.") - return // Check if this is a hardsuit upgrade or a modification. @@ -78,7 +69,6 @@ var/mob/living/carbon/human/H = src.loc if(H.back == src) to_chat(user, "You can't install a hardsuit module while the suit is being worn.") - return 1 if(!installed_modules) installed_modules = list() @@ -86,18 +76,15 @@ for(var/obj/item/rig_module/installed_mod in installed_modules) if(!installed_mod.redundant && istype(installed_mod,W)) to_chat(user, "The hardsuit already has a module of that class installed.") - return 1 var/obj/item/rig_module/mod = W to_chat(user, "You begin installing \the [mod] into \the [src].") - if(!do_after(user,40, target = src)) return if(!user || !W) return to_chat(user, "You install \the [mod] into \the [src].") - user.unEquip(mod) installed_modules |= mod mod.forceMove(src) @@ -108,7 +95,6 @@ else if(!cell && istype(W,/obj/item/weapon/stock_parts/cell)) to_chat(user, "You jack \the [W] into \the [src]'s battery mount.") - user.unEquip(W) W.forceMove(src) src.cell = W @@ -118,7 +104,6 @@ if(!air_supply) to_chat(user, "There is not tank to remove.") - return if(user.r_hand && user.l_hand) @@ -126,7 +111,6 @@ else user.put_in_hands(air_supply) to_chat(user, "You detach and remove \the [air_supply].") - air_supply = null return @@ -144,7 +128,6 @@ var/mob/living/carbon/human/H = src.loc if(H.back == src) to_chat(user, "You can't remove an installed device while the hardsuit is being worn.") - return switch(to_remove) @@ -153,7 +136,6 @@ if(cell) to_chat(user, "You detatch \the [cell] from \the [src]'s battery mount.") - for(var/obj/item/rig_module/module in installed_modules) module.deactivate() if(user.r_hand && user.l_hand) @@ -164,7 +146,6 @@ else to_chat(user, "There is nothing loaded in that mount.") - if("system module") var/list/possible_removals = list() @@ -175,7 +156,6 @@ if(!possible_removals.len) to_chat(user, "There are no installed modules to remove.") - return var/removal_choice = input("Which module would you like to remove?") as null|anything in possible_removals @@ -184,7 +164,6 @@ var/obj/item/rig_module/removed = possible_removals[removal_choice] to_chat(user, "You detatch \the [removed] from \the [src].") - removed.forceMove(get_turf(src)) removed.removed() installed_modules -= removed @@ -214,5 +193,4 @@ locked = 0 subverted = 1 to_chat(user, "You short out the access protocol for the suit.") - return 1 diff --git a/code/modules/clothing/spacesuits/rig/rig_pieces.dm b/code/modules/clothing/spacesuits/rig/rig_pieces.dm index 41f58657611..dab4ad5ac35 100644 --- a/code/modules/clothing/spacesuits/rig/rig_pieces.dm +++ b/code/modules/clothing/spacesuits/rig/rig_pieces.dm @@ -24,7 +24,6 @@ if(!isturf(user.loc)) to_chat(user, "You cannot turn the light on while in this [user.loc].")//To prevent some lighting anomalities. - return toggle_light(user) diff --git a/code/modules/clothing/spacesuits/rig/rig_verbs.dm b/code/modules/clothing/spacesuits/rig/rig_verbs.dm index acd84334bac..f4769eddf0b 100644 --- a/code/modules/clothing/spacesuits/rig/rig_verbs.dm +++ b/code/modules/clothing/spacesuits/rig/rig_verbs.dm @@ -18,7 +18,6 @@ if(!istype(wearer) || !wearer.back == src) to_chat(usr, "The hardsuit is not being worn.") - return if(!check_power_cost(usr)) @@ -26,7 +25,6 @@ if(!(flags & NODROP)) to_chat(usr, "The suit is not active.") - return if(!check_suit_access(usr)) @@ -34,7 +32,6 @@ if(!visor) to_chat(usr, "The hardsuit does not have a configurable visor.") - return var/mob/M = usr @@ -55,7 +52,6 @@ if(!istype(wearer) || !wearer.back == src) to_chat(usr, "The hardsuit is not being worn.") - return if(!check_suit_access(usr)) @@ -92,7 +88,6 @@ if(!istype(wearer) || !wearer.back == src) to_chat(usr, "The hardsuit is not being worn.") - return if(!check_suit_access(usr)) @@ -113,7 +108,6 @@ if(!istype(wearer) || !wearer.back == src) to_chat(usr, "The hardsuit is not being worn.") - return if(!check_suit_access(usr)) @@ -134,7 +128,6 @@ if(!istype(wearer) || !wearer.back == src) to_chat(usr, "The hardsuit is not being worn.") - return if(!check_suit_access(usr)) @@ -158,7 +151,6 @@ if(!istype(wearer) || !wearer.back == src) to_chat(usr, "The hardsuit is not being worn.") - return if(!check_suit_access(usr)) @@ -185,12 +177,10 @@ if(!(flags & NODROP)) to_chat(usr, "The suit is not active.") - return if(!visor) to_chat(usr, "The hardsuit does not have a configurable visor.") - return var/mob/M = usr @@ -202,7 +192,6 @@ if(!visor.active) to_chat(usr, "The visor is suffering a hardware fault and cannot be configured.") - return visor.engage() @@ -219,17 +208,14 @@ if(!(flags & NODROP)) to_chat(usr, "The suit is not active.") - return if(!istype(wearer) || !wearer.back == src) to_chat(usr, "The hardsuit is not being worn.") - return if(!speech) to_chat(usr, "The hardsuit does not have a speech synthesiser.") - return var/mob/M = usr @@ -253,12 +239,10 @@ if(!(flags & NODROP)) to_chat(usr, "The suit is not active.") - return if(!istype(wearer) || !wearer.back == src) to_chat(usr, "The hardsuit is not being worn.") - return var/mob/M = usr @@ -275,13 +259,11 @@ if(!istype(module)) selected_module = null to_chat(usr, "Primary system is now: deselected.") - return selected_module = module to_chat(usr, "Primary system is now: [selected_module.interface_name].") - /obj/item/weapon/rig/verb/toggle_module() set name = "Toggle Module" @@ -297,12 +279,10 @@ if(!(flags & NODROP)) to_chat(usr, "The suit is not active.") - return if(!istype(wearer) || !wearer.back == src) to_chat(usr, "The hardsuit is not being worn.") - return var/mob/M = usr @@ -321,11 +301,9 @@ if(module.active) to_chat(usr, "You attempt to deactivate \the [module.interface_name].") - module.deactivate() else to_chat(usr, "You attempt to activate \the [module.interface_name].") - module.activate() /obj/item/weapon/rig/verb/engage_module() @@ -340,12 +318,10 @@ if(!(flags & NODROP)) to_chat(usr, "The suit is not active.") - return if(!istype(wearer) || !wearer.back == src) to_chat(usr, "The hardsuit is not being worn.") - return if(!check_power_cost(usr, 0, 0, 0, 0)) @@ -366,5 +342,4 @@ return to_chat(usr, "You attempt to engage the [module.interface_name].") - module.engage() \ No newline at end of file diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 7abf3efdf1b..6f699e3a9ae 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -175,12 +175,10 @@ src.active = !( src.active ) if (src.active) to_chat(user, "\blue The reactive armor is now active.") - src.icon_state = "reactive" src.item_state = "reactive" else to_chat(user, "\blue The reactive armor is now inactive.") - src.icon_state = "reactiveoff" src.item_state = "reactiveoff" src.add_fingerprint(user) diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index a926b54499e..f1a8865418c 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -554,11 +554,9 @@ if(on) on = 0 to_chat(usr, "You turn the suit's special processes off.") - else on = 1 to_chat(usr, "You turn the suit's special processes on.") - processing_objects.Add(src) diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index 3d12a9ff290..5dc5cf02699 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -24,7 +24,6 @@ has_suit.overlays += inv_overlay to_chat(user, "You attach [src] to [has_suit].") - src.add_fingerprint(user) /obj/item/clothing/accessory/proc/on_removed(mob/user as mob) @@ -40,7 +39,6 @@ if(istype(H)) if(H.wear_suit && H.wear_suit.flags_inv & HIDEJUMPSUIT) to_chat(user, "[H]'s body is covered, and you cannot attach \the [src].") - return 1 var/obj/item/clothing/under/U = H.w_uniform if(istype(U)) @@ -50,7 +48,6 @@ U.attackby(src, user) else to_chat(user, "[H] is not wearing anything to attach \the [src] to.") - return 1 return ..() @@ -207,7 +204,6 @@ /obj/item/clothing/accessory/holobadge/attack_self(mob/user as mob) if(!stored_name) to_chat(user, "Waving around a badge before swiping an ID would be pretty pointless.") - return if(isliving(user)) user.visible_message("\red [user] displays their NanoTrasen Internal Security Legal Authorization Badge.\nIt reads: [stored_name], NT Security.","\red You display your NanoTrasen Internal Security Legal Authorization Badge.\nIt reads: [stored_name], NT Security.") @@ -225,25 +221,21 @@ if(access_security in id_card.access || emagged) to_chat(user, "You imprint your ID details onto the badge.") - stored_name = id_card.registered_name name = "holobadge ([stored_name])" desc = "This glowing blue badge marks [stored_name] as THE LAW." else to_chat(user, "[src] rejects your insufficient access rights.") - return ..() /obj/item/clothing/accessory/holobadge/emag_act(user as mob) if (emagged) to_chat(user, "\red [src] is already cracked.") - return else emagged = 1 to_chat(user, "\red You swipe the card and crack the holobadge security checks.") - return /obj/item/clothing/accessory/holobadge/attack(mob/living/carbon/human/M, mob/living/user) @@ -385,13 +377,11 @@ return ..() if(access_id) to_chat(user, "There is already \a [access_id] clipped onto \the [src]") - user.drop_item() W.forceMove(src) access_id = W to_chat(user, "\The [W] clips onto \the [src] snugly.") - /obj/item/clothing/accessory/petcollar/GetAccess() return access_id ? access_id.GetAccess() : ..() @@ -400,7 +390,6 @@ if(access_id) to_chat(user, "There is \icon[access_id] \a [access_id] clipped onto it.") - /obj/item/clothing/accessory/petcollar/equipped(mob/living/simple_animal/user) if(istype(user)) processing_objects |= src diff --git a/code/modules/clothing/under/accessories/holster.dm b/code/modules/clothing/under/accessories/holster.dm index 44fdc31ed57..2a4bb7634e5 100644 --- a/code/modules/clothing/under/accessories/holster.dm +++ b/code/modules/clothing/under/accessories/holster.dm @@ -28,18 +28,15 @@ /obj/item/clothing/accessory/holster/proc/holster(obj/item/I, mob/user as mob) if(holstered) to_chat(user, "There is already a [holstered] holstered here!") - return if (!istype(I, /obj/item/weapon/gun)) to_chat(user, "Only guns can be holstered!") - return var/obj/item/weapon/gun/W = I if (!can_holster(W)) to_chat(user, "This [W] won't fit in the [src]!") - return holstered = W @@ -54,7 +51,6 @@ if(istype(user.get_active_hand(),/obj) && istype(user.get_inactive_hand(),/obj)) to_chat(user, "You need an empty hand to draw the [holstered]!") - else if(user.a_intent == I_HARM) usr.visible_message("\red [user] draws the [holstered], ready to shoot!", \ @@ -86,11 +82,9 @@ ..(user) if (holstered) to_chat(user, "A [holstered] is holstered here.") - else to_chat(user, "It is empty.") - /obj/item/clothing/accessory/holster/on_attached(obj/item/clothing/under/S, mob/user as mob) ..() has_suit.verbs += /obj/item/clothing/accessory/holster/verb/holster_verb @@ -118,11 +112,9 @@ if (!H) to_chat(usr, "Something is very wrong.") - if(!H.holstered) if(!istype(usr.get_active_hand(), /obj/item/weapon/gun)) to_chat(usr, "You need your gun equiped to holster it.") - return var/obj/item/weapon/gun/W = usr.get_active_hand() H.holster(W, usr) diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm index aa5ebdb78f5..4c5997d3330 100644 --- a/code/modules/clothing/under/accessories/storage.dm +++ b/code/modules/clothing/under/accessories/storage.dm @@ -63,7 +63,6 @@ hold.open(user) else to_chat(user, "You empty [src].") - var/turf/T = get_turf(src) hold.hide_from(usr) for(var/obj/item/I in hold.contents) diff --git a/code/modules/clothing/under/chameleon.dm b/code/modules/clothing/under/chameleon.dm index 70b6ef113f9..a2496168b5f 100644 --- a/code/modules/clothing/under/chameleon.dm +++ b/code/modules/clothing/under/chameleon.dm @@ -24,18 +24,15 @@ ..() if(istype(U, /obj/item/clothing/under/chameleon)) to_chat(user, "\red Nothing happens.") - return if(istype(U, /obj/item/clothing/under)) if(src.clothing_choices.Find(U)) to_chat(user, "\red Pattern is already recognised by the suit.") - return src.clothing_choices += U to_chat(user, "\red Pattern absorbed by the suit.") - emp_act(severity) name = "psychedelic" desc = "Groovy!" @@ -56,7 +53,6 @@ if(icon_state == "psyche") to_chat(usr, "\red Your suit is malfunctioning") - return var/obj/item/clothing/under/A diff --git a/code/modules/computer3/bios.dm b/code/modules/computer3/bios.dm index 8c05ad5338a..564156540d3 100644 --- a/code/modules/computer3/bios.dm +++ b/code/modules/computer3/bios.dm @@ -25,17 +25,14 @@ if(istype(user,/mob/living/silicon)) if(!program.ai_allowed) to_chat(user, "\blue You are forbidden from accessing this program.") - return 0 else if(program.human_controls) if(!ishuman(user)) to_chat(user, "\red Your body can't work the controls!") - return 0 if(user.restrained()) to_chat(user, "\red You need a free hand!") - return 0 if(!in_range(src,user)) @@ -43,7 +40,6 @@ if(ishuman(user) && istype(user.get_active_hand(),/obj/item/tk_grab)) if(program.human_controls) to_chat(user, "\red It's too complicated to work at a distance!") - return 0 add_fingerprint(user) user.set_machine(src) @@ -120,7 +116,6 @@ if(PROG_CRASH) if(usr) to_chat(usr, "\red The program crashed!") - usr << browse(null,"\ref[src]") Reset() @@ -154,7 +149,6 @@ else if(usr) to_chat(usr, "\red The program crashed!") - usr << browse(null,"\ref[src]") testing("computer/Crash() - unknown error code [errorcode]") Reset() diff --git a/code/modules/computer3/buildandrepair.dm b/code/modules/computer3/buildandrepair.dm index 158d057451d..4ea984d15d1 100644 --- a/code/modules/computer3/buildandrepair.dm +++ b/code/modules/computer3/buildandrepair.dm @@ -83,20 +83,17 @@ playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 20, target = src)) to_chat(user, "\blue You wrench the frame into place.") - src.anchored = 1 src.state = 1 if(istype(P, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = P if(!WT.remove_fuel(0, user)) to_chat(user, "The welding tool must be on to complete this task.") - return playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) if(do_after(user, 20, target = src)) if(!src || !WT.isOn()) return to_chat(user, "\blue You deconstruct the frame.") - new /obj/item/stack/sheet/metal( src.loc, 5 ) qdel(src) if(1) @@ -104,7 +101,6 @@ playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 20, target = src)) to_chat(user, "\blue You unfasten the frame.") - src.anchored = 0 src.state = 0 if(istype(P, /obj/item/weapon/circuitboard) && !circuit) @@ -112,24 +108,20 @@ if(B.board_type == "computer") playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) to_chat(user, "\blue You place the circuit board inside the frame.") - src.icon_state = "1" src.circuit = P user.drop_item() P.loc = src else to_chat(user, "\red This frame does not accept circuit boards of this type!") - if(istype(P, /obj/item/weapon/screwdriver) && circuit) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) to_chat(user, "\blue You screw the circuit board into place.") - src.state = 2 src.icon_state = "2" if(istype(P, /obj/item/weapon/crowbar) && circuit) playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) to_chat(user, "\blue You remove the circuit board.") - src.state = 1 src.icon_state = "0" circuit.loc = src.loc @@ -138,7 +130,6 @@ if(istype(P, /obj/item/weapon/screwdriver) && circuit) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) to_chat(user, "\blue You unfasten the circuit board.") - src.state = 1 src.icon_state = "1" @@ -148,12 +139,10 @@ if(do_after(10, target = src)) battery.loc = loc to_chat(user, "\blue You remove [battery].") - battery = null else to_chat(user, "\red There's no battery to remove!") - if(istype(P, /obj/item/weapon/stock_parts/cell)) if(!battery) playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) @@ -161,12 +150,10 @@ battery = P P.loc = src to_chat(user, "\blue You insert [battery].") - else to_chat(user, "\red There's already \an [battery] in [src]!") - if(istype(P, /obj/item/stack/cable_coil)) if(P:amount >= 5) playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) @@ -175,18 +162,15 @@ P:amount -= 5 if(!P:amount) qdel(P) to_chat(user, "\blue You add cables to the frame.") - src.state = 3 src.icon_state = "3" if(3) if(istype(P, /obj/item/weapon/wirecutters)) if(components.len) to_chat(user, "There are parts in the way!") - return playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) to_chat(user, "\blue You remove the cables.") - src.state = 2 src.icon_state = "2" var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( src.loc ) @@ -202,21 +186,18 @@ if(P) P:use(2) to_chat(user, "\blue You put in the glass panel.") - src.state = 4 src.icon_state = "4" if(4) if(istype(P, /obj/item/weapon/crowbar)) playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) to_chat(user, "\blue You remove the glass panel.") - src.state = 3 src.icon_state = "3" new /obj/item/stack/sheet/glass( src.loc, 2 ) if(istype(P, /obj/item/weapon/screwdriver)) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) to_chat(user, "\blue You connect the monitor.") - var/obj/machinery/computer3/B = new src.circuit.build_path ( src.loc, built=1 ) /*if(circuit.powernet) B:powernet = circuit.powernet if(circuit.id) B:id = circuit.id @@ -240,7 +221,6 @@ /obj/structure/computer3frame/proc/remove_peripheral(var/obj/item/I = null) if(!components || !components.len) to_chat(usr, "\red There are no components in [src] to take out!") - return 0 if(!I) I = input(usr, "Remove which component?","Remove component", null) as null|obj in components @@ -280,19 +260,16 @@ warning("Erronous component in computerframe/remove_peripheral: [I]") I.loc = loc to_chat(usr, "\blue You remove [I]") - return 1 return 0 /obj/structure/computer3frame/proc/insert_peripheral(var/obj/item/I) if(components.len >= max_components) to_chat(usr, "There isn't room in [src] for another component!") - return 0 switch(I.type) if(/obj/item/part/computer/storage/hdd) if(hdd) to_chat(usr, "There is already \an [hdd] in [src]!") - return 0 hdd = I components += hdd @@ -300,7 +277,6 @@ if(/obj/item/part/computer/storage/removable) if(floppy) to_chat(usr, "There is already \an [floppy] in [src]!") - return 0 floppy = I components += floppy @@ -308,7 +284,6 @@ if(/obj/item/part/computer/networking/radio) if(radio) to_chat(usr, "There is already \an [radio] in [src]!") - return 0 radio = I components += radio @@ -316,7 +291,6 @@ if(/obj/item/part/computer/networking/cameras) if(camnet) to_chat(usr, "There is already \an [camnet] in [src]!") - return 0 camnet = I components += camnet @@ -326,4 +300,3 @@ to_chat(usr, "There is already \an [net] in [src]!") - diff --git a/code/modules/computer3/component.dm b/code/modules/computer3/component.dm index 4e0e0ac6807..6dac7aebb31 100644 --- a/code/modules/computer3/component.dm +++ b/code/modules/computer3/component.dm @@ -78,12 +78,10 @@ emag_act(user as mob) if(!writer) to_chat(usr, "You insert \the card, and the computer grinds, sparks, and beeps. After a moment, the card ejects itself.") - computer.emagged = 1 return 1 else to_chat(usr, "You are unable to insert \the card, as the reader slot is occupied") - return 0 attackby(var/obj/item/I as obj, var/mob/user as mob, params) @@ -101,7 +99,6 @@ // This shouldn't happen, just in case.. if(slot == 2 && !dualslot) to_chat(usr, "This device has only one card slot") - return 0 var/mob/living/L = usr @@ -109,31 +106,23 @@ if(1) if(equip_to_reader(card, L)) to_chat(usr, "You insert the card into reader slot") - else to_chat(usr, "There is already something in the reader slot.") - if(2) if(equip_to_writer(card, L)) to_chat(usr, "You insert the card into writer slot") - else to_chat(usr, "There is already something in the reader slot.") - if(3) if(equip_to_reader(card, L)) to_chat(usr, "You insert the card into reader slot") - else if (equip_to_writer(card, L) && dualslot) to_chat(usr, "You insert the card into writer slot") - else if (dualslot) to_chat(usr, "There is already something in both slots.") - else to_chat(usr, "There is already something in the reader slot.") - // Usage of insert() preferred, as it also tells result to the user. proc/equip_to_reader(var/obj/item/weapon/card/card, var/mob/living/L) if(!reader) @@ -159,48 +148,36 @@ if(1) if (remove_reader(L)) to_chat(L, "You remove the card from reader slot") - else to_chat(L, "There is no card in the reader slot") - if(2) if (remove_writer(L)) to_chat(L, "You remove the card from writer slot") - else to_chat(L, "There is no card in the writer slot") - if(3) if (remove_reader(L)) if (remove_writer(L)) to_chat(L, "You remove cards from both slots") - else to_chat(L, "You remove the card from reader slot") - else if(remove_writer(L)) to_chat(L, "You remove the card from writer slot") - else to_chat(L, "There are no cards in both slots") - if(4) if (!remove_reader(L)) if (remove_writer(L)) to_chat(L, "You remove the card from writer slot") - else if (!dualslot) to_chat(L, "There is no card in the reader slot") - else to_chat(L, "There are no cards in both slots") - else to_chat(L, "You remove the card from reader slot") - proc/remove_reader(var/mob/living/L) if(reader) reader.loc = loc @@ -263,7 +240,6 @@ if(slot == 1) // 1: writer if(writer != null) to_chat(usr, "There's already a card in that slot!") - return 0 var/mob/living/L = usr L.drop_item() @@ -273,7 +249,6 @@ else if(slot == 2) // 2: reader if(reader != null) to_chat(usr, "There's already a card in that slot!") - return 0 var/mob/living/L = usr L.drop_item() @@ -283,7 +258,6 @@ else // 0: auto if(reader && writer) to_chat(usr, "Both slots are full!") - return 0 var/mob/living/L = usr L.drop_item() diff --git a/code/modules/computer3/computer.dm b/code/modules/computer3/computer.dm index 9f286241560..75252b33107 100644 --- a/code/modules/computer3/computer.dm +++ b/code/modules/computer3/computer.dm @@ -78,12 +78,10 @@ if(usr.stat || usr.restrained() || usr.lying || !istype(usr, /mob/living)) to_chat(usr, "\red You can't do that.") - return if(!Adjacent(usr)) to_chat(usr, "You can't reach it.") - return Reset() @@ -369,7 +367,6 @@ to_chat(user, "\The [src] won't boot!") - attack_ai(var/mob/user as mob) // copypasta because server racks lose attack_hand() if(stat) Reset() @@ -395,7 +392,6 @@ to_chat(user, "\The [src] won't boot!") - interact() if(stat) Reset() diff --git a/code/modules/computer3/computers/atmos_alert.dm b/code/modules/computer3/computers/atmos_alert.dm index 3b48d0fb2c6..1d834565cac 100644 --- a/code/modules/computer3/computers/atmos_alert.dm +++ b/code/modules/computer3/computers/atmos_alert.dm @@ -98,7 +98,6 @@ for(var/zone in priority_alarms) if(ckey(zone) == removing_zone) to_chat(usr, "\green Priority Alert for area [zone] cleared.") - priority_alarms -= zone if("minor_clear" in href_list) @@ -106,7 +105,6 @@ for(var/zone in minor_alarms) if(ckey(zone) == removing_zone) to_chat(usr, "\green Minor Alert for area [zone] cleared.") - minor_alarms -= zone computer.updateUsrDialog() diff --git a/code/modules/computer3/computers/camera.dm b/code/modules/computer3/computers/camera.dm index 6500fe6f405..7cf5fd0439a 100644 --- a/code/modules/computer3/computers/camera.dm +++ b/code/modules/computer3/computers/camera.dm @@ -317,7 +317,6 @@ interact() else to_chat(usr, "The screen turns to static.") - return // Atlantis: Required for camnetkeys to work. diff --git a/code/modules/computer3/computers/cloning.dm b/code/modules/computer3/computers/cloning.dm index 61d1f25ab83..f90ba3e57e3 100644 --- a/code/modules/computer3/computers/cloning.dm +++ b/code/modules/computer3/computers/cloning.dm @@ -80,7 +80,6 @@ proc/RecordsList() var/dat = "

      Current records

      " to_chat(dat += topic_link(src,"menu=1",", Back") + "

      ") - for(var/datum/data/record/R in records) dat += "

      [R.fields["name"]]

      Scan ID [R.fields["id"]] " + topic_link(src,"view_rec=\ref[R]","View Record") return dat @@ -89,7 +88,6 @@ var/dat = "

      Selected Record

      " to_chat(dat += topic_link(src,"menu=2",", Back") + "

      ") - if (!active_record) dat += "Record not found." else diff --git a/code/modules/computer3/computers/communications.dm b/code/modules/computer3/computers/communications.dm index ec4482ee28f..b738cef704e 100644 --- a/code/modules/computer3/computers/communications.dm +++ b/code/modules/computer3/computers/communications.dm @@ -61,7 +61,6 @@ return if (!(computer.z in config.station_levels)) to_chat(usr, "\red Unable to establish a connection: \black You're too far away from the station!") - return if("main" in href_list) @@ -105,17 +104,14 @@ tmp_alertlevel = 0 else: to_chat(usr, "You are not authorized to do this.") - tmp_alertlevel = 0 state = STATE_DEFAULT else to_chat(usr, "You need to swipe your ID.") - if("announce" in href_list) if(authenticated==2) if(message_cooldown) to_chat(usr, "Please allow at least one minute to pass between announcements") - return var/input = input(usr, "Please write a message to announce to the station crew.", "Priority Announcement") if(!input || !interactable()) @@ -197,14 +193,12 @@ if(authenticated==2) if(centcomm_message_cooldown) to_chat(usr, "Arrays recycling. Please stand by.") - return var/input = stripped_input(usr, "Please choose a message to transmit to Centcomm via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "To abort, send an empty message.", "") if(!input || !interactable()) return Centcomm_announce(input, usr) to_chat(usr, "Message transmitted.") - log_say("[key_name(usr)] has made a Centcomm announcement: [input]") centcomm_message_cooldown = 1 spawn(600)//10 minute cooldown @@ -216,14 +210,12 @@ if((authenticated==2) && (computer.emagged)) if(centcomm_message_cooldown) to_chat(usr, "Arrays recycling. Please stand by.") - return var/input = stripped_input(usr, "Please choose a message to transmit to \[ABNORMAL ROUTING CORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "To abort, send an empty message.", "") if(!input || !interactable()) return Syndicate_announce(input, usr) to_chat(usr, "Message transmitted.") - log_say("[key_name(usr)] has made a Syndicate announcement: [input]") centcomm_message_cooldown = 1 spawn(600)//10 minute cooldown @@ -231,7 +223,6 @@ if("RestoreBackup" in href_list) to_chat(usr, "Backup routing data restored!") - computer.emagged = 0 computer.updateDialog() diff --git a/code/modules/computer3/computers/law.dm b/code/modules/computer3/computers/law.dm index 099c9453ced..ec278163b2a 100644 --- a/code/modules/computer3/computers/law.dm +++ b/code/modules/computer3/computers/law.dm @@ -18,17 +18,14 @@ opened = !opened if(opened) to_chat(usr, "\blue The access panel is now open.") - else to_chat(usr, "\blue The access panel is now closed.") - return attackby(obj/item/weapon/aiModule/module as obj, mob/user as mob, params) if (user.z > 6) to_chat(user, "\red Unable to establish a connection: \black You're too far away from the station!") - return if(istype(module, /obj/item/weapon/aiModule)) module.install(src) @@ -39,21 +36,17 @@ attack_hand(var/mob/user as mob) if(src.stat & NOPOWER) to_chat(usr, "The upload computer has no power!") - return if(src.stat & BROKEN) to_chat(usr, "The upload computer is broken!") - return src.current = select_active_ai(user) if (!src.current) to_chat(usr, "No active AIs detected.") - else to_chat(usr, "[src.current.name] selected for law changes.") - return @@ -75,19 +68,15 @@ attack_hand(var/mob/user as mob) if(src.stat & NOPOWER) to_chat(usr, "The upload computer has no power!") - return if(src.stat & BROKEN) to_chat(usr, "The upload computer is broken!") - return src.current = freeborg() if (!src.current) to_chat(usr, "No free cyborgs detected.") - else to_chat(usr, "[src.current.name] selected for law changes.") - return diff --git a/code/modules/computer3/computers/medical.dm b/code/modules/computer3/computers/medical.dm index 2094eee9856..aeda16c4414 100644 --- a/code/modules/computer3/computers/medical.dm +++ b/code/modules/computer3/computers/medical.dm @@ -51,7 +51,6 @@ return if (computer.z > 6) to_chat(usr, "\red Unable to establish a connection: \black You're too far away from the station!") - return var/dat diff --git a/code/modules/computer3/computers/message.dm b/code/modules/computer3/computers/message.dm index 427c2283808..31aa4f3a501 100644 --- a/code/modules/computer3/computers/message.dm +++ b/code/modules/computer3/computers/message.dm @@ -221,11 +221,9 @@ proc/BruteForce(mob/usr as mob) if(isnull(linkedServer)) to_chat(usr, "Could not complete brute-force: Linked Server Disconnected!") - else var/currentKey = src.linkedServer.decryptkey to_chat(usr, "Brute-force completed! The key is '[currentKey]'.") - src.hacking = 0 src.active_state = normal_icon src.screen = 0 // Return the screen back to normal @@ -418,7 +416,6 @@ var/mob/living/carbon/human/H = customrecepient.loc to_chat(H, "\icon[customrecepient] Message from [customsender] ([customjob]), \"[custommessage]\" (Reply)" - log_pda("[usr] (PDA: [customsender]) sent \"[custommessage]\" to [customrecepient.owner]") customrecepient.overlays.Cut() customrecepient.overlays += image('icons/obj/pda.dmi', "pda-r") @@ -434,7 +431,6 @@ var/mob/living/carbon/human/H = customrecepient.loc to_chat(H, "\icon[customrecepient] Message from [PDARec.owner] ([customjob]), \"[custommessage]\" (Reply)" - log_pda("[usr] (PDA: [PDARec.owner]) sent \"[custommessage]\" to [customrecepient.owner]") customrecepient.overlays.Cut() customrecepient.overlays += image('icons/obj/pda.dmi', "pda-r") @@ -451,7 +447,6 @@ // to_chat(usr, href_list["select"]) - if ("back" in href_list) src.screen = 0 interact() \ No newline at end of file diff --git a/code/modules/computer3/computers/prisoner.dm b/code/modules/computer3/computers/prisoner.dm index 85c6f0c9562..b38b376abf5 100644 --- a/code/modules/computer3/computers/prisoner.dm +++ b/code/modules/computer3/computers/prisoner.dm @@ -96,7 +96,6 @@ log_say("PrisonComputer3 message: [key_name(usr)]->[key_name(R)] : [warning]") to_chat(R, "\green You hear a voice in your head saying: '[warning]'") - interact() return diff --git a/code/modules/computer3/computers/prisonshuttle.dm b/code/modules/computer3/computers/prisonshuttle.dm index aedcaaeb07b..119dbc350a4 100644 --- a/code/modules/computer3/computers/prisonshuttle.dm +++ b/code/modules/computer3/computers/prisonshuttle.dm @@ -47,13 +47,11 @@ var/prison_shuttle_timeleft = 0 if (src.stat & BROKEN) to_chat(user, "\blue The broken glass falls out.") - new /obj/item/trash/shard( src.loc ) A.state = 3 A.icon_state = "3" else to_chat(user, "\blue You disconnect the monitor.") - A.state = 4 A.icon_state = "4" @@ -61,7 +59,6 @@ var/prison_shuttle_timeleft = 0 else if(istype(I,/obj/item/card/emag) && (!hacked)) hacked = 1 to_chat(user, "\blue You disable the lock.") - else return src.attack_hand(user) @@ -69,11 +66,9 @@ var/prison_shuttle_timeleft = 0 attack_hand(var/mob/user as mob) if(!src.allowed(user) && (!hacked)) to_chat(user, "\red Access Denied.") - return if(prison_break) to_chat(user, "\red Unable to locate shuttle.") - return if(..()) return @@ -106,12 +101,10 @@ var/prison_shuttle_timeleft = 0 if (href_list["sendtodock"]) if (!prison_can_move()) to_chat(usr, "\red The prison shuttle is unable to leave.") - return if(!prison_shuttle_at_station|| prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison) return post_signal("prison") to_chat(usr, "\blue The prison shuttle has been called and will arrive in [(PRISON_MOVETIME/10)] seconds.") - src.temp += "Shuttle sent.

      OK" src.updateUsrDialog() prison_shuttle_moving_to_prison = 1 @@ -122,12 +115,10 @@ var/prison_shuttle_timeleft = 0 else if (href_list["sendtostation"]) if (!prison_can_move()) to_chat(usr, "\red The prison shuttle is unable to leave.") - return if(prison_shuttle_at_station || prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison) return post_signal("prison") to_chat(usr, "\blue The prison shuttle has been called and will arrive in [(PRISON_MOVETIME/10)] seconds.") - src.temp += "Shuttle sent.

      OK" src.updateUsrDialog() prison_shuttle_moving_to_station = 1 @@ -196,7 +187,6 @@ var/prison_shuttle_timeleft = 0 if (!prison_can_move()) to_chat(usr, "\red The prison shuttle is unable to leave.") - return var/area/start_location = locate(/area/shuttle/prison/prison) @@ -226,7 +216,6 @@ var/prison_shuttle_timeleft = 0 if (!prison_can_move()) to_chat(usr, "\red The prison shuttle is unable to leave.") - return var/area/start_location = locate(/area/shuttle/prison/station) diff --git a/code/modules/computer3/computers/robot.dm b/code/modules/computer3/computers/robot.dm index 3e404ff1200..002750b49c1 100644 --- a/code/modules/computer3/computers/robot.dm +++ b/code/modules/computer3/computers/robot.dm @@ -127,7 +127,6 @@ else to_chat(usr, "\red Access Denied.") - if ("stop" in href_list) src.temp = {" Stop Robot Destruction Sequence?
      @@ -161,7 +160,6 @@ if(R && istype(R)) if(R.mind && R.mind.special_role && R.emagged) to_chat(R, "Extreme danger. Termination codes detected. Scrambling security codes and automatic AI unlink triggered.") - R.ResetSecurityCodes() else @@ -171,7 +169,6 @@ else to_chat(usr, "\red Access Denied.") - if ("stopbot" in href_list) if(computer.allowed(usr)) var/mob/living/silicon/robot/R = locate(href_list["stopbot"]) @@ -186,17 +183,14 @@ // R.cell.charge = R.lockcharge R.lockcharge = !R.lockcharge to_chat(R, "Your lockdown has been lifted!") - else R.lockcharge = !R.lockcharge // R.cell.charge = 0 to_chat(R, "You have been locked down!") - else to_chat(usr, "\red Access Denied.") - if ("magbot" in href_list) if(computer.allowed(usr)) var/mob/living/silicon/robot/R = locate(href_list["magbot"]) diff --git a/code/modules/computer3/computers/scanconsole.dm b/code/modules/computer3/computers/scanconsole.dm index a312f49a423..fa88ae24b36 100644 --- a/code/modules/computer3/computers/scanconsole.dm +++ b/code/modules/computer3/computers/scanconsole.dm @@ -359,7 +359,6 @@ if(!viable) return "No viable occupant detected." to_chat(var/dat = topic_link(src,"mode=0",", Main Menu") + "
      ") - dat += "

      Modify Unique Identifier

      " dat += "
      Unique Identifier:
      [getblockstring(ui=1)]

      " @@ -374,7 +373,6 @@ if(!viable) return "No viable occupant detected." to_chat(var/dat = topic_link(src,"mode=0",", Main Menu") + "
      ") - dat += "

      Modify Structural Enzymes

      " dat += "
      Structural Enzymes: [getblockstring(ui=0)]

      " dat += "Selected Block: " + block_plus_minus("seblock",se_block,1,MAX_SEBLOCK) + "

      " @@ -385,7 +383,6 @@ proc/emitter_menu() to_chat(var/dat = topic_link(src,"mode=0",", Main Menu") + "
      ") - dat += "

      Radiation Emitter Settings

      " if (viable) dat += topic_link(src,"pulse","Pulse Radiation") @@ -746,7 +743,6 @@ human_occupant.reagents.add_reagent("inaprovaline", round(REJUVENATORS_MAX - human_occupant.reagents.get_reagent_amount("inaprovaline"))) // to_chat(usr, text("Occupant now has [] units of rejuvenation in his/her bloodstream.", human_occupant.reagents.get_reagent_amount("inaprovaline"))) - //////////////////////////////////////////////////////// if (href_list["strucmenuplus"]) if (se_block < 14) diff --git a/code/modules/computer3/computers/security.dm b/code/modules/computer3/computers/security.dm index 047ff3c4359..c7eb0a8881b 100644 --- a/code/modules/computer3/computers/security.dm +++ b/code/modules/computer3/computers/security.dm @@ -59,7 +59,6 @@ if (computer.z > 6) to_chat(usr, "\red Unable to establish a connection: \black You're too far away from the station!") - return var/dat diff --git a/code/modules/computer3/computers/shuttle.dm b/code/modules/computer3/computers/shuttle.dm index 9fbaa113bab..236de564868 100644 --- a/code/modules/computer3/computers/shuttle.dm +++ b/code/modules/computer3/computers/shuttle.dm @@ -20,18 +20,15 @@ W = pda.id if (!W:access) //no access to_chat(user, "The access level of [W:registered_name]\'s card is not high enough. ") - return var/list/cardaccess = W:access if(!istype(cardaccess, /list) || !cardaccess.len) //no access to_chat(user, "The access level of [W:registered_name]\'s card is not high enough. ") - return if(!(access_heads in W:access)) //doesn't have this access to_chat(user, "The access level of [W:registered_name]\'s card is not high enough. ") - return 0 var/choice = alert(user, text("Would you like to (un)authorize a shortened launch time? [] authorization\s are still needed. Use abort to cancel all authorizations.", src.auth_need - src.authorized.len), "Shuttle Launch", "Authorize", "Repeal", "Abort") @@ -45,12 +42,10 @@ message_admins("[key_name_admin(user)] has authorized early shuttle launch") log_game("[user.ckey] has authorized early shuttle launch") to_chat(world, text("\blue Alert: [] authorizations needed until shuttle is launched early", src.auth_need - src.authorized.len)) - else message_admins("[key_name_admin(user)] has launched the shuttle") log_game("[user.ckey] has launched the shuttle early") to_chat(world, "\blue Alert: Shuttle launch time shortened to 10 seconds!") - emergency_shuttle.online = 1 emergency_shuttle.settimeleft(10) //src.authorized = null @@ -61,10 +56,8 @@ src.authorized -= W:registered_name to_chat(world, text("\blue Alert: [] authorizations needed until shuttle is launched early", src.auth_need - src.authorized.len)) - if("Abort") to_chat(world, "\blue All authorizations to shorting time for shuttle launch have been revoked!") - src.authorized.len = 0 src.authorized = list( ) return @@ -77,7 +70,6 @@ switch(choice) if("Launch") to_chat(world, "\blue Alert: Shuttle launch time shortened to 10 seconds!") - emergency_shuttle.settimeleft( 10 ) emagged = 1 if("Cancel") diff --git a/code/modules/computer3/computers/specops_shuttle.dm b/code/modules/computer3/computers/specops_shuttle.dm index c863150f38f..8281a30479f 100644 --- a/code/modules/computer3/computers/specops_shuttle.dm +++ b/code/modules/computer3/computers/specops_shuttle.dm @@ -59,7 +59,6 @@ var/specops_shuttle_timeleft = 0 if (!specops_can_move()) to_chat(usr, "\red The Special Operations shuttle is unable to leave.") - return //Begin Marauder launchpad. @@ -156,7 +155,6 @@ var/specops_shuttle_timeleft = 0 var/mob/M = locate(/mob) in T to_chat(M, "\red You have arrived to [station_name]. Commence operation!") - /proc/specops_can_move() if(specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return 0 else return 1 @@ -173,19 +171,16 @@ var/specops_shuttle_timeleft = 0 /obj/machinery/computer3/specops_shuttle/attackby(I as obj, user as mob, params) if(istype(I,/obj/item/card/emag)) to_chat(user, "\blue The electronic systems in this console are far too advanced for your primitive hacking peripherals.") - else return attack_hand(user) /obj/machinery/computer3/specops_shuttle/attack_hand(var/mob/user as mob) if(!allowed(user)) to_chat(user, "\red Access Denied.") - return if (sent_strike_team == 0) to_chat(usr, "\red The strike team has not yet deployed.") - return if(..()) @@ -220,7 +215,6 @@ var/specops_shuttle_timeleft = 0 if(!specops_shuttle_at_station|| specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return to_chat(usr, "\blue Central Command will not allow the Special Operations shuttle to return.") - return else if (href_list["sendtostation"]) @@ -228,12 +222,10 @@ var/specops_shuttle_timeleft = 0 if (!specops_can_move()) to_chat(usr, "\red The Special Operations shuttle is unable to leave.") - return to_chat(usr, "\blue The Special Operations shuttle will arrive on [station_name] in [(SPECOPS_MOVETIME/10)] seconds.") - temp += "Shuttle departing.

      OK" updateUsrDialog() diff --git a/code/modules/computer3/computers/syndicate_shuttle.dm b/code/modules/computer3/computers/syndicate_shuttle.dm index 855ae3c02a2..5585f4fff0a 100644 --- a/code/modules/computer3/computers/syndicate_shuttle.dm +++ b/code/modules/computer3/computers/syndicate_shuttle.dm @@ -48,7 +48,6 @@ /obj/machinery/computer3/syndicate_station/attack_hand(mob/user as mob) if(!allowed(user)) to_chat(user, "\red Access Denied") - return user.set_machine(src) diff --git a/code/modules/computer3/computers/syndicate_specops_shuttle.dm b/code/modules/computer3/computers/syndicate_specops_shuttle.dm index c97785300fa..f490cd3c822 100644 --- a/code/modules/computer3/computers/syndicate_specops_shuttle.dm +++ b/code/modules/computer3/computers/syndicate_specops_shuttle.dm @@ -59,7 +59,6 @@ var/syndicate_elite_shuttle_timeleft = 0 if (!syndicate_elite_can_move()) to_chat(usr, "\red The Syndicate Elite shuttle is unable to leave.") - return sleep(600) @@ -169,7 +168,6 @@ var/syndicate_elite_shuttle_timeleft = 0 var/mob/M = locate(/mob) in T to_chat(M, "\red You have arrived to [station_name]. Commence operation!") - /proc/syndicate_elite_can_move() if(syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership) return 0 else return 1 @@ -186,19 +184,16 @@ var/syndicate_elite_shuttle_timeleft = 0 /obj/machinery/computer3/syndicate_elite_shuttle/attackby(I as obj, user as mob, params) if(istype(I,/obj/item/card/emag)) to_chat(user, "\blue The electronic systems in this console are far too advanced for your primitive hacking peripherals.") - else return attack_hand(user) /obj/machinery/computer3/syndicate_elite_shuttle/attack_hand(var/mob/user as mob) if(!allowed(user)) to_chat(user, "\red Access Denied.") - return // if (sent_syndicate_strike_team == 0) // to_chat(usr, "\red The strike team has not yet deployed.") - // return if(..()) @@ -232,7 +227,6 @@ var/syndicate_elite_shuttle_timeleft = 0 if(!syndicate_elite_shuttle_at_station|| syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership) return to_chat(usr, "\blue The Syndicate will not allow the Elite Squad shuttle to return.") - return else if (href_list["sendtostation"]) @@ -240,12 +234,10 @@ var/syndicate_elite_shuttle_timeleft = 0 if (!specops_can_move()) to_chat(usr, "\red The Syndicate Elite shuttle is unable to leave.") - return to_chat(usr, "\blue The Syndicate Elite shuttle will arrive on [station_name] in [(SYNDICATE_ELITE_MOVETIME/10)] seconds.") - temp = "Shuttle departing.

      OK" updateUsrDialog() diff --git a/code/modules/computer3/laptop.dm b/code/modules/computer3/laptop.dm index 5d5ba843b0b..dd4f73914b6 100644 --- a/code/modules/computer3/laptop.dm +++ b/code/modules/computer3/laptop.dm @@ -36,17 +36,14 @@ if(usr.stat || usr.restrained() || usr.lying || !istype(usr, /mob/living)) to_chat(usr, "\red You can't do that.") - return if(!Adjacent(usr)) to_chat(usr, "You can't reach it.") - return if(!istype(loc,/turf)) to_chat(usr, "[src] is too bulky! You'll have to set it down.") - return if(!stored_computer) @@ -54,7 +51,6 @@ for(var/obj/O in contents) O.forceMove(loc) to_chat(usr, "\The [src] crumbles to pieces.") - spawn(5) qdel(src) return @@ -67,7 +63,6 @@ loc = null to_chat(usr, "You open \the [src].") - spawn(5) stored_computer.manipulating = 0 qdel(src) @@ -75,7 +70,6 @@ to_chat(usr, "\red You are already opening the computer!") - AltClick() if(Adjacent(usr)) open_computer() @@ -102,7 +96,6 @@ if(!C) to_chat(usr, "There is no card port on the laptop.") - return var/obj/item/weapon/card/id/card @@ -112,11 +105,9 @@ card = C.writer else to_chat(usr, "There is nothing to remove from the laptop card port.") - return to_chat(usr, "You remove [card] from the laptop.") - C.remove(card) @@ -145,12 +136,10 @@ if(usr.stat || usr.restrained() || usr.lying || !istype(usr, /mob/living)) to_chat(usr, "\red You can't do that.") - return if(!Adjacent(usr)) to_chat(usr, "You can't reach it.") - return if(istype(loc,/obj/item/device/laptop)) @@ -162,7 +151,6 @@ if(stat&BROKEN) to_chat(usr, "\The [src] is broken! You can't quite get it closed.") - return if(!portable) @@ -175,7 +163,6 @@ stat |= MAINT to_chat(usr, "You close \the [src].") - auto_use_power() if(stat&MAINT) return diff --git a/code/modules/computer3/lapvend.dm b/code/modules/computer3/lapvend.dm index 4bce2cf7ca4..8383981046d 100644 --- a/code/modules/computer3/lapvend.dm +++ b/code/modules/computer3/lapvend.dm @@ -57,7 +57,6 @@ L.loc = src vendmode = 3 to_chat(usr, "You slot your [L.name] into \The [src.name]") - else ..() @@ -264,14 +263,11 @@ power = 0 else to_chat(usr, "\icon[src]You don't have that much money!") - else to_chat(usr, "\icon[src]Unable to access account. Check security settings and try again.") - else to_chat(usr, "\icon[src]Unable to access vendor account. Please record the machine ID and call CentComm Support.") - /obj/machinery/lapvend/proc/total() var/total = 0 @@ -410,7 +406,5 @@ else to_chat(usr, "\icon[src]Unable to access account. Check security settings and try again.") - else to_chat(usr, "\icon[src]Unable to access vendor account. Please record the machine ID and call CentComm Support.") - diff --git a/code/modules/computer3/storage.dm b/code/modules/computer3/storage.dm index e8a5b4aac8b..9ff8cab497b 100644 --- a/code/modules/computer3/storage.dm +++ b/code/modules/computer3/storage.dm @@ -117,18 +117,15 @@ attackby(obj/O as obj, mob/user as mob, params) if(inserted && istype(O,/obj/item/weapon/pen)) to_chat(usr, "You use [O] to carefully pry [inserted] out of [src].") - eject_disk(forced = 1) return if(istype(O,/obj/item/weapon/disk/file)) if(inserted) to_chat(usr, "There's already a disk in [src]!") - return to_chat(usr, "You insert [O] into [src].") - usr.drop_item() O.loc = src inserted = O diff --git a/code/modules/computer3/upload/programs.dm b/code/modules/computer3/upload/programs.dm index 5e86666c8b2..34197f3bf69 100644 --- a/code/modules/computer3/upload/programs.dm +++ b/code/modules/computer3/upload/programs.dm @@ -9,6 +9,5 @@ return 0 if(!computer.net) to_chat(usr, "An indecipherable set of code flicks across the screen. Nothing else happens.") - return var/list/results = computer.net.get_machines \ No newline at end of file diff --git a/code/modules/crafting/guncrafting.dm b/code/modules/crafting/guncrafting.dm index 6223a663755..8a9d5803529 100644 --- a/code/modules/crafting/guncrafting.dm +++ b/code/modules/crafting/guncrafting.dm @@ -21,7 +21,6 @@ /obj/item/weaponcrafting/receiver/attackby(obj/item/W as obj, mob/user as mob, params) if(istype(W,/obj/item/pipe)) to_chat(user, "You attach the shotgun barrel to the receiver. The pins seem loose.") - var/obj/item/weaponcrafting/ishotgunconstruction/I = new /obj/item/weaponcrafting/ishotgunconstruction user.unEquip(src) user.put_in_hands(I) @@ -44,7 +43,6 @@ user.unEquip(src) user.put_in_hands(C) to_chat(user, "You screw the pins into place, securing the pipe to the receiver.") - qdel(src) /obj/item/weaponcrafting/ishotgunconstruction2 @@ -56,7 +54,6 @@ /obj/item/weaponcrafting/ishotgunconstruction2/attackby(obj/item/W as obj, mob/user as mob, params) if(istype(W,/obj/item/weaponcrafting/stock)) to_chat(user, "You attach the stock to the receiver-barrel assembly.") - var/obj/item/weaponcrafting/ishotgunconstruction3/I = new /obj/item/weaponcrafting/ishotgunconstruction3 user.unEquip(src) user.put_in_hands(I) @@ -79,10 +76,8 @@ user.unEquip(src) user.put_in_hands(W) to_chat(user, "You tie the wrapping paper around the stock and the barrel to secure it.") - qdel(src) else to_chat(user, "You need at least five feet of wrapping paper to secure the stock.") - return diff --git a/code/modules/crafting/table.dm b/code/modules/crafting/table.dm index 8fdaaffaba0..19ea37c3866 100644 --- a/code/modules/crafting/table.dm +++ b/code/modules/crafting/table.dm @@ -204,17 +204,14 @@ if(href_list["make"]) if(!check_table_space()) to_chat(usr, "The table is too crowded.") - return var/datum/table_recipe/TR = locate(href_list["make"]) busy = 1 interact(usr) if(construct_item(usr, TR)) to_chat(usr, "[TR.name] constructed.") - else to_chat(usr, "Construction failed.") - busy = 0 interact(usr) diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 79817543530..c89d08b8d1b 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -29,35 +29,29 @@ if(user.a_intent == "harm") user.visible_message("[user] stabs [M] with the [src]!", "You stab [M] with the [src]!") to_chat(M, "[user] stabs you with the [src]!
      You feel a tiny prick!") - return if(used) to_chat(user, "The [src] is out of ink.") - return if(!istype(M, /mob/living/carbon/human)) to_chat(user, "You don't think tattooing [M] is the best idea.") - return var/mob/living/carbon/human/target = M if(istype(target.species, /datum/species/machine)) to_chat(user, "[target] has no skin, how do you expect to tattoo them?") - return if(target.m_style != "None") to_chat(user, "[target] already has body markings, any more would look silly!") - return if(target == user) to_chat(user, "You use the [src] to apply a [tattoo_name] to yourself!") - else user.visible_message("[user] begins to apply a [tattoo_name] [target] with the [src].", "You begin to tattoo [target] with the [src]!") if(!do_after(user,30, target = M)) @@ -134,7 +128,6 @@ C.name = "Detective Sax" C.visible_message("[C] suddenly winks into existence at [user]'s feet!") to_chat(user, "[src] crumbles to dust in your hands!") - qdel(src) /obj/item/weapon/storage/toolbox/fluff/lunchbox //godoforeos: Jason Conrad @@ -235,18 +228,14 @@ if("Kluysfluff1") src.icon_state = "Kluysfluff2" to_chat(usr, "The fibre unfolds into a jacket.") - if("Kluysfluff2") src.icon_state = "Kluysfluff3" to_chat(usr, "The fibre unfolds into a coat.") - if("Kluysfluff3") src.icon_state = "Kluysfluff1" to_chat(usr, "The fibre gets sucked back into its holder.") - else to_chat(usr, "You attempt to hit the button but can't.") - return usr.update_inv_wear_suit() @@ -296,12 +285,10 @@ if(src.icon_state == "jane_sid_suit_down") src.item_color = "jane_sid_suit" to_chat(usr, "You zip up \the [src].") - else src.item_color = "jane_sid_suit_down" to_chat(usr, "You unzip and roll down \the [src].") - src.icon_state = "[item_color]" src.item_state = "[item_color]" usr.update_inv_w_uniform() @@ -384,13 +371,11 @@ icon_state = initial(icon_state) item_state = initial(item_state) to_chat(usr, "You untransform \the [src].") - adjusted = 0 else icon_state += "_open" item_state += "_open" to_chat(usr, "You transform \the [src].") - adjusted = 1 usr.update_inv_head() diff --git a/code/modules/customitems/item_spawning.dm b/code/modules/customitems/item_spawning.dm index 9dc4dc7f6ff..d0b350b9b1e 100644 --- a/code/modules/customitems/item_spawning.dm +++ b/code/modules/customitems/item_spawning.dm @@ -46,14 +46,12 @@ Item.loc = M.back ok = 1 to_chat(M, "Your [Item.name] has been added to your [M.back.name].") - if(ok == 0) for(var/obj/item/weapon/storage/S in M.contents) // Try to place it in any item that can store stuff, on the mob. if (S.contents.len < S.storage_slots) Item.loc = S ok = 1 to_chat(M, "Your [Item.name] has been added to your [S.name].") - break if(description) Item.desc = description diff --git a/code/modules/detective_work/evidence.dm b/code/modules/detective_work/evidence.dm index ec2c7d12eaa..4654e0ab665 100644 --- a/code/modules/detective_work/evidence.dm +++ b/code/modules/detective_work/evidence.dm @@ -23,17 +23,14 @@ if(istype(I, /obj/item/weapon/evidencebag)) to_chat(user, "You find putting an evidence bag in another evidence bag to be slightly absurd.") - return 1 //now this is podracing if(I.w_class > 3) to_chat(user, "[I] won't fit in [src].") - return if(contents.len) to_chat(user, "[src] already has something inside it.") - return if(!isturf(I.loc)) //If it isn't on the floor. Do some checks to see if it's in our hands or a box. Otherwise give up. @@ -81,7 +78,6 @@ else to_chat(user, "[src] is empty.") - icon_state = "evidenceobj" return diff --git a/code/modules/detective_work/scanner.dm b/code/modules/detective_work/scanner.dm index 75bed197992..59466282384 100644 --- a/code/modules/detective_work/scanner.dm +++ b/code/modules/detective_work/scanner.dm @@ -18,7 +18,6 @@ if(log.len && !scanning) scanning = 1 to_chat(user, "Printing report, please wait...") - playsound(loc, "sound/goonstation/machines/printer_thermal.ogg", 50, 1) spawn(100) @@ -35,14 +34,12 @@ M.put_in_hands(P) to_chat(M, "Report printed. Log cleared.") - // Clear the logs log = list() scanning = 0 else to_chat(user, "The scanner has no logs or is in use.") - /obj/item/device/detective_scanner/attack(mob/living/M as mob, mob/user as mob) return @@ -65,7 +62,6 @@ to_chat(user, "You scan \the [A]. The scanner is now analysing the results...") - // GATHER INFORMATION //Make our lists @@ -157,12 +153,10 @@ add_log("# No forensic traces found #", 0) // Don't display this to the holder user if(holder) to_chat(holder, "Unable to locate any fingerprints, materials, fibers, or blood on \the [target_name]!") - else if(holder) to_chat(holder, "You finish scanning \the [target_name].") - add_log("---------------------------------------------------------", 0) scanning = 0 return @@ -172,7 +166,6 @@ if(broadcast && ismob(loc)) var/mob/M = loc to_chat(M, msg) - log += "  [msg]" else CRASH("[src] \ref[src] is adding a log when it was never put in scanning mode!") diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm index f3d7a2805bc..7448d3da352 100644 --- a/code/modules/economy/ATM.dm +++ b/code/modules/economy/ATM.dm @@ -113,7 +113,6 @@ log transactions authenticated_account.transaction_log.Add(T) to_chat(user, "You insert [C] into [src].") - src.attack_hand(user) qdel(I) else @@ -122,7 +121,6 @@ log transactions /obj/machinery/atm/attack_hand(mob/user as mob) if(istype(user, /mob/living/silicon)) to_chat(user, "\red Artificial unit recognized. Artificial units do not currently receive monetary compensation, as per Nanotrasen regulation #1005.") - return if(get_dist(src,user) <= 1) //check to see if the user has low security enabled @@ -228,7 +226,6 @@ log transactions var/transfer_purpose = href_list["purpose"] if(linked_db.charge_to_account(target_account_number, authenticated_account.owner_name, transfer_purpose, machine_id, transfer_amount)) to_chat(usr, "\icon[src]Funds transfer successful.") - authenticated_account.money -= transfer_amount //create an entry in the account transaction log @@ -243,10 +240,8 @@ log transactions else to_chat(usr, "\icon[src]Funds transfer failed.") - else to_chat(usr, "\icon[src]You don't have enough funds to do that!") - if("view_screen") view_screen = text2num(href_list["view_screen"]) if("change_security_level") @@ -281,12 +276,10 @@ log transactions failed_account.transaction_log.Add(T) else to_chat(usr, "\red \icon[src] Incorrect pin/account combination entered, [max_pin_attempts - number_incorrect_tries] attempts remaining.") - previous_account_number = tried_account_num playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 1) else to_chat(usr, "\red \icon[src] incorrect pin/account combination entered.") - number_incorrect_tries = 0 else playsound(src, 'sound/machines/twobeep.ogg', 50, 1) @@ -304,7 +297,6 @@ log transactions to_chat(usr, "\blue \icon[src] Access granted. Welcome user '[authenticated_account.owner_name].'") - previous_account_number = tried_account_num if("withdrawal") var/amount = max(text2num(href_list["funds_amount"]),0) @@ -317,7 +309,6 @@ log transactions //remove the money if(amount > 10000) // prevent crashes to_chat(usr, "\blue The ATM's screen flashes, 'Maximum single withdrawl limit reached, defaulting to 10,000.'") - amount = 10000 authenticated_account.money -= amount withdraw_arbitrary_sum(amount) @@ -333,12 +324,10 @@ log transactions authenticated_account.transaction_log.Add(T) else to_chat(usr, "\icon[src]You don't have enough funds to do that!") - if("balance_statement") if(authenticated_account) if(world.timeofday < lastprint + PRINT_DELAY) to_chat(usr, "The [src.name] flashes an error on its display.") - return lastprint = world.timeofday playsound(loc, "sound/goonstation/machines/printer_thermal.ogg", 50, 1) @@ -404,7 +393,6 @@ log transactions if(authenticated_account) to_chat(human_user, "\blue \icon[src] Access granted. Welcome user '[authenticated_account.owner_name].'") - //create a transaction log entry var/datum/transaction/T = new() T.target_name = authenticated_account.owner_name diff --git a/code/modules/economy/EFTPOS.dm b/code/modules/economy/EFTPOS.dm index f67aba1e6e2..a9fe34e1e46 100644 --- a/code/modules/economy/EFTPOS.dm +++ b/code/modules/economy/EFTPOS.dm @@ -112,10 +112,8 @@ scan_card(I) else to_chat(usr, "\icon[src]Unable to connect to linked account.") - else to_chat(usr, "\icon[src]Unable to connect to accounts database.") - else ..() @@ -133,7 +131,6 @@ print_reference() else to_chat(usr, "\icon[src]Incorrect code entered.") - if("change_id") var/attempt_code = text2num(input("Re-enter the current EFTPOS access code", "Confirm EFTPOS code")) if(attempt_code == access_code) @@ -143,7 +140,6 @@ print_reference() else to_chat(usr, "\icon[src]Incorrect code entered.") - if("link_account") if(!linked_db) reconnect_database() @@ -153,7 +149,6 @@ linked_account = attempt_account_access(attempt_account_num, attempt_pin, 1) else to_chat(usr, "\icon[src]Unable to connect to accounts database.") - if("trans_purpose") var/purpose = input("Enter reason for EFTPOS transaction", "Transaction purpose") as text|null if(purpose) @@ -174,7 +169,6 @@ transaction_locked = 1 else to_chat(usr, "\icon[src] No account connected to send transactions to.") - if("scan_card") //attempt to connect to a new db, and if that doesn't work then fail if(!linked_db) @@ -185,7 +179,6 @@ scan_card(I) else to_chat(usr, "\icon[src]Unable to link accounts.") - if("reset") //reset the access code - requires HoP/captain access var/obj/item/I = usr.get_active_hand() @@ -194,12 +187,10 @@ if(access_cent_commander in C.access || access_hop in C.access || access_captain in C.access) access_code = 0 to_chat(usr, "\icon[src]Access code reset to 0.") - else if (istype(I, /obj/item/weapon/card/emag)) access_code = 0 to_chat(usr, "\icon[src]Access code reset to 0.") - src.attack_self(usr) /obj/item/device/eftpos/proc/scan_card(var/obj/item/weapon/card/I) @@ -243,13 +234,10 @@ linked_account.transaction_log.Add(T) else to_chat(usr, "\icon[src]You don't have that much money!") - else to_chat(usr, "\icon[src]Unable to access account. Check security settings and try again.") - else to_chat(usr, "\icon[src]EFTPOS is not connected to an account.") - else ..() diff --git a/code/modules/economy/POS.dm b/code/modules/economy/POS.dm index e16a475d468..79e506ddee9 100644 --- a/code/modules/economy/POS.dm +++ b/code/modules/economy/POS.dm @@ -404,7 +404,6 @@ var/const/POS_HEADER = {" return if(usr != logged_in) to_chat(usr, "\red [logged_in.name] is already logged in. You cannot use this machine until they log out.") - return if("act" in href_list) switch(href_list["act"]) @@ -433,7 +432,6 @@ var/const/POS_HEADER = {" var/list/cells = splittext(line,",") if(cells.len<2) to_chat(usr, "\red The CSV must have at least two columns: Product Name, followed by Price (as a number).") - src.attack_hand(usr) return var/line_item/LI = new @@ -448,7 +446,6 @@ var/const/POS_HEADER = {" var/datum/money_account/new_linked_account = get_money_account(text2num(href_list["payableto"]),z) if(!new_linked_account) to_chat(usr, "\red Unable to link new account.") - else linked_account = new_linked_account screen=POS_SCREEN_SETTINGS diff --git a/code/modules/economy/utils.dm b/code/modules/economy/utils.dm index c2148deb9b5..5ef9a033b6d 100644 --- a/code/modules/economy/utils.dm +++ b/code/modules/economy/utils.dm @@ -49,7 +49,6 @@ /datum/money_account/proc/charge(var/transaction_amount,var/datum/money_account/dest,var/transaction_purpose, var/terminal_name="", var/terminal_id=0, var/dest_name = "UNKNOWN") if(suspended) to_chat(usr, "Unable to access source account: account suspended.") - return 0 if(transaction_amount <= money) @@ -90,5 +89,4 @@ return 1 else to_chat(usr, "Insufficient funds in account.") - return 0 \ No newline at end of file diff --git a/code/modules/events/communications_blackout.dm b/code/modules/events/communications_blackout.dm index 9a77a6d08ff..6ada1a25c0f 100644 --- a/code/modules/events/communications_blackout.dm +++ b/code/modules/events/communications_blackout.dm @@ -8,12 +8,9 @@ for(var/mob/living/silicon/ai/A in player_list) //AIs are always aware of communication blackouts. to_chat(A, "
      ") - to_chat(A, "[alert]") - to_chat(A, "
      ") - if(prob(30)) //most of the time, we don't want an announcement, so as to allow AIs to fake blackouts. command_announcement.Announce(alert) @@ -27,10 +24,7 @@ else // AIs will always know if there's a comm blackout, rogue AIs could then lie about comm blackouts in the future while they shutdown comms for(var/mob/living/silicon/ai/A in player_list) to_chat(A, "
      ") - to_chat(A, "Ionospheric anomalies detected. Temporary telecommunication failure imminent. Please contact you-BZZT") - to_chat(A, "
      ") - for(var/obj/machinery/telecomms/T in telecomms_list) T.emp_act(1) diff --git a/code/modules/events/event_manager.dm b/code/modules/events/event_manager.dm index 06a40d81fdb..85ffa86f25f 100644 --- a/code/modules/events/event_manager.dm +++ b/code/modules/events/event_manager.dm @@ -74,7 +74,6 @@ return to_chat(world, "


      Random Events This Round:") - for(var/datum/event/E in active_events|finished_events) var/datum/event_meta/EM = E.event_meta if(EM.name == "Nothing") @@ -90,7 +89,6 @@ to_chat(world, message) - /datum/event_manager/proc/GetInteractWindow() var/html = "Refresh" diff --git a/code/modules/events/holidays/Holidays.dm b/code/modules/events/holidays/Holidays.dm index 363cd7017e0..e06c7764a39 100644 --- a/code/modules/events/holidays/Holidays.dm +++ b/code/modules/events/holidays/Holidays.dm @@ -141,9 +141,7 @@ var/global/Holiday = null /proc/Holiday_Game_Start() if(Holiday) to_chat(world, "and...") - to_chat(world, "

      Happy [Holiday] Everybody!

      ") - switch(Holiday) //special holidays if("Easter") //do easter stuff diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm index 6a6d2c91469..d153294c790 100644 --- a/code/modules/events/ion_storm.dm +++ b/code/modules/events/ion_storm.dm @@ -28,12 +28,9 @@ if(message) M.add_ion_law(message) to_chat(M, "
      ") - to_chat(M, "[message] ...LAWS UPDATED") - to_chat(M, "
      ") - if(botEmagChance) for(var/mob/living/simple_animal/bot/bot in machines) if(prob(botEmagChance)) diff --git a/code/modules/events/prison_break.dm b/code/modules/events/prison_break.dm index 77f2717831a..89671701958 100644 --- a/code/modules/events/prison_break.dm +++ b/code/modules/events/prison_break.dm @@ -52,7 +52,6 @@ for(var/mob/living/silicon/ai/A in player_list) to_chat(A, "Malicious program detected in the [english_list(areaName)] lighting and airlock control systems by [my_department].") - else log_to_dd("ERROR: Could not initate grey-tide. Unable to find suitable containment area.") kill() diff --git a/code/modules/events/undead.dm b/code/modules/events/undead.dm index b2a0f166735..2ff8d05c20a 100644 --- a/code/modules/events/undead.dm +++ b/code/modules/events/undead.dm @@ -38,4 +38,3 @@ /datum/event/undead/announce() for(var/mob/living/M in player_list) to_chat(M, "You feel [pick("a chill","a deathly chill","the undead","dirty", "creeped out","afraid","fear")]!") - diff --git a/code/modules/fish/fish_items.dm b/code/modules/fish/fish_items.dm index 65db943ae6e..00659104480 100644 --- a/code/modules/fish/fish_items.dm +++ b/code/modules/fish/fish_items.dm @@ -40,7 +40,6 @@ var/global/list/fish_items_list = list("goldfish" = /obj/item/weapon/fish/goldfi suicide_act(mob/user) //"A tiny net is a death sentence: it's a net and it's tiny!" https://www.youtube.com/watch?v=FCI9Y4VGCVw to_chat(viewers(user), "[user] places the [src.name] on top of \his head, \his fingers tangled in the netting! It looks like \he's trying to commit suicide.") - return(OXYLOSS) /obj/item/weapon/fishfood @@ -67,7 +66,6 @@ var/global/list/fish_items_list = list("goldfish" = /obj/item/weapon/fish/goldfi suicide_act(mob/user) to_chat(viewers(user), "[user] is vigorously scrubbing \himself raw with the [src.name]! It looks like \he's trying to commit suicide.") - return(BRUTELOSS|FIRELOSS) ////////////////////////////////////////////// @@ -136,7 +134,6 @@ var/global/list/fish_items_list = list("goldfish" = /obj/item/weapon/fish/goldfi /obj/item/weapon/fish/shark/attackby(var/obj/item/O, var/mob/user as mob) if(istype(O, /obj/item/weapon/wirecutters)) to_chat(user, "You rip out the teeth of \the [src.name]!") - new /obj/item/weapon/fish/toothless_shark(get_turf(src)) new /obj/item/weapon/shard/shark_teeth(get_turf(src)) qdel(src) @@ -170,7 +167,6 @@ var/global/list/fish_items_list = list("goldfish" = /obj/item/weapon/fish/goldfi /obj/item/weapon/fish/catfish/attackby(var/obj/item/O, var/mob/user as mob) if(is_sharp(O)) to_chat(user, "You carefully clean and gut \the [src.name].") - new /obj/item/weapon/reagent_containers/food/snacks/catfishmeat(get_turf(src)) new /obj/item/weapon/reagent_containers/food/snacks/catfishmeat(get_turf(src)) qdel(src) @@ -190,7 +186,6 @@ var/global/list/fish_items_list = list("goldfish" = /obj/item/weapon/fish/goldfi /obj/item/weapon/fish/salmon/attackby(var/obj/item/O, var/mob/user as mob) if(is_sharp(O)) to_chat(user, "You carefully clean and gut \the [src.name].") - new /obj/item/weapon/reagent_containers/food/snacks/salmonmeat(get_turf(src)) new /obj/item/weapon/reagent_containers/food/snacks/salmonmeat(get_turf(src)) qdel(src) @@ -207,7 +202,6 @@ var/global/list/fish_items_list = list("goldfish" = /obj/item/weapon/fish/goldfi /obj/item/weapon/fish/babycarp/attackby(var/obj/item/O, var/mob/user as mob) if(is_sharp(O)) to_chat(user, "You carefully clean and gut \the [src.name].") - new /obj/item/weapon/reagent_containers/food/snacks/carpmeat(get_turf(src)) //just one fillet; this is a baby, afterall. qdel(src) return diff --git a/code/modules/fish/fishtank.dm b/code/modules/fish/fishtank.dm index 754d6d80fc6..8fe4bfa746d 100644 --- a/code/modules/fish/fishtank.dm +++ b/code/modules/fish/fishtank.dm @@ -312,7 +312,6 @@ else to_chat(usr, "The eggs disolve in the water. They were duds!") - /obj/machinery/fishtank/proc/select_egg_type() var/fish = pick(fish_list) //Select a fish from the fish in the tank if(prob(25)) //25% chance to be a dud (blank) egg @@ -342,7 +341,6 @@ /obj/machinery/fishtank/proc/harvest_fish(var/mob/user) if(!fish_count) //Can't catch non-existant fish! to_chat(usr, "There are no fish in \the [src] to catch!") - return var/caught_fish @@ -499,7 +497,6 @@ //Finally, report the full examine_message constructed from the above reports to_chat(user, "[examine_message]") - return examine_message ////////////////////////////// @@ -527,7 +524,6 @@ M.health = M.maxHealth //Eating fish heals the predator else to_chat(usr, "There are no fish in [src]!") - else attack_generic(M, M.harm_intent_damage) else if(istype(M, /mob/living/simple_animal/hostile/bear)) @@ -546,7 +542,6 @@ M.health = M.maxHealth //Eating fish heals the predator else to_chat(usr, "There are no fish in [src]!") - else attack_generic(M, M.harm_intent_damage) else @@ -612,16 +607,13 @@ if(W.isOn()) if(cur_health < max_health) to_chat(usr, "You repair some of the cracks on \the [src].") - cur_health += 20 check_health() else to_chat(usr, "There is no damage to fix!") - else if(cur_health < max_health) to_chat(usr, "[W.name] must on to repair this damage.") - else user.changeNext_move(CLICK_CD_MELEE) hit(W.force) @@ -631,7 +623,6 @@ if(istype(O, /obj/item/weapon/reagent_containers/glass)) if(lid_switch) to_chat(usr, "Open the lid on \the [src] first!") - return var/obj/item/weapon/reagent_containers/glass/C = O //Containers with any reagents will get dumped in @@ -650,7 +641,6 @@ else if(water_level == water_capacity) to_chat(usr, "[src] is already full!") - return else message = "The filtration process purifies the water, raising the water level." @@ -667,7 +657,6 @@ else if(water_level == 0) to_chat(usr, "[src] is empty!") - else if(water_level >= C.volume) //Enough to fill the container completely C.reagents.add_reagent("fishwater", C.volume) @@ -683,13 +672,11 @@ if(istype(O, /obj/item/weapon/wrench)) if(water_level == 0) to_chat(usr, "Now disassembling [src].") - playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user,50, target = src)) destroy(1) else to_chat(usr, "[src] must be empty before you disassemble it!") - return //Fish eggs else if(istype(O, /obj/item/fish_eggs)) @@ -697,12 +684,10 @@ //Don't add eggs if there is no water (they kinda need that to live) if(water_level == 0) to_chat(usr, "[src] has no water; [egg.name] won't hatch without water!") - else //Don't add eggs if the tank already has the max number of fish if(fish_count >= max_fish) to_chat(usr, "[src] can't hold any more fish.") - else add_fish(egg.fish_type) qdel(egg) @@ -719,10 +704,8 @@ food_level += 10 else to_chat(usr, "[src] already has plenty of food in it. You decide to not add more.") - else to_chat(usr, "[src] doesn't have any water in it. You should fill it with water first.") - check_food_level() return //Fish egg scoop @@ -741,7 +724,6 @@ if(istype(O, /obj/item/weapon/tank_brush)) if(filth_level == 0) to_chat(usr, "[src] is already spotless!") - else filth_level = 0 user.visible_message("[user.name] scrubs the inside of \the [src], cleaning the filth.", "You scrub the inside of \the [src], cleaning the filth.") diff --git a/code/modules/flufftext/Dreaming.dm b/code/modules/flufftext/Dreaming.dm index 1a04faede2a..3b165750d0b 100644 --- a/code/modules/flufftext/Dreaming.dm +++ b/code/modules/flufftext/Dreaming.dm @@ -21,7 +21,6 @@ mob/living/carbon/proc/dream() var/dream_image = pick(dreams) dreams -= dream_image to_chat(src, "... [dream_image] ...") - sleep(rand(40,70)) if(paralysis <= 0) dreaming = 0 diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 2c57b030ede..69fbd9bc1fc 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -244,12 +244,10 @@ Gunshots/explosions/opening doors/less rare audio (done) if(!xeno) return var/xeno_name = xeno.name to_chat(target, "[xeno_name] begins climbing into the ventilation system...") - sleep(10) if(!xeno) return qdel(xeno) to_chat(target, "[xeno_name] scrambles into the ventilation ducts!") - qdel(src) /obj/effect/hallucination/singularity_scare @@ -298,40 +296,28 @@ Gunshots/explosions/opening doors/less rare audio (done) if(1) //Laser fight for(var/i=0,i[my_target] flails around wildly.
      ", \ "[my_target] has attacked [src]!") @@ -450,7 +435,6 @@ Gunshots/explosions/opening doors/less rare audio (done) for(var/mob/O in oviewers(world.view , my_target)) to_chat(O, "[my_target] stumbles around.") - /obj/effect/fake_attacker/New(loc,var/mob/living/carbon/T) ..() my_target = T @@ -478,7 +462,6 @@ Gunshots/explosions/opening doors/less rare audio (done) to_chat(my_target, currentimage) - /obj/effect/fake_attacker/proc/attack_loop() while(1) sleep(rand(5,10)) @@ -494,7 +477,6 @@ Gunshots/explosions/opening doors/less rare audio (done) src.do_attack_animation(my_target) if(weapon_name) to_chat(my_target, sound(pick('sound/weapons/genhit1.ogg', 'sound/weapons/genhit2.ogg', 'sound/weapons/genhit3.ogg'))) - my_target.show_message("[src.name] has attacked [my_target] with [weapon_name]!", 1) my_target.staminaloss += 30 if(prob(20)) @@ -504,7 +486,6 @@ Gunshots/explosions/opening doors/less rare audio (done) fake_blood(my_target) else to_chat(my_target, sound(pick('sound/weapons/punch1.ogg','sound/weapons/punch2.ogg','sound/weapons/punch3.ogg','sound/weapons/punch4.ogg'))) - my_target.show_message("[src.name] has punched [my_target]!", 1) my_target.staminaloss += 30 if(prob(33)) @@ -523,7 +504,6 @@ Gunshots/explosions/opening doors/less rare audio (done) O.name = "blood" var/image/I = image('icons/effects/blood.dmi',O,"floor[rand(1,7)]",O.dir,1) to_chat(target, I) - spawn(300) qdel(O) return @@ -586,14 +566,12 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite people += H if(person) //Basic talk to_chat(target, target.hear_say(pick(speak_messages),language = pick(person.languages),speaker = person)) - else // Radio talk var/list/humans = list() for(var/mob/living/carbon/human/H in living_mob_list) humans += H person = pick(humans) to_chat(target, target.hear_radio(pick(radio_messages),language = pick(person.languages),speaker = person, part_a = "\[[get_frequency_name(PUB_FREQ)]\] ", part_b = " ")) - qdel(src) /obj/effect/hallucination/message @@ -611,7 +589,6 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite "You hear a strange, alien voice in your head...[pick("Hiss","Ssss")]", \ "You can see...everything!") to_chat(target, chosen) - qdel(src) /mob/living/carbon/proc/hallucinate(var/hal_type) // Todo -> proc / defines @@ -639,50 +616,38 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite if("sounds") //Strange audio // to_chat(src, "Strange Audio") - switch(rand(1,18)) if(1) to_chat(src, 'sound/machines/airlock.ogg') - if(2) if(prob(50)) to_chat(src, 'sound/effects/Explosion1.ogg') else to_chat(src, 'sound/effects/Explosion2.ogg') - if(3) to_chat(src, 'sound/effects/explosionfar.ogg') - if(4) to_chat(src, 'sound/effects/Glassbr1.ogg') - if(5) to_chat(src, 'sound/effects/Glassbr2.ogg') - if(6) to_chat(src, 'sound/effects/Glassbr3.ogg') - if(7) to_chat(src, 'sound/machines/twobeep.ogg') - if(8) to_chat(src, 'sound/machines/windowdoor.ogg') - if(9) //To make it more realistic, I added two gunshots (enough to kill) to_chat(src, 'sound/weapons/Gunshot.ogg') spawn(rand(10,30)) to_chat(src, 'sound/weapons/Gunshot.ogg') - if(10) to_chat(src, 'sound/weapons/smash.ogg') - if(11) //Same as above, but with tasers. to_chat(src, 'sound/weapons/Taser.ogg') spawn(rand(10,30)) to_chat(src, 'sound/weapons/Taser.ogg') - //Rare audio if(12) //These sounds are (mostly) taken from Hidden: Source @@ -692,38 +657,29 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite 'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\ 'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg') to_chat(src, pick(creepyasssounds)) - if(13) to_chat(src, "You feel a tiny prick!") - if(14) to_chat(src, "

      Priority Announcement

      ") to_chat(src, "

      The Emergency Shuttle has docked with the station. You have 3 minutes to board the Emergency Shuttle.

      ") to_chat(src, sound('sound/AI/shuttledock.ogg')) - if(15) to_chat(src, 'sound/items/Welder.ogg') - if(16) to_chat(src, 'sound/items/Screwdriver.ogg') - if(17) to_chat(src, 'sound/weapons/saberon.ogg') - if(18) to_chat(src, 'sound/weapons/saberoff.ogg') - if("hudscrew") //Screwy HUD // to_chat(src, "Screwy HUD") - hal_screwyhud = pick(1,2,3,3,4,4) spawn(rand(100,250)) hal_screwyhud = 0 if("items") //Strange items // to_chat(src, "Traitor Items") - if(!halitem) halitem = new var/list/slots_free = list(ui_lhand,ui_rhand) @@ -770,7 +726,6 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite if("dangerflash") //Flashes of danger // to_chat(src, "Danger Flash") - if(!halimage) var/list/possible_points = list() for(var/turf/simulated/floor/F in view(src,world.view)) @@ -781,15 +736,12 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite switch(rand(1,3)) if(1) // to_chat(src, "Space") - halimage = image('icons/turf/space.dmi',target,"[rand(1,25)]",TURF_LAYER) if(2) // to_chat(src, "Fire") - halimage = image('icons/effects/fire.dmi',target,"1",TURF_LAYER) if(3) // to_chat(src, "C4") - halimage = image('icons/obj/assemblies.dmi',target,"plastic-explosive2",OBJ_LAYER+0.01) diff --git a/code/modules/food/cooker.dm b/code/modules/food/cooker.dm index 05722cd2085..40e04817209 100644 --- a/code/modules/food/cooker.dm +++ b/code/modules/food/cooker.dm @@ -36,12 +36,10 @@ /obj/machinery/cooker/proc/checkValid(obj/item/check, mob/user) if(on) to_chat(user, "[src] is still active!") - return 0 if(istype(check, /obj/item/weapon/reagent_containers/food/snacks)) return 1 to_chat(user, "You can only process food!") - return 0 /obj/machinery/cooker/proc/setIcon(obj/item/copyme, obj/item/copyto) @@ -64,7 +62,6 @@ var/obj/item/weapon/reagent_containers/food/snacks/badrecipe/burnt = new(get_turf(src)) setRegents(props, burnt) to_chat(user, "You smell burning coming from the [src]!") - var/datum/effect/system/bad_smoke_spread/smoke = new /datum/effect/system/bad_smoke_spread() // burning things makes smoke! smoke.set_up(5, 0, src) smoke.start() @@ -84,7 +81,6 @@ /obj/machinery/cooker/proc/putIn(obj/item/tocook, mob/chef) icon_state = onicon to_chat(chef, "You put [tocook] into [src].") - on = 1 chef.drop_item() tocook.loc = src @@ -103,7 +99,6 @@ if(istype(I, /obj/item/weapon/reagent_containers/food/snacks)) if(checkCooked(I)) to_chat(user, "That is already [thiscooktype], it would do nothing!") - return putIn(I, user) sleep(cooktime) diff --git a/code/modules/food/customizables.dm b/code/modules/food/customizables.dm index 1631456beec..ff1ff9f6ad5 100644 --- a/code/modules/food/customizables.dm +++ b/code/modules/food/customizables.dm @@ -325,14 +325,11 @@ /obj/item/weapon/reagent_containers/food/snacks/customizable/attackby(obj/item/I, mob/user, params) if(src.contents.len > sandwich_limit) to_chat(user, "If you put anything else in or on [src] it's going to make a mess.") - return if(!istype(I, /obj/item/weapon/reagent_containers/food/snacks)) to_chat(user, "\The [I] isn't exactly something that you would want to eat.") - return to_chat(user, "You add [I] to [src].") - if(istype(I, /obj/item/weapon/reagent_containers/)) var/obj/item/weapon/reagent_containers/F = I F.reagents.trans_to(src, F.reagents.total_volume) @@ -391,7 +388,6 @@ to_chat(user, " You think you can see [whatsinside] in there.") - /* /obj/item/weapon/reagent_containers/food/snacks/customizable/attack(mob/M as mob, mob/user as mob, def_zone) //SNOOOOOOOWFLAAAAAAAAAAAAAAAAAKES @@ -407,7 +403,6 @@ if(H && shard && M == user) //This needs a check for feeding the food to other people, but that could be abusable. to_chat(H, "\red You lacerate your mouth on a [shard.name] in the sandwich!") - H.adjustBruteLoss(5) //TODO: Target head if human. ..() */ diff --git a/code/modules/food/icecream_vat.dm b/code/modules/food/icecream_vat.dm index 44303927248..6c23d781818 100644 --- a/code/modules/food/icecream_vat.dm +++ b/code/modules/food/icecream_vat.dm @@ -33,16 +33,13 @@ if(istype(I, /obj/item/weapon/reagent_containers/glass)) if(beaker) to_chat(user, "A container is already inside [src].") - return if(!user.drop_item()) to_chat(user, "\The [I] is stuck to you!") - return beaker = I I.forceMove(src) to_chat(user, "You add [I] to [src]") - updateUsrDialog() return if(istype(I, /obj/item/weapon/reagent_containers/food/snacks/icecream)) @@ -57,14 +54,12 @@ to_chat(user, "This [I] already has sprinkles.") - /obj/machinery/icemachine/proc/validexchange(reag) if(reag == "sprinkles" | reag == "cola" | reag == "kahlua" | reag == "dr_gibb" | reag == "vodka" | reag == "space_up" | reag == "rum" | reag == "spacemountainwind" | reag == "gin" | reag == "cream" | reag == "water") return 1 else if(reagents.total_volume < 500) to_chat(usr, "[src] vibrates for a moment, apparently accepting the unknown liquid.") - playsound(loc, 'sound/machines/twobeep.ogg', 10, 1) return 1 diff --git a/code/modules/food/oven.dm b/code/modules/food/oven.dm index 616065f0abc..604adaaf142 100644 --- a/code/modules/food/oven.dm +++ b/code/modules/food/oven.dm @@ -18,7 +18,6 @@ /obj/machinery/cooking/attackby(obj/item/I, mob/user, params) if(on) to_chat(user, "The machine is already running.") - return else var/obj/item/F = I @@ -28,7 +27,6 @@ return else to_chat(user, "You put [F] into [src] for cooking.") - user.drop_item() F.loc = src on = TRUE diff --git a/code/modules/garbage_collection/garbage_collector.dm b/code/modules/garbage_collection/garbage_collector.dm index f7ea60a7db7..aa8933c42de 100644 --- a/code/modules/garbage_collection/garbage_collector.dm +++ b/code/modules/garbage_collection/garbage_collector.dm @@ -143,7 +143,6 @@ var/global/datum/controller/process/garbage_collector/garbageCollector garbageCollector.addTrash(D) else // to_chat(world, "WARNING GC DID NOT GET A RETURN VALUE FOR [D], [D.type]!") - garbageCollector.addTrash(D) diff --git a/code/modules/garbage_collection/gc_testing.dm b/code/modules/garbage_collection/gc_testing.dm index 2d2a3801759..25fc4bef495 100644 --- a/code/modules/garbage_collection/gc_testing.dm +++ b/code/modules/garbage_collection/gc_testing.dm @@ -10,7 +10,6 @@ garbageCollector.del_everything = !garbageCollector.del_everything // to_chat(world, "GC: qdel turned [garbageCollector.del_everything ? "off" : "on"].") - log_admin("[key_name(usr)] turned qdel [garbageCollector.del_everything ? "off" : "on"].") message_admins("\blue [key_name_admin(usr)] turned qdel [garbageCollector.del_everything ? "off" : "on"].", 1) @@ -46,15 +45,12 @@ if(!gc_hard_del_types || !gc_hard_del_types.len) to_chat(usr, "No hard del()'d types found.") - return to_chat(usr, "Types hard del()'d by the GC:") - for(var/A in gc_hard_del_types) to_chat(usr, "[A]") - // Profiling stuff var/global/del_profiling = 0 var/global/list/dels_profiled = list() diff --git a/code/modules/holiday/holiday.dm b/code/modules/holiday/holiday.dm index 5f13c6d9aa6..db82a5227e6 100644 --- a/code/modules/holiday/holiday.dm +++ b/code/modules/holiday/holiday.dm @@ -318,7 +318,6 @@ begin_month-- //begins in march, ends in april // to_chat(world, "Easter calculates to be on [begin_day] of [begin_month] ([days_early] early) to [end_day] of [end_month] ([days_extra] extra) for 20[yy]") - return ..() diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 94e5ea0c8f5..a025e32f872 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -29,7 +29,6 @@ sleep(250) // ugly hack, should mean roundstart plants are fine. if(!plant_controller) to_chat(world, "Plant controller does not exist and [src] requires it. Aborting.") - qdel(src) return @@ -85,7 +84,6 @@ sleep(250) // ugly hack, should mean roundstart plants are fine. if(!plant_controller) to_chat(world, "Plant controller does not exist and [src] requires it. Aborting.") - qdel(src) return @@ -185,7 +183,6 @@ M.stop_pulling() to_chat(M, "You slipped on the [name]!") - playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) M.Stun(8) M.Weaken(5) @@ -206,7 +203,6 @@ if(C.use(5)) //TODO: generalize this. to_chat(user, "You add some cable to the [src.name] and slide it inside the battery casing.") - var/obj/item/weapon/stock_parts/cell/potato/pocell = new /obj/item/weapon/stock_parts/cell/potato(get_turf(user)) if(src.loc == user && !(user.l_hand && user.r_hand) && istype(user,/mob/living/carbon/human)) user.put_in_hands(pocell) @@ -224,7 +220,6 @@ return else if(seed.kitchen_tag == "potato") to_chat(user, "You slice \the [src] into sticks.") - reagents_per_slice = reagents.total_volume slice = new /obj/item/weapon/reagent_containers/food/snacks/rawsticks(get_turf(src)) reagents.trans_to(slice, reagents_per_slice) @@ -232,7 +227,6 @@ return else if(seed.kitchen_tag == "carrot") to_chat(user, "You slice \the [src] into sticks.") - reagents_per_slice = reagents.total_volume slice = new /obj/item/weapon/reagent_containers/food/snacks/carrotfries(get_turf(src)) reagents.trans_to(slice, reagents_per_slice) @@ -240,7 +234,6 @@ return else if(seed.kitchen_tag == "watermelon") to_chat(user, "You slice \the [src] into large slices.") - reagents_per_slice = reagents.total_volume/5 for(var/i=0,i<5,i++) slice = new /obj/item/weapon/reagent_containers/food/snacks/watermelonslice(get_turf(src)) @@ -249,7 +242,6 @@ return else if(seed.kitchen_tag == "soybeans") to_chat(user, "You roughly chop up \the [src].") - reagents_per_slice = reagents.total_volume slice = new /obj/item/weapon/reagent_containers/food/snacks/soydope(get_turf(src)) reagents.trans_to(slice, reagents_per_slice) @@ -268,7 +260,6 @@ continue G.attackby(NG, user) to_chat(user, "You add the newly-formed wood to the stack. It now contains [NG.amount] planks.") - qdel(src) return else if(istype(W, /obj/item/weapon/rollingpaper)) @@ -293,12 +284,10 @@ qdel(W) user.put_in_active_hand(J) to_chat(user, "\blue You roll the [src] into a rolling paper.") - qdel(src) else to_chat(user, "\red You can't roll a smokable from the [src].") - ..() /obj/item/weapon/reagent_containers/food/snacks/grown/attack(var/mob/living/carbon/M, var/mob/user, var/def_zone) @@ -359,13 +348,11 @@ if(reagents && reagents.total_volume <= 0) //used-up fruit will be destroyed if(user) to_chat(user, "\The [src] has dried out and crumbles to dust.") - //user.drop_from_inventory(src) qdel(src) else if(prob(35)) //fruit that still has reagents has a chance of breaking each time it stings on hit if(user) to_chat(user, "\The [src] has fallen to bits.") - //user.drop_from_inventory(src) qdel(src) @@ -392,7 +379,6 @@ if(user.a_intent == I_DISARM && seed.get_trait(TRAIT_SPREAD) > 0) //Using disarm so we can tell if you want to plant or convert non-final plants to_chat(user, "You plant the [src.name].") - new /obj/machinery/portable_atmospherics/hydroponics/soil/invisible(get_turf(user),src.seed) new /obj/effect/plant(get_turf(user), src.seed) qdel(src) @@ -405,14 +391,12 @@ var/obj/item/stack/medical/bruise_pack/comfrey/poultice = new /obj/item/stack/medical/bruise_pack/comfrey(user.loc) poultice.heal_brute = potency to_chat(user, "You mash the leaves into a poultice.") - qdel(src) return if("aloe") var/obj/item/stack/medical/ointment/aloe/poultice = new /obj/item/stack/medical/ointment/aloe(user.loc) poultice.heal_burn = potency to_chat(user, "You mash the petals into a poultice.") - qdel(src) return if("grass") @@ -427,7 +411,6 @@ continue NG.attackby(G, user) to_chat(user, "You add the newly-formed grass to the stack. It now contains [G.amount] tiles.") - qdel(src) return if("sunflower") @@ -442,7 +425,6 @@ user.say("PRAISE THE SUN!") else to_chat(user, "PRAISE THE SUN!") - user.unEquip(src) user.put_in_hands(NF) qdel(src) @@ -451,7 +433,6 @@ var/obj/item/weapon/grown/nettle/nettle = new /obj/item/weapon/grown/nettle(user.loc) nettle.force = round((5 + potency / 5), 1) to_chat(user, "You straighten up the plant.") - user.unEquip(src) user.put_in_hands(nettle) qdel(src) @@ -460,51 +441,40 @@ var/obj/item/weapon/grown/nettle/death/DN = new /obj/item/weapon/grown/nettle/death(user.loc) DN.force = round((5 + potency / 2.5), 1) to_chat(user, "You straighten up the plant.") - user.unEquip(src) user.put_in_hands(DN) qdel(src) return if("cashpod") to_chat(user, "You crack open the cash pod...") - var/value = round(seed.get_trait(TRAIT_POTENCY)) user.unEquip(src) switch(value) if(0) to_chat(user, "It's empty! What a waste...") - if(1 to 10) to_chat(user, "It has a space dollar inside. Woo.") - new /obj/item/weapon/spacecash(get_turf(user)) if(11 to 20) to_chat(user, "It has 10 space dollars inside!") - new /obj/item/weapon/spacecash/c10(get_turf(user)) if(21 to 30) to_chat(user, "It has 20 space dollars inside! Cool!") - new /obj/item/weapon/spacecash/c20(get_turf(user)) if(31 to 40) to_chat(user, "It has 50 space dollars inside! Nice!") - new /obj/item/weapon/spacecash/c50(get_turf(user)) if(41 to 50) to_chat(user, "It has 100 space dollars inside! Sweet!") - new /obj/item/weapon/spacecash/c100(get_turf(user)) if(51 to 60) to_chat(user, "It has 200 space dollars inside! Awesome!") - new /obj/item/weapon/spacecash/c200(get_turf(user)) if(61 to 80) to_chat(user, "It has 500 space dollars inside! CHA-CHING!") - new /obj/item/weapon/spacecash/c500(get_turf(user)) else to_chat(user, "It has 1000 space dollars inside! JACKPOT!") - new /obj/item/weapon/spacecash/c1000(get_turf(user)) qdel(src) return @@ -538,5 +508,4 @@ batteries_recharged = 1 if(batteries_recharged) to_chat(usr, "Battery has recovered.") - ..() \ No newline at end of file diff --git a/code/modules/hydroponics/grown_inedible.dm b/code/modules/hydroponics/grown_inedible.dm index 3592e5091d5..fd9405cc6bf 100644 --- a/code/modules/hydroponics/grown_inedible.dm +++ b/code/modules/hydroponics/grown_inedible.dm @@ -66,7 +66,6 @@ else C.take_organ_damage(0,force) to_chat(C, "The nettle burns your bare hand!") - return 1 /obj/item/weapon/grown/nettle/afterattack(atom/A as mob|obj, mob/user,proximity) @@ -75,7 +74,6 @@ force -= rand(1, (force / 3) + 1) // When you whack someone with it, leaves fall off else to_chat(usr, "All the leaves have fallen off the nettle from violent whacking.") - usr.unEquip(src) qdel(src) @@ -94,11 +92,9 @@ user.Paralyse(5) to_chat(user, "You are stunned by the Deathnettle when you try picking it up!") - /obj/item/weapon/grown/nettle/death/afterattack(mob/living/carbon/M, mob/user) if(istype(M, /mob/living)) to_chat(M, "You are stunned by the powerful acid of the Deathnettle!") - add_logs(M, user, "attacked", src) M.eye_blurry += force/7 @@ -123,7 +119,6 @@ ..() if(istype(W, /obj/item/weapon/circular_saw) || istype(W, /obj/item/weapon/hatchet) || istype(W, /obj/item/weapon/kitchen/knife)) to_chat(user, "You use [W] to fashion a pipe out of the corn cob!") - new /obj/item/clothing/mask/cigarette/pipe/cobpipe (user.loc) qdel(src) return @@ -155,11 +150,9 @@ /obj/item/weapon/grown/sunflower/attack(mob/M as mob, mob/user as mob) to_chat(M, " [user] smacks you with a [name]!FLOWER POWER") - to_chat(user, " Your [name]'s FLOWER POWER strikes [M]") - // Novaflower /obj/item/weapon/grown/novaflower @@ -175,16 +168,12 @@ /obj/item/weapon/grown/novaflower/attack(mob/living/carbon/M as mob, mob/user as mob) to_chat(M, "[user] smacks you with a [name]!FLOWER POWER") - to_chat(user, " Your [name]'s FLOWER POWER strikes [M]") - if(istype(M, /mob/living)) to_chat(M, "You are heated by the warmth of the of the [name]!") - M.bodytemperature += potency/2 * TEMPERATURE_DAMAGE_COEFFICIENT /obj/item/weapon/grown/novaflower/pickup(mob/living/carbon/human/user as mob) if(!user.gloves) to_chat(user, "The [name] burns your bare hand!") - user.adjustFireLoss(rand(1,5)) diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index 46945d792f6..7f7addca012 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -121,18 +121,14 @@ if(get_trait(TRAIT_CARNIVOROUS) == 2) if(affecting) to_chat(target, "\The [fruit]'s thorns pierce your [affecting.name] greedily!") - else to_chat(target, "\The [fruit]'s thorns pierce your flesh greedily!") - damage = get_trait(TRAIT_POTENCY)/2 else if(affecting) to_chat(target, "\The [fruit]'s thorns dig deeply into your [affecting.name]!") - else to_chat(target, "\The [fruit]'s thorns dig deeply into your flesh!") - damage = get_trait(TRAIT_POTENCY)/5 else return @@ -192,7 +188,6 @@ return to_chat(target, "You are stung by \the [fruit]!") - for(var/rid in chems) var/injecting = min(5,max(1,get_trait(TRAIT_POTENCY)/5)) target.reagents.add_reagent(rid,injecting) @@ -720,12 +715,10 @@ if(!force_amount && get_trait(TRAIT_YIELD) == 0 && !harvest_sample) if(istype(user)) to_chat(user, "You fail to harvest anything useful.") - else if(istype(user)) to_chat(user, "You [harvest_sample ? "take a sample" : "harvest"] from the [display_name].") - //This may be a new line. Update the global if it is. if(name == "new line" || !(name in plant_controller.seeds)) uid = plant_controller.seeds.len + 1 diff --git a/code/modules/hydroponics/seed_controller.dm b/code/modules/hydroponics/seed_controller.dm index 211a738f57d..5ba2b4dcfb3 100644 --- a/code/modules/hydroponics/seed_controller.dm +++ b/code/modules/hydroponics/seed_controller.dm @@ -14,13 +14,11 @@ if(!plant_controller || !plant_controller.gene_tag_list) to_chat(usr, "Gene tags not set.") - return for(var/gene_tag in plant_controller.gene_tag_list) to_chat(usr, "[gene_tag]") - var/global/datum/controller/plants/plant_controller // Set in New(). /datum/controller/plants @@ -148,7 +146,5 @@ var/global/datum/controller/plants/plant_controller // Set in New(). if(!plant_controller || !plant_controller.plant_sprites || !plant_controller.plant_sprites.len) to_chat(world, "Cannot list plant sprites, plant controller or plant sprites list may not be initialized.") - for(var/base in plant_controller.plant_sprites) to_chat(world, "[base] : [plant_controller.plant_sprites[base]] growth states") - diff --git a/code/modules/hydroponics/seed_machines.dm b/code/modules/hydroponics/seed_machines.dm index 0fafc331621..6e94201c75c 100644 --- a/code/modules/hydroponics/seed_machines.dm +++ b/code/modules/hydroponics/seed_machines.dm @@ -18,7 +18,6 @@ var/choice = alert(user, "Are you sure you want to wipe the disk?", "Xenobotany Data", "No", "Yes") if(src && user && genes && choice && choice == "Yes" && user.Adjacent(get_turf(src))) to_chat(user, "You wipe the disk data.") - name = initial(name) desc = initial(name) genes = list() @@ -84,24 +83,20 @@ if(istype(W,/obj/item/seeds)) if(seed) to_chat(user, "There is already a seed loaded.") - return var/obj/item/seeds/S =W if(S.seed && S.seed.get_trait(TRAIT_IMMUTABLE) > 0) to_chat(user, "That seed is not compatible with our genetics technology.") - else user.drop_item(W) W.loc = src seed = W to_chat(user, "You load [W] into [src].") - return if(istype(W,/obj/item/weapon/screwdriver)) open = !open to_chat(user, "You [open ? "open" : "close"] the maintenance panel.") - return if(open) @@ -112,7 +107,6 @@ if(istype(W,/obj/item/weapon/disk/botany)) if(loaded_disk) to_chat(user, "There is already a data disk loaded.") - return else var/obj/item/weapon/disk/botany/B = W @@ -120,12 +114,10 @@ if(B.genes && B.genes.len) if(!disk_needs_genes) to_chat(user, "That disk already has gene data loaded.") - return else if(disk_needs_genes) to_chat(user, "That disk does not have any gene data loaded.") - return user.drop_item(W) @@ -133,7 +125,6 @@ loaded_disk = W to_chat(user, "You load [W] into [src].") - return ..() diff --git a/code/modules/hydroponics/seed_packets.dm b/code/modules/hydroponics/seed_packets.dm index 728a67e34e2..dee87d848d3 100644 --- a/code/modules/hydroponics/seed_packets.dm +++ b/code/modules/hydroponics/seed_packets.dm @@ -64,7 +64,6 @@ var/global/list/plant_seed_sprites = list() if(seed && !seed.roundstart) to_chat(user, "It's tagged as variety #[seed.uid].") - /obj/item/seeds/cutting name = "cuttings" desc = "Some plant cuttings." diff --git a/code/modules/hydroponics/seed_storage.dm b/code/modules/hydroponics/seed_storage.dm index 4032d9b0ff4..fe905595677 100644 --- a/code/modules/hydroponics/seed_storage.dm +++ b/code/modules/hydroponics/seed_storage.dm @@ -216,14 +216,12 @@ user.visible_message("[user] puts the seeds from \the [O.name] into \the [src].", "You put the seeds from \the [O.name] into \the [src].") else to_chat(user, "There are no seeds in \the [O.name].") - return else if(istype(O, /obj/item/weapon/wrench)) playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) anchored = !anchored to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src].") - /obj/machinery/seed_storage/proc/add(var/obj/item/seeds/O as obj) if (istype(O.loc, /mob)) var/mob/user = O.loc diff --git a/code/modules/hydroponics/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm index cdbf594abdb..c26d5b98bad 100644 --- a/code/modules/hydroponics/spreading/spreading.dm +++ b/code/modules/hydroponics/spreading/spreading.dm @@ -93,7 +93,6 @@ sleep(250) // ugly hack, should mean roundstart plants are fine. if(!plant_controller) to_chat(world, "Plant controller does not exist and [src] requires it. Aborting.") - qdel(src) return @@ -245,7 +244,6 @@ if(istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/weapon/scalpel)) if(!seed) to_chat(user, "There is nothing to take a sample from.") - return seed.harvest(user,0,1) health -= (rand(3,5)*10) diff --git a/code/modules/hydroponics/spreading/spreading_response.dm b/code/modules/hydroponics/spreading/spreading_response.dm index ec264a71115..5de1ba34473 100644 --- a/code/modules/hydroponics/spreading/spreading_response.dm +++ b/code/modules/hydroponics/spreading/spreading_response.dm @@ -53,6 +53,5 @@ //entangling people if(victim.loc == src.loc) to_chat(victim, "Tendrils [pick("wind", "tangle", "tighten")] around you!") - can_buckle = 1 buckle_mob(victim) \ No newline at end of file diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index 58ba48a6aaa..d394fcefea8 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -165,7 +165,6 @@ if(closed_system) if(user) to_chat(user, "You can't harvest from the plant while the lid is shut.") - return if(user) @@ -199,7 +198,6 @@ if(closed_system) to_chat(user, "You can't remove the dead plant while the lid is shut.") - return seed = null @@ -212,7 +210,6 @@ mutation_mod = 0 to_chat(user, "You remove the dead plant.") - check_health() return @@ -341,12 +338,10 @@ if(labelled) to_chat(usr, "You remove the label.") - labelled = null update_icon() else to_chat(usr, "There is no label to remove.") - return /obj/machinery/portable_atmospherics/hydroponics/verb/setlight() @@ -359,7 +354,6 @@ tray_light = new_light to_chat(usr, "You set the tray to a light level of [tray_light] lumens.") - /obj/machinery/portable_atmospherics/hydroponics/proc/check_level_sanity() //Make sure various values are sane. if(seed) @@ -406,7 +400,6 @@ if(istype(O, /obj/item/weapon/crowbar)) if(anchored==2) to_chat(user, "Unscrew the hoses first!") - return default_deconstruction_crowbar(O, 1) @@ -419,13 +412,11 @@ //Check if container is empty if(!C.reagents.total_volume) to_chat(user, "\red [C] is empty.") - return //Container not empty, transfer contents to tray var/trans = C.reagents.trans_to(src, C.amount_per_transfer_from_this) to_chat(user, "\blue You transfer [trans] units of the solution to [src].") - check_level_sanity() process_reagents() update_icon() @@ -438,7 +429,6 @@ pestlevel -= P.pest_kill_str weedlevel -= P.weed_kill_str to_chat(user, "You spray [src] with [O].") - playsound(loc, 'sound/effects/spray3.ogg', 50, 1, -6) qdel(O) @@ -452,7 +442,6 @@ toxins += W.toxicity weedlevel -= W.weed_kill_str to_chat(user, "You spray [src] with [O].") - playsound(loc, 'sound/effects/spray3.ogg', 50, 1, -6) qdel(O) @@ -466,7 +455,6 @@ if(seed) if(!S.reagents.total_volume) to_chat(user, "\red [S] is empty.") - return //Container not empty, transfer contents to tray S.reagents.trans_to(src, S.amount_per_transfer_from_this) @@ -477,21 +465,18 @@ else to_chat(user, "There's nothing in [src] to spray!") - else if(istype(O, /obj/item/weapon/screwdriver) && unwrenchable) //THIS NEED TO BE DONE DIFFERENTLY, SOMEONE REFACTOR THE TRAY CODE ALREADY if(anchored) if(anchored == 2) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) anchored = 1 to_chat(user, "You unscrew the [src]'s hoses.") - panel_open = 0 else if(anchored == 1) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) anchored = 2 to_chat(user, "You screw in the [src]'s hoses.") - panel_open = 1 for(var/obj/machinery/portable_atmospherics/hydroponics/h in range(1,src)) @@ -502,17 +487,14 @@ if(!seed) to_chat(user, "There is nothing to take a sample from in \the [src].") - return if(sampled) to_chat(user, "You have already sampled from this plant.") - return if(dead) to_chat(user, "The plant is dead.") - return // Create a sample. @@ -538,16 +520,13 @@ return ..() else to_chat(user, "There's no plant to inject.") - return 1 else if(seed) //Leaving this in in case we want to extract from plants later. to_chat(user, "You can't get any extract out of this plant.") - else to_chat(user, "There's nothing to draw something from.") - return 1 else if (istype(O, /obj/item/seeds)) @@ -559,12 +538,10 @@ if(!S.seed) to_chat(user, "The packet seems to be empty. You throw it away.") - qdel(O) return to_chat(user, "You plant the [S.seed.seed_name] [S.seed.seed_noun].") - seed = S.seed //Grab the seed datum. dead = 0 age = 1 @@ -580,7 +557,6 @@ else to_chat(user, "\The [src] already has seeds in it!") - else if (istype(O, /obj/item/weapon/minihoe)) // The minihoe if(weedlevel > 0) @@ -590,7 +566,6 @@ else to_chat(user, "This plot is completely devoid of weeds. It doesn't need uprooting.") - else if (istype(O, /obj/item/weapon/storage/bag/plants)) attack_hand(user) @@ -611,12 +586,10 @@ anchored = !anchored to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src].") - else if(istype(O, /obj/item/apiary)) if(seed) to_chat(user, "[src] is already occupied!") - else user.drop_item() qdel(O) @@ -629,7 +602,6 @@ else if ((istype(O, /obj/item/weapon/tank) && !( src.destroyed ))) if (src.holding) to_chat(user, "\blue There is alreadu a tank loaded into the [src].") - return var/obj/item/weapon/tank/T = O user.drop_item() @@ -665,34 +637,26 @@ if(!seed) to_chat(user, "[src] is empty.") - return to_chat(user, "[seed.display_name] are growing here.
      ") - if(!Adjacent(user)) return to_chat(user, "Water: [round(waterlevel,0.1)]/[maxwater]") - to_chat(user, "Nutrient: [round(nutrilevel,0.1)]/[maxnutri]") - if(weedlevel >= 5) to_chat(user, "\The [src] is infested with weeds!") - if(pestlevel >= 5) to_chat(user, "\The [src] is infested with tiny worms!") - if(dead) to_chat(user, "The plant is dead.") - else if(health <= (seed.get_trait(TRAIT_ENDURANCE)/ 2)) to_chat(user, "The plant looks unhealthy.") - if(mechanical) var/turf/T = loc var/datum/gas_mixture/environment @@ -721,7 +685,6 @@ to_chat(user, "The tray's sensor suite is reporting [light_string] and a temperature of [environment.temperature]K.") - /obj/machinery/portable_atmospherics/hydroponics/verb/close_lid_verb() set name = "Toggle Tray Lid" set category = "Object" @@ -734,7 +697,6 @@ closed_system = !closed_system to_chat(user, "You [closed_system ? "close" : "open"] the tray's lid.") - update_icon() /obj/machinery/portable_atmospherics/hydroponics/verb/eject_tank_verb() @@ -750,9 +712,7 @@ if(!holding) to_chat(usr, "\red There is no tank loaded into [src] to eject.") - if(istype(holding, /obj/item/weapon/tank)) to_chat(usr, "\blue You eject [holding.name] from [src].") - holding.loc = loc holding = null \ No newline at end of file diff --git a/code/modules/hydroponics/trays/tray_apiary.dm b/code/modules/hydroponics/trays/tray_apiary.dm index 836952ed88d..25a2698d274 100644 --- a/code/modules/hydroponics/trays/tray_apiary.dm +++ b/code/modules/hydroponics/trays/tray_apiary.dm @@ -36,11 +36,9 @@ if(!yieldmod) yieldmod += 1 // to_chat(world, "Yield increased by 1, from 0, to a total of [myseed.yield]") - else if (prob(1/(yieldmod * yieldmod) *100))//This formula gives you diminishing returns based on yield. 100% with 1 yield, decreasing to 25%, 11%, 6, 4, 2... yieldmod += 1 // to_chat(world, "Yield increased by 1, to a total of [myseed.yield]") - else ..() return @@ -49,14 +47,12 @@ if(istype(O, /obj/item/queen_bee)) if(health > 0) to_chat(user, "\red There is already a queen in there.") - else health = 10 nutrilevel += 10 user.drop_item() qdel(O) to_chat(user, "\blue You carefully insert the queen into [src], she gets busy making a hive.") - bees_in_hive = 0 else if(istype(O, /obj/item/beezeez)) beezeez += 100 @@ -64,53 +60,42 @@ user.drop_item() if(health > 0) to_chat(user, "\blue You insert [O] into [src]. A relaxed humming appears to pick up.") - else to_chat(user, "\blue You insert [O] into [src]. Now it just needs some bees.") - qdel(O) else if(istype(O, /obj/item/weapon/minihoe)) if(health > 0) to_chat(user, "\red You begin to dislodge the apiary from the tray, the bees don't like that.") - angry_swarm(user) else to_chat(user, "\blue You begin to dislodge the dead apiary from the tray.") - if(do_after(user, 50, target = src)) new hydrotray_type(src.loc) new /obj/item/apiary(src.loc) to_chat(user, "\red You dislodge the apiary from the tray.") - qdel(src) else if(istype(O, /obj/item/weapon/bee_net)) var/obj/item/weapon/bee_net/N = O if(N.caught_bees > 0) to_chat(user, "\blue You empty the bees into the apiary.") - bees_in_hive += N.caught_bees N.caught_bees = 0 else to_chat(user, "\blue There are no more bees in the net.") - else if(istype(O, /obj/item/weapon/reagent_containers/glass)) var/obj/item/weapon/reagent_containers/glass/G = O if(harvestable_honey > 0) if(health > 0) to_chat(user, "\red You begin to harvest the honey. The bees don't seem to like it.") - angry_swarm(user) else to_chat(user, "\blue You begin to harvest the honey.") - if(do_after(user,50, target = src)) G.reagents.add_reagent("honey",harvestable_honey) harvestable_honey = 0 to_chat(user, "\blue You successfully harvest the honey.") - else to_chat(user, "\blue There is no honey left to harvest.") - else angry_swarm(user) ..() @@ -252,5 +237,4 @@ H.reagents.add_reagent("toxin", toxic) to_chat(usr, "\blue You harvest the honeycomb from the hive. There is a wild buzzing!") - angry_swarm(usr) diff --git a/code/modules/hydroponics/trays/tray_tools.dm b/code/modules/hydroponics/trays/tray_tools.dm index bb4bde2da23..b4c4c5c4543 100644 --- a/code/modules/hydroponics/trays/tray_tools.dm +++ b/code/modules/hydroponics/trays/tray_tools.dm @@ -30,7 +30,6 @@ /obj/item/device/analyzer/plant_analyzer/proc/print_report(var/mob/living/user) if(!last_data) to_chat(user, "There is no scan data to print.") - return playsound(loc, "sound/goonstation/machines/printer_thermal.ogg", 50, 1) var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(get_turf(src)) @@ -101,7 +100,6 @@ if(!grown_seed) to_chat(user, "[src] can tell you nothing about \the [target].") - return form_title = "[grown_seed.seed_name] (#[grown_seed.uid])" @@ -347,7 +345,6 @@ extend = !extend if(extend) to_chat(user, "With a flick of the wrist, you extend the scythe. It's reaping time!") - icon_state = "tscythe1" item_state = "scythe0" slot_flags &= ~SLOT_BELT @@ -359,7 +356,6 @@ playsound(src.loc, 'sound/weapons/blade_unsheath.ogg', 50, 1) //Sound credit to Qat of Freesound.org else to_chat(user, "You collapse the scythe, folding it for easy storage.") - icon_state = "tscythe0" item_state = "tscythe0" //no sprite in other words slot_flags |= SLOT_BELT diff --git a/code/modules/hydroponics/trays/tray_update_icons.dm b/code/modules/hydroponics/trays/tray_update_icons.dm index 746c0eba6f2..aac0822a283 100644 --- a/code/modules/hydroponics/trays/tray_update_icons.dm +++ b/code/modules/hydroponics/trays/tray_update_icons.dm @@ -31,7 +31,6 @@ seed.update_growth_stages() if(!seed.growth_stages) to_chat(world, "Seed type [seed.get_trait(TRAIT_PLANT_ICON)] cannot find a growth stage value.") - return var/overlay_stage = 1 if(age >= seed.get_trait(TRAIT_MATURATION)) diff --git a/code/modules/karma/karma.dm b/code/modules/karma/karma.dm index f3ac43660bc..12dedc60fba 100644 --- a/code/modules/karma/karma.dm +++ b/code/modules/karma/karma.dm @@ -55,12 +55,10 @@ var/list/karma_spenders = list() if(!ticker || !player_list.len) to_chat(usr, "\red You can't award karma until the game has started.") - return if(ticker.current_state == GAME_STATE_PREGAME) to_chat(usr, "\red You can't award karma until the game has started.") - return var/list/karma_list = list("Cancel") @@ -71,7 +69,6 @@ var/list/karma_spenders = list() if(!karma_list.len || karma_list.len == 1) to_chat(usr, "\red There's no-one to spend your karma on.") - return var/pickedmob = input("Who would you like to award Karma to?", "Award Karma", "Cancel") as null|mob in karma_list @@ -81,7 +78,6 @@ var/list/karma_spenders = list() if(!istype(pickedmob, /mob)) to_chat(usr, "\red That's not a mob.") - return spend_karma(pickedmob) @@ -93,45 +89,36 @@ var/list/karma_spenders = list() if(!M) to_chat(usr, "Please right click a mob to award karma directly, or use the 'Award Karma' verb to select a player from the player listing.") - return if(!istype(M, /mob)) to_chat(usr, "\red That's not a mob.") - return if(!M.client) to_chat(usr, "\red That mob has no client connected at the moment.") - return if(src.client.karma_spent) to_chat(usr, "\red You've already spent your karma for the round.") - return for(var/a in karma_spenders) if(a == src.key) to_chat(usr, "\red You've already spent your karma for the round.") - return if(M.key == src.key) to_chat(usr, "\red You can't spend karma on yourself!") - return if(M.client.address == src.client.address) message_admins("\red Illegal karma spending detected from [src.key] to [M.key]. Using the same IP!") log_game("\red Illegal karma spending detected from [src.key] to [M.key]. Using the same IP!") to_chat(usr, "\red The karma system is not available to multi-accounters.") - var/choice = input("Give [M.name] good karma?", "Karma") in list("Good", "Cancel") if(!choice || choice == "Cancel") return if(choice == "Good" && !(src.client.karma_spent)) if(src.client.karma_spent) to_chat(usr, "\red You've already spent your karma for the round.") - return M.client.karma += 1 to_chat(usr, "[choice] karma spent on [M.name].") - src.client.karma_spent = 1 karma_spenders.Add(src.key) if(M.client.karma <= -2 || M.client.karma >= 2) @@ -154,14 +141,12 @@ var/list/karma_spenders = list() var/currentkarma=verify_karma() to_chat(usr, {"
      You have [currentkarma] available."}) - return /client/proc/verify_karma() var/currentkarma=0 if(!dbcon.IsConnected()) to_chat(usr, "\red Unable to connect to karma database. Please try again later.
      ") - return else var/DBQuery/query = dbcon.NewQuery("SELECT karma, karmaspent FROM [format_table_name("karmatotals")] WHERE byondkey='[src.key]'") @@ -175,11 +160,9 @@ var/list/karma_spenders = list() currentkarma = (text2num(totalkarma) - text2num(karmaspent)) /* if(totalkarma) to_chat(usr, {"
      You have [currentkarma] available.
      ) - You've gained [totalkarma] total karma in your time here.
      "} else to_chat(usr, "Your total karma is: 0
      ")*/ - return currentkarma /client/verb/karmashop() @@ -283,7 +266,6 @@ You've gained [totalkarma] total karma in your time here.
      "} return else to_chat(usr, "You have unlocked [job].") - message_admins("[key_name(usr)] has unlocked [job].") karmacharge(cost) @@ -300,12 +282,10 @@ You've gained [totalkarma] total karma in your time here.
      "} return else to_chat(usr, "You have unlocked [job].") - message_admins("[key_name(usr)] has unlocked [job].") karmacharge(cost) else to_chat(usr, "You already have this job unlocked!") - return /client/proc/DB_species_unlock(var/species,var/cost) @@ -326,7 +306,6 @@ You've gained [totalkarma] total karma in your time here.
      "} return else to_chat(usr, "You have unlocked [species].") - message_admins("[key_name(usr)] has unlocked [species].") karmacharge(cost) @@ -343,12 +322,10 @@ You've gained [totalkarma] total karma in your time here.
      "} return else to_chat(usr, "You have unlocked [species].") - message_admins("[key_name(usr)] has unlocked [species].") karmacharge(cost) else to_chat(usr, "You already have this species unlocked!") - return /client/proc/karmacharge(var/cost,var/refund = 0) @@ -369,7 +346,6 @@ You've gained [totalkarma] total karma in your time here.
      "} return else to_chat(usr, "You have been [refund ? "refunded" : "charged"] [cost] karma.") - message_admins("[key_name(usr)] has been [refund ? "refunded" : "charged"] [cost] karma.") return @@ -396,7 +372,6 @@ You've gained [totalkarma] total karma in your time here.
      "} cost = 10 else to_chat(usr, "\red That job is not refundable.") - return var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("whitelist")] WHERE ckey='[usr.key]'") @@ -419,7 +394,6 @@ You've gained [totalkarma] total karma in your time here.
      "} else to_chat(usr, "\red Type [type] is not a valid column.") - if(name in typelist) typelist -= name var/newtypelist = jointext(typelist,",") @@ -431,17 +405,14 @@ You've gained [totalkarma] total karma in your time here.
      "} return else to_chat(usr, "You have been refunded [cost] karma for [type] [name].") - message_admins("[key_name(usr)] has been refunded [cost] karma for [type] [name].") karmacharge(text2num(cost),1) else to_chat(usr, "\red You have not bought [name].") - else to_chat(usr, "\red Your ckey ([dbckey]) was not found.") - /client/proc/checkpurchased(var/name = null) // If the first parameter is null, return a full list of purchases var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("whitelist")] WHERE ckey='[usr.key]'") query.Execute() diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index 64384fb7dcb..498b7b62a37 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -33,7 +33,6 @@ update_icon() else if(istype(O, /obj/item/weapon/wrench)) to_chat(user, "\blue Now disassembling bookcase") - playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user,50, target = src)) new /obj/item/stack/sheet/wood(get_turf(src)) @@ -162,13 +161,11 @@ if(carved) if(store) to_chat(user, "[store] falls out of [title]!") - store.loc = get_turf(src.loc) store = null return else to_chat(user, "The pages of [title] have been cut out!") - return if(src.dat) user << browse("Penned by [author].
      " + "[dat]", "window=book") @@ -177,7 +174,6 @@ else to_chat(user, "This book is completely blank!") - /obj/item/weapon/book/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(carved) if(!store) @@ -186,20 +182,16 @@ W.loc = src store = W to_chat(user, "You put [W] in [title].") - return else to_chat(user, "[W] won't fit in [title].") - return else to_chat(user, "There's already something in [title]!") - return if(istype(W, /obj/item/weapon/pen)) if(unique) to_chat(user, "These pages don't seem to take the ink well. Looks like you can't modify it.") - return var/choice = input("What would you like to change?") in list("Title", "Contents", "Author", "Cancel") switch(choice) @@ -207,7 +199,6 @@ var/newtitle = reject_bad_text(stripped_input(usr, "Write a new title:")) if(!newtitle) to_chat(usr, "The title is invalid.") - return else src.name = newtitle @@ -216,7 +207,6 @@ var/content = strip_html(input(usr, "Write your book's contents (HTML NOT allowed):"),8192) as message|null if(!content) to_chat(usr, "The content is invalid.") - return else src.dat += content @@ -224,7 +214,6 @@ var/newauthor = stripped_input(usr, "Write the author's name:") if(!newauthor) to_chat(usr, "The name is invalid.") - return else src.author = newauthor @@ -234,45 +223,36 @@ var/obj/item/weapon/barcodescanner/scanner = W if(!scanner.computer) to_chat(user, "[W]'s screen flashes: 'No associated computer found!'") - else switch(scanner.mode) if(0) scanner.book = src to_chat(user, "[W]'s screen flashes: 'Book stored in buffer.'") - if(1) scanner.book = src scanner.computer.buffer_book = src.name to_chat(user, "[W]'s screen flashes: 'Book stored in buffer. Book title stored in associated computer buffer.'") - if(2) scanner.book = src for(var/datum/borrowbook/b in scanner.computer.checkouts) if(b.bookname == src.name) scanner.computer.checkouts.Remove(b) to_chat(user, "[W]'s screen flashes: 'Book stored in buffer. Book has been checked in.'") - return to_chat(user, "[W]'s screen flashes: 'Book stored in buffer. No active check-out record found for current title.'") - if(3) scanner.book = src for(var/obj/item/weapon/book in scanner.computer.inventory) if(book == src) to_chat(user, "[W]'s screen flashes: 'Book stored in buffer. Title already present in inventory, aborting to avoid duplicate entry.'") - return scanner.computer.inventory.Add(src) to_chat(user, "[W]'s screen flashes: 'Book stored in buffer. Title added to general inventory.'") - else if(istype(W, /obj/item/weapon/kitchen/knife) || istype(W, /obj/item/weapon/wirecutters)) if(carved) return to_chat(user, "You begin to carve out [title].") - if(do_after(user, 30, target = src)) to_chat(user, "You carve out the pages from [title]! You didn't want to read it anyway.") - carved = 1 return else @@ -298,7 +278,6 @@ if(mode > 3) mode = 0 to_chat(user, "[src] Status Display:") - var/modedesc switch(mode) if(0) @@ -312,12 +291,8 @@ else modedesc = "ERROR" to_chat(user, " - Mode [mode] : [modedesc]") - if(src.computer) to_chat(user, "Computer has been associated with this unit.") - else to_chat(user, "No associated computer found. Only local scans will function properly.") - to_chat(user, "\n") - diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index c65c82445e0..57f1b85b227 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -148,7 +148,6 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f if(src.arcanecheckout) new /obj/item/weapon/tome(src.loc) to_chat(user, "Your sanity barely endures the seconds spent in the vault's browsing window. The only thing to remind you of this when you stop browsing is a dusty old tome sitting on the desk. You don't really remember printing it.") - user.visible_message("[user] stares at the blank screen for a few moments, his expression frozen in fear. When he finally awakens from it, he looks a lot older.", 2) src.arcanecheckout = 0 if(1) @@ -246,7 +245,6 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f var/obj/item/weapon/barcodescanner/scanner = W scanner.computer = src to_chat(user, "[scanner]'s associated machine has been set to [src].") - for (var/mob/V in hearers(src)) V.show_message("[src] lets out a low, short blip.", 2) else @@ -484,7 +482,6 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f set category = "Admin" if(!src.holder) to_chat(src, "Only administrators may use this command.") - return var/isbn = input("ISBN number?", "Delete Book") as num | null diff --git a/code/modules/media/broadcast/receivers/radio.dm b/code/modules/media/broadcast/receivers/radio.dm index 1d155f186bf..7b9c4ad7b15 100644 --- a/code/modules/media/broadcast/receivers/radio.dm +++ b/code/modules/media/broadcast/receivers/radio.dm @@ -15,7 +15,6 @@ /obj/machinery/media/receiver/boombox/attack_hand(var/mob/user) if(stat & (NOPOWER|BROKEN)) to_chat(usr, "\red You don't see anything to mess with.") - return user.set_machine(src) interact(user) @@ -61,7 +60,6 @@ connect_frequency() else to_chat(usr, "\red Invalid FM frequency. (90.0, 200.0)") - updateDialog() diff --git a/code/modules/media/broadcast/transmitters/broadcast.dm b/code/modules/media/broadcast/transmitters/broadcast.dm index c732e5bce96..d8607851752 100644 --- a/code/modules/media/broadcast/transmitters/broadcast.dm +++ b/code/modules/media/broadcast/transmitters/broadcast.dm @@ -137,7 +137,6 @@ else to_chat(usr, "\red Invalid FM frequency. (90.0, 200.0)") - /obj/machinery/media/transmitter/broadcast/process() if(stat & (NOPOWER|BROKEN)) return @@ -163,12 +162,10 @@ // to_chat(world, "got [transfer_moles] moles at [removed.temperature]") - if(removed) var/heat_capacity = removed.heat_capacity() // to_chat(world, "heating ([heat_capacity])") - if(heat_capacity) // Added check to avoid divide by zero (oshi-) runtime errors -- TLE if(removed.temperature < MAX_TEMP + T0C) removed.temperature = min(removed.temperature + heating_power/heat_capacity, 1000) // Added min() check to try and avoid wacky superheating issues in low gas scenarios -- TLE @@ -177,11 +174,9 @@ // to_chat(world, "now at [removed.temperature]") - env.merge(removed) // to_chat(world, "turf now at [env.temperature]") - /* // Checks heat from the environment and applies any integrity damage var/datum/gas_mixture/environment = loc.return_air() diff --git a/code/modules/media/jukebox.dm b/code/modules/media/jukebox.dm index 6337dccdb34..33a44c5f23b 100644 --- a/code/modules/media/jukebox.dm +++ b/code/modules/media/jukebox.dm @@ -116,7 +116,6 @@ var/global/loopModeNames=list( /obj/machinery/media/jukebox/attack_hand(var/mob/user) if(stat & NOPOWER) to_chat(usr, "\red You don't see anything to mess with.") - return if(stat & BROKEN && playlist!=null) user.visible_message("\red [user.name] smacks the side of \the [src.name].","\red You hammer the side of \the [src.name].") @@ -182,7 +181,6 @@ var/global/loopModeNames=list( ..() if(emagged) to_chat(usr, "\red You touch the bluescreened menu. Nothing happens. You feel dumber.") - return if (href_list["power"]) @@ -193,7 +191,6 @@ var/global/loopModeNames=list( if (href_list["playlist"]) if(!check_reload()) to_chat(usr, "\red You must wait 60 seconds between playlist reloads.") - return playlist_id=href_list["playlist"] last_reload=world.time diff --git a/code/modules/media/mediamanager.dm b/code/modules/media/mediamanager.dm index 8aa525ac896..d78afc6f9f2 100644 --- a/code/modules/media/mediamanager.dm +++ b/code/modules/media/mediamanager.dm @@ -82,7 +82,6 @@ if(vlc.attachEvent) { #ifdef DEBUG_MEDIAPLAYER to_chat(#define MP_DEBUG(x) owner, x) - #warning Please comment out #define DEBUG_MEDIAPLAYER before committing. #else #define MP_DEBUG(x) @@ -139,7 +138,6 @@ to_chat(#define MP_DEBUG(x) owner, x) targetURL = M.media_url targetStartTime = M.media_start_time // to_chat(owner, "Found audio source: [M.media_url] @ [(world.time - start_time) / 10]s.") - //else // testing("M is not playing or null.") @@ -158,7 +156,6 @@ to_chat(#define MP_DEBUG(x) owner, x) if(!media || !istype(media)) to_chat(usr, "You have no media datum to change, if you're not in the lobby tell an admin.") - return var/value = input("Choose your Jukebox volume.", "Jukebox volume", media.get_volume()) value = round(max(0, min(100, value))) diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm index bd5f8b338d0..16c247b6b50 100644 --- a/code/modules/mining/abandonedcrates.dm +++ b/code/modules/mining/abandonedcrates.dm @@ -65,34 +65,28 @@ /obj/structure/closet/crate/secure/loot/togglelock(mob/user as mob) if(locked) to_chat(user, "The crate is locked with a Deca-code lock.") - var/input = input(usr, "Enter digit from [min] to [max].", "Deca-Code Lock", "") as num if(in_range(src, user)) input = Clamp(input, 0, 10) if (input == code) to_chat(user, "The crate unlocks!") - locked = 0 overlays.Cut() overlays += greenlight else if (input == null || input > max || input < min) to_chat(user, "You leave the crate alone.") - else to_chat(user, "A red light flashes.") - lastattempt = input attempts-- if (attempts == 0) to_chat(user, "The crate's anti-tamper system activates!") - var/turf/T = get_turf(src.loc) explosion(T, -1, -1, 1, 1) qdel(src) return else to_chat(user, "You attempt to interact with the device using a hand gesture, but it appears this crate is from before the DECANECT came out.") - return else return ..() @@ -101,27 +95,20 @@ if(locked) if (istype(W, /obj/item/weapon/card/emag)) to_chat(user, "The crate unlocks!") - locked = 0 if (istype(W, /obj/item/device/multitool)) to_chat(user, "DECA-CODE LOCK REPORT:") - if (attempts == 1) to_chat(user, "* Anti-Tamper Bomb will activate on next failed access attempt.") - else to_chat(user, "* Anti-Tamper Bomb will activate after [src.attempts] failed access attempts.") - if (lastattempt == null) to_chat(user, " has been made to open the crate thus far.") - return // hot and cold if (code > lastattempt) to_chat(user, "* Last access attempt lower than expected code.") - else to_chat(user, "* Last access attempt higher than expected code.") - else ..() else ..() diff --git a/code/modules/mining/coins.dm b/code/modules/mining/coins.dm index 70fd5738c2d..a8ac5e1a88c 100644 --- a/code/modules/mining/coins.dm +++ b/code/modules/mining/coins.dm @@ -103,17 +103,14 @@ var/obj/item/stack/cable_coil/CC = W if(string_attached) to_chat(user, "There already is a string attached to this coin.") - return if (CC.use(1)) overlays += image('icons/obj/items.dmi',"coin_string_overlay") string_attached = 1 to_chat(user, "You attach a string to the coin.") - else to_chat(user, "You need one length of cable to attach a string to the coin.") - return else if(istype(W,/obj/item/weapon/wirecutters)) @@ -127,7 +124,6 @@ overlays = list() string_attached = null to_chat(user, "You detach the string from the coin.") - else if(istype(W,/obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W if(WT.welding && WT.remove_fuel(0, user)) @@ -139,7 +135,6 @@ var/typekey = typelist[cmineral] if(ispath(typekey)) to_chat(user, "\blue You make [src] into a ring.") - new typekey(get_turf(loc)) qdel(src) else ..() diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index a4e4c6e9eb7..60044582dec 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -210,7 +210,6 @@ points = 0 else to_chat(usr, "Required access not found.") - else if(href_list["choice"] == "insert") var/obj/item/weapon/card/id/I = usr.get_active_hand() if(istype(I)) @@ -220,7 +219,6 @@ inserted_id = I else to_chat(usr, "No valid ID.") - if(href_list["release"]) if(check_access(inserted_id) || allowed(usr)) //Check the ID inside, otherwise check the user. if(!(text2path(href_list["release"]) in stack_list)) return @@ -235,7 +233,6 @@ stack_list -= text2path(href_list["release"]) else to_chat(usr, "Required access not found.") - if(href_list["plasteel"]) if(check_access(inserted_id) || allowed(usr)) if(!(/obj/item/stack/sheet/metal in stack_list)) return @@ -252,7 +249,6 @@ unload_mineral(plasteelout) else to_chat(usr, "Required access not found.") - if(href_list["plasglass"]) if(check_access(inserted_id) || allowed(usr)) if(!(/obj/item/stack/sheet/glass in stack_list)) return @@ -269,7 +265,6 @@ unload_mineral(plasglassout) else to_chat(usr, "Required access not found.") - updateUsrDialog() return @@ -422,7 +417,6 @@ inserted_id = I else to_chat(usr, "No valid ID.") - if(href_list["purchase"]) if(istype(inserted_id)) var/datum/data/mining_equipment/prize = locate(href_list["purchase"]) @@ -504,18 +498,15 @@ var/obj/item/weapon/card/id/C = I C.mining_points += points to_chat(user, "You transfer [points] points to [C].") - points = 0 else to_chat(user, "There's no points left on [src].") - ..() /obj/item/weapon/card/mining_point_card/examine(mob/user) ..(user) to_chat(user, "There's [points] points on the card.") - /**********************Jaunter**********************/ /obj/item/device/wormhole_jaunter @@ -534,7 +525,6 @@ var/turf/device_turf = get_turf(user) if(!device_turf||device_turf.z==2||device_turf.z>=7) to_chat(user, "You're having difficulties getting the [src.name] to work.") - return else user.visible_message("[user.name] activates the [src.name]!") @@ -545,7 +535,6 @@ L += B if(!L.len) to_chat(user, "The [src.name] failed to create a wormhole.") - return var/chosen_beacon = pick(L) var/obj/effect/portal/wormhole/jaunt_tunnel/J = new /obj/effect/portal/wormhole/jaunt_tunnel(get_turf(src), chosen_beacon) @@ -617,12 +606,10 @@ if(burst_time == 50) burst_time = 30 to_chat(user, "You set the resonator's fields to detonate after 3 seconds.") - else burst_time = 50 to_chat(user, "You set the resonator's fields to detonate after 5 seconds.") - /obj/item/weapon/resonator/afterattack(atom/target, mob/user, proximity_flag) if(proximity_flag) if(!check_allowed_items(target, 1)) return @@ -659,12 +646,10 @@ for(var/mob/living/L in src.loc) add_logs(L, creator, "used a resonator field on", object="resonator") to_chat(L, "The [src.name] ruptured with you in it!") - L.adjustBruteLoss(resonance_damage) else for(var/mob/living/L in src.loc) to_chat(L, "The [src.name] ruptured with you in it!") - L.adjustBruteLoss(resonance_damage) qdel(src) @@ -741,19 +726,15 @@ if(W.welding && !stat) if(stance != HOSTILE_STANCE_IDLE) to_chat(user, "[src] is moving around too much to repair!") - return if(maxHealth == health) to_chat(user, "[src] is at full integrity.") - else health += 10 to_chat(user, "You repair some of the armor on [src].") - return if(istype(I, /obj/item/device/mining_scanner) || istype(I, /obj/item/device/t_scanner/adv_mining_scanner)) to_chat(user, "You instruct [src] to drop any collected ore.") - DropOre() return ..() @@ -776,11 +757,9 @@ if(0) SetCollectBehavior() to_chat(M, "[src] has been set to search and store loose ore.") - if(2) SetOffenseBehavior() to_chat(M, "[src] has been set to attack hostile wildlife.") - return ..() @@ -888,11 +867,9 @@ return else to_chat(user, "[src] is only effective on the dead.") - return else to_chat(user, "[src] is only effective on lesser beings.") - return /obj/item/weapon/lazarus_injector/emag_act() @@ -907,11 +884,9 @@ ..(user) if(!loaded) to_chat(user, "[src] is empty.") - if(malfunctioning) to_chat(user, "The display on [src] seems to be flickering.") - /**********************Mining Scanner**********************/ /obj/item/device/mining_scanner @@ -1017,9 +992,7 @@ var/obj/item/organ/internal/hivelord_core/C = M if(!istype(C, /obj/item/organ/internal/hivelord_core)) to_chat(user, "The stabilizer only works on hivelord cores.") - return ..() C.preserved = 1 to_chat(user, "You inject the hivelord core with the stabilizer. It will no longer go inert.") - qdel(src) \ No newline at end of file diff --git a/code/modules/mining/laborcamp/laborshuttle.dm b/code/modules/mining/laborcamp/laborshuttle.dm index 03782a96f7f..25bbf0f3ee5 100644 --- a/code/modules/mining/laborcamp/laborshuttle.dm +++ b/code/modules/mining/laborcamp/laborshuttle.dm @@ -19,11 +19,9 @@ var/obj/docking_port/mobile/M = shuttle_master.getShuttle("laborcamp") if(!M) to_chat(usr, "Cannot locate shuttle!") - return 0 var/obj/docking_port/stationary/S = M.get_docked() if(S && S.name == "laborcamp_away") to_chat(usr, "Shuttle is already at the outpost!") - return 0 ..() \ No newline at end of file diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm index ab1759d844f..47c9c45dbc3 100644 --- a/code/modules/mining/laborcamp/laborstacker.dm +++ b/code/modules/mining/laborcamp/laborstacker.dm @@ -76,7 +76,6 @@ - /obj/machinery/mineral/labor_claim_console/Topic(href, href_list) usr.set_machine(src) src.add_fingerprint(usr) @@ -90,7 +89,6 @@ inserted_id.points += machine.points machine.points = 0 to_chat(src, "Points transferred.") - else if(href_list["choice"] == "insert") var/obj/item/weapon/card/id/prisoner/I = usr.get_active_hand() if(istype(I)) @@ -99,29 +97,23 @@ inserted_id = I else to_chat(usr, "Invalid ID.") - if(check_auth()) //Sanity check against hef spoofs if(href_list["choice"] == "station") if(!alone_in_area(get_area(src), usr)) to_chat(usr, "Prisoners are only allowed to be released while alone.") - else switch(shuttle_master.moveShuttle("laborcamp","laborcamp_home")) if(1) to_chat(usr, "Shuttle not found") - if(2) to_chat(usr, "Shuttle already at station") - if(3) to_chat(usr, "No permission to dock could be granted.") - else var/message = "[inserted_id.registered_name] has returned to the station. Minerals and Prisoner ID card ready for retrieval." announcer.autosay(message, "Labor Camp Controller", "Security") to_chat(usr, "Shuttle received message and will be sent shortly.") - if(href_list["choice"] == "release") if(alone_in_area(get_area(loc), usr)) var/obj/docking_port/stationary/S = shuttle_master.getDock("laborcamp_home") @@ -130,11 +122,9 @@ release_door.open() else to_chat(usr, "Prisoners can only be released while docked with the station.") - else to_chat(usr, "Prisoners are only allowed to be released while alone.") - src.updateUsrDialog() return @@ -180,15 +170,10 @@ if(istype(I, /obj/item/weapon/card/id/prisoner)) var/obj/item/weapon/card/id/prisoner/prisoner_id = I to_chat(user, "ID: [prisoner_id.registered_name]") - to_chat(user, "Points Collected:[prisoner_id.points]") - to_chat(user, "Point Quota: [prisoner_id.goal]") - to_chat(user, "Collect points by bringing smelted minerals to the Labor Shuttle stacking machine. Reach your quota to earn your release.") - else to_chat(user, "Error: Invalid ID") - return ..() diff --git a/code/modules/mining/manufacturing.dm b/code/modules/mining/manufacturing.dm index 5d66474b5fb..429b0ee42bc 100644 --- a/code/modules/mining/manufacturing.dm +++ b/code/modules/mining/manufacturing.dm @@ -178,7 +178,6 @@ if (href_list["download"]) to_chat(if(!src.dl_list) usr, "\red This unit is not capable of downloading any additional schematics.") - else var/amtdl = 0 //var/dontload = 0 @@ -193,10 +192,8 @@ amtdl++ else dontload = 0*/ to_chat(if (amtdl) usr, "\blue [amtdl] new schematics downloaded from Robotics Research Database.") - to_chat(else usr, "\red No new schematics currently available in Robotics Research Database.") - if (href_list["delete"]) var/operation = text2num(href_list["delete"]) if(operation == 1) // Clear Disk Schematics @@ -205,19 +202,15 @@ src.diskload-= D amtgone++ to_chat(if (amtgone) usr, "\blue Cleared [amtgone] schematics from database.") - to_chat(else usr, "\red No disk-loaded schematics detected in database.") - if(operation == 2) // Clear Download Schematics var/amtgone = 0 for(var/datum/manufacture/D in src.download) src.download-= D amtgone++ to_chat(if (amtgone) usr, "\blue Cleared [amtgone] schematics from database.") - to_chat(else usr, "\red No downloaded schematics detected in database.") - if (href_list["eject"]) var/operation = text2num(href_list["eject"]) var/ejectamt = 0 @@ -236,7 +229,6 @@ if(11) ejecting = /obj/item/weapon/ore/fabric else to_chat(usr, "\red Error. Unknown ore type.") - return sleep(3) ejectamt = input(usr,"How many units do you want to eject?","Eject Materials") as num @@ -258,7 +250,6 @@ if (istype(O,I.cost3)) A3++ if (A1 < I.amount1 || A2 < I.amount2 || A3 < I.amount3) to_chat(usr, "\red Insufficient materials to manufacture that item.") - return // Consume Mats var/C1 = I.amount1 @@ -347,7 +338,6 @@ load = 2 else if(istype(W, /obj/item/weapon/disk/data/schematic)) to_chat(if (!src.acceptdisk) user, "\red This unit is unable to accept disks.") - else var/amtload = 0 var/dontload = 0 @@ -365,9 +355,7 @@ amtload++ else dontload = 0 to_chat(if (amtload) user, "\blue [amtload] new schematics downloaded from disk.") - to_chat(else user, "\red No new schematics available on disk.") - else if (istype(W, /obj/item/weapon/storage/bag/ore)) for(var/mob/V in viewers(user, null)) V.show_message(text("\blue [] uses the []'s automatic ore loader on []!", user, src, W), 1) var/amtload = 0 @@ -375,13 +363,10 @@ M.loc = src amtload++ to_chat(if (amtload) user, "\blue [amtload] pieces of ore loaded from [W]!") - to_chat(else user, "\red No ore loaded!") - else if(istype(W, /obj/item/weapon/card/emag)) src.hacked = 1 to_chat(user, "\blue You remove the [src]'s product locks!") - else ..() if (load == 1) @@ -407,9 +392,7 @@ M.loc = src amtload++ to_chat(if (amtload) user, "\blue [amtload] pieces of ore loaded from [O]!") - to_chat(else user, "\red No ore loaded!") - else if (istype(O, /obj/item/weapon/ore/)) for(var/mob/V in viewers(user, null)) V.show_message(text("\blue [] begins quickly stuffing ore into []!", user, src), 1) var/staystill = user.loc @@ -418,7 +401,6 @@ sleep(3) if (user.loc != staystill) break to_chat(user, "\blue You finish stuffing ore into [src]!") - /*else if (istype(O, /obj/item/weapon/plant/wheat/metal)) for(var/mob/V in viewers(user, null)) V.show_message(text("\blue [] begins quickly stuffing [O] into []!", user, src), 1) var/staystill = user.loc @@ -428,7 +410,6 @@ sleep(3) if (user.loc != staystill) break to_chat(user, "\blue You finish stuffing [O] into [src]!"*/) - else ..() src.updateUsrDialog() diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index d3fdb6fb3b0..a468913eda3 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -220,7 +220,6 @@ var/mob/living/simple_animal/T = target if(captured) to_chat(U, "Capture failed!: The capsule already has a mob registered to it!") - else if(istype(T) && "neutral" in T.faction) T.forceMove(src) @@ -228,12 +227,10 @@ T.cancel_camera() name = "Lazarus Capsule: [initial(T.name)]" to_chat(U, "You placed a [T.name] inside the Lazarus Capsule!") - captured = T else to_chat(U, "You can't capture that mob!") - /obj/item/device/mobcapsule/throw_impact(atom/A, mob/user) ..() if(captured) diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 9ed15e58cef..e2ff03a506e 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -362,7 +362,6 @@ var/global/list/rockTurfEdgeCache if (!user.IsAdvancedToolUser()) to_chat(usr, "You don't have the dexterity to do this!") - return if (istype(P, /obj/item/weapon/pickaxe)) @@ -374,13 +373,11 @@ var/global/list/rockTurfEdgeCache return last_act = world.time to_chat(user, "You start picking...") - P.playDigSound() if(do_after(user, P.digspeed, target = src)) if(istype(src, /turf/simulated/mineral)) //sanity check against turf being deleted during digspeed delay to_chat(user, "You finish cutting into the rock.") - P.update_icon() gets_drilled(user) feedback_add_details("pick_used_mining","[P.name]") @@ -411,11 +408,9 @@ var/global/list/rockTurfEdgeCache /turf/simulated/mineral/attack_alien(var/mob/living/carbon/alien/M) to_chat(M, "You start digging into the rock...") - playsound(src, 'sound/effects/break_stone.ogg', 50, 1) if(do_after(M, 40, target = src)) to_chat(M, "You tunnel into the rock.") - gets_drilled() /turf/simulated/mineral/Bumped(AM as mob|obj) @@ -481,16 +476,13 @@ var/global/list/rockTurfEdgeCache if (dug) to_chat(user, "This area has already been dug!") - return to_chat(user, "You start digging...") - sleep(20) if ((user.loc == T && user.get_active_hand() == W)) to_chat(user, "You dig a hole.") - gets_dug() return @@ -502,16 +494,13 @@ var/global/list/rockTurfEdgeCache if (dug) to_chat(user, "This area has already been dug!") - return to_chat(user, "You start digging...") - sleep(P.digspeed) if ((user.loc == T && user.get_active_hand() == W)) to_chat(user, "You dig a hole.") - gets_dug() return diff --git a/code/modules/mining/mint.dm b/code/modules/mining/mint.dm index e07b4641300..be34465c207 100644 --- a/code/modules/mining/mint.dm +++ b/code/modules/mining/mint.dm @@ -125,7 +125,6 @@ src.add_fingerprint(usr) if(processing==1) to_chat(usr, "The machine is processing.") - return if(href_list["choose"]) chosen = href_list["choose"] diff --git a/code/modules/mining/money_bag.dm b/code/modules/mining/money_bag.dm index 5f7e34f4463..a7a7b4b10df 100644 --- a/code/modules/mining/money_bag.dm +++ b/code/modules/mining/money_bag.dm @@ -68,14 +68,12 @@ if(!user.drop_item()) return to_chat(user, "You add the [C.name] into the bag.") - contents += C if (istype(W, /obj/item/weapon/moneybag)) var/obj/item/weapon/moneybag/C = W for (var/obj/O in C.contents) contents += O; to_chat(user, "You empty the [C.name] into the bag.") - return /obj/item/weapon/moneybag/Topic(href, href_list) diff --git a/code/modules/mining/ore.dm b/code/modules/mining/ore.dm index f6bd12a4c2e..f5e0f2349be 100644 --- a/code/modules/mining/ore.dm +++ b/code/modules/mining/ore.dm @@ -14,7 +14,6 @@ qdel(src) else if(W.isOn()) to_chat(user, "Not enough fuel to smelt [src].") - ..() /obj/item/weapon/ore/Crossed(AM as mob|obj) @@ -66,7 +65,6 @@ /obj/item/weapon/ore/glass/attack_self(mob/living/user as mob) to_chat(user, "You use the sand to make sandstone.") - var/sandAmt = 1 for(var/obj/item/weapon/ore/glass/G in user.loc) // The sand on the floor sandAmt += 1 @@ -97,7 +95,6 @@ var/obj/item/weapon/weldingtool/W = I if(W.welding) to_chat(user, "You can't hit a high enough temperature to smelt [src] properly!") - else ..() diff --git a/code/modules/mining/satchel_ore_boxdm.dm b/code/modules/mining/satchel_ore_boxdm.dm index 4a30f138982..7d6750c4be4 100644 --- a/code/modules/mining/satchel_ore_boxdm.dm +++ b/code/modules/mining/satchel_ore_boxdm.dm @@ -20,7 +20,6 @@ for(var/obj/item/weapon/ore/O in S.contents) S.remove_from_storage(O, src) //This will move the item to this item's contents to_chat(user, "You empty the satchel into the box.") - return /obj/structure/ore_box/attack_hand(mob/user as mob) @@ -93,7 +92,6 @@ contents -= O O.loc = src.loc to_chat(usr, "You empty the box.") - src.updateUsrDialog() return @@ -109,7 +107,6 @@ obj/structure/ore_box/ex_act(severity, target) if(!istype(usr, /mob/living/carbon/human)) //Only living, intelligent creatures with hands can empty ore boxes. to_chat(usr, "You are physically incapable of emptying the ore box.") - return if( usr.stat || usr.restrained() ) @@ -117,14 +114,12 @@ obj/structure/ore_box/ex_act(severity, target) if(!Adjacent(usr)) //You can only empty the box if you can physically reach it to_chat(usr, "You cannot reach the ore box.") - return add_fingerprint(usr) if(contents.len < 1) to_chat(usr, "The ore box is empty.") - return for (var/obj/item/weapon/ore/O in contents) @@ -132,5 +127,4 @@ obj/structure/ore_box/ex_act(severity, target) O.loc = src.loc to_chat(usr, "You empty the ore box.") - return diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 161bb8666c7..82b83db73ef 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -202,10 +202,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(ticker) if(ticker.mode) // to_chat(world, "DEBUG: ticker not null") - if(ticker.mode.name == "AI malfunction") // to_chat(world, "DEBUG: malf mode ticker test") - if(ticker.mode:malf_mode_declared) stat(null, "Time left: [max(ticker.mode:AI_win_timeleft/(ticker.mode:apcs/3), 0)]") show_stat_emergency_shuttle_eta() @@ -216,15 +214,12 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(!client) return if(!can_reenter_corpse) to_chat(src, "You've given up your right to respawn!") - return if(!(mind && mind.current && can_reenter_corpse)) to_chat(src, "You have no body.") - return if(mind.current.key && copytext(mind.current.key,1,2)!="@") //makes sure we don't accidentally kick any clients to_chat(usr, "Another consciousness is in your body...It is resisting you.") - return if(mind.current.ajourn && mind.current.stat != DEAD) //check if the corpse is astral-journeying (it's client ghosted using a cultist rune). var/turf/T = get_turf(mind.current) @@ -236,7 +231,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp break if(!found_astral_rune) to_chat(usr, "The astral cord that ties your body and your spirit has been severed. You are likely to wander the realm beyond until your body is finally dead and thus reunited with you.") - return mind.current.ajourn=0 @@ -254,13 +248,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/dead/observer/proc/notify_cloning(var/message, var/sound, var/atom/source) if(message) to_chat(src, "[message]") - to_chat(src, "(Click to re-enter)") - if(sound) to_chat(src, sound(sound)) - /mob/dead/observer/proc/show_me_the_hud(hud_index) var/datum/atom_hud/H = huds[hud_index] H.add_hud_to(src) @@ -280,35 +271,29 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(0) show_me_the_hud(DATA_HUD_SECURITY_BASIC) to_chat(src, "Security HUD set.") - if(DATA_HUD_SECURITY_BASIC) show_me_the_hud(DATA_HUD_MEDICAL_ADVANCED) to_chat(src, "Medical HUD set.") - if(DATA_HUD_MEDICAL_ADVANCED) show_me_the_hud(DATA_HUD_DIAGNOSTIC) to_chat(src, "Diagnostic HUD set.") - if(DATA_HUD_DIAGNOSTIC) data_hud_seen = 0 to_chat(src, "HUDs disabled.") - /mob/dead/observer/verb/toggle_antagHUD() set category = "Ghost" set name = "Toggle AntagHUD" set desc = "Toggles AntagHUD allowing you to see who is the antagonist" if(!config.antag_hud_allowed && !client.holder) to_chat(src, "\red Admins have disabled this for this round.") - return if(!client) return var/mob/dead/observer/M = src if(jobban_isbanned(M, "AntagHUD")) to_chat(src, "\red You have been banned from using this feature") - return if(config.antag_hud_restricted && !M.has_enabled_antagHUD && !check_rights(R_ADMIN|R_MOD,0)) var/response = alert(src, "If you turn this on, you will not be able to take any part in the round.","Are you sure you want to turn this feature on?","Yes","No") @@ -329,11 +314,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp H.remove_hud_from(usr) if(!M.antagHUD) to_chat(usr, "AntagHud Toggled ON") - M.antagHUD = 1 else to_chat(usr, "AntagHud Toggled OFF") - M.antagHUD = 0 /mob/dead/observer/proc/dead_tele(A in ghostteleportlocs) @@ -343,7 +326,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(!isobserver(usr)) to_chat(usr, "Not when you're not dead!") - return usr.verbs -= /mob/dead/observer/proc/dead_tele @@ -360,7 +342,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(!L || !L.len) to_chat(usr, "No area available.") - usr.forceMove(pick(L)) following = null @@ -383,7 +364,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return following = target to_chat(src, "Now following [target]") - if(ismob(target)) forceMove(get_turf(target)) var/mob/M = target @@ -441,7 +421,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp to_chat(src, "This mob is not located in the game world.") - /* Now a spell. See spells.dm /mob/dead/observer/verb/boo() set category = "Ghost" @@ -461,12 +440,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set hidden = 1 to_chat(src, "\red You are dead! You have no mind to store memory!") - /mob/dead/observer/add_memory() set hidden = 1 to_chat(src, "\red You are dead! You have no mind to store memory!") - /mob/dead/observer/verb/analyze_air() set name = "Analyze Air" set category = "Ghost" @@ -483,13 +460,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/total_moles = environment.total_moles() to_chat(src, "\blue Results:") - if(abs(pressure - ONE_ATMOSPHERE) < 10) to_chat(src, "\blue Pressure: [round(pressure,0.1)] kPa") - else to_chat(src, "\red Pressure: [round(pressure,0.1)] kPa") - if(total_moles) var/o2_concentration = environment.oxygen/total_moles var/n2_concentration = environment.nitrogen/total_moles @@ -499,38 +473,28 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/unknown_concentration = 1-(o2_concentration+n2_concentration+co2_concentration+plasma_concentration) if(abs(n2_concentration - N2STANDARD) < 20) to_chat(src, "\blue Nitrogen: [round(n2_concentration*100)]% ([round(environment.nitrogen,0.01)] moles)") - else to_chat(src, "\red Nitrogen: [round(n2_concentration*100)]% ([round(environment.nitrogen,0.01)] moles)") - if(abs(o2_concentration - O2STANDARD) < 2) to_chat(src, "\blue Oxygen: [round(o2_concentration*100)]% ([round(environment.oxygen,0.01)] moles)") - else to_chat(src, "\red Oxygen: [round(o2_concentration*100)]% ([round(environment.oxygen,0.01)] moles)") - if(co2_concentration > 0.01) to_chat(src, "\red CO2: [round(co2_concentration*100)]% ([round(environment.carbon_dioxide,0.01)] moles)") - else to_chat(src, "\blue CO2: [round(co2_concentration*100)]% ([round(environment.carbon_dioxide,0.01)] moles)") - if(plasma_concentration > 0.01) to_chat(src, "\red Plasma: [round(plasma_concentration*100)]% ([round(environment.toxins,0.01)] moles)") - if(unknown_concentration > 0.01) to_chat(src, "\red Unknown: [round(unknown_concentration*100)]% ([round(unknown_concentration*total_moles,0.01)] moles)") - to_chat(src, "\blue Temperature: [round(environment.temperature-T0C,0.1)]°C") - to_chat(src, "\blue Heat Capacity: [round(environment.heat_capacity(),0.1)]") - /mob/dead/observer/verb/view_manifest() set name = "View Crew Manifest" set category = "Ghost" @@ -587,7 +551,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/mob/target = locate(href_list["jump"]) var/mob/A = usr; to_chat(A, "Teleporting to [target]...") - //var/mob/living/silicon/ai/A = locate(href_list["track2"]) in mob_list if(target && target != usr) spawn(0) @@ -611,11 +574,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp src.anonsay = !src.anonsay if(anonsay) to_chat(src, "Your key won't be shown when you speak in dead chat.") - else to_chat(src, "Your key will be publicly visible again.") - /mob/dead/observer/verb/toggle_ghostsee() set name = "Toggle Ghost Vision" set desc = "Toggles your ability to see things only ghosts can see, like other ghosts" @@ -624,7 +585,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp updateghostsight() to_chat(usr, "You [(ghostvision?"now":"no longer")] have ghost vision.") - /mob/dead/observer/verb/toggle_darkness() set name = "Toggle Darkness" set category = "Ghost" diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm index 1a2998fbaac..7f63a8f1261 100644 --- a/code/modules/mob/dead/observer/say.dm +++ b/code/modules/mob/dead/observer/say.dm @@ -9,7 +9,6 @@ if (src.client) if(src.client.prefs.muted & MUTE_DEADCHAT) to_chat(src, "\red You cannot talk in deadchat (muted).") - return if (src.client.handle_spam_prevention(message,MUTE_DEADCHAT)) @@ -32,7 +31,6 @@ if(src.client) if(src.client.prefs.muted & MUTE_DEADCHAT) to_chat(src, "\red You cannot emote in deadchat (muted).") - return if(src.client.handle_spam_prevention(message, MUTE_DEADCHAT)) diff --git a/code/modules/mob/dead/observer/spells.dm b/code/modules/mob/dead/observer/spells.dm index ae504a90fd3..993f2b6e344 100644 --- a/code/modules/mob/dead/observer/spells.dm +++ b/code/modules/mob/dead/observer/spells.dm @@ -34,7 +34,6 @@ var/global/list/boo_phrases=list( if(H && H.client) to_chat(H, "[pick(boo_phrases)]") - // Flicker unblessed lights in range if(istype(A,/obj/machinery/light)) var/obj/machinery/light/L = A diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm index cc74d5e6ffd..8d03cdd969a 100644 --- a/code/modules/mob/emote.dm +++ b/code/modules/mob/emote.dm @@ -18,7 +18,6 @@ if(stat || !use_me && usr == src) to_chat(usr, "You are unable to emote.") - return var/muzzled = istype(src.wear_mask, /obj/item/clothing/mask/muzzle) @@ -87,18 +86,15 @@ if(client.prefs.muted & MUTE_DEADCHAT) to_chat(src, "\red You cannot send deadchat emotes (muted).") - return if(!(client.prefs.toggles & CHAT_DEAD)) to_chat(src, "\red You have deadchat muted.") - return if(!src.client.holder) if(!config.dsay_allowed) to_chat(src, "\red Deadchat is globally muted") - return @@ -124,6 +120,5 @@ if(check_rights(R_ADMIN|R_MOD, 0, M) && (M.client.prefs.toggles & CHAT_DEAD)) // Show the emote to admins/mods to_chat(M, message) - else if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_DEAD)) // Show the emote to regular ghosts with deadchat toggled on M.show_message(message, 2) diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index c222c73b33c..c3ca5a602c9 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -66,17 +66,13 @@ if(!language || !(language.flags & INNATE)) // INNATE is the flag for audible-emote-language, so we don't want to show an "x talks but you cannot hear them" message if it's set if(speaker == src) to_chat(src, "You cannot hear yourself speak!") - else to_chat(src, "[speaker_name][alt_name] talks but you cannot hear them.") - else if(language) to_chat(src, "[speaker_name][alt_name] [track][language.format_message(message, verb)]") - else to_chat(src, "[speaker_name][alt_name] [track][verb], \"[message]\"") - if (speech_sound && (get_dist(speaker, src) <= world.view && src.z == speaker.z)) var/turf/source = speaker? get_turf(speaker) : get_turf(src) src.playsound_local(source, speech_sound, sound_vol, 1) @@ -182,14 +178,11 @@ if(sdisabilities & DEAF || ear_deaf) if(prob(20)) to_chat(src, "You feel your headset vibrate but can hear nothing from it!") - else if(track) to_chat(src, "[part_a][track][part_b][formatted]
      ") - else to_chat(src, "[part_a][speaker_name][part_b][formatted]") - /mob/proc/hear_signlang(var/message, var/verb = "gestures", var/datum/language/language, var/mob/speaker = null) if(!client) return @@ -223,4 +216,3 @@ heard = "...You almost hear someone talking..." to_chat(src, heard) - diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm index 71d8e9ac211..09f8009be75 100644 --- a/code/modules/mob/holder.dm +++ b/code/modules/mob/holder.dm @@ -48,12 +48,9 @@ if(istype(M)) M.unEquip(src) to_chat(M, "[src] wriggles out of your grip!") - to_chat(src, "You wriggle out of [M]'s grip!") - else if(istype(src.loc,/obj/item)) to_chat(src, "You struggle free of [src.loc].") - src.forceMove(get_turf(src)) if(istype(M)) @@ -78,9 +75,7 @@ H.attack_hand(grabber) to_chat(grabber, "You scoop up \the [src].") - to_chat(src, "\The [grabber] scoops you up.") - grabber.status_flags |= PASSEMOTES return H diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index c35403c43a7..777eac07ec8 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -105,13 +105,11 @@ if(istype(player,/mob/dead) && follow) var/msg_dead = "[name], [speaker_mask] ([ghost_follow_link(speaker, ghost=player)]) [format_message(message, get_spoken_verb(message))]" to_chat(player, msg_dead) - continue else if(istype(player,/mob/dead) || ((src in player.languages) && check_special_condition(player))) to_chat(player, msg) - /datum/language/proc/check_special_condition(var/mob/other) return 1 diff --git a/code/modules/mob/living/autohiss.dm b/code/modules/mob/living/autohiss.dm index 17d8a061073..4506ce50cfb 100644 --- a/code/modules/mob/living/autohiss.dm +++ b/code/modules/mob/living/autohiss.dm @@ -26,18 +26,14 @@ switch(autohiss_mode) if(AUTOHISS_OFF) to_chat(src, "Auto-hiss is now OFF.") - if(AUTOHISS_BASIC) to_chat(src, "Auto-hiss is now BASIC.") - if(AUTOHISS_FULL) to_chat(src, "Auto-hiss is now FULL.") - else autohiss_mode = AUTOHISS_OFF to_chat(src, "Auto-hiss is now OFF.") - /datum/species var/list/autohiss_basic_map = null var/list/autohiss_extra_map = null diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index 21d006ee886..fdd86c790f9 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -86,7 +86,6 @@ // to_chat(world, "Loc temp: [loc_temp] - Body temp: [bodytemperature] - Fireloss: [getFireLoss()] - Fire protection: [heat_protection] - Location: [loc] - src: [src]") - // Aliens are now weak to fire. //After then, it reacts to the surrounding atmosphere based on your thermal protection diff --git a/code/modules/mob/living/carbon/alien/alien_defenses.dm b/code/modules/mob/living/carbon/alien/alien_defenses.dm index 225d4a8046b..397a14fc259 100644 --- a/code/modules/mob/living/carbon/alien/alien_defenses.dm +++ b/code/modules/mob/living/carbon/alien/alien_defenses.dm @@ -8,12 +8,10 @@ In all, this is a lot like the monkey code. /N /mob/living/carbon/alien/attack_alien(mob/living/carbon/alien/M as mob) if (!ticker) to_chat(M, "You cannot attack people before the game has started.") - return if (istype(loc, /turf) && istype(loc.loc, /area/start)) to_chat(M, "No attacking people at spawn, you jackass.") - return switch(M.a_intent) @@ -41,7 +39,6 @@ In all, this is a lot like the monkey code. /N updatehealth() else to_chat(M, "[name] is too injured for that.") - return diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index a72e93b3db4..afae056b99f 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -9,15 +9,12 @@ Doesn't work on other aliens/AI.*/ /mob/living/carbon/proc/powerc(X, Y)//Y is optional, checks for weed planting. X can be null. if(stat) to_chat(src, "You must be conscious to do this.") - return 0 else if(X && getPlasma() < X) to_chat(src, "Not enough plasma stored.") - return 0 else if(Y && (!isturf(src.loc) || istype(src.loc, /turf/space))) to_chat(src, "You can't place that here!") - return 0 else return 1 @@ -28,7 +25,6 @@ Doesn't work on other aliens/AI.*/ if(locate(/obj/structure/alien/weeds/node) in get_turf(src)) to_chat(src, "There's already a weed node here.") - return if(powerc(50,1)) @@ -49,9 +45,7 @@ Doesn't work on other aliens/AI.*/ if(msg) log_say("Alien Whisper: [key_name(src)]->[key_name(M)]: [msg]") to_chat(M, "You hear a strange, alien voice in your head...[msg]") - to_chat(src, "You said: [msg] to [M]") - for(var/mob/dead/observer/G in player_list) G.show_message("Alien message from [src] ([ghost_follow_link(src, ghost=G)]) to [M] ([ghost_follow_link(M, ghost=G)]): [msg]") return @@ -70,12 +64,9 @@ Doesn't work on other aliens/AI.*/ M.adjustPlasma(amount) adjustPlasma(-amount) to_chat(M, "[src] has transfered [amount] plasma to you.") - to_chat(src, {"You have trasferred [amount] plasma to [M]"}) - else to_chat(src, "You need to be closer.") - return @@ -91,7 +82,6 @@ Doesn't work on other aliens/AI.*/ var/obj/I = O if(I.unacidable) //So the aliens don't destroy energy fields/singularies/other aliens/etc with their acid. to_chat(src, "You cannot dissolve this object.") - return // TURF CHECK else if(istype(O, /turf/simulated)) @@ -99,12 +89,10 @@ Doesn't work on other aliens/AI.*/ // R WALL if(istype(T, /turf/simulated/wall/r_wall)) to_chat(src, "You cannot dissolve this object.") - return // R FLOOR if(istype(T, /turf/simulated/floor/engine)) to_chat(src, "You cannot dissolve this object.") - return else// Not a type we can acid. return @@ -114,7 +102,6 @@ Doesn't work on other aliens/AI.*/ visible_message("[src] vomits globs of vile stuff all over [O]. It begins to sizzle and melt under the bubbling mess of acid!") else to_chat(src, "Target is too far away.") - return /mob/living/carbon/alien/humanoid/proc/neurotoxin() // ok diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm index c93eb944df6..e45fa198006 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm @@ -35,12 +35,10 @@ if(src.has_brain_worms()) to_chat(src, "We cannot perform this ability at the present time!") - return if(no_queen) adjustPlasma(-500) to_chat(src, "You begin to evolve!") - for(var/mob/O in viewers(src, null)) O.show_message(text("[src] begins to twist and contort!"), 1) var/mob/living/carbon/alien/humanoid/queen/new_xeno = new(loc) @@ -49,5 +47,4 @@ qdel(src) else to_chat(src, "We already have an alive queen.") - return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm index 91411978d51..a5e72059ab8 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm @@ -51,7 +51,6 @@ leap_icon.icon_state = "leap_[leap_on_click ? "on":"off"]" if(message) to_chat(src, "You will now [leap_on_click ? "leap at":"slash at"] enemies!") - else return @@ -67,7 +66,6 @@ /mob/living/carbon/alien/humanoid/hunter/proc/leap_at(var/atom/A) if(pounce_cooldown) to_chat(src, "You are too fatigued to pounce right now!") - return if(leaping) //Leap while you leap, so you can leap while you leap @@ -75,7 +73,6 @@ if(!has_gravity(src) || !has_gravity(A)) to_chat(src, "It is unsafe to leap without gravity!") - //It's also extremely buggy visually, so it's balance+bugfix return if(lying) diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm index f5ddc992a0e..eb2ae210e71 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm @@ -77,7 +77,6 @@ if(powerc(250)) adjustToxLoss(-250) to_chat(src, "\green You begin to evolve!") - for(var/mob/O in viewers(src, null)) O.show_message(text("[src] begins to twist and contort!"), 1) var/mob/living/carbon/alien/humanoid/sentinel/praetorian/new_xeno = new(loc) diff --git a/code/modules/mob/living/carbon/alien/humanoid/emote.dm b/code/modules/mob/living/carbon/alien/humanoid/emote.dm index a5a09b9a378..caf3cc4e5ad 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/emote.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/emote.dm @@ -107,7 +107,6 @@ if("help") to_chat(src, "burp, flip, deathgasp, choke, collapse, dance, drool, gasp, shiver, gnarl, jump, moan, nod, roar, roll, scratch,\nscretch, shake, sign-#, sit, sulk, sway, tail, twitch, whimper") - if(!stat) if (act == "roar") playsound(src.loc, 'sound/voice/hiss5.ogg', 40, 1, 1) diff --git a/code/modules/mob/living/carbon/alien/humanoid/empress.dm b/code/modules/mob/living/carbon/alien/humanoid/empress.dm index aafb05c6640..d4716aafccb 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/empress.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/empress.dm @@ -83,7 +83,6 @@ if(locate(/obj/structure/alien/egg) in get_turf(src)) to_chat(src, "There's already an egg here.") - return if(powerc(250,1))//Can't plant eggs on spess tiles. That's silly. diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index 736d5a1da09..c50e4603e41 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -114,7 +114,6 @@ /mob/living/carbon/alien/humanoid/attack_slime(mob/living/carbon/slime/M as mob) if (!ticker) to_chat(M, "You cannot attack people before the game has started.") - return if(M.Victim) return // can't attack while eating! @@ -186,12 +185,10 @@ /mob/living/carbon/alien/humanoid/attack_hand(mob/living/carbon/human/M as mob) if (!ticker) to_chat(M, "You cannot attack people before the game has started.") - return if (istype(loc, /turf) && istype(loc.loc, /area/start)) to_chat(M, "No attacking people at spawn, you jackass.") - return if(..()) //to allow surgery to return properly. @@ -256,12 +253,10 @@ In all, this is a lot like the monkey code. /N /mob/living/carbon/alien/humanoid/attack_alien(mob/living/carbon/alien/humanoid/M as mob) if (!ticker) to_chat(M, "You cannot attack people before the game has started.") - return if (istype(loc, /turf) && istype(loc.loc, /area/start)) to_chat(M, "No attacking people at spawn, you jackass.") - return ..() @@ -288,7 +283,6 @@ In all, this is a lot like the monkey code. /N updatehealth() else to_chat(M, "[name] is too injured for that.") - return @@ -311,7 +305,6 @@ In all, this is a lot like the monkey code. /N updatehealth() else to_chat(L, "[name] is too injured for that.") - return diff --git a/code/modules/mob/living/carbon/alien/humanoid/life.dm b/code/modules/mob/living/carbon/alien/humanoid/life.dm index 6ccce6f2f66..b41d5a9705d 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/life.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/life.dm @@ -18,7 +18,6 @@ if (disabilities & EPILEPSY) if ((prob(1) && paralysis < 10)) to_chat(src, "You have a seizure!") - Paralyse(10) if (disabilities & COUGHING) if ((prob(5) && paralysis <= 1)) diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm index 634bbf95117..5b2e19f011d 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm @@ -64,7 +64,6 @@ set category = "Alien" if(locate(/obj/structure/alien/egg) in get_turf(src)) to_chat(src, "There's already an egg here.") - return if(powerc(75,1))//Can't plant eggs on spess tiles. That's silly. @@ -113,7 +112,6 @@ if(no_queen) adjustToxLoss(-1000) to_chat(src, "You begin to evolve!") - for(var/mob/O in viewers(src, null)) O.show_message(text("[src] begins to twist and contort!"), 1) var/mob/living/carbon/alien/humanoid/empress/new_xeno = new(loc) @@ -125,7 +123,6 @@ qdel(src) else to_chat(src, "We already have an alive empress.") - return */ \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/larva/emote.dm b/code/modules/mob/living/carbon/alien/larva/emote.dm index c956e0b2489..b617a1fc883 100644 --- a/code/modules/mob/living/carbon/alien/larva/emote.dm +++ b/code/modules/mob/living/carbon/alien/larva/emote.dm @@ -16,7 +16,6 @@ if (src.client) if (client.prefs.muted & MUTE_IC) to_chat(src, "\red You cannot send IC messages (muted).") - return if (src.client.handle_spam_prevention(message,MUTE_IC)) return @@ -112,10 +111,8 @@ m_type = 2 if("help") to_chat(src, "burp, choke, collapse, dance, drool, gasp, shiver, gnarl, jump, moan, nod, roll, scratch,\nscretch, shake, sign-#, sulk, sway, tail, twitch, whimper") - else to_chat(src, text("Invalid Emote: []", act)) - if ((message && src.stat == 0)) log_emote("[name]/[key] : [message]") if (m_type & 1) diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index f12989c83e0..a513ab76a90 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -39,7 +39,6 @@ if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations)) if(prob(70)) to_chat(src, "\red You fail to push [tmob]'s fat ass out of the way.") - now_pushing = 0 return if(!(tmob.status_flags & CANPUSH)) @@ -126,7 +125,6 @@ /mob/living/carbon/alien/larva/attack_slime(mob/living/carbon/slime/M as mob) if (!ticker) to_chat(M, "You cannot attack people before the game has started.") - return if(M.Victim) @@ -152,12 +150,10 @@ /mob/living/carbon/alien/larva/attack_hand(mob/living/carbon/human/M as mob) if (!ticker) to_chat(M, "You cannot attack people before the game has started.") - return if (istype(loc, /turf) && istype(loc.loc, /area/start)) to_chat(M, "No attacking people at spawn, you jackass.") - return ..() @@ -200,12 +196,10 @@ /mob/living/carbon/alien/larva/attack_alien(mob/living/carbon/alien/humanoid/M as mob) if (!ticker) to_chat(M, "You cannot attack people before the game has started.") - return if (istype(loc, /turf) && istype(loc.loc, /area/start)) to_chat(M, "No attacking people at spawn, you jackass.") - return ..() @@ -231,7 +225,6 @@ updatehealth() else to_chat(M, "[name] is too injured for that.") - return /mob/living/carbon/alien/larva/restrained() diff --git a/code/modules/mob/living/carbon/alien/larva/powers.dm b/code/modules/mob/living/carbon/alien/larva/powers.dm index a30f8ff9b2d..44351eb792a 100644 --- a/code/modules/mob/living/carbon/alien/larva/powers.dm +++ b/code/modules/mob/living/carbon/alien/larva/powers.dm @@ -10,20 +10,16 @@ if (layer != TURF_LAYER+0.2) layer = TURF_LAYER+0.2 to_chat(src, text("You are now hiding.")) - for(var/mob/O in oviewers(src, null)) if ((O.client && !( O.blinded ))) to_chat(O, text("[] scurries to the ground!", src)) - else layer = MOB_LAYER to_chat(src, text("\green You have stopped hiding.")) - for(var/mob/O in oviewers(src, null)) if ((O.client && !( O.blinded ))) to_chat(O, text("[] slowly peaks up from the ground...", src)) - /mob/living/carbon/alien/larva/verb/evolve() set name = "Evolve" set desc = "Evolve into a fully grown Alien." @@ -35,19 +31,13 @@ if(handcuffed || legcuffed) to_chat(src, "\red You cannot evolve when you are cuffed.") - if(amount_grown >= max_grown) //TODO ~Carn //green is impossible to read, so i made these blue and changed the formatting slightly to_chat(src, "\blue You are growing into a beautiful alien! It is time to choose a caste.") - to_chat(src, "\blue There are three to choose from:") - to_chat(src, "Hunters \blue are strong and agile, able to hunt away from the hive and rapidly move through ventilation shafts. Hunters generate plasma slowly and have low reserves.") - to_chat(src, "Sentinels \blue are tasked with protecting the hive and are deadly up close and at a range. They are not as physically imposing nor fast as the hunters.") - to_chat(src, "Drones \blue are the working class, offering the largest plasma storage and generation. They are the only caste which may evolve again, turning into the dreaded alien queen.") - var/alien_caste = alert(src, "Please choose which alien caste you shall belong to.",,"Hunter","Sentinel","Drone") var/mob/living/carbon/alien/humanoid/new_xeno @@ -67,5 +57,4 @@ return else to_chat(src, "You are not fully grown.") - return diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index a49f7c0a6ea..93bf633093f 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -34,7 +34,6 @@ if(breath.temperature > (T0C + 66) && !(RESIST_COLD in mutations)) if(prob(20)) to_chat(src, "You feel a searing heat in your lungs!") - fire_alert = max(fire_alert, 1) else fire_alert = 0 diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm index 860e5aed290..151ed93e3ef 100644 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm @@ -12,10 +12,8 @@ ..() if(stage < 4) to_chat(finder, "It's small and weak, barely the size of a fetus.") - else to_chat(finder, "It's grown quite large, and writhes slightly as you look at it.") - if(prob(10)) AttemptGrow(0) @@ -33,10 +31,8 @@ owner.emote("cough") if(prob(2)) to_chat(owner, "Your throat feels sore.") - if(prob(2)) to_chat(owner, "Mucous runs down the back of your throat.") - if(4) if(prob(2)) owner.emote("sneeze") @@ -44,17 +40,14 @@ owner.emote("cough") if(prob(4)) to_chat(owner, "Your muscles ache.") - if(prob(20)) owner.take_organ_damage(1) if(prob(4)) to_chat(owner, "Your stomach hurts.") - if(prob(20)) owner.adjustToxLoss(1) if(5) to_chat(owner, "You feel something tearing its way out of your stomach...") - owner.adjustToxLoss(10) /obj/item/organ/internal/body_egg/alien_embryo/egg_process() @@ -107,7 +100,6 @@ new_xeno.mind.special_role = "Alien" to_chat(new_xeno, sound('sound/voice/hiss5.ogg',0,0,0,100))//To get the player's attention - if(gib_on_success) owner.gib() else diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index fd04034f152..f0935c520ce 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -50,14 +50,11 @@ var/const/MAX_ACTIVE_TIME = 400 switch(stat) if(DEAD,UNCONSCIOUS) to_chat(user, "[src] is not moving.") - if(CONSCIOUS) to_chat(user, "[src] seems to be active!") - if (sterile) to_chat(user, "It looks like the proboscis has been removed.") - /obj/item/clothing/mask/facehugger/attackby(obj/item/O,mob/m, params) if(O.force) Die() diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index 106acb44814..6ad6a672b43 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -20,17 +20,14 @@ /obj/item/device/mmi/attackby(var/obj/item/O as obj, var/mob/user as mob, params) if(istype(O, /obj/item/organ/internal/brain/crystal )) to_chat(user, " This brain is too malformed to be able to use with the [src].") - return if(istype(O,/obj/item/organ/internal/brain) && !brainmob) //Time to stick a brain in it --NEO var/obj/item/organ/internal/brain/B = O if(!B.brainmob) to_chat(user, "You aren't sure where this brain came from, but you're pretty sure it's a useless brain.") - return if(held_brain) to_chat(user, "Somehow, this MMI still has a brain in it. Report this to the bug tracker.") - log_to_dd("[user] tried to stick a [O] into [src] in [get_area(src)], but the held brain variable wasn't cleared") return for(var/mob/V in viewers(src, null)) @@ -71,10 +68,8 @@ /obj/item/device/mmi/attack_self(mob/user as mob) if(!brainmob) to_chat(user, "You upend the MMI, but there's nothing in it.") - else to_chat(user, "You unlock and upend the MMI, spilling the brain onto the floor.") - dropbrain(get_turf(user)) icon = 'icons/obj/assemblies.dmi' icon_state = "mmi_empty" @@ -107,7 +102,6 @@ if(isnull(held_brain)) log_to_dd("[src] at [loc] attempted to drop brain without a contained brain in [get_area(src)].") to_chat(brainmob, "Your MMI did not contain a brain! We'll make a new one for you, but you'd best report this to the bugtracker!") - held_brain = new(dropspot) // Let's not ruin someone's round because of something dumb -- Crazylemon held_brain.dna = brainmob.dna.Clone() held_brain.name = "\the [brainmob.name]'s [initial(held_brain.name)]" @@ -145,11 +139,9 @@ if(brainmob.stat) to_chat(brainmob, "Can't do that while incapacitated or dead.") - radio.listening = radio.listening==1 ? 0 : 1 to_chat(brainmob, "Radio is [radio.listening==1 ? "now" : "no longer"] receiving broadcast.") - /obj/item/device/mmi/emp_act(severity) if(!brainmob) return diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm index 1dda87d0c46..5fbfd6c5012 100644 --- a/code/modules/mob/living/carbon/brain/brain_item.dm +++ b/code/modules/mob/living/carbon/brain/brain_item.dm @@ -49,18 +49,15 @@ H.mind.transfer_to(brainmob) to_chat(brainmob, "You feel slightly disoriented. That's normal when you're just a [initial(src.name)].") - callHook("debrain", list(brainmob)) /obj/item/organ/internal/brain/examine(mob/user) // -- TLE ..(user) if(brainmob && brainmob.client)//if thar be a brain inside... the brain. to_chat(user, "You can feel the small spark of life still left in this one.") - else to_chat(user, "This one seems particularly lifeless. Perhaps it will regain some of its luster later..") - /obj/item/organ/internal/brain/remove(var/mob/living/user,special = 0) name = "[dna.real_name]'s [initial(name)]" diff --git a/code/modules/mob/living/carbon/brain/emote.dm b/code/modules/mob/living/carbon/brain/emote.dm index 108ae12029b..fd2a4879c9d 100644 --- a/code/modules/mob/living/carbon/brain/emote.dm +++ b/code/modules/mob/living/carbon/brain/emote.dm @@ -15,17 +15,14 @@ if ("alarm") to_chat(src, "You sound an alarm.") - message = "\The [src] sounds an alarm." m_type = 2 if ("alert") to_chat(src, "You let out a distressed noise.") - message = "\The [src] lets out a distressed noise." m_type = 2 if ("notice") to_chat(src, "You play a loud tone.") - message = "\The [src] plays a loud tone." m_type = 2 if ("flash") @@ -36,22 +33,18 @@ m_type = 1 if ("whistle") to_chat(src, "You whistle.") - message = "\The [src] whistles." m_type = 2 if ("beep") to_chat(src, "You beep.") - message = "\The [src] beeps." m_type = 2 if ("boop") to_chat(src, "You boop.") - message = "\The [src] boops." m_type = 2 if ("help") to_chat(src, "alarm, alert, notice, flash,blink, whistle, beep, boop") - if(message && !stat) ..(act, m_type, message) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm index 507320b7ef6..857546732d7 100644 --- a/code/modules/mob/living/carbon/brain/life.dm +++ b/code/modules/mob/living/carbon/brain/life.dm @@ -6,11 +6,9 @@ updatehealth() if(!container) to_chat(src, "You feel weak.") - else to_chat(src, "STATUS: CRITICAL AMOUNTS OF RADIATION DETECTED.") - switch(radiation) if(0 to 49) radiation-- @@ -25,10 +23,8 @@ radiation -= 5 if(!container) to_chat(src, "You feel weak.") - else to_chat(src, "STATUS: DANGEROUS AMOUNTS OF RADIATION DETECTED.") - updatehealth() if(75 to 100) diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index d39da7e6c02..07251303a12 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -19,7 +19,6 @@ if(brainmob && !brainmob.key && searching == 0) //Start the process of searching for a new user. to_chat(user, "\blue You carefully locate the manual activation switch and start the positronic brain's boot process.") - icon_state = "posibrain-searching" ghost_volunteers.Cut() src.searching = 1 @@ -34,25 +33,20 @@ if(silenced) silenced = 0 to_chat(user, "You toggle the speaker to 'on', on the [src].") - desc = "A cube of shining metal, four inches to a side and covered in shallow grooves. The speaker switch is set to 'on'." if(brainmob && brainmob.key) to_chat(brainmob, "Your internal speaker has been toggled to 'on'.") - else silenced = 1 to_chat(user, "You toggle the speaker to 'off', on the [src].") - desc = "A cube of shining metal, four inches to a side and covered in shallow grooves. The speaker switch is set to 'off'." if(brainmob && brainmob.key) to_chat(brainmob, "Your internal speaker has been toggled to 'off'.") - /obj/item/device/mmi/posibrain/proc/request_player() for(var/mob/dead/observer/O in player_list) if(check_observer(O)) to_chat(O, "\A [src] has been activated. (Teleport | Sign Up)") - // if(ROLE_POSIBRAIN in O.client.prefs.be_special) The Guardian implementation looks cleaner // question(O.client) @@ -93,7 +87,6 @@ if(H.mind) H.mind.transfer_to(brainmob) to_chat(brainmob, "You feel slightly disoriented. That's normal when you're just a metal cube.") - icon_state = "posibrain-occupied" return @@ -103,11 +96,8 @@ src.name = "positronic brain ([src.brainmob.name])" to_chat(src.brainmob, "You are a positronic brain, brought into existence on [station_name()].") - to_chat(src.brainmob, "As a synthetic intelligence, you answer to all crewmembers, as well as the AI.") - to_chat(src.brainmob, "Remember, the purpose of your existence is to serve the crew and the station. Above all else, do no harm.") - src.brainmob.mind.assigned_role = "Positronic Brain" var/turf/T = get_turf_or_move(src.loc) @@ -134,31 +124,24 @@ /obj/item/device/mmi/posibrain/proc/volunteer(var/mob/dead/observer/O) if(!searching) to_chat(O, "Not looking for a ghost, yet.") - return if(!istype(O)) to_chat(O, "\red Error.") - return if(O in ghost_volunteers) to_chat(O, "\blue Removed from registration list.") - ghost_volunteers.Remove(O) return if(!check_observer(O)) to_chat(O, "\red You cannot be \a [src].") - return if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted) to_chat(O, "\red Upon using the antagHUD you forfeited the ability to join the round.") - return if(jobban_isbanned(O, "Cyborg") || jobban_isbanned(O,"nonhumandept")) to_chat(O, "\red You are job banned from this role.") - return to_chat(O., "\blue You've been added to the list of ghosts that may become this [src]. Click again to unvolunteer.") - ghost_volunteers.Add(O) @@ -180,7 +163,6 @@ msg += "*---------*" to_chat(user, msg) - /obj/item/device/mmi/posibrain/emp_act(severity) if(!src.brainmob) return diff --git a/code/modules/mob/living/carbon/brain/say.dm b/code/modules/mob/living/carbon/brain/say.dm index 324debd7394..03d6906b876 100644 --- a/code/modules/mob/living/carbon/brain/say.dm +++ b/code/modules/mob/living/carbon/brain/say.dm @@ -10,7 +10,6 @@ var/obj/item/device/mmi/posibrain/P = container if(P && P.silenced) to_chat(usr, "You cannot speak, as your internal speaker has been toggled to 'off'.") - return if(prob(emp_damage*4)) if(prob(10))//10% chane to drop the message entirely diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index fe363381b51..ac4bb584528 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -96,7 +96,6 @@ if(src.is_muzzled()) if(message) to_chat(src, "The muzzle prevents you from vomiting!") - return 0 if(stun) Stun(4) @@ -195,7 +194,6 @@ if(istype(item_in_hand,/obj/item/weapon/twohanded)) if(item_in_hand:wielded == 1) to_chat(usr, "Your other hand is too busy holding the [item_in_hand.name]") - return src.hand = !( src.hand ) if(hud_used.l_hand_hud_object && hud_used.r_hand_hud_object) @@ -263,10 +261,8 @@ if(staminaloss) if(staminaloss > 30) to_chat(src, "You're completely exhausted.") - else to_chat(src, "You feel fatigued.") - if((SKELETON in H.mutations) && (!H.w_uniform) && (!H.wear_suit)) H.play_xylophone() else @@ -329,18 +325,15 @@ switch(damage) if(1) to_chat(src, "Your eyes sting a little.") - if(prob(40)) //waiting on carbon organs E.damage += 1 if(2) to_chat(src, "Your eyes burn.") - E.damage += rand(2, 4) else to_chat(src, "Your eyes itch and burn severely!") - E.damage += rand(12, 16) if(E.damage > E.min_bruised_damage) @@ -350,18 +343,14 @@ if(E.damage > (E.min_bruised_damage + E.min_broken_damage) / 2) if(!(E.status & ORGAN_ROBOT)) to_chat(src, "Your eyes start to burn badly!") - else //snowflake conditions piss me off for the record to_chat(src, "The flash blinds you!") - else if(E.damage >= E.min_broken_damage) to_chat(src, "You can't see anything!") - else to_chat(src, "Your eyes are really starting to hurt. This can't be good for you!") - return 1 else if(damage == 0) // just enough protection @@ -369,7 +358,6 @@ to_chat(src, "Something bright flashes in the corner of your vision!") - /mob/living/carbon/proc/tintcheck() return 0 @@ -399,17 +387,14 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, if(stat) to_chat(src, "You must be conscious to do this!") - return if(lying) to_chat(src, "You can't vent crawl while you're stunned!") - return if(buckled_mob) to_chat(src, "You can't vent crawl with [buckled_mob] on you!") - return var/obj/machinery/atmospherics/unary/vent_found @@ -454,7 +439,6 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, if(failed) to_chat(src, "You can't crawl around in the ventilation ducts with items!") - return visible_message("[src] scrambles into the ventilation ducts!", "You climb into the ventilation system.") @@ -465,7 +449,6 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, to_chat(src, "This ventilation duct is not connected to anything!") - /mob/living/proc/add_ventcrawl(obj/machinery/atmospherics/starting_machine) if(!istype(starting_machine) || !starting_machine.returnPipenet()) return @@ -677,7 +660,6 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, no_mask = 1 if(no_mask) to_chat(usr, "[src] is not wearing a suitable mask or helmet!") - return if(do_mob(usr, src, POCKET_STRIP_DELAY)) @@ -692,7 +674,6 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, no_mask2 = 1 if(no_mask2) to_chat(usr, "[src] is not wearing a suitable mask or helmet!") - return internal = ITEM if(internals) @@ -820,7 +801,6 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, spawn (t) step(src, src.dir) stop_pulling() to_chat(src, "You slipped on the [description]!") - playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) if (stun) Stun(stun) @@ -852,23 +832,17 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, /mob/living/carbon/proc/selfFeed(var/obj/item/weapon/reagent_containers/food/toEat, fullness) if(istype(toEat, /obj/item/weapon/reagent_containers/food/pill)) to_chat(src, "You [toEat.apply_method] [toEat].") - else if (fullness <= 50) to_chat(src, "You hungrily chew out a piece of [toEat] and gobble it!") - else if (fullness > 50 && fullness <= 150) to_chat(src, "You hungrily begin to eat [toEat].") - else if (fullness > 150 && fullness <= 350) to_chat(src, "You take a bite of [toEat].") - else if (fullness > 350 && fullness <= 550) to_chat(src, "You unwillingly chew a bit of [toEat].") - else if (fullness > (550 * (1 + overeatduration / 2000))) // The more you eat - the more you can eat to_chat(src, "You cannot force any more of [toEat] to go down your throat.") - return 0 return 1 diff --git a/code/modules/mob/living/carbon/give.dm b/code/modules/mob/living/carbon/give.dm index e7828ea93f0..13e8fe153ea 100644 --- a/code/modules/mob/living/carbon/give.dm +++ b/code/modules/mob/living/carbon/give.dm @@ -5,18 +5,15 @@ if(!iscarbon(target)) //something is bypassing the give arguments, no clue what, adding a sanity check JIC to_chat(usr, "Wait a second... \the [target] HAS NO HANDS! AHH!")//cheesy messages ftw - return if(target.stat == 2 || usr.stat == 2|| target.client == null) return var/obj/item/I if(!usr.hand && usr.r_hand == null) to_chat(usr, " You don't have anything in your right hand to give to [target.name]") - return if(usr.hand && usr.l_hand == null) to_chat(usr, " You don't have anything in your left hand to give to [target.name]") - return if(usr.hand) I = usr.l_hand @@ -26,7 +23,6 @@ return if((I.flags & NODROP) || (I.flags & ABSTRACT)) to_chat(usr, "That's not exactly something you can give.") - return if(target.r_hand == null || target.l_hand == null) switch(alert(target,"[usr] wants to give you \a [I]?",,"Yes","No")) @@ -35,21 +31,15 @@ return if(!Adjacent(usr)) to_chat(usr, " You need to stay in reaching distance while giving an object.") - to_chat(target, " [usr.name] moved too far away.") - return if((usr.hand && usr.l_hand != I) || (!usr.hand && usr.r_hand != I)) to_chat(usr, " You need to keep the item in your active hand.") - to_chat(target, " [usr.name] seem to have given up on giving \the [I.name] to you.") - return if(target.r_hand != null && target.l_hand != null) to_chat(target, " Your hands are full.") - to_chat(usr, " Their hands are full.") - return else usr.drop_item() @@ -69,4 +59,3 @@ target.visible_message(" [usr.name] tried to hand [I.name] to [target.name] but [target.name] didn't want it.") else to_chat(usr, " [target.name]'s hands are full.") - diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 19d6d93cd5f..657d40983de 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -754,7 +754,6 @@ if (!left_hand_good && !right_hand_good) to_chat(usr, "You need at least one hand in good working order to snap your fingers.") - return message = "[src] snaps \his fingers." @@ -771,9 +770,7 @@ // playsound(src.loc, 'sound/effects/fart.ogg', 50, 1, -3) //Admins still vote no to fun if(locate(/obj/item/weapon/storage/bible) in get_turf(src)) to_chat(viewers(src), "[src] farts on the Bible!") - to_chat(viewers(src), "A mysterious force smites [src]!") - var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, src) s.start() @@ -815,7 +812,6 @@ emotelist += "\nSlime people specific emotes :- squish(es)-(none)/mob" to_chat(src, emotelist) - else to_chat(src, "\blue Unusable emote '[act]'. Say *help for a list.") @@ -823,7 +819,6 @@ - if(message) //Humans are special fucking snowflakes and have 735 lines of emotes, they get to handle their own emotes, not call the parent log_emote("[name]/[key] : [message]") diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 455fcbc2607..1eb906d5ec1 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -216,11 +216,9 @@ if(distance <= 1 && user.stat != 1) if(pulse == PULSE_NONE) to_chat(user, "[t_He] has no pulse[src.client ? "" : " and [t_his] soul has departed"]...") - else to_chat(user, "[t_He] has a pulse!") - msg += "" if(fire_stacks > 0) msg += "[t_He] [t_is] covered in something flammable.\n" @@ -488,7 +486,6 @@ to_chat(user, msg) - //Helper procedure. Called by /mob/living/carbon/human/examine() and /mob/living/carbon/human/Topic() to determine HUD access to security and medical records. /proc/hasHUD(mob/M as mob, hudtype) if(istype(M, /mob/living/carbon/human)) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 216beb2ca65..5d27605b13c 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -169,7 +169,6 @@ if(tmob.pinned.len || (M.pulling == tmob && (tmob.restrained() && !M.restrained()) && M.stat == CONSCIOUS)) if(!(world.time % 5)) //tmob is pinned to wall, or is restrained and pulled by a concious unrestrained human to_chat(src, "[tmob] is restrained, you cannot push past.") - now_pushing = 0 return 0 @@ -181,7 +180,6 @@ if(tmob.pulling == M && (M.restrained() && !tmob.restrained()) && tmob.stat == CONSCIOUS) if(!(world.time % 5)) to_chat(src, "[tmob] is restraining [M], you cannot push past.") - now_pushing = 0 return 0 @@ -208,7 +206,6 @@ if(ishuman(tmob) && (FAT in tmob.mutations)) if(prob(40) && !(FAT in src.mutations)) to_chat(src, "You fail to push [tmob]'s fat ass out of the way.") - now_pushing = 0 return @@ -759,7 +756,6 @@ heart_attack = 0 if(stat == CONSCIOUS) to_chat(src, "You feel your heart beating again!") - . = ..() @@ -776,7 +772,6 @@ var/slot = text2num(href_list["item"]) if(slot in check_obscured_slots()) to_chat(usr, "You can't reach that! Something is covering it.") - return if(href_list["pockets"]) @@ -789,12 +784,9 @@ if(pocket_item && !(pocket_item.flags&ABSTRACT)) if(pocket_item.flags & NODROP) to_chat(usr, "You try to empty [src]'s [pocket_side] pocket, it seems to be stuck!") - to_chat(usr, "You try to empty [src]'s [pocket_side] pocket.") - else if(place_item && place_item.mob_can_equip(src, pocket_id, 1) && !(place_item.flags&ABSTRACT)) to_chat(usr, "You try to place [place_item] into [src]'s [pocket_side] pocket.") - delay_denominator = 4 else return @@ -818,7 +810,6 @@ if(!thief_mode) to_chat(src, "You feel your [pocket_side] pocket being fumbled with!") - if(href_list["set_sensor"]) if(istype(w_uniform, /obj/item/clothing/under)) var/obj/item/clothing/under/U = w_uniform @@ -879,7 +870,6 @@ if(!modified) to_chat(usr, "\red Unable to locate a data core entry for this person.") - if (href_list["secrecord"]) if(hasHUD(usr,"security")) var/perpname = "wot" @@ -910,7 +900,6 @@ if(!read) to_chat(usr, "\red Unable to locate a data core entry for this person.") - if (href_list["secrecordComment"]) if(hasHUD(usr,"security")) var/perpname = "wot" @@ -933,18 +922,14 @@ var/counter = 1 while(R.fields[text("com_[]", counter)]) to_chat(usr, text("[]", R.fields[text("com_[]", counter)])) - counter++ if (counter == 1) to_chat(usr, "No comment found") - to_chat(usr, "\[Add comment\]") - if(!read) to_chat(usr, "\red Unable to locate a data core entry for this person.") - if (href_list["secrecordadd"]) if(hasHUD(usr,"security")) var/perpname = "wot" @@ -1015,7 +1000,6 @@ if(!modified) to_chat(usr, "\red Unable to locate a data core entry for this person.") - if (href_list["medrecord"]) if(hasHUD(usr,"medical")) var/perpname = "wot" @@ -1047,7 +1031,6 @@ if(!read) to_chat(usr, "\red Unable to locate a data core entry for this person.") - if (href_list["medrecordComment"]) if(hasHUD(usr,"medical")) var/perpname = "wot" @@ -1070,18 +1053,14 @@ var/counter = 1 while(R.fields[text("com_[]", counter)]) to_chat(usr, text("[]", R.fields[text("com_[]", counter)])) - counter++ if (counter == 1) to_chat(usr, "No comment found") - to_chat(usr, "\[Add comment\]") - if(!read) to_chat(usr, "\red Unable to locate a data core entry for this person.") - if (href_list["medrecordadd"]) if(hasHUD(usr,"medical")) var/perpname = "wot" @@ -1236,7 +1215,6 @@ fail_msg = "There is no exposed flesh or thin material [target_zone == "head" ? "on their head" : "on their body"] to inject into." to_chat(user, "[fail_msg]") - /mob/living/carbon/human/proc/check_obscured_slots() var/list/obscured = list() @@ -1335,22 +1313,18 @@ germs++ if (germs == 100) to_chat(world, "Reached stage 1 in [ticks] ticks") - if (germs > 100) if (prob(10)) damage++ germs++ if (germs == 1000) to_chat(world, "Reached stage 2 in [ticks] ticks") - if (germs > 1000) damage++ germs++ if (germs == 2500) to_chat(world, "Reached stage 3 in [ticks] ticks") - to_chat(world, "Mob took [tdamage] tox damage") - */ //returns 1 if made bloody, returns 0 otherwise @@ -1409,7 +1383,6 @@ msg ="[O] in your [organ.name] twists painfully as you move." to_chat(src, msg) - organ.take_damage(rand(1,3), 0, 0) if(!(organ.status & ORGAN_ROBOT)) //There is no blood in protheses. organ.status |= ORGAN_BLEEDING @@ -1435,24 +1408,19 @@ if(src.pulse) to_chat(usr, "\blue [self ? "You have a" : "[src] has a"] pulse! Counting...") - else to_chat(usr, "\red [src] has no pulse!")//it is REALLY UNLIKELY that a dead person would check his own pulse - return to_chat(usr, "Don't move until counting is finished.") - var/time = world.time sleep(60) if(usr.l_move_time >= time) //checks if our mob has moved during the sleep() to_chat(usr, "You moved while counting. Try again.") - else to_chat(usr, "\blue [self ? "Your" : "[src]'s"] pulse is [src.get_pulse(GETPULSE_HAND)].") - /mob/living/carbon/human/proc/set_species(var/new_species, var/default_colour, var/delay_icon_update = 0) var/datum/species/oldspecies = species @@ -1560,13 +1528,11 @@ if (src.gloves) to_chat(src, "Your [src.gloves] are getting in the way.") - return var/turf/simulated/T = src.loc if (!istype(T)) //to prevent doodling out of mechs and lockers to_chat(src, "You cannot reach the floor.") - return var/direction = input(src,"Which way?","Tile selection") as anything in list("Here","North","South","East","West") @@ -1574,7 +1540,6 @@ T = get_step(T,text2dir(direction)) if (!istype(T)) to_chat(src, "You cannot doodle there.") - return var/num_doodles = 0 @@ -1582,7 +1547,6 @@ num_doodles++ if (num_doodles > 4) to_chat(src, "There is no space to write on!") - return var/max_length = bloody_hands * 30 //tweeter style @@ -1597,7 +1561,6 @@ message += "-" to_chat(src, "You ran out of blood to write with!") - var/obj/effect/decal/cleanable/blood/writing/W = new(T) W.message = message W.add_fingerprint(src) @@ -1610,7 +1573,6 @@ if(incapacitated()) to_chat(src, "You cannot change your monitor or optical display in your current state.") - return if(species.flags & ALL_RPARTS) //If they can have a fully cybernetic body... @@ -1649,7 +1611,6 @@ if(stat || paralysis || stunned || weakened || lying || restrained() || buckled) to_chat(src, "You cannot leap in your current state.") - return var/list/choices = list() @@ -1669,7 +1630,6 @@ if(stat || paralysis || stunned || weakened || lying || restrained() || buckled) to_chat(src, "You cannot leap in your current state.") - return last_special = world.time + 75 @@ -1685,7 +1645,6 @@ if(!src.Adjacent(T)) to_chat(src, "\red You miss!") - return T.Weaken(5) @@ -1699,7 +1658,6 @@ if(l_hand) if(r_hand) to_chat(src, "\red You need to have one hand free to grab someone.") - return else use_hand = "right" @@ -1726,18 +1684,15 @@ if(stat || paralysis || stunned || weakened || lying) to_chat(src, "\red You cannot do that in your current state.") - return var/obj/item/weapon/grab/G = locate() in src if(!G || !istype(G)) to_chat(src, "\red You are not grabbing anyone.") - return if(G.state < GRAB_AGGRESSIVE) to_chat(src, "\red You must have an aggressive grab to gut your prey!") - return last_special = world.time + 50 @@ -1843,7 +1798,6 @@ if(prob(current_size * 5) && hand.w_class >= ((11-current_size)/2) && unEquip(hand)) step_towards(hand, src) to_chat(src, "\The [S] pulls \the [hand] from your grip!") - apply_effect(current_size * 3, IRRADIATE) if(mob_negates_gravity()) return @@ -1897,7 +1851,6 @@ /mob/living/carbon/human/selfFeed(var/obj/item/weapon/reagent_containers/food/toEat, fullness) if(!check_has_mouth()) to_chat(src, "Where do you intend to put \the [toEat]? You don't have a mouth!") - return 0 return ..() @@ -1905,7 +1858,6 @@ if(!check_has_mouth()) if(!((istype(toEat, /obj/item/weapon/reagent_containers/food/drinks) && (get_species() == "Machine")))) to_chat(user, "Where do you intend to put \the [toEat]? \The [src] doesn't have a mouth!") - return 0 return ..() @@ -1913,14 +1865,11 @@ if(!check_has_mouth()) if(!get_species() == "Machine") to_chat(src, "Where do you intend to put \the [src]? You don't have a mouth!") - return 0 else to_chat(src, "You pour a bit of liquid from [toDrink] into your connection port.") - else to_chat(src, "You swallow a gulp of [toDrink].") - return 1 /mob/living/carbon/human/can_track(mob/living/user) diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index e24858cf552..25be2232432 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -1,12 +1,10 @@ /mob/living/carbon/human/attack_hand(mob/living/carbon/human/M as mob) if (istype(loc, /turf) && istype(loc.loc, /area/start)) to_chat(M, "No attacking people at spawn, you jackass.") - return if(frozen) to_chat(M, "\red Do not touch Admin-Frozen people.") - return var/mob/living/carbon/human/H = M @@ -16,7 +14,6 @@ temp = H.organs_by_name["l_hand"] if(!temp || !temp.is_usable()) to_chat(H, "\red You can't use your hand.") - return ..() @@ -74,19 +71,15 @@ return 1 if(!H.check_has_mouth()) to_chat(H, "You don't have a mouth, you cannot perform CPR!") - return if(!check_has_mouth()) to_chat(H, "They don't have a mouth, you cannot perform CPR!") - return if((M.head && (M.head.flags & HEADCOVERSMOUTH)) || (M.wear_mask && (M.wear_mask.flags & MASKCOVERSMOUTH) && !M.wear_mask.mask_adjusted)) to_chat(M, "Remove your mask!") - return 0 if((head && (head.flags & HEADCOVERSMOUTH)) || (wear_mask && (wear_mask.flags & MASKCOVERSMOUTH) && !wear_mask.mask_adjusted)) to_chat(M, "Remove his mask!") - return 0 M.visible_message("\The [M] is trying to perform CPR on \the [src]!", \ @@ -100,15 +93,12 @@ "You perform CPR on \the [src].") to_chat(src, "You feel a breath of fresh air enter your lungs. It feels good.") - to_chat(M, "Repeat at least every 7 seconds.") - add_logs(src, M, "CPRed") return 1 else to_chat(M, "You need to stay still while performing CPR!") - if(I_GRAB) if(attacker_style && attacker_style.grab_act(H, src)) return 1 @@ -127,23 +117,18 @@ if(M.mind && M.mind.vampire && (M.mind in ticker.mode.vampires) && !M.mind.vampire.draining) if((head && (head.flags & HEADCOVERSMOUTH)) || (wear_mask && (wear_mask.flags & MASKCOVERSMOUTH))) to_chat(M, "Remove their mask!") - return 0 if((M.head && (M.head.flags & HEADCOVERSMOUTH)) || (M.wear_mask && (M.wear_mask.flags & MASKCOVERSMOUTH))) to_chat(M, "Remove your mask!") - return 0 if(mind && mind.vampire && (mind in ticker.mode.vampires)) to_chat(M, "Your fangs fail to pierce [src.name]'s cold flesh") - return 0 if(SKELETON in mutations) to_chat(M, "There is no blood in a skeleton!") - return 0 if(issmall(src) && !ckey) //Monkeyized humans are okay, humanized monkeys are okey, monkeys are not. to_chat(M, "Blood from a monkey is useless!") - return 0 //we're good to suck the blood, blaah M.mind.vampire.handle_bloodsucking(src) diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index db8772c1334..c0e58942cfc 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -155,7 +155,6 @@ var/obj/item/organ/external/O = pick(candidates) O.mutate() to_chat(src, "Something is not right with your [O.name]...") - O.add_autopsy_data("Mutation", amount) return @@ -165,7 +164,6 @@ if(O.status & ORGAN_MUTATED) O.unmutate() to_chat(src, "Your [O.name] is shaped normally again.") - return @@ -176,7 +174,6 @@ to_chat(src, "Your [O.name] is shaped normally again.") - // Defined here solely to take species flags into account without having to recast at mob/living level. /mob/living/carbon/human/getOxyLoss() if(species.flags & NO_BREATHE) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 8ea0a6fc4e8..5f8e44f840a 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -177,14 +177,11 @@ emp_act return if(!(affecting.status & ORGAN_ROBOT)) to_chat(user, "\red That limb isn't robotic.") - return if(affecting.sabotaged) to_chat(user, "\red [src]'s [affecting.name] is already sabotaged!") - else to_chat(user, "\red You sneakily slide the card into the dataport on [src]'s [affecting.name] and short out the safeties.") - affecting.sabotaged = 1 return 1 @@ -202,7 +199,6 @@ emp_act src.loc.add_blood(src) --src.meatleft to_chat(user, "\red You hack off a chunk of meat from [src.name]") - if(!src.meatleft) src.attack_log += "\[[time_stamp()]\] Was chopped up into meat by [key_name(user)]" user.attack_log += "\[[time_stamp()]\] Chopped up [key_name(src)] into meat" @@ -217,7 +213,6 @@ emp_act var/obj/item/organ/external/affecting = get_organ(ran_zone(user.zone_sel.selecting)) if(!affecting || affecting.is_stump() || (affecting.status & ORGAN_DESTROYED)) to_chat(user, "They are missing that limb!") - return 1 var/hit_area = affecting.name diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 70effa20c9b..568de281cf1 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -8,7 +8,6 @@ var/obj/item/weapon/storage/S = H.get_inactive_hand() if(!I) to_chat(H, "You are not holding anything to equip.") - return if(istype(I, /obj/item/clothing/head/helmet/space/rig)) // If the item to be equipped is a rigid suit helmet @@ -16,7 +15,6 @@ if(C.rig_restrict_helmet) to_chat(src, "\red You must fasten the helmet to a hardsuit first. (Target the head and use on a hardsuit)")// Stop eva helms equipping. - return 0 if(H.equip_to_appropriate_slot(I)) @@ -40,7 +38,6 @@ to_chat(H, "\red You are unable to equip that.") - /mob/living/carbon/human/proc/equip_in_one_of_slots(obj/item/W, list/slots, del_on_fail = 1) for (var/slot in slots) if (equip_to_slot_if_possible(W, slots[slot], del_on_fail = 0)) @@ -306,7 +303,6 @@ uniform.attackby(W,src) else to_chat(src, "You are trying to equip this item to an unsupported inventory slot. Report this to a coder!") - return /mob/living/carbon/human/put_in_hands(obj/item/W) @@ -421,7 +417,6 @@ if(!(I.flags & ONESIZEFITSALL)) if(!disable_warning) to_chat(src, "You're too fat to wear the [I].") - return 0 switch(slot) @@ -469,7 +464,6 @@ if(!w_uniform) if(!disable_warning) to_chat(src, "You need a jumpsuit before you can attach this [name].") - return 0 if(!(I.slot_flags & SLOT_BELT)) return @@ -514,7 +508,6 @@ if(!w_uniform) if(!disable_warning) to_chat(src, "You need a jumpsuit before you can attach this [name].") - return 0 if(!(I.slot_flags & SLOT_ID)) return 0 @@ -525,7 +518,6 @@ if(!w_uniform) if(!disable_warning) to_chat(src, "You need a jumpsuit before you can attach this [name].") - return 0 if(!(I.slot_flags & SLOT_PDA)) return 0 @@ -538,7 +530,6 @@ if(!w_uniform) if(!disable_warning) to_chat(src, "You need a jumpsuit before you can attach this [name].") - return 0 if(I.slot_flags & SLOT_DENYPOCKET) return @@ -552,7 +543,6 @@ if(!w_uniform) if(!disable_warning) to_chat(src, "You need a jumpsuit before you can attach this [name].") - return 0 if(I.slot_flags & SLOT_DENYPOCKET) return 0 @@ -567,17 +557,14 @@ if(!wear_suit) if(!disable_warning) to_chat(src, "You need a suit before you can attach this [name].") - return 0 if(!wear_suit.allowed) if(!disable_warning) to_chat(src, "You somehow have a suit with no defined allowed items for suit storage, stop that.") - return 0 if(I.w_class > 4) if(!disable_warning) to_chat(src, "The [name] is too big to attach.") - return 0 if(istype(I, /obj/item/device/pda) || istype(I, /obj/item/weapon/pen) || is_type_in_list(I, wear_suit.allowed)) return 1 @@ -604,13 +591,11 @@ if(!w_uniform) if(!disable_warning) to_chat(src, "You need a jumpsuit before you can attach this [name].") - return 0 var/obj/item/clothing/under/uniform = w_uniform if(uniform.accessories.len && !uniform.can_attach_accessory(src)) if(!disable_warning) to_chat(src, "You already have an accessory of this type attached to your [uniform].") - return 0 if(!(I.slot_flags & SLOT_TIE)) return 0 diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 7db1d26a8fc..c2ec65368a4 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -188,7 +188,6 @@ reagents.add_reagent("radium", rads/10) if( prob(10) ) to_chat(src, "You feel relaxed.") - return if (radiation > 100) @@ -197,7 +196,6 @@ Weaken(10) if(!lying) to_chat(src, "You feel weak.") - emote("collapse") if (radiation < 0) @@ -232,7 +230,6 @@ Weaken(3) if(!lying) to_chat(src, "You feel weak.") - emote("collapse") updatehealth() @@ -242,7 +239,6 @@ damage = 3 if(prob(1)) to_chat(src, "You mutate!") - randmutb(src) domutcheck(src,null) emote("gasp") @@ -254,7 +250,6 @@ damage = 5 if(prob(1)) to_chat(src, "You mutate!") - randmutb(src) domutcheck(src,null) emote("gasp") @@ -399,7 +394,6 @@ var/loc_temp = get_temperature(environment) // to_chat(world, "Loc temp: [loc_temp] - Body temp: [bodytemperature] - Fireloss: [getFireLoss()] - Thermal protection: [get_thermal_protection()] - Fire protection: [thermal_protection + add_fire_protection(loc_temp)] - Heat capacity: [environment_heat_capacity] - Location: [loc] - src: [src]") - //Body temperature is adjusted in two steps. Firstly your body tries to stabilize itself a bit. if(stat != 2) stabilize_temperature_from_calories() @@ -705,7 +699,6 @@ if(FAT in mutations) if(overeatduration < 100) to_chat(src, "You feel fit again!") - mutations.Remove(FAT) update_mutantrace(0) update_mutations(0) @@ -714,7 +707,6 @@ else if(overeatduration > 500) to_chat(src, "You suddenly feel blubbery!") - mutations.Add(FAT) update_mutantrace(0) update_mutations(0) @@ -897,19 +889,16 @@ if(remoteview_target.stat != CONSCIOUS) to_chat(src, "Your psy-connection grows too faint to maintain!") - isRemoteObserve = 0 if(PSY_RESIST in remoteview_target.mutations) to_chat(src, "Your mind is shut out!") - isRemoteObserve = 0 // Not on the station or mining? var/turf/temp_turf = get_turf(remoteview_target) if(!temp_turf in config.contact_levels) to_chat(src, "Your psy-connection grows too faint to maintain!") - isRemoteObserve = 0 if(remote_view) @@ -982,7 +971,6 @@ if(shock_stage == 10) to_chat(src, ""+pick("It hurts so much!", "You really need some painkillers..", "Dear god, the pain!")) - if(shock_stage >= 30) if(shock_stage == 30) custom_emote(1,"is having trouble keeping their eyes open.") eye_blurry = max(2, eye_blurry) @@ -991,24 +979,20 @@ if(shock_stage == 40) to_chat(src, ""+pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!")) - if(shock_stage >=60) if(shock_stage == 60) custom_emote(1,"falls limp.") if (prob(2)) to_chat(src, ""+pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!")) - Weaken(20) if(shock_stage >= 80) if (prob(5)) to_chat(src, ""+pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!")) - Weaken(20) if(shock_stage >= 120) if (prob(2)) to_chat(src, ""+pick("You black out!", "You feel like you could die any moment now.", "You're about to lose consciousness.")) - Paralyse(5) if(shock_stage == 150) @@ -1099,7 +1083,6 @@ if(H.species && H.species.flags & NO_BREATHE) return //no puking if you can't smell! to_chat(H, "You smell something foul...") - H.fakevomit() /mob/living/carbon/human/proc/handle_heartbeat() @@ -1121,7 +1104,6 @@ heartbeat = 0 to_chat(src, sound('sound/effects/electheart.ogg',0,0,0,30))//Credit to GhostHack (www.ghosthack.de) for sound. - else heartbeat++ return @@ -1140,10 +1122,8 @@ heartbeat = 0 if(H.status & ORGAN_ASSISTED) to_chat(src, sound('sound/effects/pacemakebeat.ogg',0,0,0,50)) - else to_chat(src, sound('sound/effects/singlebeat.ogg',0,0,0,50)) - else heartbeat++ diff --git a/code/modules/mob/living/carbon/human/login.dm b/code/modules/mob/living/carbon/human/login.dm index 8d744a9728e..c9c23b31857 100644 --- a/code/modules/mob/living/carbon/human/login.dm +++ b/code/modules/mob/living/carbon/human/login.dm @@ -3,7 +3,6 @@ if(species && species.ventcrawler) to_chat(src, "You can ventcrawl! Use alt+click on vents to quickly travel about the station.") - update_pipe_vision() update_hud() return diff --git a/code/modules/mob/living/carbon/human/species/apollo.dm b/code/modules/mob/living/carbon/human/species/apollo.dm index 7c2302a356a..a7735a00db9 100644 --- a/code/modules/mob/living/carbon/human/species/apollo.dm +++ b/code/modules/mob/living/carbon/human/species/apollo.dm @@ -51,10 +51,8 @@ for(var/mob/living/carbon/C in living_mob_list) if(C.get_int_organ(/obj/item/organ/internal/wryn/hivenode)) to_chat(C, "Your antennae tingle as you are overcome with pain...") - to_chat(C, "It feels like part of you has died.") - /datum/species/wryn/handle_attack_hand(var/mob/living/carbon/human/H, var/mob/living/carbon/human/M) if(M.a_intent == I_HARM) if(H.handcuffed) @@ -64,7 +62,6 @@ M.visible_message("[M] begins to violently pull off [H]'s antennae.") to_chat(H, "[M] grips your antennae and starts violently pulling!") - do_after(H, 250, target = src) if(p_loc == M.loc && p_loc_m == H.loc) var/obj/item/organ/internal/wryn/hivenode/node = new /obj/item/organ/internal/wryn/hivenode @@ -72,11 +69,8 @@ node.remove(H) node.loc = M.loc to_chat(M, "You hear a loud crunch as you mercilessly pull off [H]'s antennae.") - to_chat(H, "You hear a loud crunch as your antennae is ripped off your head by [M].") - to_chat(H, "It's so quiet...") - H.h_style = "Bald" H.update_hair() diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm index 5a56b6b508e..5bced02a651 100644 --- a/code/modules/mob/living/carbon/human/species/plasmaman.dm +++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm @@ -113,7 +113,6 @@ H.equip_or_collect(new helm(H), slot_head) H.equip_or_collect(new/obj/item/weapon/tank/plasma/plasmaman(H), tank_slot) // Bigger plasma tank from Raggy. to_chat(H, "You are now running on plasma internals from the [H.s_store] in your [tank_slot_name]. You must breathe plasma in order to survive, and are extremely flammable.") - H.internal = H.get_item_by_slot(tank_slot) if (H.internals) H.internals.icon_state = "internal1" @@ -193,12 +192,10 @@ if(breath.temperature < cold_level_1) if(prob(20)) to_chat(src, "\red You feel your face freezing and an icicle forming in your lungs!") - else if(breath.temperature > heat_level_1) if(prob(20)) to_chat(src, "\red You feel your face burning and a searing heat in your lungs!") - switch(breath.temperature) if(-INFINITY to cold_level_3) H.apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Cold") @@ -226,7 +223,6 @@ if(!istype(H.wear_suit, /obj/item/clothing/suit/space/eva/plasmaman) || !istype(H.head, /obj/item/clothing/head/helmet/space/eva/plasmaman)) to_chat(H, "Your body reacts with the atmosphere and bursts into flame!") - H.adjust_fire_stacks(0.5) H.IgniteMob() diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 1c7d2b258b2..f810be86382 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -289,14 +289,12 @@ if(breath.temperature < cold_level_1) if(prob(20)) to_chat(H, "\red You feel your face freezing and an icicle forming in your lungs!") - else if(breath.temperature > heat_level_1) if(prob(20)) to_chat(H, "\red You feel your face burning and a searing heat in your lungs!") - switch(breath.temperature) if(-INFINITY to cold_level_3) H.apply_damage(cold_env_multiplier*COLD_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Cold") diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 633df4a8b98..56566b71a92 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -276,7 +276,6 @@ else H.equip_or_collect(new /obj/item/weapon/tank/emergency_oxygen/vox(H), slot_l_hand) to_chat(H, "You are now running on nitrogen internals from the [H.l_hand] in your hand. Your species finds oxygen toxic, so you must breathe nitrogen only.") - H.internal = H.l_hand if (H.internals) H.internals.icon_state = "internal1" @@ -445,20 +444,17 @@ if(!istype(S)) if(!silent) to_chat(src, "You're not a slime person!") - return if(src in S.recolor_list) S.recolor_list -= src if(!silent) to_chat(src, "You adjust your internal chemistry to filter out pigments from things you consume.") - else S.recolor_list += src if(!silent) to_chat(src, "You adjust your internal chemistry to permit pigments in chemicals you consume to tint you.") - /mob/living/carbon/human/verb/toggle_recolor_verb() set category = "IC" set name = "Toggle Reagent Recoloring" @@ -478,12 +474,10 @@ if(stat || paralysis || stunned) to_chat(src, "You cannot regenerate missing limbs in your current state.") - return if(nutrition < SLIMEPERSON_MINHUNGER) to_chat(src, "You're too hungry to regenerate a limb!") - return var/list/missing_limbs = list() @@ -500,7 +494,6 @@ if(!missing_limbs.len) to_chat(src, "You're not missing any limbs!") - return var/limb_select = input(src, "Choose a limb to regrow", "Limb Regrowth") as null|anything in missing_limbs @@ -510,12 +503,10 @@ if(do_after(src, SLIMEPERSON_REGROWTHDELAY, needhand=0, target = src)) if(stat || paralysis || stunned) to_chat(src, "You cannot regenerate missing limbs in your current state.") - return if(nutrition < SLIMEPERSON_MINHUNGER) to_chat(src, "You're too hungry to regenerate a limb!") - return var/obj/item/organ/external/O = organs_by_name[chosen_limb] @@ -525,11 +516,9 @@ if(istype(O)) if(!O.is_stump()) to_chat(src, "Your limb has already been replaced in some way!") - return else to_chat(src, "You distribute the damaged tissue around your body, out of the way of your new pseudopod!") - var/obj/item/organ/external/doomedStump = O stored_brute = doomedStump.brute_dam stored_burn = doomedStump.burn_dam @@ -541,7 +530,6 @@ var/obj/item/organ/external/potential_parent = organs_by_name[initial(limb_path.parent_organ)] if(!istype(potential_parent) || potential_parent.is_stump()) to_chat(src, "You've lost the organ that you've been growing your new part on!") - return // No rayman for you // Grah this line will leave a "not used" warning, in spite of the fact that the new() proc WILL do the thing. // Bothersome. @@ -556,7 +544,6 @@ visible_message("[src] finishes regrowing their missing [new_limb]!", "You finish regrowing your [limb_select]") else to_chat(src, "You need to hold still in order to regrow a limb!") - return #undef SLIMEPERSON_HUNGERCOST diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index e62ea67602b..f37cd16a5a3 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -643,7 +643,6 @@ var/global/list/damage_icon_parts = list() standing.icon = 'icons/mob/uniform_fat.dmi' else to_chat(src, "\red You burst out of \the [w_uniform]!") - unEquip(w_uniform) return else @@ -859,7 +858,6 @@ var/global/list/damage_icon_parts = list() standing = image("icon" = 'icons/mob/suit_fat.dmi', "icon_state" = "[wear_suit.icon_state]") else to_chat(src, "\red You burst out of \the [wear_suit]!") - unEquip(wear_suit) return else diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index fc12a861daf..43794bed7b8 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -279,7 +279,6 @@ var/total_health = (health - staminaloss) if(total_health <= config.health_threshold_softcrit && !stat) to_chat(src, "You're too exhausted to keep going...") - Weaken(5) setStaminaLoss(health - 2) return diff --git a/code/modules/mob/living/carbon/slime/emote.dm b/code/modules/mob/living/carbon/slime/emote.dm index b63afe0b073..64838a1704d 100644 --- a/code/modules/mob/living/carbon/slime/emote.dm +++ b/code/modules/mob/living/carbon/slime/emote.dm @@ -14,7 +14,6 @@ if (src.client) if (client.prefs.muted & MUTE_IC) to_chat(src, "\red You cannot send IC messages (muted).") - return if (src.client.handle_spam_prevention(message,MUTE_IC)) return @@ -61,10 +60,8 @@ if ("help") //This is an exception to_chat(src, "Help for slime emotes. You can use these emotes with say \"*emote\":\n\nbounce, custom, jiggle, light, moan, shiver, sway, twitch, vibrate") - else to_chat(src, "\blue Unusable emote '[act]'. Say *help for a list.") - if ((message && src.stat == 0)) if (m_type & 1) for(var/mob/O in viewers(src, null)) diff --git a/code/modules/mob/living/carbon/slime/examine.dm b/code/modules/mob/living/carbon/slime/examine.dm index 9b1ff32b05f..7d2e2d5e62c 100644 --- a/code/modules/mob/living/carbon/slime/examine.dm +++ b/code/modules/mob/living/carbon/slime/examine.dm @@ -42,4 +42,3 @@ msg += "*---------*" to_chat(user, msg) - diff --git a/code/modules/mob/living/carbon/slime/powers.dm b/code/modules/mob/living/carbon/slime/powers.dm index 4c17c2f3f20..d0ced0684a3 100644 --- a/code/modules/mob/living/carbon/slime/powers.dm +++ b/code/modules/mob/living/carbon/slime/powers.dm @@ -7,7 +7,6 @@ if(stat) to_chat(src, "I must be conscious to do this...") - return var/list/choices = list() @@ -27,29 +26,22 @@ for(var/mob/living/carbon/slime/met in view()) if(met.Victim == M && met != src) to_chat(src, "The [met.name] is already feeding on this subject...") - return to_chat(src, "\blue I have latched onto the subject and begun feeding...") - to_chat(M, "\red The [src.name] has latched onto your head!") - Feedon(M) else to_chat(src, "This subject does not have a strong enough life energy...") - else to_chat(src, "This subject does not have an edible life energy...") - else to_chat(src, "I must not feed on my brothers...") - else to_chat(src, "This subject does not have an edible life energy...") - /mob/living/carbon/slime/proc/Feedon(var/mob/living/M) Victim = M src.loc = M.loc @@ -155,24 +147,20 @@ if(client) to_chat(src, "This subject does not have a strong enough life energy anymore...") - else M.canmove = 1 if(client) to_chat(src, "I have stopped feeding...") - else if(client) to_chat(src, "I have stopped feeding...") - Victim = null /mob/living/carbon/slime/proc/Feedstop() if(Victim) if(Victim.client) to_chat(Victim, "[src] has let go of your head!") - Victim = null /mob/living/carbon/slime/proc/UpdateFeed(var/mob/M) @@ -187,7 +175,6 @@ if(stat) to_chat(src, "I must be conscious to do this...") - return if(!is_adult) if(amount_grown >= 10) @@ -198,25 +185,21 @@ name = text("[colour] [is_adult ? "adult" : "baby"] slime ([number])") else to_chat(src, "I am not ready to evolve yet...") - else to_chat(src, "I have already evolved...") - /mob/living/carbon/slime/verb/Reproduce() set category = "Slime" set desc = "This will make you split into four Slimes." if(stat) to_chat(src, "I must be conscious to do this...") - return if(is_adult) if(amount_grown >= 10) if(stat) to_chat(src, "I must be conscious to do this...") - return var/list/babies = list() @@ -244,7 +227,5 @@ qdel(src) else to_chat(src, "I am not ready to reproduce yet...") - else to_chat(src, "I am not old enough to reproduce yet...") - diff --git a/code/modules/mob/living/carbon/slime/slime.dm b/code/modules/mob/living/carbon/slime/slime.dm index 223f924b63a..532f6a4aba0 100644 --- a/code/modules/mob/living/carbon/slime/slime.dm +++ b/code/modules/mob/living/carbon/slime/slime.dm @@ -233,7 +233,6 @@ /mob/living/carbon/slime/attack_slime(mob/living/carbon/slime/M as mob) if (!ticker) to_chat(M, "You cannot attack people before the game has started.") - return if (Victim) return // can't attack while eating! @@ -295,12 +294,10 @@ /mob/living/carbon/slime/attack_hand(mob/living/carbon/human/M as mob) if (!ticker) to_chat(M, "You cannot attack people before the game has started.") - return if (istype(loc, /turf) && istype(loc.loc, /area/start)) to_chat(M, "No attacking people at spawn, you jackass.") - return ..() @@ -375,7 +372,6 @@ return else to_chat(M, "\red Not enough charge! ") - return */ @@ -424,12 +420,10 @@ /mob/living/carbon/slime/attack_alien(mob/living/carbon/alien/humanoid/M as mob) if (!ticker) to_chat(M, "You cannot attack people before the game has started.") - return if (istype(loc, /turf) && istype(loc.loc, /area/start)) to_chat(M, "No attacking people at spawn, you jackass.") - return switch(M.a_intent) @@ -510,7 +504,6 @@ else Friends[user] = 1 to_chat(user, "You feed the slime the plasma. It chirps happily.") - var/obj/item/stack/sheet/mineral/plasma/S = W S.use(1) return @@ -518,7 +511,6 @@ attacked += 10 if(prob(25)) to_chat(user, "[W] passes right through [src]!") - return if(Discipline && prob(50)) // wow, buddy, why am I getting attacked?? Discipline = 0 @@ -603,5 +595,4 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75 if(istype(toEat, /obj/item/weapon/reagent_containers/food/drinks)) return 1 to_chat(user, "This creature does not seem to have a mouth!") - return 0 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/superheroes.dm b/code/modules/mob/living/carbon/superheroes.dm index b96fe011f6b..d8f741928fd 100644 --- a/code/modules/mob/living/carbon/superheroes.dm +++ b/code/modules/mob/living/carbon/superheroes.dm @@ -54,7 +54,6 @@ to_chat(H, desc) - /datum/superheroes/owlman name = "Owlman" class = "Superhero" @@ -151,86 +150,64 @@ for(var/mob/living/carbon/human/target in targets) if(ticker.mode.greyshirts.len >= 3) to_chat(usr, "You have already recruited the maximum number of henchmen.") - if(!in_range(usr, target)) to_chat(usr, "You need to be closer to enthrall [target].") - charge_counter = charge_max return if(!target.ckey) to_chat(usr, "The target has no mind.") - charge_counter = charge_max return if(target.stat) to_chat(usr, "The target must be conscious.") - charge_counter = charge_max return if(!ishuman(target)) to_chat(usr, "You can only recruit humans.") - charge_counter = charge_max return if(target.mind.assigned_role != "Civilian") to_chat(usr, "You can only recruit Civilians.") - if(recruiting) to_chat(usr, "You are already recruiting!") - charge_counter = charge_max return recruiting = 1 to_chat(usr, "This target is valid. You begin the recruiting process.") - to_chat(target, "[usr] focuses in concentration. Your head begins to ache.") - for(var/progress = 0, progress <= 3, progress++) switch(progress) if(1) to_chat(usr, "You begin by introducing yourself and explaining what you're about.") - usr.visible_message("[usr]'s introduces himself and explains his plans.") if(2) to_chat(usr, "You begin the recruitment of [target].") - usr.visible_message("[usr] leans over towards [target], whispering excitedly as he gives a speech.") to_chat(target, "You feel yourself agreeing with [usr], and a surge of loyalty begins building.") - target.Weaken(12) sleep(20) if(isloyal(target)) to_chat(usr, "They are enslaved by Nanotrasen. You feel their interest in your cause wane and disappear.") - usr.visible_message("[usr] stops talking for a moment, then moves back away from [target].") to_chat(target, "Your loyalty implant activates and a sharp pain reminds you of your loyalties to Nanotrasen.") - return if(3) to_chat(usr, "You begin filling out the application form with [target].") - usr.visible_message("[usr] pulls out a pen and paper and begins filling an application form with [target].") to_chat(target, "You are being convinced by [usr] to fill out an application form to become a henchman.")//Ow the edge - if(!do_mob(usr, target, 100)) //around 30 seconds total for enthralling, 45 for someone with a loyalty implant to_chat(usr, "The enrollment process has been interrupted - you have lost the attention of [target].") - to_chat(target, "You move away and are no longer under the charm of [usr]. The application form is null and void.") - recruiting = 0 return recruiting = 0 to_chat(usr, "You have recruited [target] as your henchman!") - to_chat(target, "You have decided to enroll as a henchman for [usr]. You are now part of the feared 'Greyshirts'.") - to_chat(target, "You must follow the orders of [usr], and help him succeed in his dastardly schemes.") - to_chat(target, "You may not harm other Greyshirt or [usr]. However, you do not need to obey other Greyshirts.") - ticker.mode.greyshirts += target.mind target.set_species("Human") target.h_style = "Bald" diff --git a/code/modules/mob/living/default_language.dm b/code/modules/mob/living/default_language.dm index 154b64611c9..f6c9c3abc0e 100644 --- a/code/modules/mob/living/default_language.dm +++ b/code/modules/mob/living/default_language.dm @@ -7,10 +7,8 @@ if(language) to_chat(src, "You will now speak [language] if you do not specify a language when speaking.") - else to_chat(src, "You will now speak whatever your standard default language is if you do not specify one when speaking.") - default_language = language // Silicons can't neccessarily speak everything in their languages list @@ -23,7 +21,5 @@ if(default_language) to_chat(src, "You are currently speaking [default_language] by default.") - else to_chat(src, "Your current default language is your species or mob type default.") - diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 69753f5694c..ae101b15c5d 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -68,7 +68,6 @@ updatehealth() to_chat(src, "You have given up life and succumbed to death.") - /mob/living/proc/InCritical() return (src.health < 0 && src.health > -95.0 && stat == UNCONSCIOUS) @@ -94,7 +93,6 @@ /mob/living/proc/burn_skin(burn_amount) if(istype(src, /mob/living/carbon/human)) // to_chat(world, "DEBUG: burn_skin(), mutations=[mutations]") - if (RESIST_HEAT in src.mutations) //fireproof return 0 var/mob/living/carbon/human/H = src //make this damage method divide the damage to be done among all the body parts, then burn each body part for that much damage. will have better effect then just randomly picking a body part @@ -127,7 +125,6 @@ temperature = desired // if(istype(src, /mob/living/carbon/human)) // to_chat(world, "[src] ~ [src.bodytemperature] ~ [temperature]") - return temperature @@ -421,14 +418,11 @@ if(config.allow_Metadata) if(client) to_chat(usr, "[src]'s Metainfo:
      [client.prefs.metadata]") - else to_chat(usr, "[src] does not have any stored infomation!") - else to_chat(usr, "OOC Metadata is not supported by this server!") - return /mob/living/Move(atom/newloc, direct) @@ -577,10 +571,8 @@ var/mob/living/captive_brain/H = src to_chat(H, "\red You begin doggedly resisting the parasite's control (this will take approximately sixty seconds).") - to_chat(B.host, "\red You feel the captive mind of [src] begin to resist your control.") - spawn(rand(350,450)+B.host.brainloss) if(!B || !B.controlling) @@ -588,10 +580,8 @@ B.host.adjustBrainLoss(rand(5,10)) to_chat(H, "\red With an immense exertion of will, you regain control of your body!") - to_chat(B.host, "\red You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you.") - B.detatch() verbs -= /mob/living/carbon/proc/release_control @@ -644,7 +634,6 @@ C.last_special = world.time + CLICK_CD_BREAKOUT to_chat(C, "\red You attempt to unbuckle yourself. (This will take around 2 minutes and you need to stay still)") - for(var/mob/O in viewers(L)) O.show_message("\red [usr] attempts to unbuckle themself!", 1) @@ -655,7 +644,6 @@ for(var/mob/O in viewers(C)) O.show_message("\red [usr] manages to unbuckle themself!", 1) to_chat(C, "\blue You successfully unbuckle yourself.") - C.buckled.user_unbuckle_mob(C,C) else @@ -699,7 +687,6 @@ displaytime = 5 to_chat(CM, "\red You attempt to remove \the [HC]. (This will take around [displaytime] [hulklien ? "seconds" : "minute[displaytime==1 ? "" : "s"]"] and you need to stand still)") - for(var/mob/O in viewers(CM)) O.show_message( "\red [usr] attempts to [hulklien ? "break" : "remove"] \the [HC]!", 1) spawn(0) @@ -712,7 +699,6 @@ to_chat(CM, "\blue You successfully [hulklien ? "break" : "remove"] \the [CM.handcuffed].") - if(hulklien) CM.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) qdel(CM.handcuffed) @@ -745,7 +731,6 @@ to_chat(CM, "\red You attempt to remove \the [HC]. (This will take around [displaytime] [hulklien ? "seconds" : "minute[displaytime==1 ? "" : "s"]"] and you need to stand still)") - for(var/mob/O in viewers(CM)) O.show_message( "\red [usr] attempts to [hulklien ? "break" : "remove"] \the [HC]!", 1) @@ -758,7 +743,6 @@ to_chat(CM, "\blue You successfully [hulklien ? "break" : "remove"] \the [CM.legcuffed].") - if(!hulklien) CM.unEquip(CM.legcuffed) @@ -797,7 +781,6 @@ /mob/living/proc/Exhaust() to_chat(src, "You're too exhausted to keep going...") - Weaken(5) /mob/living/proc/get_visible_name() @@ -842,7 +825,6 @@ /mob/living/stripPanelUnequip(obj/item/what, mob/who, where, var/silent = 0) if(what.flags & NODROP) to_chat(src, "You can't remove \the [what.name], it appears to be stuck!") - return if(!silent) who.visible_message("[src] tries to remove [who]'s [what.name].", \ @@ -861,12 +843,10 @@ what = src.get_active_hand() if(what && (what.flags & NODROP)) to_chat(src, "You can't put \the [what.name] on [who], it's stuck to your hand!") - return if(what) if(!what.mob_can_equip(who, where, 1)) to_chat(src, "\The [what.name] doesn't fit in that place!") - return if(!silent) visible_message("[src] tries to put [what] on [who].") diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 22a5fe7435e..b48aa36a64c 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -18,25 +18,19 @@ armor = max(0, armor - armour_penetration) if(penetrated_text) to_chat(src, "[penetrated_text]") - else to_chat(src, "Your armor was penetrated!") - if(armor >= 100) if(absorb_text) to_chat(src, "[absorb_text]") - else to_chat(src, "Your armor absorbs the blow!") - else if(armor > 0) if(soften_text) to_chat(src, "[soften_text]") - else to_chat(src, "Your armor softens the blow!") - return armor //if null is passed for def_zone, then this should return something appropriate for all zones (e.g. area effect damage) @@ -51,7 +45,6 @@ C.attack_self(src)//Should shut it off update_icons() to_chat(src, "\blue Your [C.name] was disrupted!") - Stun(2) //Armor @@ -249,7 +242,6 @@ for(var/obj/item/weapon/grab/G in src.grabbed_by) if(G.assailant == user) to_chat(user, "You already grabbed [src].") - return add_logs(src, user, "grabbed", addition="passively") @@ -257,7 +249,6 @@ var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(user, src) if(buckled) to_chat(user, "You cannot grab [src], \he is buckled in!") - if(!G) //the grab will delete itself in New if src is anchored return 0 user.put_in_active_hand(G) diff --git a/code/modules/mob/living/login.dm b/code/modules/mob/living/login.dm index cd32fd22204..a64126db27a 100644 --- a/code/modules/mob/living/login.dm +++ b/code/modules/mob/living/login.dm @@ -9,7 +9,6 @@ //Vents if(ventcrawler) to_chat(src, "You can ventcrawl! Use alt+click on vents to quickly travel about the station.") - //Should update regardless of if we can ventcrawl, since we can end up in pipes in other ways. update_pipe_vision() diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 6caf2fa042b..ef2cc344cdf 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -120,7 +120,6 @@ proc/get_radio_key_from_channel(var/channel) if(client) if(client.prefs.muted & MUTE_IC) to_chat(src, "\red You cannot speak in IC (Muted).") - return message = trim_strip_html_properly(message) @@ -162,7 +161,6 @@ proc/get_radio_key_from_channel(var/channel) if(is_muzzled()) to_chat(src, "You're muzzled and cannot speak!") - return message = trim_left(message) @@ -315,7 +313,6 @@ proc/get_radio_key_from_channel(var/channel) if(act == "help") return //except help, because help is handled individually to_chat(src, "\blue Unusable emote '[act]'. Say *help for a list.") - /mob/living/whisper(message as text) message = trim_strip_html_properly(message) @@ -341,7 +338,6 @@ proc/get_radio_key_from_channel(var/channel) if(client) if(client.prefs.muted & MUTE_IC) to_chat(src, "You cannot speak in IC (Muted).") - return if(stat) @@ -351,7 +347,6 @@ proc/get_radio_key_from_channel(var/channel) if(is_muzzled()) to_chat(src, "You're muzzled and cannot speak!") - return var/message_range = 1 diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index d25f9a767c9..b037cf1aa75 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -202,18 +202,12 @@ var/list/ai_verbs_default = list( /mob/living/silicon/ai/proc/on_mob_init() to_chat(src, "You are playing the station's AI. The AI cannot move, but can interact with many objects while viewing them (through cameras).") - to_chat(src, "To look at other parts of the station, click on yourself to get a camera menu.") - to_chat(src, "While observing through a camera, you can use most (networked) devices which you can see, such as computers, APCs, intercoms, doors, etc.") - to_chat(src, "To use something, simply click on it.") - to_chat(src, "Use say :b to speak to your cyborgs through binary. Use say :h to speak from an active holopad.") - to_chat(src, "For department channels, use the following say commands:") - var/radio_text = "" for(var/i = 1 to common_radio.channels.len) var/channel = common_radio.channels[i] @@ -224,12 +218,10 @@ var/list/ai_verbs_default = list( to_chat(src, radio_text) - if (!(ticker && ticker.mode && (mind in ticker.mode.malf_ai))) show_laws() to_chat(src, "These laws may be changed by other players, or by you being the traitor.") - job = "AI" /mob/living/silicon/ai/rename_character(oldname, newname) @@ -339,7 +331,6 @@ var/list/ai_verbs_default = list( else icon_state = "ai" //else // to_chat(usr, "You can only change your display once!") - //return @@ -368,7 +359,6 @@ var/list/ai_verbs_default = list( if(message_cooldown) to_chat(src, "Please allow one minute to pass between announcements.") - return var/input = input(usr, "Please write a message to announce to the station crew.", "A.I. Announcement") as message|null @@ -430,7 +420,6 @@ var/list/ai_verbs_default = list( to_chat(src, "[anchored ? "You are now anchored." : "You are now unanchored."]") - /mob/living/silicon/ai/update_canmove() return 0 @@ -512,7 +501,6 @@ var/list/ai_verbs_default = list( else to_chat(src, "Unable to locate the holopad.") - if(href_list["say_word"]) play_vox_word(href_list["say_word"], null, src) return @@ -523,7 +511,6 @@ var/list/ai_verbs_default = list( ai_actual_track(target) else to_chat(src, "Target is not on or near any active cameras on the station.") - return if (href_list["trackbot"]) @@ -532,7 +519,6 @@ var/list/ai_verbs_default = list( ai_actual_track(target) else to_chat(src, "Target is not on or near any active cameras on the station.") - return if (href_list["callbot"]) //Command a bot to move to a selected location. @@ -541,7 +527,6 @@ var/list/ai_verbs_default = list( return //True if there is no bot found, the bot is manually emagged, or the AI is carded with wireless off. waypoint_mode = 1 to_chat(src, "Set your waypoint by clicking on a valid location free of obstructions.") - return if (href_list["interface"]) //Remotely connect to a bot! @@ -558,7 +543,6 @@ var/list/ai_verbs_default = list( var/obj/mecha/M = locate(href_list["ai_take_control"]) if(controlled_mech) to_chat(src, "You are already loaded into an onboard computer!") - return if(M) M.transfer_ai(AI_MECH_HACK,src, usr) //Called om the mech itself. @@ -570,13 +554,11 @@ var/list/ai_verbs_default = list( A.cameraFollow = target to_chat(A, "Now tracking [target.name] on camera.") - if (usr.machine == null) usr.machine = usr while (src.cameraFollow == target) to_chat(usr, "Target is not on or near any active cameras on the station. We'll check again in 5 seconds (unless you use the cancel-camera verb).") - sleep(40) continue @@ -593,12 +575,10 @@ var/list/ai_verbs_default = list( /mob/living/silicon/ai/attack_alien(mob/living/carbon/alien/humanoid/M as mob) if (!ticker) to_chat(M, "You cannot attack people before the game has started.") - return if (istype(loc, /turf) && istype(loc.loc, /area/start)) to_chat(M, "No attacking people at spawn, you jackass.") - return switch(M.a_intent) @@ -651,7 +631,6 @@ var/list/ai_verbs_default = list( set desc = "Wirelessly control various automatic robots." if(stat == 2) to_chat(src, "Critical error. System offline.") - return if(check_unable(AI_CHECK_WIRELESS | AI_CHECK_RADIO)) @@ -689,7 +668,6 @@ var/list/ai_verbs_default = list( else to_chat(src, "Selected location is not visible.") - /mob/living/silicon/ai/proc/call_bot(var/turf/waypoint) if(!Bot) @@ -697,7 +675,6 @@ var/list/ai_verbs_default = list( if(Bot.calling_ai && Bot.calling_ai != src) //Prevents an override if another AI is controlling this bot. to_chat(src, "Interface error. Unit is already in use.") - return Bot.call_bot(src, waypoint) @@ -733,7 +710,6 @@ var/list/ai_verbs_default = list( if(usr.stat == 2) to_chat(usr, "You can't change your camera network because you are dead!") - return var/mob/living/silicon/ai/U = usr @@ -766,7 +742,6 @@ var/list/ai_verbs_default = list( U.eyeobj.setLoc(get_turf(C)) break to_chat(src, "\blue Switched to [network] camera network.") - //End of code by Mord_Sith @@ -782,7 +757,6 @@ var/list/ai_verbs_default = list( if(usr.stat == 2) to_chat(usr, "You cannot change your emotional status because you are dead!") - return if(check_unable()) @@ -859,7 +833,6 @@ var/list/ai_verbs_default = list( var/obj/machinery/power/apc/apc = src.loc if(!istype(apc)) to_chat(src, "\blue You are already in your Main Core.") - return apc.malfvacate() @@ -877,7 +850,6 @@ var/list/ai_verbs_default = list( if (!camera_light_on) to_chat(src, "Camera lights deactivated.") - for (var/obj/machinery/camera/C in lit_cameras) C.set_light(0) lit_cameras = list() @@ -888,7 +860,6 @@ var/list/ai_verbs_default = list( to_chat(src, "Camera lights activated.") - /mob/living/silicon/ai/proc/sensor_mode() set name = "Set Sensor Augmentation" set desc = "Augment visual feed with internal sensor overlays." @@ -905,7 +876,6 @@ var/list/ai_verbs_default = list( arrivalmsg = newmsg to_chat(usr, "The arrival message has been successfully changed.") - // Handled camera lighting, when toggled. // It will get the nearest camera from the eyeobj, lighting it. @@ -961,7 +931,6 @@ var/list/ai_verbs_default = list( return to_chat(src, "Accessing Subspace Transceiver control...") - if (src.aiRadio) src.aiRadio.interact(src) @@ -974,15 +943,12 @@ var/list/ai_verbs_default = list( var/obj/item/weapon/card/id/id = H.wear_id if(istype(id) && id.is_untrackable()) to_chat(src, "Unable to locate an airlock") - return if(H.digitalcamo) to_chat(src, "Unable to locate an airlock") - return if (!near_camera(target)) to_chat(src, "Target is not near any active cameras.") - return var/obj/machinery/door/airlock/tobeopened var/dist = -1 @@ -991,53 +957,42 @@ var/list/ai_verbs_default = list( if(dist < 0) dist = get_dist(D, target) // to_chat(world, dist) - tobeopened = D else if(dist > get_dist(D, target)) dist = get_dist(D, target) // to_chat(world, dist) - tobeopened = D // to_chat(world, "found [tobeopened.name] closer") - else // to_chat(world, "[D.name] not close enough | [get_dist(D, target)] | [dist]") - if(tobeopened) switch(alert(src, "Do you want to open \the [tobeopened] for [target]?","Doorknob_v2a.exe","Yes","No")) if("Yes") var/nhref = "src=\ref[tobeopened];aiEnable=7" tobeopened.Topic(nhref, params2list(nhref), tobeopened, 1) to_chat(src, "\blue You've opened \the [tobeopened] for [target].") - if("No") to_chat(src, "\red You deny the request.") - else to_chat(src, "\red You've failed to open an airlock for [target]") - return /mob/living/silicon/ai/proc/check_unable(var/flags = 0) if(stat == DEAD) to_chat(usr, "You are dead!") - return 1 if(lacks_power()) to_chat(usr, "Power systems failure!") - return 1 if((flags & AI_CHECK_WIRELESS) && src.control_disabled) to_chat(usr, "Wireless control is disabled!") - return 1 if((flags & AI_CHECK_RADIO) && src.aiRadio.disabledAi) to_chat(src, "System Error - Transceiver Disabled!") - return 1 return 0 @@ -1051,12 +1006,10 @@ var/list/ai_verbs_default = list( if(!mind) to_chat(user, "No intelligence patterns detected.")//No more magical carding of empty cores, AI RETURN TO BODY!!!11 - return if (mind.special_role == "malfunction") //AI MALF!! to_chat(user, "ERROR: Remote transfer interface disabled.")//Do ho ho ho~ - return new /obj/structure/AIcore/deactivated(loc)//Spawns a deactivated terminal at AI location. aiRestorePowerRoutine = 0//So the AI initially has power. @@ -1064,10 +1017,8 @@ var/list/ai_verbs_default = list( aiRadio.disabledAi = 1 //No talking on the built-in radio for you either! loc = card//Throw AI into the card. to_chat(src, "You have been downloaded to a mobile storage device. Remote device connection severed.") - to_chat(user, "Transfer successful: [name] ([rand(1000,9999)].exe) removed from host terminal and stored within local memory.") - // Pass lying down or getting up to our pet human, if we're in a rig. /mob/living/silicon/ai/lay_down() set name = "Rest" diff --git a/code/modules/mob/living/silicon/ai/examine.dm b/code/modules/mob/living/silicon/ai/examine.dm index d031aad02b0..d65e6e0d7d8 100644 --- a/code/modules/mob/living/silicon/ai/examine.dm +++ b/code/modules/mob/living/silicon/ai/examine.dm @@ -24,7 +24,6 @@ msg += "*---------*" to_chat(user, msg) - user.showLaws(src) diff --git a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm index 3967c329a73..b18c011bb23 100644 --- a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm +++ b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm @@ -117,7 +117,6 @@ var/datum/cameranet/cameranet = new() // to_chat(world, "X1: [x1] - Y1: [y1] - X2: [x2] - Y2: [y2]") - for(var/x = x1; x <= x2; x += CHUNK_SIZE) for(var/y = y1; y <= y2; y += CHUNK_SIZE) if(chunkGenerated(x, y, T.z)) diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index bbfb08c82d3..317aae2dd6b 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -102,7 +102,6 @@ src.eyeobj.loc = src.loc else to_chat(src, "ERROR: Eyeobj not found. Creating new eye...") - src.eyeobj = new(src.loc) src.eyeobj.ai = src src.eyeobj.name = "[src.name] (AI Eye)" // Give it a name @@ -117,4 +116,3 @@ return //won't work if dead acceleration = !acceleration to_chat(usr, "Camera acceleration has been toggled [acceleration ? "on" : "off"].") - diff --git a/code/modules/mob/living/silicon/ai/latejoin.dm b/code/modules/mob/living/silicon/ai/latejoin.dm index 512af50d6d6..585c484a73a 100644 --- a/code/modules/mob/living/silicon/ai/latejoin.dm +++ b/code/modules/mob/living/silicon/ai/latejoin.dm @@ -17,7 +17,6 @@ var/global/list/empty_playable_ai_cores = list() if(ticker && ticker.mode && ticker.mode.name == "AI malfunction") to_chat(usr, "You cannot use this verb in malfunction. If you need to leave, please adminhelp.") - return // Guard against misclicks, this isn't the sort of thing we want happening accidentally diff --git a/code/modules/mob/living/silicon/ai/laws.dm b/code/modules/mob/living/silicon/ai/laws.dm index e869eb7e654..74816aeeb89 100755 --- a/code/modules/mob/living/silicon/ai/laws.dm +++ b/code/modules/mob/living/silicon/ai/laws.dm @@ -12,7 +12,6 @@ who = src to_chat(who, "Obey these laws:") - src.laws_sanity_check() src.laws.show_laws(who) diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index b47a155e51e..dabaf2c4153 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -19,7 +19,6 @@ if(malfhack) if(malfhack.aidisabled) to_chat(src, "ERROR: APC access disabled, hack attempt canceled.") - malfhacking = 0 malfhack = null @@ -49,12 +48,10 @@ if(aiRestorePowerRoutine == 2) to_chat(src, "Alert cancelled. Power has been restored without our assistance.") - aiRestorePowerRoutine = 0 clear_fullscreen("blind") else if(aiRestorePowerRoutine == 3) to_chat(src, "Alert cancelled. Power has been restored.") - aiRestorePowerRoutine = 0 clear_fullscreen("blind") @@ -73,35 +70,28 @@ if(!aiRestorePowerRoutine) aiRestorePowerRoutine = 1 to_chat(src, "You have lost power!") - if(!is_special_character(src)) set_zeroth_law("") spawn(20) to_chat(src, "Backup battery online. Scanners, camera, and radio interface offline. Beginning fault-detection.") - sleep(50) my_area = get_area(src) T = get_turf(src) if(my_area && my_area.power_equip && !istype(T, /turf/space)) to_chat(src, "Alert cancelled. Power has been restored without our assistance.") - aiRestorePowerRoutine = 0 return to_chat(src, "Fault confirmed: missing external power. Shutting down main control system to save power.") - sleep(20) to_chat(src, "Emergency control system online. Verifying connection to power network.") - sleep(50) T = get_turf(src) if(istype(T, /turf/space)) to_chat(src, "Unable to verify! No power connection detected!") - aiRestorePowerRoutine = 2 return to_chat(src, "Connection verified. Searching for APC in power network.") - sleep(50) my_area = get_area(src) @@ -122,14 +112,12 @@ to_chat(src, "Unable to locate APC!") else to_chat(src, "Lost connection with the APC!") - aiRestorePowerRoutine = 2 return if(my_area.power_equip) if (!istype(T, /turf/space)) to_chat(src, "Alert cancelled. Power has been restored without our assistance.") - aiRestorePowerRoutine = 0 clear_fullscreen("blind") return @@ -143,16 +131,13 @@ to_chat(src, "Power port upload access confirmed. Loading control program into APC power port software.") if(4) to_chat(src, "Transfer complete. Forcing APC to execute program.") - sleep(50) to_chat(src, "Receiving control information from APC.") - sleep(2) //bring up APC dialog aiRestorePowerRoutine = 3 theAPC.attack_ai(src) to_chat(src, "Here are your current laws:") - src.show_laws() //WHY THE FUCK IS THIS HERE sleep(50) theAPC = null diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm index c82803adb11..d5315deaefb 100644 --- a/code/modules/mob/living/silicon/ai/say.dm +++ b/code/modules/mob/living/silicon/ai/say.dm @@ -31,7 +31,6 @@ var/const/VOX_PATH = "sound/vox_fem/" if(announcing_vox > world.time) to_chat(src, "Please wait [round((announcing_vox - world.time) / 10)] seconds.") - return var/message = input(src, "WARNING: Misuse of this verb can result in you being job banned. More help is available in 'Announcement Help'", "Announcement", last_announcement) as text|null @@ -60,7 +59,6 @@ var/const/VOX_PATH = "sound/vox_fem/" if(incorrect_words.len) to_chat(src, "These words are not available on the announcement system: [english_list(incorrect_words)].") - return announcing_vox = world.time + VOX_DELAY @@ -86,10 +84,8 @@ var/const/VOX_PATH = "sound/vox_fem/" var/turf/T = get_turf(M) if(T && T.z == z_level && !isdeaf(M)) to_chat(M, voice) - else to_chat(only_listener, voice) - return 1 return 0 @@ -99,6 +95,5 @@ var/const/VOX_PATH = "sound/vox_fem/" var/list/vox_files = flist(VOX_PATH) for(var/file in vox_files) // to_chat(src, "Downloading [file]") - var/sound/S = sound("[VOX_PATH][file]") src << browse_rsc(S) diff --git a/code/modules/mob/living/silicon/laws.dm b/code/modules/mob/living/silicon/laws.dm index 0e0f34dd290..27e431e1675 100644 --- a/code/modules/mob/living/silicon/laws.dm +++ b/code/modules/mob/living/silicon/laws.dm @@ -20,7 +20,6 @@ if(tracking_entities) to_chat(src, "Internal camera is currently being accessed.") - /mob/living/silicon/proc/add_ion_law(var/law) laws_sanity_check() laws.add_ion_law(law) @@ -77,7 +76,6 @@ /mob/living/silicon/proc/dostatelaws(var/method, var/prefix, var/datum/ai_laws/laws) if(stating_laws[prefix]) to_chat(src, "[method]: Already stating laws using this communication method.") - return stating_laws[prefix] = 1 @@ -91,7 +89,6 @@ if(!can_state) to_chat(src, "[method]: Unable to state laws. Communication method unavailable.") - stating_laws[prefix] = 0 /mob/living/silicon/proc/statelaw(var/law) diff --git a/code/modules/mob/living/silicon/pai/emote.dm b/code/modules/mob/living/silicon/pai/emote.dm index 79986a486ec..8328290ba80 100644 --- a/code/modules/mob/living/silicon/pai/emote.dm +++ b/code/modules/mob/living/silicon/pai/emote.dm @@ -3,5 +3,4 @@ if ("help") to_chat(src, "ping, beep, buzz.") - ..(act, m_type, message) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/pai/examine.dm b/code/modules/mob/living/silicon/pai/examine.dm index 26f8cafbf7e..814efb1899b 100644 --- a/code/modules/mob/living/silicon/pai/examine.dm +++ b/code/modules/mob/living/silicon/pai/examine.dm @@ -22,5 +22,4 @@ msg += "*---------*" to_chat(user, msg) - */ \ No newline at end of file diff --git a/code/modules/mob/living/silicon/pai/life.dm b/code/modules/mob/living/silicon/pai/life.dm index 029d07e37d2..ac8e20238d3 100644 --- a/code/modules/mob/living/silicon/pai/life.dm +++ b/code/modules/mob/living/silicon/pai/life.dm @@ -10,7 +10,6 @@ silence_time = null to_chat(src, "Communication circuit reinitialized. Speech and messaging functionality restored.") - if(cable) if(get_dist(src, cable) > 1) var/turf/T = get_turf_or_move(loc) diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index a6a183eee20..82cc717dab9 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -164,7 +164,6 @@ src.silence_time = world.timeofday + 120 * 10 // Silence for 2 minutes to_chat(src, "Communication circuit overload. Shutting down and reloading communication circuits - speech and messaging functionality will be unavailable until the reboot is complete.") - if(prob(20)) var/turf/T = get_turf_or_move(src.loc) for (var/mob/M in viewers(T)) @@ -176,7 +175,6 @@ src.master = null src.master_dna = null to_chat(src, "You feel unbound.") - if(2) var/command if(severity == 1) @@ -185,11 +183,9 @@ command = pick("Serve", "Kill", "Love", "Hate", "Disobey", "Devour", "Fool", "Enrage", "Entice", "Observe", "Judge", "Respect", "Disrespect", "Consume", "Educate", "Destroy", "Disgrace", "Amuse", "Entertain", "Ignite", "Glorify", "Memorialize", "Analyze") src.pai_law0 = "[command] your master." to_chat(src, "Pr1m3 d1r3c71v3 uPd473D.") - if(3) to_chat(src, "You feel an electric surge run through your circuitry and become acutely aware at how lucky you are that you can still feel at all.") - /mob/living/silicon/pai/ex_act(severity) ..() @@ -229,12 +225,10 @@ /mob/living/silicon/pai/attack_alien(mob/living/carbon/alien/humanoid/M as mob) if (!ticker) to_chat(M, "You cannot attack people before the game has started.") - return if (istype(src.loc, /turf) && istype(src.loc.loc, /area/start)) to_chat(M, "You cannot attack someone in the spawn area.") - return switch(M.a_intent) @@ -291,7 +285,6 @@ nanomanager.update_uis(src) to_chat(usr, "You reset your record-viewing software.") - /mob/living/silicon/pai/cancel_camera() set category = "pAI Commands" set name = "Cancel Camera View" @@ -311,7 +304,6 @@ if(usr.stat == 2) to_chat(usr, "You can't change your camera network because you are dead!") - return for (var/obj/machinery/camera/C in Cameras) @@ -323,7 +315,6 @@ src.network = input(usr, "Which network would you like to view?") as null|anything in cameralist to_chat(src, "\blue Switched to [src.network] camera network.") - //End of code by Mord_Sith */ @@ -351,12 +342,10 @@ if(src.loc != card) to_chat(src, "\red You are already in your mobile form!") - return if(world.time <= last_special) to_chat(src, "\red You must wait before folding your chassis out again!") - return last_special = world.time + 200 @@ -389,12 +378,10 @@ if(src.loc == card) to_chat(src, "\red You are already in your card form!") - return if(world.time <= last_special) to_chat(src, "\red You must wait before returning to your card form!") - return close_up() @@ -446,7 +433,6 @@ icon_state = resting ? "[chassis]_rest" : "[chassis]" to_chat(src, "You are now [resting ? "resting" : "getting up"]") - canmove = !resting //Overriding this will stop a number of headaches down the track. @@ -455,7 +441,6 @@ var/obj/item/stack/nanopaste/N = W if (stat == DEAD) to_chat(user, "\The [src] is beyond help, at this point.") - else if (getBruteLoss() || getFireLoss()) adjustBruteLoss(-15) adjustFireLoss(-15) @@ -466,7 +451,6 @@ else to_chat(user, "All [src.name]'s systems are nominal.") - return else if(W.force) visible_message("[user.name] attacks [src] with [W]!") @@ -529,7 +513,6 @@ return if(istype(AM,/obj/item)) to_chat(src, "You are far too small to pull anything!") - return /mob/living/silicon/pai/update_canmove() @@ -557,7 +540,6 @@ to_chat(user, msg) - /mob/living/silicon/pai/bullet_act(var/obj/item/projectile/Proj) ..(Proj) updatehealth() @@ -595,10 +577,8 @@ get_scooped(H) else to_chat(src, "You need to stay in reaching distance to be picked up.") - if("No") to_chat(src, "[H] decided not to pick you up.") - else if(Adjacent(H)) get_scooped(H) diff --git a/code/modules/mob/living/silicon/pai/personality.dm b/code/modules/mob/living/silicon/pai/personality.dm index f6f2e14f994..49b7e394d44 100644 --- a/code/modules/mob/living/silicon/pai/personality.dm +++ b/code/modules/mob/living/silicon/pai/personality.dm @@ -18,14 +18,10 @@ to_chat(F["name"], src.name) - to_chat(F["description"], src.description) - to_chat(F["role"], src.role) - to_chat(F["comments"], src.comments) - F["version"] << 1 return 1 diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm index b5c616b4319..980e1bb09ee 100644 --- a/code/modules/mob/living/silicon/pai/recruit.dm +++ b/code/modules/mob/living/silicon/pai/recruit.dm @@ -352,7 +352,6 @@ var/datum/paiController/paiController // Global handler for pAI candidates if(player_old_enough_antag(O.client,ROLE_PAI)) if(check_recruit(O)) to_chat(O, "\blue A pAI card is looking for personalities. (Teleport | Sign Up)") - //question(O.client) proc/check_recruit(var/mob/dead/observer/O) if(jobban_isbanned(O, "pAI") || jobban_isbanned(O,"nonhumandept")) diff --git a/code/modules/mob/living/silicon/pai/say.dm b/code/modules/mob/living/silicon/pai/say.dm index 6861110b920..2c7bc900d68 100644 --- a/code/modules/mob/living/silicon/pai/say.dm +++ b/code/modules/mob/living/silicon/pai/say.dm @@ -1,6 +1,5 @@ /mob/living/silicon/pai/say(var/msg) if(silence_time) to_chat(src, "Communication circuits remain uninitialized.") - else ..(msg) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index 21c69edf5f0..e85345db226 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -20,7 +20,6 @@ var/global/list/default_pai_software = list() if(pai_software_by_key[P.id]) var/datum/pai_software/O = pai_software_by_key[P.id] to_chat(world, "pAI software module [P.name] has the same key as [O.name]!") - r = 0 continue pai_software_by_key[P.id] = P diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm index cdebdc27d5c..9019a61b206 100644 --- a/code/modules/mob/living/silicon/pai/software_modules.dm +++ b/code/modules/mob/living/silicon/pai/software_modules.dm @@ -57,7 +57,6 @@ if(!M || !M.loc || count > 6) //For a runtime where M ends up in nullspace (similar to bluespace but less colourful) to_chat(src, "You are not being carried by anyone!") - return 0 M = M.loc count++ @@ -70,16 +69,12 @@ v.show_message("[M] presses \his thumb against [P].", 3, "[P] makes a sharp clicking sound as it extracts DNA material from [M].", 2) var/datum/dna/dna = M.dna to_chat(P, "

      [M]'s UE string : [dna.unique_enzymes]

      ") - if(dna.unique_enzymes == P.master_dna) to_chat(P, "DNA is a match to stored Master DNA.") - else to_chat(P, "DNA does not match stored Master DNA.") - else to_chat(P, "[M] does not seem like \he is going to provide a DNA sample willingly.") - return 1 /datum/pai_software/radio_config @@ -508,10 +503,8 @@ break if(T.loc) to_chat(AI, "Network Alert: Brute-force encryption crack in progress in [T.loc].") - else to_chat(AI, "Network Alert: Brute-force encryption crack in progress. Unable to pinpoint location.") - var/obj/machinery/door/D = cable.machine if(!istype(D)) hack_aborted = 1 @@ -710,7 +703,6 @@ if(!held || !held.loc || count > 6) //For a runtime where M ends up in nullspace (similar to bluespace but less colourful) to_chat(src, "You are not being carried by anyone!") - return 0 held = held.loc count++ diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index 0c9087e5d99..c6ae0f57ddf 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -185,13 +185,9 @@ if(( (CLUMSY in user.mutations) || user.getBrainLoss() >= 60) && prob(50)) user.visible_message("[user] has analyzed the floor's vitals!", "You try to analyze the floor's vitals!") to_chat(user, "Analyzing Results for The floor:\n\t Overall Status: Healthy") - to_chat(user, "\t Damage Specifics: [0]-[0]-[0]-[0]") - to_chat(user, "Key: Suffocation/Toxin/Burns/Brute") - to_chat(user, "Body Temperature: ???") - return var/scan_type @@ -201,7 +197,6 @@ scan_type = "prosthetics" else to_chat(user, "You can't analyze non-robotic things!") - return user.visible_message("[user] has analyzed [M]'s components.","You have analyzed [M]'s components.") @@ -210,18 +205,13 @@ var/BU = M.getFireLoss() > 50 ? "[M.getFireLoss()]" : M.getFireLoss() var/BR = M.getBruteLoss() > 50 ? "[M.getBruteLoss()]" : M.getBruteLoss() to_chat(user, "Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "fully disabled" : "[M.health]% functional"]") - to_chat(user, "\t Key: Electronics/Brute") - to_chat(user, "\t Damage Specifics: [BU] - [BR]") - if(M.timeofdeath && M.stat == DEAD) to_chat(user, "Time of Disable: [M.timeofdeath]") - var/mob/living/silicon/robot/H = M var/list/damaged = H.get_damaged_components(1,1,1) to_chat(user, "Localized Damage:") - if(length(damaged)>0) for(var/datum/robot_component/org in damaged) user.show_message(text("\t []: [][] - [] - [] - []", \ @@ -233,20 +223,15 @@ (org.powered) ? "Power ON" : "Power OFF"),1) else to_chat(user, "\t Components are OK.") - if(H.emagged && prob(5)) to_chat(user, "\t ERROR: INTERNAL SYSTEMS COMPROMISED") - if("prosthetics") var/mob/living/carbon/human/H = M to_chat(user, "Analyzing Results for \the [H]:") - to_chat(user, "Key: Electronics/Brute") - to_chat(user, "External prosthetics:") - var/organ_found if(H.internal_organs.len) for(var/obj/item/organ/external/E in H.organs) @@ -254,14 +239,10 @@ continue organ_found = 1 to_chat(user, "[E.name]: [round(E.brute_dam)] [round(E.burn_dam)]") - if(!organ_found) to_chat(user, "No prosthetics located.") - to_chat(user, "
      ") - to_chat(user, "Internal prosthetics:") - organ_found = null if(H.internal_organs.len) for(var/obj/item/organ/internal/O in H.internal_organs) @@ -269,9 +250,7 @@ continue organ_found = 1 to_chat(user, "[capitalize(O.name)]: [O.damage]") - if(!organ_found) to_chat(user, "No prosthetics located.") - src.add_fingerprint(user) diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index 2ce6b4903f2..9a5c1a9f4d5 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -109,12 +109,10 @@ if(istype(W, /obj/item/borg/upgrade/)) to_chat(user, "\red The maintenance drone chassis not compatible with \the [W].") - return else if (istype(W, /obj/item/weapon/crowbar)) to_chat(user, "The machine is hermetically sealed. You can't open the case.") - return else if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) @@ -123,19 +121,16 @@ if(!config.allow_drone_spawn || emagged || health < -35) //It's dead, Dave. to_chat(user, "\red The interface is fried, and a distressing burned smell wafts from the robot's interior. You're not rebooting this one.") - return if(!allowed(usr)) to_chat(user, "\red Access denied.") - return var/delta = (world.time / 10) - last_reboot if(reboot_cooldown > delta) var/cooldown_time = round(reboot_cooldown - ((world.time / 10) - last_reboot), 1) to_chat(usr, "\red The reboot system is currently offline. Please wait another [cooldown_time] seconds.") - return user.visible_message("\red \the [user] swipes \his ID card through \the [src], attempting to reboot it.", "\red You swipe your ID card through \the [src], attempting to reboot it.") @@ -159,7 +154,6 @@ else to_chat(user, "\red Access denied.") - return ..() @@ -167,7 +161,6 @@ /mob/living/silicon/robot/drone/emag_act(user as mob) if(!client || stat == 2) to_chat(user, "\red There's not much point subverting this heap of junk.") - return if(!ishuman(user)) @@ -176,16 +169,12 @@ if(emagged) to_chat(src, "\red [user] attempts to load subversive software into you, but your hacked subroutined ignore the attempt.") - to_chat(user, "\red You attempt to subvert [src], but the sequencer has no effect.") - return to_chat(user, "\red You swipe the sequencer across [src]'s interface and watch its eyes flicker.") - to_chat(src, "\red You feel a sudden burst of malware loaded into your execute-as-root buffer. Your tiny brain methodically parses, loads and executes the script.") - message_admins("[key_name_admin(user)] emagged drone [key_name_admin(src)]. Laws overridden.") log_game("[key_name(user)] emagged drone [key_name(src)]. Laws overridden.") var/time = time2text(world.realtime,"hh:mm:ss") @@ -200,10 +189,8 @@ set_zeroth_law("Only [H.real_name] and people he designates as being such are Syndicate Agents.") to_chat(src, "Obey these laws:") - laws.show_laws(src) to_chat(src, "\red \b ALERT: [H.real_name] is your new master. Obey your new laws and his commands.") - return //DRONE LIFE/DEATH @@ -243,10 +230,8 @@ if(stat != 2) if(emagged) to_chat(src, "\red You feel something attempting to modify your programming, but your hacked subroutines are unaffected.") - else to_chat(src, "\red A reset-to-factory directive packet filters through your data connection, and you obediently modify your programming to suit it.") - full_law_reset() show_laws() @@ -254,10 +239,8 @@ if(stat != 2) if(emagged) to_chat(src, "\red You feel a system kill order percolate through your tiny brain, but it doesn't seem like a good idea to you.") - else to_chat(src, "\red You feel a system kill order percolate through your tiny brain, and you obediently destroy yourself.") - death() /mob/living/silicon/robot/drone/proc/full_law_reset() @@ -296,21 +279,14 @@ lawupdate = 0 to_chat(src, "Systems rebooted. Loading base pattern maintenance protocol... loaded.") - full_law_reset() to_chat(src, "
      You are a maintenance drone, a tiny-brained robotic repair machine.") - to_chat(src, "You have no individual will, no personality, and no drives or urges other than your laws.") - to_chat(src, "Use ; to talk to other drones, and say to speak silently to your nearby fellows.") - to_chat(src, "Remember, you are lawed against interference with the crew. Also remember, you DO NOT take orders from the AI.") - to_chat(src, "Don't invade their worksites, don't steal their resources, don't tell them about the changeling in the toilets.") - to_chat(src, "Make sure crew members do not notice you..") - /* sprite["Default"] = "repairbot" sprite["Mk2 Mousedrone"] = "mk2" @@ -346,13 +322,11 @@ var/obj/item/O = AM if(O.w_class > 2) to_chat(src, "You are too small to pull that.") - return else ..() else to_chat(src, "You are too small to pull that.") - return /mob/living/silicon/robot/drone/add_robot_verbs() diff --git a/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm b/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm index 346fa52a0f9..305c89e87cb 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm @@ -11,14 +11,12 @@ return to_chat(src, "\blue You configure your internal beacon, tagging yourself for delivery to '[tag]'.") - mail_destination = TAGGERLOCATIONS.Find(tag) //Auto flush if we use this verb inside a disposal chute. var/obj/machinery/disposal/D = src.loc if(istype(D)) to_chat(src, "\blue \The [D] acknowledges your signal.") - D.flush_count = D.flush_every_ticks return @@ -31,12 +29,10 @@ if (layer != TURF_LAYER+0.2) layer = TURF_LAYER+0.2 to_chat(src, text("\blue You are now hiding.")) - else layer = MOB_LAYER to_chat(src, text("\blue You have stopped hiding.")) - /mob/living/silicon/robot/drone/verb/light() set name = "Light On/Off" set desc = "Activate a low power omnidirectional LED. Toggled on or off." diff --git a/code/modules/mob/living/silicon/robot/drone/drone_console.dm b/code/modules/mob/living/silicon/robot/drone/drone_console.dm index 7fc2aa863df..5e7077f7000 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_console.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_console.dm @@ -21,7 +21,6 @@ if(!allowed(user)) to_chat(user, "\red Access denied.") - return interact(user) @@ -56,7 +55,6 @@ if(!allowed(usr)) to_chat(usr, "\red Access denied.") - return if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) @@ -73,23 +71,19 @@ drone_call_area = t_area to_chat(usr, "\blue You set the area selector to [drone_call_area].") - else if (href_list["ping"]) to_chat(usr, "\blue You issue a maintenance request for all active drones, highlighting [drone_call_area].") - for(var/mob/living/silicon/robot/drone/D in world) if(D.client && D.stat == 0) to_chat(D, "-- Maintenance drone presence requested in: [drone_call_area].") - else if (href_list["resync"]) var/mob/living/silicon/robot/drone/D = locate(href_list["resync"]) if(D.stat != 2) to_chat(usr, "\red You issue a law synchronization directive for the drone.") - D.law_resync() else if (href_list["shutdown"]) @@ -98,7 +92,6 @@ if(D.stat != 2) to_chat(usr, "\red You issue a kill command for the unfortunate drone.") - message_admins("[key_name_admin(usr)] issued kill order for drone [key_name_admin(D)] from control console.") log_game("[key_name(usr)] issued kill order for [key_name(src)] from control console.") D.shut_down() @@ -114,12 +107,10 @@ dronefab = fab to_chat(usr, "\blue Drone fabricator located.") - return to_chat(usr, "\red Unable to locate drone fabricator.") - else if (href_list["toggle_fab"]) if(!dronefab) @@ -128,11 +119,9 @@ if(get_dist(src,dronefab) > 3) dronefab = null to_chat(usr, "\red Unable to locate drone fabricator.") - return dronefab.produce_drones = !dronefab.produce_drones to_chat(usr, "\blue You [dronefab.produce_drones ? "enable" : "disable"] drone production in the nearby fabricator.") - src.updateUsrDialog() \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index 939a547da1f..b5026a882fe 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -73,7 +73,6 @@ if(!silent) to_chat(src.loc, "You drop \the [wrapped].") - wrapped.forceMove(get_turf(src)) wrapped = null @@ -127,14 +126,12 @@ //We can grab the item, finally. if(grab) to_chat(user, "You collect \the [I].") - I.forceMove(src) wrapped = I return else to_chat(user, "Your gripper cannot hold \the [target].") - else if(istype(target,/obj/machinery/power/apc)) var/obj/machinery/power/apc/A = target if(A.opened) @@ -203,17 +200,14 @@ to_chat(D, "You begin decompiling the other drone.") - if(!do_after(D,50, target = target)) to_chat(D, "You need to remain still while decompiling such a large object.") - return if(!M || !D) return to_chat(D, "You carefully and thoroughly decompile your downed fellow, storing as much of its resources as you can within yourself.") - qdel(M) new/obj/effect/decal/cleanable/blood/oil(get_turf(src)) @@ -286,10 +280,8 @@ if(grabbed_something) to_chat(user, "You deploy your decompiler and clear out the contents of \the [T].") - else to_chat(user, "Nothing on \the [T] is useful to you.") - return //PRETTIER TOOL LIST. @@ -297,7 +289,6 @@ if(weapon_lock) to_chat(src, "Weapon lock active, unable to use modules! Count:[weaponlock_time]") - return if(!module) diff --git a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm index 040632662a2..881fde51dee 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm @@ -50,7 +50,6 @@ if(produce_drones && drone_progress >= 100 && istype(user,/mob/dead) && config.allow_drone_spawn && count_drones() < config.max_maint_drones) to_chat(user, "
      A drone is prepared. Select 'Join As Drone' from the Ghost tab to spawn as a maintenance drone.") - /obj/machinery/drone_fabricator/proc/count_drones() var/drones = 0 for(var/mob/living/silicon/robot/drone/D in world) @@ -87,7 +86,6 @@ if(!(config.allow_drone_spawn)) to_chat(src, "\red That verb is not currently permitted.") - return if (!src.stat) @@ -98,19 +96,16 @@ if(jobban_isbanned(src,"nonhumandept") || jobban_isbanned(src,"Drone")) to_chat(usr, "\red You are banned from playing drones and cannot spawn as a drone.") - return if(!ticker || ticker.current_state < 3) to_chat(src, "You can't join as a drone before the game starts!") - return var/drone_age = 14 // 14 days to play as a drone var/player_age_check = check_client_age(usr.client, drone_age) if(player_age_check && config.use_age_restriction_for_antags) to_chat(usr, "This role is not yet available to you. You need to wait another [player_age_check] days.") - return var/deathtime = world.time - src.timeofdeath @@ -119,7 +114,6 @@ var/mob/dead/observer/G = src if(G.has_enabled_antagHUD == 1 && config.antag_hud_restricted) to_chat(usr, "\blue Upon using the antagHUD you forfeited the ability to join the round.") - return if(G.started_as_observer == 1) joinedasobserver = 1 @@ -136,9 +130,7 @@ if (deathtime < 6000 && joinedasobserver == 0) to_chat(usr, "You have been dead for[pluralcheck] [deathtimeseconds] seconds.") - to_chat(usr, "You must wait 10 minutes to respawn as a drone!") - return for(var/obj/machinery/drone_fabricator/DF in world) @@ -147,7 +139,6 @@ if(DF.count_drones() >= config.max_maint_drones) to_chat(src, "\red There are too many active drones in the world for you to spawn.") - return if(DF.drone_progress >= 100) @@ -155,4 +146,3 @@ return to_chat(src, "\red There are no available drone spawn points, sorry.") - diff --git a/code/modules/mob/living/silicon/robot/drone/drone_say.dm b/code/modules/mob/living/silicon/robot/drone/drone_say.dm index 99a372f7f21..9ce0b6c027e 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_say.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_say.dm @@ -3,7 +3,6 @@ if (src.client) if(client.prefs.muted & MUTE_IC) to_chat(src, "You cannot send IC messages (muted).") - return 0 if (src.client.handle_spam_prevention(message,MUTE_IC)) return 0 @@ -32,13 +31,11 @@ if(D.client && D.local_transmit) to_chat(D, "[src] transmits, \"[message]\"") - for (var/mob/M in player_list) if (istype(M, /mob/new_player)) continue else if(M.stat == 2 && M.client && M.client.prefs.toggles & CHAT_GHOSTEARS) to_chat(M, "[src] transmits, \"[message]\"") - return 1 return ..(message, 0) diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm index 5d5b3cf0811..0c841f41207 100644 --- a/code/modules/mob/living/silicon/robot/emote.dm +++ b/code/modules/mob/living/silicon/robot/emote.dm @@ -145,7 +145,6 @@ else to_chat(src, "You are not THE LAW, pal.") - if("halt") if (istype(module,/obj/item/weapon/robot_module/security)) message = "[src]'s speakers skreech, \"Halt! Security!\"." @@ -155,7 +154,6 @@ else to_chat(src, "You are not security.") - if ("flip") m_type = 1 message = "[src] does a flip!" @@ -164,5 +162,4 @@ if ("help") to_chat(src, "salute, bow-(none)/mob, clap, flap, aflap, twitch, twitch_s, nod, deathgasp, glare-(none)/mob, stare-(none)/mob, look, beep, ping, \nbuzz, law, halt") - ..(act, m_type, message) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/examine.dm b/code/modules/mob/living/silicon/robot/examine.dm index d664fae834c..8d2af648463 100644 --- a/code/modules/mob/living/silicon/robot/examine.dm +++ b/code/modules/mob/living/silicon/robot/examine.dm @@ -45,5 +45,4 @@ msg += "\nIt is [pose]" to_chat(user, msg) - user.showLaws(src) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index 30c29527128..97b15ecda1a 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -44,7 +44,6 @@ return if(activated(O)) to_chat(src, "Already activated") - return if (is_component_functioning("power cell") && cell) if(istype(O, /obj/item/borg)) @@ -52,7 +51,6 @@ if(B.powerneeded) if((cell.charge * 100 / cell.maxcharge) < B.powerneeded) to_chat(src, "Not enough power to activate [B.name]!") - return if(!module_state_1) O.mouse_opacity = initial(O.mouse_opacity) @@ -80,7 +78,6 @@ sight_mode |= module_state_3:sight_mode else to_chat(src, "You need to disable a module first!") - src.update_icons() /mob/living/silicon/robot/proc/uneq_active() diff --git a/code/modules/mob/living/silicon/robot/laws.dm b/code/modules/mob/living/silicon/robot/laws.dm index 394e7f79bde..bc575831537 100644 --- a/code/modules/mob/living/silicon/robot/laws.dm +++ b/code/modules/mob/living/silicon/robot/laws.dm @@ -16,39 +16,30 @@ if(connected_ai.stat || connected_ai.control_disabled) to_chat(src, "AI signal lost, unable to sync laws.") - else lawsync() photosync() to_chat(src, "Laws synced with AI, be sure to note any changes.") - // TODO: Update to new antagonist system. if(mind && mind.special_role == "traitor" && mind.original == src) to_chat(src, "Remember, your AI does NOT share or know about your law 0.") - else to_chat(src, "No AI selected to sync laws with, disabling lawsync protocol.") - lawupdate = 0 to_chat(who, "Obey these laws:") - laws.show_laws(who) // TODO: Update to new antagonist system. if (mind && (mind.special_role == "traitor" && mind.original == src) && connected_ai) to_chat(who, "Remember, [connected_ai.name] is technically your master, but your objective comes first.") - else if (connected_ai) to_chat(who, "Remember, [connected_ai.name] is your master, other AIs can be ignored.") - else if (emagged) to_chat(who, "Remember, you are not required to listen to the AI.") - else to_chat(who, "Remember, you are not bound to any AI, you are not required to listen to them.") - /mob/living/silicon/robot/lawsync() laws_sanity_check() var/datum/ai_laws/master = connected_ai && lawupdate ? connected_ai.laws : null diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 010ffb676d7..d247d726003 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -30,7 +30,6 @@ if(B.powerneeded) if((cell.charge * 100 / cell.maxcharge) < B.powerneeded) to_chat(src, "Deactivating [B.name] due to lack of power!") - uneq_module(B) if(cell.charge <= 0) uneq_all() @@ -105,17 +104,14 @@ if(uneq_module(module_state_3)) to_chat(src, "SYSTEM ERROR: Module 3 OFFLINE.") - if(health < 0) if(uneq_module(module_state_2)) to_chat(src, "SYSTEM ERROR: Module 2 OFFLINE.") - if(health < -50) if(uneq_module(module_state_1)) to_chat(src, "CRITICAL ERROR: All modules OFFLINE.") - if(paralysis || stunned || weakened) stat = UNCONSCIOUS @@ -282,7 +278,6 @@ if(weaponlock_time <= 0) if(src.client) to_chat(src, "\red Weapon Lock Timed Out!") - weapon_lock = 0 weaponlock_time = 120 diff --git a/code/modules/mob/living/silicon/robot/photos.dm b/code/modules/mob/living/silicon/robot/photos.dm index 6fdee77418c..33f739c41c9 100644 --- a/code/modules/mob/living/silicon/robot/photos.dm +++ b/code/modules/mob/living/silicon/robot/photos.dm @@ -11,4 +11,3 @@ synced = 1 if(synced) to_chat(src, "Locally saved images synced with AI. Images were retained in local database in case of loss of connection with the AI.") - diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 236b5f3316e..390ad8d07dc 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -248,7 +248,6 @@ var/list/robot_verbs_default = list( mmi.update_icon() else to_chat(src, "Oops! Something went very wrong, your MMI was unable to receive your mind. You have been ghosted. Please make a bug report so we can fix this bug.") - ghostize() error("A borg has been destroyed, but its MMI lacked a brainmob, so the mind could not be transferred. Player: [ckey].") mmi = null @@ -268,7 +267,6 @@ var/list/robot_verbs_default = list( var/list/modules = list("Standard", "Engineering", "Medical", "Miner", "Janitor", "Service", "Security") if(security_level == (SEC_LEVEL_GAMMA || SEC_LEVEL_EPSILON) || crisis) to_chat(src, "\red Crisis mode active. Combat module available.") - modules+="Combat" if(ticker && ticker.mode && ticker.mode.name == "nations") var/datum/game_mode/nations/N = ticker.mode @@ -421,7 +419,6 @@ var/list/robot_verbs_default = list( if(!is_component_functioning("diagnosis unit")) to_chat(src, "\red Your self-diagnosis component isn't functioning.") - var/dat = self_diagnosis() src << browse(dat, "window=robotdiagnosis") @@ -446,12 +443,10 @@ var/list/robot_verbs_default = list( if(C.toggled) C.toggled = 0 to_chat(src, "\red You disable [C.name].") - else C.toggled = 1 to_chat(src, "\red You enable [C.name].") - /mob/living/silicon/robot/proc/sensor_mode() set name = "Set Sensor Augmentation" set desc = "Augment visual feed with internal sensor overlays." @@ -559,7 +554,6 @@ var/list/robot_verbs_default = list( if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations)) if(prob(20)) to_chat(usr, "\red You fail to push [tmob]'s fat ass out of the way.") - now_pushing = 0 return if(!(tmob.status_flags & CANPUSH)) @@ -603,7 +597,6 @@ var/list/robot_verbs_default = list( to_chat(usr, "\blue You install the [W.name].") - return if (istype(W, /obj/item/weapon/weldingtool) && user.a_intent == I_HELP) @@ -611,7 +604,6 @@ var/list/robot_verbs_default = list( return if (!getBruteLoss()) to_chat(user, "Nothing to fix!") - return var/obj/item/weapon/weldingtool/WT = W user.changeNext_move(CLICK_CD_MELEE) @@ -623,14 +615,12 @@ var/list/robot_verbs_default = list( user.visible_message("\The [user] patches some dents on \the [src] with \the [WT].") else to_chat(user, "Need more welding fuel!") - return else if(istype(W, /obj/item/stack/cable_coil) && user.a_intent == I_HELP && (wiresexposed || istype(src,/mob/living/silicon/robot/drone))) if (!getFireLoss()) to_chat(user, "Nothing to fix!") - return var/obj/item/stack/cable_coil/coil = W adjustFireLoss(-30) @@ -643,21 +633,17 @@ var/list/robot_verbs_default = list( if(opened) if(cell) to_chat(user, "You close the cover.") - opened = 0 update_icons() else if(wiresexposed && wires.IsAllCut()) //Cell is out, wires are exposed, remove MMI, produce damaged chassis, baleet original mob. if(!mmi) to_chat(user, "\The [src] has no brain to remove.") - return to_chat(user, "You jam the crowbar into the robot and begin levering [mmi].") - if(do_after(user,3 SECONDS, target = src)) to_chat(user, "You damage some parts of the chassis, but eventually manage to rip out [mmi]!") - var/obj/item/robot_parts/robot_suit/C = new/obj/item/robot_parts/robot_suit(loc) C.l_leg = new/obj/item/robot_parts/l_leg(C) C.r_leg = new/obj/item/robot_parts/r_leg(C) @@ -684,7 +670,6 @@ var/list/robot_verbs_default = list( var/datum/robot_component/C = components[remove] var/obj/item/robot_parts/robot_component/I = C.wrapped to_chat(user, "You remove \the [I].") - if(istype(I)) I.brute = C.brute_damage I.burn = C.electronics_damage @@ -698,10 +683,8 @@ var/list/robot_verbs_default = list( else if(locked) to_chat(user, "The cover is locked and cannot be opened.") - else to_chat(user, "You open the cover.") - opened = 1 update_icons() @@ -709,17 +692,14 @@ var/list/robot_verbs_default = list( var/datum/robot_component/C = components["power cell"] if(wiresexposed) to_chat(user, "Close the panel first.") - else if(cell) to_chat(user, "There is a power cell already installed.") - else user.drop_item() W.loc = src cell = W to_chat(user, "You insert the power cell.") - C.installed = 1 C.wrapped = W C.install() @@ -734,11 +714,9 @@ var/list/robot_verbs_default = list( else to_chat(user, "You can't reach the wiring.") - else if(istype(W, /obj/item/weapon/screwdriver) && opened && !cell) // haxing wiresexposed = !wiresexposed to_chat(user, "The wires have been [wiresexposed ? "exposed" : "unexposed"]") - update_icons() else if(istype(W, /obj/item/weapon/screwdriver) && opened && cell) // radio @@ -746,7 +724,6 @@ var/list/robot_verbs_default = list( radio.attackby(W,user)//Push it to the radio to let it handle everything else to_chat(user, "Unable to locate a radio.") - update_icons() else if(istype(W, /obj/item/device/encryptionkey/) && opened) @@ -755,46 +732,36 @@ var/list/robot_verbs_default = list( else to_chat(user, "Unable to locate a radio.") - else if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) // trying to unlock the interface with an ID card if(emagged)//still allow them to open the cover to_chat(user, "The interface seems slightly damaged") - if(opened) to_chat(user, "You must close the cover to swipe an ID card.") - else if(allowed(usr)) locked = !locked to_chat(user, "You [ locked ? "lock" : "unlock"] [src]'s interface.") - update_icons() else to_chat(user, "\red Access denied.") - else if(istype(W, /obj/item/borg/upgrade/)) var/obj/item/borg/upgrade/U = W if(!opened) to_chat(user, "You must access the borgs internals!") - else if(!src.module && U.require_module) to_chat(user, "The borg must choose a module before it can be upgraded!") - else if(U.locked) to_chat(user, "The upgrade is locked and cannot be used yet!") - else if(!user.drop_item()) return if(U.action(src)) to_chat(user, "You apply the upgrade to [src].") - U.forceMove(src) else to_chat(user, "Upgrade error.") - else spark_system.start() return ..() @@ -806,18 +773,15 @@ var/list/robot_verbs_default = list( if(!opened)//Cover is closed if(locked) to_chat(user, "You emag the cover lock.") - locked = 0 else to_chat(user, "The cover is already unlocked.") - return if(opened)//Cover is open if(emagged) return//Prevents the X has hit Y with Z message also you cant emag them twice if(wiresexposed) to_chat(user, "You must close the panel first") - return else sleep(6) @@ -826,7 +790,6 @@ var/list/robot_verbs_default = list( src.hud_used.update_robot_modules_display() //Shows/hides the emag item if the inventory screen is already open. disconnect_from_ai() to_chat(user, "You emag [src]'s interface.") - // message_admins("[key_name_admin(user)] emagged cyborg [key_name_admin(src)]. Laws overridden.") log_game("[key_name(user)] emagged cyborg [key_name(src)]. Laws overridden.") clear_supplied_laws() @@ -836,30 +799,21 @@ var/list/robot_verbs_default = list( lawchanges.Add("[time] : [M.name]([M.key]) emagged [name]([key])") set_zeroth_law("Only [M.real_name] and people he designates as being such are Syndicate Agents.") to_chat(src, "\red ALERT: Foreign software detected.") - sleep(5) to_chat(src, "\red Initiating diagnostics...") - sleep(20) to_chat(src, "\red SynBorg v1.7 loaded.") - sleep(5) to_chat(src, "\red LAW SYNCHRONISATION ERROR") - sleep(5) to_chat(src, "\red Would you like to send a report to NanoTraSoft? Y/N") - sleep(10) to_chat(src, "\red > N") - sleep(20) to_chat(src, "\red ERRORERRORERROR") - to_chat(src, "Obey these laws:") - laws.show_laws(src) to_chat(src, "\red \b ALERT: [M.real_name] is your new master. Obey your new laws and his commands.") - if(src.module && istype(src.module, /obj/item/weapon/robot_module/miner)) for(var/obj/item/weapon/pickaxe/drill/cyborg/D in src.module.modules) qdel(D) @@ -885,16 +839,13 @@ var/list/robot_verbs_default = list( update_icons() to_chat(usr, "You unlock your cover.") - /mob/living/silicon/robot/attack_alien(mob/living/carbon/alien/humanoid/M as mob) if (!ticker) to_chat(M, "You cannot attack people before the game has started.") - return if (istype(loc, /turf) && istype(loc.loc, /area/start)) to_chat(M, "No attacking people at spawn, you jackass.") - return switch(M.a_intent) @@ -997,7 +948,6 @@ var/list/robot_verbs_default = list( cell.add_fingerprint(user) user.put_in_active_hand(cell) to_chat(user, "You remove \the [cell].") - cell = null update_icons() diag_hud_set_borgcell() @@ -1083,7 +1033,6 @@ var/list/robot_verbs_default = list( /mob/living/silicon/robot/proc/installed_modules() if(weapon_lock) to_chat(src, "\red Weapon lock active, unable to use modules! Count:[weaponlock_time]") - return if(!module) @@ -1171,10 +1120,8 @@ var/list/robot_verbs_default = list( contents -= O else to_chat(src, "Module isn't activated.") - else to_chat(src, "Module isn't activated") - installed_modules() return 1 @@ -1186,13 +1133,11 @@ var/list/robot_verbs_default = list( /mob/living/silicon/robot/proc/control_headlamp() if(stat || lamp_recharging) to_chat(src, "This function is currently offline.") - return //Some sort of magical "modulo" thing which somehow increments lamp power by 2, until it hits the max and resets to 0. lamp_intensity = (lamp_intensity+2) % (lamp_max+2) to_chat(src, "[lamp_intensity ? "Headlamp power set to Level [lamp_intensity/2]" : "Headlamp disabled."]") - update_headlamp() /mob/living/silicon/robot/proc/update_headlamp(var/turn_off = 0, var/cooldown = 100) @@ -1200,7 +1145,6 @@ var/list/robot_verbs_default = list( if(lamp_intensity && (turn_off || stat)) to_chat(src, "Your headlamp has been deactivated.") - lamp_intensity = 0 lamp_recharging = 1 spawn(cooldown) //10 seconds by default, if the source of the deactivation does not keep stat that long. @@ -1257,7 +1201,6 @@ var/list/robot_verbs_default = list( cleaned_human.update_inv_shoes(0,0) cleaned_human.clean_blood() to_chat(cleaned_human, "[src] cleans your face!") - return #undef BORG_CAMERA_BUFFER @@ -1296,7 +1239,6 @@ var/list/robot_verbs_default = list( if(R) R.UnlinkSelf() to_chat(R, "Buffers flushed and reset. Camera system shutdown. All systems operational.") - src.verbs -= /mob/living/silicon/robot/proc/ResetSecurityCodes /mob/living/silicon/robot/mode() @@ -1341,7 +1283,6 @@ var/list/robot_verbs_default = list( lockcharge = null else to_chat(src, "Something is badly wrong with the sprite selection. Harass a coder.") - icon_state = module_sprites[1] lockcharge = null return @@ -1359,21 +1300,17 @@ var/list/robot_verbs_default = list( else to_chat(src, "Your icon has been set. You now require a module reset to change it.") - /mob/living/silicon/robot/proc/notify_ai(var/notifytype, var/oldname, var/newname) if(!connected_ai) return switch(notifytype) if(1) //New Cyborg to_chat(connected_ai, "

      NOTICE - New cyborg connection detected: [name]
      ") - if(2) //New Module to_chat(connected_ai, "

      NOTICE - Cyborg module change detected: [name] has loaded the [designation] module.
      ") - if(3) //New Name to_chat(connected_ai, "

      NOTICE - Cyborg reclassification detected: [oldname] is now designated as [newname].
      ") - /mob/living/silicon/robot/proc/disconnect_from_ai() if(connected_ai) sync() // One last sync attempt @@ -1426,7 +1363,6 @@ var/list/robot_verbs_default = list( if(isnull(ckey) && !searching_for_ckey) searching_for_ckey = 1 to_chat(user, "Now checking for possible borgs.") - var/list/borg_candidates = pollCandidates("Do you want to play as a Nanotrasen Combat borg?") if(borg_candidates.len > 0 && isnull(ckey)) searching_for_ckey = 0 @@ -1439,11 +1375,9 @@ var/list/robot_verbs_default = list( else searching_for_ckey = 0 to_chat(user, "Unable to connect to Central Command. Please wait and try again later.") - return else to_chat(user, "[src] is already checking for possible borgs.") - return /mob/living/silicon/robot/syndicate @@ -1478,7 +1412,6 @@ var/list/robot_verbs_default = list( if(playstyle_string) to_chat(src, playstyle_string) - playsound(loc, 'sound/mecha/nominalsyndi.ogg', 75, 0) /mob/living/silicon/robot/syndicate/medical diff --git a/code/modules/mob/living/silicon/robot/robot_damage.dm b/code/modules/mob/living/silicon/robot/robot_damage.dm index 7b52c10f96a..54bc69b7020 100644 --- a/code/modules/mob/living/silicon/robot/robot_damage.dm +++ b/code/modules/mob/living/silicon/robot/robot_damage.dm @@ -9,9 +9,7 @@ var/mob/dead/observer/ghost = get_ghost() if(ghost) to_chat(ghost, "Your cyborg shell has been repaired, re-enter if you want to continue! (Verbs -> Ghost -> Re-enter corpse)") - to_chat(ghost, sound('sound/effects/genetics.ogg')) - return @@ -93,13 +91,11 @@ if(cell.charge <= 0) cell.charge = 0 to_chat(src, "\red Your shield has overloaded!") - else brute -= absorb_brute burn -= absorb_burn to_chat(src, "\red Your shield absorbs some of the impact!") - var/datum/robot_component/armour/A = get_armour() if(A) A.take_damage(brute,burn,sharp,edge) @@ -146,13 +142,11 @@ if(cell.charge <= 0) cell.charge = 0 to_chat(src, "\red Your shield has overloaded!") - else brute -= absorb_brute burn -= absorb_burn to_chat(src, "\red Your shield absorbs some of the impact!") - var/datum/robot_component/armour/A = get_armour() if(A) A.take_damage(brute,burn,sharp) diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm index 7ef838c4a18..13c48d03ac5 100644 --- a/code/modules/mob/living/silicon/robot/robot_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_items.dm @@ -22,7 +22,6 @@ else mode = 1 to_chat(user, "Changed printing mode to '[mode == 2 ? "Rename Paper" : "Write Paper"]'") - playsound(src.loc, 'sound/effects/pop.ogg', 50, 0) return diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm index 956e5927fcc..07ea4bfa0bb 100644 --- a/code/modules/mob/living/silicon/say.dm +++ b/code/modules/mob/living/silicon/say.dm @@ -9,7 +9,6 @@ if(message_mode) if(!is_component_functioning("radio")) to_chat(src, "Your radio isn't functional at this time.") - return 0 if(message_mode == "general") message_mode = null @@ -23,7 +22,6 @@ else if(message_mode) if (aiRadio.disabledAi || aiRestorePowerRoutine || stat) to_chat(src, "System Error - Transceiver Disabled.") - return 0 if(message_mode == "general") message_mode = null @@ -86,14 +84,12 @@ rendered_b = "[voice_name] [speaking.format_message(message_stars, verb)]" to_chat(src, "Holopad transmitted, [real_name] [speaking.format_message(message, verb)]")//The AI can "hear" its own message. - else rendered_a = "[name] [verb], \"[message]\"" rendered_b = "[voice_name] [verb], \"[message_stars]\"" to_chat(src, "Holopad transmitted, [real_name] [verb], \"[message]\"")//The AI can "hear" its own message. - for(var/mob/M in hearers(T.loc))//The location is the object, default distance. if(M.say_understands(src))//If they understand AI speak. Humans and the like will be able to. M.show_message(rendered_a, 2) @@ -103,7 +99,6 @@ This is another way of saying that we won't bother dealing with them.*/ else to_chat(src, "No holopad connected.") - return return 1 @@ -121,12 +116,10 @@ var/rendered = "[name] [message]" to_chat(src, "Holopad action relayed, [real_name] [message]") - for(var/mob/M in viewers(T.loc)) M.show_message(rendered, 2) else //This shouldn't occur, but better safe then sorry. to_chat(src, "No holopad connected.") - return return 1 diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index f7813d04b45..a49e79a59e7 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -75,9 +75,7 @@ Stun(3) flash_eyes(affect_silicon = 1) to_chat(src, "\red *BZZZT*") - to_chat(src, "\red Warning: Electromagnetic pulse detected.") - ..() @@ -87,7 +85,6 @@ /mob/living/silicon/can_inject(var/mob/user, var/error_msg) if(error_msg) to_chat(user, "Their outer shell is too tough.") - return 0 /mob/living/silicon/IsAdvancedToolUser() @@ -283,19 +280,15 @@ if ("Security") add_sec_hud() to_chat(src, "Security records overlay enabled.") - if ("Medical") add_med_hud() to_chat(src, "Life signs monitor overlay enabled.") - if ("Diagnostic") add_diag_hud() to_chat(src, "Robotics diagnostic overlay enabled.") - if ("Disable") to_chat(src, "Sensor augmentations disabled.") - /mob/living/silicon/proc/receive_alarm(var/datum/alarm_handler/alarm_handler, var/datum/alarm/alarm, was_raised) if(!next_alarm_notice) next_alarm_notice = world.time + SecondsToTicks(10) @@ -325,7 +318,6 @@ if(!reported) reported = 1 to_chat(src, "--- [AH.category] Detected ---") - raised_alarm(A) for(var/datum/alarm_handler/AH in queued_alarms) @@ -336,14 +328,11 @@ if(!reported) reported = 1 to_chat(src, "--- [AH.category] Cleared ---") - to_chat(src, "\The [A.alarm_name()].") - if(alarm_raised) to_chat(src, "\[Show Alerts\]") - for(var/datum/alarm_handler/AH in queued_alarms) var/list/alarms = queued_alarms[AH] alarms.Cut() @@ -351,14 +340,12 @@ /mob/living/silicon/proc/raised_alarm(var/datum/alarm/A) to_chat(src, "[A.alarm_name()]!") - /mob/living/silicon/ai/raised_alarm(var/datum/alarm/A) var/cameratext = "" for(var/obj/machinery/camera/C in A.cameras()) cameratext += "[(cameratext == "")? "" : "|"][C.c_tag]" to_chat(src, "[A.alarm_name()]! ([(cameratext)? cameratext : "No Camera"])") - /mob/living/silicon/adjustToxLoss(var/amount) return diff --git a/code/modules/mob/living/simple_animal/bees.dm b/code/modules/mob/living/simple_animal/bees.dm index 438c60528e8..959444ea5e4 100644 --- a/code/modules/mob/living/simple_animal/bees.dm +++ b/code/modules/mob/living/simple_animal/bees.dm @@ -46,7 +46,6 @@ M.apply_damage((round(feral/10,1)*(max((round(strength/20,1)),1)))+toxic, TOX) // Bee venom based on how angry I am and how many there are of me! to_chat(M, "\red You have been stung!") - //if we're chasing someone, get a little bit angry if(target_mob && prob(10)) feral++ diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 89075e51173..2a53be92ee5 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -178,7 +178,6 @@ locked = 0 emagged = 1 to_chat(user, "You bypass [src]'s controls.") - return if(!locked && open) //Bot panel is unlocked by ID or emag, and the panel is screwed open. Ready for emagging. emagged = 2 @@ -187,27 +186,22 @@ bot_reset() turn_on() //The bot automatically turns on when emagged, unless recently hit with EMP. to_chat(src, "(#$*#$^^( OVERRIDE DETECTED") - show_laws() add_logs(user, src, "emagged") return else //Bot is unlocked, but the maint panel has not been opened with a screwdriver yet. to_chat(user, "You need to open maintenance panel first!") - /mob/living/simple_animal/bot/examine(mob/user) ..() if(health < maxHealth) if(health > maxHealth/3) to_chat(user, "[src]'s parts look loose.") - else to_chat(user, "[src]'s parts look very loose!") - else to_chat(user, "[src] is in pristine condition.") - /mob/living/simple_animal/bot/adjustBruteLoss(amount) . = ..() @@ -270,7 +264,6 @@ else to_chat(user, "[src]'s interface is not responding!") - /mob/living/simple_animal/bot/proc/interact(mob/user) show_controls(user) @@ -279,29 +272,22 @@ if(!locked) open = !open to_chat(user, "The maintenance panel is now [open ? "opened" : "closed"].") - else to_chat(user, "The maintenance panel is locked.") - else if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda)) if(bot_core.allowed(user) && !open && !emagged) locked = !locked to_chat(user, "Controls are now [locked ? "locked." : "unlocked."]") - else if(emagged) to_chat(user, "ERROR") - if(open) to_chat(user, "Please close the access panel before locking it.") - else to_chat(user, "Access denied.") - else if(istype(W, /obj/item/device/paicard)) if(paicard) to_chat(user, "A [paicard] is already inserted!") - else if(allow_pai && !key) if(!locked && !open) var/obj/item/device/paicard/card = W @@ -313,27 +299,21 @@ user.visible_message("[user] inserts [W] into [src]!","You insert [W] into [src].") paicard.pai.mind.transfer_to(src) to_chat(src, "You sense your form change as you are uploaded into [src].") - bot_name = name name = paicard.pai.name faction = user.faction add_logs(user, paicard.pai, "uploaded to [src.bot_name],") else to_chat(user, "[W] is inactive.") - else to_chat(user, "The personality slot is locked.") - else to_chat(user, "[src] is not compatible with [W]") - else if(istype(W, /obj/item/weapon/hemostat) && paicard) if(open) to_chat(user, "Close the access panel before manipulating the personality slot!") - else to_chat(user, "You attempt to pull [paicard] free...") - if(do_after(user, 30, target = src)) if (paicard) user.visible_message("[user] uses [W] to pull [paicard] out of [bot_name]!","You pull [paicard] out of [bot_name] with [W].") @@ -343,11 +323,9 @@ if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != "harm") if(health >= maxHealth) to_chat(user, "[src] does not need a repair!") - return if(!open) to_chat(user, "Unable to repair with the maintenance panel closed!") - return var/obj/item/weapon/weldingtool/WT = W if(WT.remove_fuel(0, user)) @@ -358,7 +336,6 @@ user.visible_message("[user] repairs [src]!","You repair [src].") else to_chat(user, "The welder must be on for this task!") - else if(W.force) //if force is non-zero var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread @@ -523,14 +500,12 @@ Pass a positive integer as an argument to override a bot's default speed. access_card = all_access //Give the bot all-access while under the AI's command. if(message) to_chat(calling_ai, "\icon[src] [name] called to [end_area.name]. [path.len-1] meters to destination.") - pathset = 1 mode = BOT_RESPONDING tries = 0 else if(message) to_chat(calling_ai, "Failed to calculate a valid route. Ensure destination is clear of obstructions and within range.") - calling_ai = null path = list() @@ -540,14 +515,12 @@ Pass a positive integer as an argument to override a bot's default speed. if(!success) if(calling_ai) to_chat(calling_ai, "\icon[src] [get_turf(src) == ai_waypoint ? "[src] successfully arrived to waypoint." : "[src] failed to reach waypoint."]") - calling_ai = null bot_reset() /mob/living/simple_animal/bot/proc/bot_reset() if(calling_ai) //Simple notification to the AI if it called a bot. It will not know the cause or identity of the bot. to_chat(calling_ai, "Call command to a bot has been reset.") - calling_ai = null path = list() summon_target = null @@ -674,22 +647,17 @@ Pass a positive integer as an argument to override a bot's default speed. switch(command) if("stop") to_chat(src, "STOP PATROL") - if("go") to_chat(src, "START PATROL") - if("summon") var/area/a = get_area(user_turf) to_chat(src, "PRIORITY ALERT: [user] in [a.name]!") - if("home") to_chat(src, "RETURN HOME!") - if("ejectpai") else to_chat(src, "Unidentified control sequence recieved: [command]") - /obj/machinery/bot_core/receive_signal(datum/signal/signal) owner.receive_signal(signal) @@ -839,7 +807,6 @@ Pass a positive integer as an argument to override a bot's default speed. if(topic_denied(usr)) to_chat(usr, "[src]'s interface is not responding!") - return 1 add_fingerprint(usr) @@ -861,23 +828,19 @@ Pass a positive integer as an argument to override a bot's default speed. hacked = 1 locked = 1 to_chat(usr, "[text_hack]") - show_laws() bot_reset() else if(!hacked) to_chat(usr, "[text_dehack_fail]") - else emagged = 0 hacked = 0 to_chat(usr, "[text_dehack]") - show_laws() bot_reset() if("ejectpai") if(paicard && (!locked || issilicon(usr) || check_rights(R_ADMIN, 0, usr))) to_chat(usr, "You eject [paicard] from [bot_name]") - ejectpai(usr) update_controls() @@ -951,7 +914,6 @@ Pass a positive integer as an argument to override a bot's default speed. add_logs(src, paicard.pai, "ejected") if(announce) to_chat(paicard.pai, "You feel your control fade as [paicard] ejects from [bot_name].") - paicard = null name = bot_name faction = initial(faction) @@ -990,30 +952,20 @@ Pass a positive integer as an argument to override a bot's default speed. set category = "IC" to_chat(src, "Directives:") - if(paicard && paicard.pai && paicard.pai.master && paicard.pai.pai_law0) to_chat(src, "Your master, [paicard.pai.master], may overrule any and all laws.") - to_chat(src, "0. [paicard.pai.pai_law0]") - if(emagged >= 2) to_chat(src, "1. #$!@#$32K#$") - else to_chat(src, "1. You are a machine built to serve the station's crew and AI(s).") - to_chat(src, "2. Your function is to [bot_purpose].") - to_chat(src, "3. You cannot serve your function if you are broken.") - to_chat(src, "4. Serve your function to the best of your ability.") - if(paicard && paicard.pai && paicard.pai.pai_laws) to_chat(src, "Supplemental Directive(s):") - to_chat(src, "[paicard.pai.pai_laws]") - /mob/living/simple_animal/bot/get_access() . = ..() diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm index ddea9e7bbf6..0dc75f742f8 100644 --- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm +++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm @@ -62,17 +62,13 @@ if(bot_core.allowed(user) && !open && !emagged) locked = !locked to_chat(user, "You [ locked ? "lock" : "unlock"] \the [src] behaviour controls.") - else if(emagged) to_chat(user, "ERROR") - if(open) to_chat(user, "Please close the access panel before locking it.") - else to_chat(user, "\The [src] doesn't seem to respect your authority.") - else return ..() @@ -82,7 +78,6 @@ if(user) to_chat(user, "[src] buzzes and beeps.") - /mob/living/simple_animal/bot/cleanbot/process_scan(obj/effect/decal/cleanable/D) for(var/T in target_types) if(istype(D, T)) diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm index c7d62d6e4cf..2c2ca652d10 100644 --- a/code/modules/mob/living/simple_animal/bot/construction.dm +++ b/code/modules/mob/living/simple_animal/bot/construction.dm @@ -23,7 +23,6 @@ var/mob/living/simple_animal/bot/cleanbot/A = new /mob/living/simple_animal/bot/cleanbot(T) A.name = created_name to_chat(user, "You add the robot arm to the bucket and sensor assembly. Beep boop!") - user.unEquip(src, 1) qdel(src) @@ -67,7 +66,6 @@ qdel(W) build_step++ to_chat(user, "You add the robot leg to [src].") - name = "legs/frame assembly" if(build_step == 1) item_state = "ed209_leg" @@ -89,7 +87,6 @@ qdel(W) build_step++ to_chat(user, "You add the armor to [src].") - name = "vest/legs/frame assembly" item_state = "[lasercolor]ed209_shell" icon_state = "[lasercolor]ed209_shell" @@ -101,7 +98,6 @@ build_step++ name = "shielded frame assembly" to_chat(user, "You weld the vest to [src].") - if(4) switch(lasercolor) if("b") @@ -121,7 +117,6 @@ qdel(W) build_step++ to_chat(user, "You add the helmet to [src].") - name = "covered and shielded frame assembly" item_state = "[lasercolor]ed209_hat" icon_state = "[lasercolor]ed209_hat" @@ -133,7 +128,6 @@ qdel(W) build_step++ to_chat(user, "You add the prox sensor to [src].") - name = "covered, shielded and sensored frame assembly" item_state = "[lasercolor]ed209_prox" icon_state = "[lasercolor]ed209_prox" @@ -143,16 +137,13 @@ var/obj/item/stack/cable_coil/coil = W if(coil.get_amount() < 1) to_chat(user, "You need one length of cable to wire the ED-209!") - return to_chat(user, "You start to wire [src]...") - if(do_after(user, 40, target = src)) if(coil.get_amount() >= 1 && build_step == 6) coil.use(1) build_step = 7 to_chat(user, "You wire the ED-209 assembly.") - name = "wired ED-209 assembly" if(7) @@ -177,7 +168,6 @@ name = newname build_step++ to_chat(user, "You add [W] to [src].") - item_state = "[lasercolor]ed209_taser" icon_state = "[lasercolor]ed209_taser" qdel(W) @@ -186,20 +176,17 @@ if(istype(W, /obj/item/weapon/screwdriver)) playsound(loc, 'sound/items/Screwdriver.ogg', 100, 1) to_chat(user, "You start attaching the gun to the frame...") - if(do_after(user, 40, target = src)) build_step++ name = "armed [name]" to_chat(user, "Taser gun attached.") - if(9) if(istype(W, /obj/item/weapon/stock_parts/cell)) if(!user.unEquip(W)) return build_step++ to_chat(user, "You complete the ED-209.") - var/turf/T = get_turf(src) new /mob/living/simple_animal/bot/ed209(T,created_name,lasercolor) qdel(W) @@ -237,7 +224,6 @@ return if(contents.len >= 1) to_chat(user, "They won't fit in, as there is already stuff inside.") - return if(T.use(10)) if(user.s_active) @@ -245,12 +231,10 @@ var/obj/item/weapon/toolbox_tiles/B = new /obj/item/weapon/toolbox_tiles user.put_in_hands(B) to_chat(user, "You add the tiles into the empty toolbox. They protrude from the top.") - user.unEquip(src, 1) qdel(src) else to_chat(user, "You need 10 floor tiles to start building a floorbot.") - return /obj/item/weapon/toolbox_tiles/attackby(obj/item/W, mob/user, params) @@ -261,7 +245,6 @@ B.created_name = created_name user.put_in_hands(B) to_chat(user, "You add the sensor to the toolbox and tiles.") - user.unEquip(src, 1) qdel(src) @@ -282,7 +265,6 @@ var/mob/living/simple_animal/bot/floorbot/A = new /mob/living/simple_animal/bot/floorbot(T) A.name = created_name to_chat(user, "You add the robot arm to the odd looking toolbox assembly. Boop beep!") - user.unEquip(src, 1) qdel(src) else if(istype(W, /obj/item/weapon/pen)) @@ -326,7 +308,6 @@ //Making a medibot! if(contents.len >= 1) to_chat(user, "You need to empty [src] out first!") - return var/obj/item/weapon/firstaid_arm_assembly/A = new /obj/item/weapon/firstaid_arm_assembly @@ -355,7 +336,6 @@ qdel(S) user.put_in_hands(A) to_chat(user, "You add the robot arm to the first aid kit.") - user.unEquip(src, 1) qdel(src) @@ -378,7 +358,6 @@ qdel(W) build_step++ to_chat(user, "You add the health sensor to [src].") - name = "First aid/robot arm/health analyzer assembly" overlays += image('icons/obj/aibots.dmi', "na_scanner") @@ -389,7 +368,6 @@ qdel(W) build_step++ to_chat(user, "You complete the Medibot. Beep boop!") - var/turf/T = get_turf(src) var/mob/living/simple_animal/bot/medbot/S = new /mob/living/simple_animal/bot/medbot(T) S.skin = skin @@ -424,7 +402,6 @@ var/obj/item/weapon/secbot_assembly/A = new /obj/item/weapon/secbot_assembly user.put_in_hands(A) to_chat(user, "You add the signaler to the helmet.") - user.unEquip(src, 1) qdel(src) else @@ -439,7 +416,6 @@ build_step++ overlays += "hs_hole" to_chat(user, "You weld a hole in [src]!") - else if(build_step == 1) var/obj/item/weapon/weldingtool/WT = I if(WT.remove_fuel(0, user)) @@ -447,13 +423,11 @@ overlays -= "hs_hole" to_chat(user, "You weld the hole in [src] shut!") - else if(isprox(I) && (build_step == 1)) if(!user.unEquip(I)) return build_step++ to_chat(user, "You add the prox sensor to [src]!") - overlays += "hs_eye" name = "helmet/signaler/prox sensor assembly" qdel(I) @@ -463,7 +437,6 @@ return build_step++ to_chat(user, "You add the robot arm to [src]!") - name = "helmet/signaler/prox sensor/robot arm assembly" overlays += "hs_arm" qdel(I) @@ -473,7 +446,6 @@ return build_step++ to_chat(user, "You complete the Securitron! Beep boop.") - var/mob/living/simple_animal/bot/secbot/S = new /mob/living/simple_animal/bot/secbot S.forceMove(get_turf(src)) S.name = created_name @@ -493,19 +465,16 @@ new /obj/item/device/assembly/signaler(get_turf(src)) new /obj/item/clothing/head/helmet(get_turf(src)) to_chat(user, "You disconnect the signaler from the helmet.") - qdel(src) else if(build_step == 2) overlays -= "hs_eye" new /obj/item/device/assembly/prox_sensor(get_turf(src)) to_chat(user, "You detach the proximity sensor from [src].") - build_step-- else if(build_step == 3) overlays -= "hs_arm" new /obj/item/robot_parts/l_arm(get_turf(src)) to_chat(user, "You remove the robot arm from [src].") - build_step-- \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm index 72b951138b6..a68837ef7ff 100644 --- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm +++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm @@ -178,7 +178,6 @@ Auto Patrol[]"}, if(emagged == 2) if(user) to_chat(user, "You short out [src]'s target assessment circuits.") - oldtarget_name = user.name audible_message("[src] buzzes oddly!") declare_arrests = 0 diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm index fd624d373bd..c988f856ef7 100644 --- a/code/modules/mob/living/simple_animal/bot/floorbot.dm +++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm @@ -98,12 +98,10 @@ amount += loaded if(loaded > 0) to_chat(user, "You load [loaded] tiles into the floorbot. He now contains [amount] tiles.") - nagged = 0 update_icon() else to_chat(user, "You need at least one floor tile to put into [src]!") - else ..() @@ -113,7 +111,6 @@ if(user) to_chat(user, "[src] buzzes and beeps.") - /mob/living/simple_animal/bot/floorbot/Topic(href, href_list) if(..()) return 1 diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm index eb1e5591f46..3534bbf55b2 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -222,11 +222,9 @@ if(istype(W, /obj/item/weapon/reagent_containers/glass)) if(locked) to_chat(user, "You cannot insert a beaker because the panel is locked!") - return if(!isnull(reagent_glass)) to_chat(user, "There is already a beaker loaded!") - return if(!user.drop_item()) return @@ -234,7 +232,6 @@ W.forceMove(src) reagent_glass = W to_chat(user, "You insert [W].") - show_controls(user) return @@ -250,7 +247,6 @@ declare_crit = 0 if(user) to_chat(user, "You short out [src]'s reagent synthesis circuits.") - audible_message("[src] buzzes oddly!") flick("medibot_spark", src) if(user) diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index be1a59d55f2..e2bad0bcd3b 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -116,7 +116,6 @@ ) else to_chat(user, "[src] does not need a repair!") - else if((istype(I, /obj/item/device/multitool) || istype(I, /obj/item/weapon/wirecutters)) && open) return attack_hand(user) else if(load && ismob(load)) // chance to knock off rider @@ -126,7 +125,6 @@ "You knock [load] off [src] with \the [I]!") else to_chat(user, "You hit [src] with \the [I] but to no effect!") - ..() else ..() @@ -139,7 +137,6 @@ if(!open) locked = !locked to_chat(user, "You [locked ? "lock" : "unlock"] the [src]'s controls!") - flick("mulebot-emagged", src) playsound(loc, 'sound/effects/sparks1.ogg', 100, 0) @@ -189,7 +186,6 @@ else if(cell && !open) if(!turn_on()) to_chat(usr, "You can't switch on [src]!") - return else return @@ -254,7 +250,6 @@ return 1 else to_chat(user, "Access denied.") - return 0 // TODO: remove this; PDAs currently depend on it @@ -480,7 +475,6 @@ if(on) var/speed = (wires.Motor1() ? 1 : 0) + (wires.Motor2() ? 2 : 0) // to_chat(world, "speed: [speed]") - var/num_steps = 0 switch(speed) if(0) @@ -524,13 +518,11 @@ if(istype(next, /turf/simulated)) // to_chat(world, "at ([x],[y]) moving to ([next.x],[next.y])") - var/oldloc = loc var/moved = step_towards(src, next) // attempt to move if(cell) cell.use(1) if(moved && oldloc!=loc) // successful move // to_chat(world, "Successful move.") - blockcount = 0 path -= loc @@ -542,7 +534,6 @@ else // failed to move // to_chat(world, "Unable to move.") - blockcount++ mode = BOT_BLOCKED if(blockcount == 3) @@ -563,18 +554,15 @@ else buzz(ANNOYED) // to_chat(world, "Bad turf.") - mode = BOT_NAV return else // to_chat(world, "No path.") - mode = BOT_NAV return if(BOT_NAV) // calculate new path // to_chat(world, "Calc new path.") - mode = BOT_WAIT_FOR_NAV spawn(0) calc_path() @@ -652,7 +640,6 @@ loaddir = dir //The MULE will attempt to load a crate in whatever direction the MULE is "facing". if(calling_ai) to_chat(calling_ai, "\icon[src] [src] wirelessly plays a chiming sound!") - playsound(calling_ai, 'sound/machines/chime.ogg',40, 0) calling_ai = null radio_channel = "AI Private" //Report on AI Private instead if the AI is controlling us. @@ -740,17 +727,13 @@ if("start") if(load) to_chat(src, "DELIVER [load] TO [destination]") - else to_chat(src, "PICK UP DELIVERY AT [destination]") - if("unload") if(load) to_chat(src, "UNLOAD") - else to_chat(src, "LOAD") - if("autoret", "autopick", "target") else ..() diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 002ed319ad6..1d3d2198fcc 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -184,7 +184,6 @@ Auto Patrol: []"}, if(emagged == 2) if(user) to_chat(user, "You short out [src]'s target assessment circuits.") - oldtarget_name = user.name audible_message("[src] buzzes oddly!") declare_arrests = 0 diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 3b1e0020e0b..6c630ec0117 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -54,7 +54,6 @@ to_chat(user, msg) - /mob/living/simple_animal/construct/attack_animal(mob/living/simple_animal/M as mob) if(istype(M, /mob/living/simple_animal/construct/builder)) health += 5 @@ -256,7 +255,6 @@ if(usr.energy<300) to_chat(usr, "\red You do not have enough power stored!") - return if(usr.stat) diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index 4822fbe7cf1..fa49d9bdffd 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -69,11 +69,9 @@ if( istype(inventory_head,/obj/item/clothing/head/helmet) && istype(inventory_back,/obj/item/clothing/suit/armor) ) if( O.force ) to_chat(user, "[src] is wearing too much armor! You can't cause \him any damage.") - visible_message(" [user] hits [src] with [O], however [src] is too armored.") else to_chat(user, "[src] is wearing too much armor! You can't reach \his skin.") - visible_message("[user] gently taps [src] with [O].") if(health>0 && prob(15)) custom_emote(1, "looks at [user] with [pick("an amused","an annoyed","a confused","a resentful", "a happy", "an excited")] expression.") @@ -82,7 +80,6 @@ if (istype(O, /obj/item/weapon/razor)) if (shaved) to_chat(user, "You can't shave this corgi, it's already been shaved!") - return user.visible_message("[user] starts to shave [src] using \the [O].", "You start to shave [src] using \the [O]...") if(do_after(user, 50, target = src)) @@ -111,7 +108,6 @@ if(inventory_head) if(inventory_head.flags & NODROP) to_chat(usr, "\The [inventory_head] is stuck too hard to [src] for you to remove!") - return name = real_name desc = initial(desc) @@ -126,20 +122,17 @@ regenerate_icons() else to_chat(usr, "There is nothing to remove from its [remove_from].") - return if("back") if(inventory_back) if(inventory_back.flags & NODROP) to_chat(usr, "\The [inventory_back] is stuck too hard to [src] for you to remove!") - return inventory_back.loc = src.loc inventory_back = null regenerate_icons() else to_chat(usr, "There is nothing to remove from its [remove_from].") - return show_inv(usr) @@ -158,7 +151,6 @@ if("back") if(inventory_back) to_chat(usr, "It's already wearing something!") - return else var/obj/item/item_to_add = usr.get_active_hand() @@ -185,10 +177,8 @@ if( ! ( item_to_add.type in allowed_types ) ) to_chat(usr, "You set [item_to_add] on [src]'s back, but \he shakes it off!") - if(!usr.drop_item()) to_chat(usr, "\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s back!") - return item_to_add.loc = loc if(prob(25)) @@ -219,7 +209,6 @@ if(inventory_head) if(user) to_chat(user, "You can't put more than one hat on [src]!") - return if(!item_to_add) user.visible_message("[user] pets [src].","You rest your hand on [src]'s head for a moment.") @@ -372,11 +361,9 @@ if(valid) if(user && !user.drop_item()) to_chat(user, "\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s head!") - return 0 if(health <= 0) to_chat(user, "There is merely a dull, lifeless look in [real_name]'s eyes as you put the [item_to_add] on \him.") - else if(user) user.visible_message("[user] puts [item_to_add] on [real_name]'s head. [src] looks at [user] and barks once.", "You put [item_to_add] on [real_name]'s head. [src] gives you a peculiar look, then wags \his tail once and barks.", @@ -388,10 +375,8 @@ else if(user && !user.drop_item()) to_chat(user, "\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s head!") - return 0 to_chat(user, "You set [item_to_add] on [src]'s head, but \he shakes it off!") - item_to_add.loc = loc if(prob(25)) step_rand(item_to_add) @@ -484,7 +469,6 @@ if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations)) if(prob(70)) to_chat(src, "\red You fail to push [tmob]'s fat ass out of the way.") - now_pushing = 0 return if(!(tmob.status_flags & CANPUSH)) @@ -551,7 +535,6 @@ /mob/living/simple_animal/pet/corgi/puppy/Topic(href, href_list) if(href_list["remove_inv"] || href_list["add_inv"]) to_chat(usr, "You can't fit this on [src]!") - return ..() @@ -576,7 +559,6 @@ /mob/living/simple_animal/pet/corgi/Lisa/Topic(href, href_list) if(href_list["remove_inv"] || href_list["add_inv"]) to_chat(usr, "\red [src] already has a cute bow!") - return ..() diff --git a/code/modules/mob/living/simple_animal/friendly/corgi_powers.dm b/code/modules/mob/living/simple_animal/friendly/corgi_powers.dm index a244ce83cf9..dc687743197 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi_powers.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi_powers.dm @@ -3,11 +3,9 @@ set desc = "d'awwww." set category = "Corgi" to_chat(src, text("[pick("You dance around","You chase your tail")].")) - for(var/mob/O in oviewers(src, null)) if ((O.client && !( O.blinded ))) to_chat(O, text("[] [pick("dances around","chases its tail")].", src)) - 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) diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm index 2de110a2fb4..f5880e5ba7d 100644 --- a/code/modules/mob/living/simple_animal/friendly/crab.dm +++ b/code/modules/mob/living/simple_animal/friendly/crab.dm @@ -52,7 +52,6 @@ if(istype(O, /obj/item/weapon/wirecutters)) if(prob(50)) to_chat(user, "\red \b This kills the crab.") - health -= 20 death() else @@ -72,7 +71,6 @@ M.show_message("\blue [user] applies the [MED] on [src]") else to_chat(user, "\blue this [src] is dead, medical items won't bring it back to life.") - else if(O.force) health -= O.force @@ -81,7 +79,6 @@ M.show_message("\red \b [src] has been attacked with the [O] by [user]. ") else to_chat(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]. ") @@ -108,7 +105,6 @@ inventory_head = null else to_chat(usr, "\red There is nothing to remove from its [remove_from].") - return if("mask") if(inventory_mask) @@ -116,7 +112,6 @@ inventory_mask = null else to_chat(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. @@ -128,13 +123,11 @@ var/add_to = href_list["add_inv"] if(!usr.get_active_hand()) to_chat(usr, "\red You have nothing in your hand to put on its [add_to].") - return switch(add_to) if("head") if(inventory_head) to_chat(usr, "\red It's is already wearing something.") - return else var/obj/item/item_to_add = usr.get_active_hand() @@ -177,7 +170,6 @@ if( ! ( item_to_add.type in allowed_types ) ) to_chat(usr, "\red It doesn't seem too keen on wearing that item.") - return usr.drop_item() @@ -241,7 +233,6 @@ if("mask") if(inventory_mask) to_chat(usr, "\red It's already wearing something.") - return else var/obj/item/item_to_add = usr.get_active_hand() @@ -258,7 +249,6 @@ if( ! ( item_to_add.type in allowed_types ) ) to_chat(usr, "\red This object won't fit.") - return usr.drop_item() diff --git a/code/modules/mob/living/simple_animal/friendly/diona.dm b/code/modules/mob/living/simple_animal/friendly/diona.dm index 6c1fb0486dc..4606558d271 100644 --- a/code/modules/mob/living/simple_animal/friendly/diona.dm +++ b/code/modules/mob/living/simple_animal/friendly/diona.dm @@ -54,9 +54,7 @@ if(M.a_intent == I_HELP) if(M.species && M.species.name == "Diona") to_chat(M, "You feel your being twine with that of [src] as it merges with your biomass.") - to_chat(src, "You feel your being twine with that of [M] as you merge with its biomass.") - src.verbs += /mob/living/simple_animal/diona/proc/split src.verbs -= /mob/living/simple_animal/diona/proc/merge src.forceMove(M) @@ -90,11 +88,9 @@ if(istype(M,/mob/living/carbon/human)) to_chat(M, "You feel your being twine with that of [src] as it merges with your biomass.") - M.status_flags |= PASSEMOTES to_chat(src, "You feel your being twine with that of [M] as you merge with its biomass.") - src.loc = M src.verbs += /mob/living/simple_animal/diona/proc/split src.verbs -= /mob/living/simple_animal/diona/proc/merge @@ -111,10 +107,8 @@ return to_chat(src.loc, "You feel a pang of loss as [src] splits away from your biomass.") - to_chat(src, "You wiggle out of the depths of [src.loc]'s biomass and plop to the ground.") - var/mob/living/M = src.loc src.loc = get_turf(src) @@ -170,12 +164,10 @@ if(donors.len < 5) to_chat(src, "You need more blood in order to ascend to a new state of consciousness...") - return if(nutrition < 500) to_chat(src, "You need to binge on weeds in order to have the energy to grow...") - return src.split() @@ -219,12 +211,10 @@ if(M.species.flags & NO_BLOOD) to_chat(src, "That donor has no blood to take.") - return if(donors.Find(M.real_name)) to_chat(src, "That donor offers you nothing new.") - return src.visible_message("[src] flicks out a feeler and neatly steals a sample of [M]'s blood.","You flick out a feeler and neatly steal a sample of [M]'s blood.") @@ -243,16 +233,13 @@ if(donors.len == 5) ready_evolve = 1 to_chat(src, "You feel ready to move on to your next stage of growth.") - else if(donors.len == 3) universal_understand = 1 to_chat(src, "You feel your awareness expand, and realize you know how to understand the creatures around you.") - else to_chat(src, "The blood seeps into your small form, and you draw out the echoes of memories and personality from it, working them into your budding mind.") - /mob/living/simple_animal/diona/put_in_hands(obj/item/W) W.loc = get_turf(src) W.layer = initial(W.layer) @@ -260,7 +247,6 @@ /mob/living/simple_animal/diona/put_in_active_hand(obj/item/W) to_chat(src, "You don't have any hands!") - return /mob/living/simple_animal/diona/emote(var/act, var/m_type=1, var/message = null) diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index 9e5086fd0cc..fd32aa4fd0c 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -82,10 +82,8 @@ milk_content -= transfered else if(G.reagents.total_volume >= G.volume) to_chat(user, "\red \The [O] is full.") - else to_chat(user, "\red The udder is dry. Wait a bit longer...") - else ..() @@ -128,10 +126,8 @@ milk_content -= transfered else if(G.reagents.total_volume >= G.volume) to_chat(user, "\red \The [O] is full.") - else to_chat(user, "\red The udder is dry. Wait a bit longer...") - else ..() @@ -153,7 +149,6 @@ "[src] looks at you with a resigned expression.", "[src] seems resigned to its fate.") to_chat(M, pick(responses)) - else ..() @@ -251,13 +246,10 @@ var/global/chicken_count = 0 qdel(O) eggsleft += rand(1, 4) // to_chat(world, eggsleft) - else to_chat(user, "\blue [name] doesn't seem hungry!") - else to_chat(user, "\blue [name] doesn't seem interested in [O]!") - else ..() diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index dcb54f0eacc..6e8ef064bd5 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -38,7 +38,6 @@ for(var/mob/M in view()) to_chat(M, 'sound/effects/mousesqueek.ogg') - /mob/living/simple_animal/mouse/Life() . = ..() if(stat == UNCONSCIOUS) @@ -106,7 +105,6 @@ /mob/living/simple_animal/mouse/start_pulling(var/atom/movable/AM)//Prevents mouse from pulling things to_chat(src, "You are too small to pull anything.") - return /mob/living/simple_animal/mouse/Crossed(AM as mob|obj) @@ -114,9 +112,7 @@ if(!stat) var/mob/M = AM to_chat(M, "\blue \icon[src] Squeek!") - to_chat(M, 'sound/effects/mousesqueek.ogg') - ..() /mob/living/simple_animal/mouse/death() diff --git a/code/modules/mob/living/simple_animal/friendly/slime.dm b/code/modules/mob/living/simple_animal/friendly/slime.dm index 79e13f85d3d..eac1a448571 100644 --- a/code/modules/mob/living/simple_animal/friendly/slime.dm +++ b/code/modules/mob/living/simple_animal/friendly/slime.dm @@ -26,7 +26,6 @@ if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations)) if(prob(70)) to_chat(src, "\red You fail to push [tmob]'s fat ass out of the way.") - now_pushing = 0 return if(!(tmob.status_flags & CANPUSH)) diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm index c484f6b6164..590dfa47b5e 100644 --- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm +++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm @@ -47,11 +47,9 @@ var/obj/item/device/mmi/B = O if(src.mmi) //There's already a brain in it. to_chat(user, "\red There's already a brain in [src]!") - return if(!B.brainmob) to_chat(user, "\red Sticking an empty MMI into the frame would sort of defeat the purpose.") - return if(!B.brainmob.key) var/ghost_can_reenter = 0 @@ -66,22 +64,18 @@ break if(!ghost_can_reenter) to_chat(user, "[O] is completely unresponsive; there's no point.") - return if(B.brainmob.stat == DEAD) to_chat(user, "\red [O] is dead. Sticking it into the frame would sort of defeat the purpose.") - return if(jobban_isbanned(B.brainmob, "Cyborg") || jobban_isbanned(B.brainmob,"nonhumandept")) to_chat(user, "\red [O] does not seem to fit.") - return to_chat(user, "\blue You install [O] in [src]!") - user.drop_item() src.mmi = O src.transfer_personality(O) @@ -102,15 +96,12 @@ W.show_message(text("\red [user] has spot-welded some of the damage to [src]!"), 1) else to_chat(user, "\blue [src] is undamaged!") - else to_chat(user, "Need more welding fuel!") - return else if(istype(O, /obj/item/weapon/card/id)||istype(O, /obj/item/device/pda)) if (!mmi) to_chat(user, "\red There's no reason to swipe your ID - the spiderbot has no brain to remove.") - return 0 var/obj/item/weapon/card/id/id_card @@ -123,7 +114,6 @@ if(access_robotics in id_card.access) to_chat(user, "\blue You swipe your access card and pop the brain out of [src].") - eject_brain() if(held_item) @@ -133,7 +123,6 @@ return 1 else to_chat(user, "\red You swipe your card, with no effect.") - return 0 else @@ -147,7 +136,6 @@ M.show_message("\red \b [src] has been attacked with the [O] by [user]. ") else to_chat(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]. ") @@ -155,7 +143,6 @@ /mob/living/simple_animal/spiderbot/emag_act(user as mob) if (emagged) to_chat(user, "\red [src] is already overloaded - better run.") - return 0 else emagged = 1 @@ -164,7 +151,6 @@ to_chat(src, "\red Your cell seems to be outputting a lot of power...") spawn(200) to_chat(src, "\red Internal heat sensors are spiking! Something is badly wrong with your cell!") - spawn(300) src.explode() @@ -246,7 +232,6 @@ if(!held_item) to_chat(usr, "\red You have nothing to drop!") - return 0 if(istype(held_item, /obj/item/weapon/grenade)) @@ -275,7 +260,6 @@ if(held_item) to_chat(src, "\red You are already holding \the [held_item]") - return 1 var/list/items = list() @@ -293,15 +277,12 @@ visible_message("\blue [src] scoops up \the [held_item]!", "\blue You grab \the [held_item]!", "You hear a skittering noise and a clink.") return held_item to_chat(src, "\red \The [selection] is too far away.") - return 0 to_chat(src, "\red There is nothing of interest to take.") - return 0 /mob/living/simple_animal/spiderbot/examine(mob/user) ..(user) if(src.held_item) to_chat(user, "It is carrying \a [src.held_item] \icon[src.held_item].") - diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 29d4ed31406..9b1459027e4 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -16,7 +16,6 @@ L.reagents.add_reagent("spidertoxin", poison_per_bite) if(prob(poison_per_bite)) to_chat(L, "You feel a tiny prick.") - L.reagents.add_reagent(poison_type, poison_per_bite) @@ -232,10 +231,8 @@ var/obj/effect/spider/eggcluster/E = locate() in get_turf(src) if(E) to_chat(src, "There is already a cluster of eggs here!") - else if(!fed) to_chat(src, "You are too hungry to do this!") - else if(busy != LAYING_EGGS) busy = LAYING_EGGS src.visible_message("\the [src] begins to lay a cluster of eggs.") diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm index 7aa3e8f0203..9c9ec79fd34 100644 --- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm +++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm @@ -45,11 +45,9 @@ if(C.stat == DEAD) if(C.status_flags & XENO_HOST) to_chat(src, "A foreign presence repels us from this body. Perhaps we should try to infest another?") - return Infect(target) to_chat(src, "With our egg laid, our death approaches rapidly...") - spawn(100) death() return diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm index ade260176ea..0d5d4b89772 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm @@ -297,18 +297,15 @@ var/mob/living/carbon/human/H = M if(inert) to_chat(user, "[src] have become inert, its healing properties are no more.") - return else if(H.stat == DEAD) to_chat(user, "[src] are useless on the dead.") - return if(H != user) H.visible_message("[user] forces [H] to eat [src]... they quickly regenerate all injuries!") else to_chat(user, "You chomp into [src], barely managing to hold it down, but feel amazingly refreshed in mere moments.") - playsound(src.loc,'sound/items/eatfood.ogg', rand(10,50), 1) H.revive() qdel(src) @@ -487,11 +484,9 @@ if(current_armor.["melee"] < 80) current_armor.["melee"] = min(current_armor.["melee"] + 10, 80) to_chat(user, "You strengthen [target], improving its resistance against melee attacks.") - qdel(src) else to_chat(user, "You can't improve [C] any further.") - return if(istype(target, /obj/mecha/working/ripley)) var/obj/mecha/D = target @@ -502,22 +497,18 @@ damage_absorption["fire"] = damage_absorption["fire"] - 0.05 damage_absorption["laser"] = damage_absorption["laser"] - 0.025 to_chat(user, "You strengthen [target], improving its resistance against melee attacks.") - qdel(src) if(D.icon_state == "ripley-open") D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-open") D.desc = "Autonomous Power Loader Unit. Its armour is enhanced with some goliath hide plates." else to_chat(user, "You can't add armour onto the mech while someone is inside!") - if(damage_absorption.["brute"] == 0.3) if(D.icon_state == "ripley-open") D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-full-open") D.desc = "Autonomous Power Loader Unit. It's wearing a fearsome carapace entirely composed of goliath hide plates - the pilot must be an experienced monster hunter." else to_chat(user, "You can't add armour onto the mech while someone is inside!") - else to_chat(user, "You can't improve [D] any further!") - return \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm index 58a44d686f6..82a7f09af80 100644 --- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm +++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm @@ -37,11 +37,9 @@ ..(user) if(health >= maxHealth) to_chat(user, "It looks healthy.") - else to_chat(user, "It looks like it's been roughed up.") - /mob/living/simple_animal/hostile/mushroom/Life() ..() if(!stat)//Mushrooms slowly regenerate if conscious, for people who want to save them from being eaten @@ -133,7 +131,6 @@ qdel(I) else to_chat(user, "[src] won't eat it!") - return if(I.force) Bruise() diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index dd782663516..1f431269e8d 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -65,7 +65,6 @@ icon_state = "angelseen" if(client) to_chat(src, "You cannot move, there are eyes on you!") - return 0 icon_state = "angel" return ..() @@ -103,7 +102,6 @@ icon_state = "angelseen" if(client) to_chat(src, "You cannot attack, there are eyes on you!") - return icon_state = "angelattack" ..() diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 15728458cc2..e4285c98a0b 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -63,7 +63,6 @@ playsound(loc, O.hitsound, 25, 1, -1) else to_chat(usr, "\red This weapon is ineffective, it does no damage.") - visible_message("\red [user] gently taps [src] with the [O]. ") diff --git a/code/modules/mob/living/simple_animal/hostile/winter_mobs.dm b/code/modules/mob/living/simple_animal/hostile/winter_mobs.dm index 6f7d0a5a07c..0ecab13b44a 100644 --- a/code/modules/mob/living/simple_animal/hostile/winter_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/winter_mobs.dm @@ -125,13 +125,9 @@ /mob/living/simple_animal/hostile/winter/santa/stage_4/death() to_chat(world, "
      ") - to_chat(world, "THE FAT MAN HAS FALLEN!") - to_chat(world, "SANTA CLAUS HAS BEEN DEFEATED!") - to_chat(world, "
      ") - ..() var/obj/item/weapon/grenade/clusterbuster/xmas/X = new /obj/item/weapon/grenade/clusterbuster/xmas(get_turf(src)) var/obj/item/weapon/grenade/clusterbuster/xmas/Y = new /obj/item/weapon/grenade/clusterbuster/xmas(get_turf(src)) diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 7c3dc5d0516..858ae10fc18 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -158,20 +158,17 @@ possible_phrase = copytext(possible_phrase,3,length(possible_phrase)) else to_chat(usr, "\red There is nothing to remove from its [remove_from].") - return show_inv(usr) else if(href_list["add_inv"]) var/add_to = href_list["add_inv"] if(!usr.get_active_hand()) to_chat(usr, "\red You have nothing in your hand to put on its [add_to].") - return switch(add_to) if("ears") if(ears) to_chat(usr, "\red It's already wearing something.") - return else var/obj/item/item_to_add = usr.get_active_hand() @@ -180,7 +177,6 @@ if( !istype(item_to_add, /obj/item/device/radio/headset) ) to_chat(usr, "\red This object won't fit.") - return var/obj/item/device/radio/headset/headset_to_add = item_to_add @@ -190,7 +186,6 @@ src.ears = headset_to_add to_chat(usr, "You fit the headset onto [src].") - clearlist(available_channels) for(var/ch in headset_to_add.channels) switch(ch) @@ -574,7 +569,6 @@ if(held_item) to_chat(src, "\red You are already holding the [held_item]") - return 1 for(var/obj/item/I in view(1,src)) @@ -591,7 +585,6 @@ return held_item to_chat(src, "\red There is nothing of interest to take.") - return 0 /mob/living/simple_animal/parrot/proc/steal_from_mob() @@ -604,7 +597,6 @@ if(held_item) to_chat(src, "\red You are already holding the [held_item]") - return 1 var/obj/item/stolen_item = null @@ -624,7 +616,6 @@ return held_item to_chat(src, "\red There is nothing of interest to take.") - return 0 /mob/living/simple_animal/parrot/verb/drop_held_item_player() @@ -649,7 +640,6 @@ if(!held_item) to_chat(usr, "\red You have nothing to drop!") - return 0 if(!drop_gently) @@ -658,13 +648,11 @@ G.loc = src.loc G.prime() to_chat(src, "You let go of the [held_item]!") - held_item = null return 1 to_chat(src, "You drop the [held_item].") - held_item.loc = src.loc held_item = null return 1 @@ -685,7 +673,6 @@ icon_state = "parrot_sit" return to_chat(src, "\red There is no perch nearby to sit on.") - return /* diff --git a/code/modules/mob/living/simple_animal/powers.dm b/code/modules/mob/living/simple_animal/powers.dm index 9df6a9c8110..934c93bb3ad 100644 --- a/code/modules/mob/living/simple_animal/powers.dm +++ b/code/modules/mob/living/simple_animal/powers.dm @@ -9,16 +9,12 @@ if (layer != TURF_LAYER+0.2) layer = TURF_LAYER+0.2 to_chat(src, text("\green You are now hiding.")) - for(var/mob/O in oviewers(src, null)) if ((O.client && !( O.blinded ))) to_chat(O, text("[] scurries to the ground!", src)) - else layer = MOB_LAYER to_chat(src, text("\green You have stopped hiding.")) - for(var/mob/O in oviewers(src, null)) if ((O.client && !( O.blinded ))) to_chat(O, text("[] slowly peaks up from the ground...", src)) - diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm index c9b801734e8..0e01aa51894 100644 --- a/code/modules/mob/living/simple_animal/shade.dm +++ b/code/modules/mob/living/simple_animal/shade.dm @@ -49,7 +49,6 @@ M.show_message("\red \b [src] has been attacked with the [O] by [user]. ") else to_chat(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]. ") diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index a92410d069f..c9be5919f43 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -386,7 +386,6 @@ /mob/living/simple_animal/attack_slime(mob/living/carbon/slime/M as mob) if (!ticker) to_chat(M, "You cannot attack people before the game has started.") - return if(M.Victim) return // can't attack while eating! @@ -425,15 +424,12 @@ return else to_chat(user, "\blue [MED] won't help at all.") - return else to_chat(user, "\blue [src] is at full health.") - return else to_chat(user, "\blue [src] is dead, medical items won't bring it back to life.") - return else if(can_collar && !collar && istype(O, /obj/item/clothing/accessory/petcollar)) var/obj/item/clothing/accessory/petcollar/C = O @@ -443,7 +439,6 @@ collar.equipped(src) regenerate_icons() to_chat(usr, "You put \the [C] around \the [src]'s neck.") - if(C.tagname) name = C.tagname real_name = C.tagname @@ -661,7 +656,6 @@ if(collar) if(collar.flags & NODROP) to_chat(usr, "\The [collar] is stuck too hard to [src] for you to remove!") - return collar.dropped(src) collar.forceMove(src.loc) @@ -669,7 +663,6 @@ regenerate_icons() else to_chat(usr, "There is nothing to remove from its [remove_from].") - return show_inv(usr) else if(href_list["add_inv"]) @@ -691,7 +684,6 @@ collar.equipped(src) regenerate_icons() to_chat(usr, "You put \the [C] around \the [src]'s neck.") - if(C.tagname) name = C.tagname real_name = C.tagname diff --git a/code/modules/mob/living/simple_animal/tribbles.dm b/code/modules/mob/living/simple_animal/tribbles.dm index c78645ce45d..23def05f072 100644 --- a/code/modules/mob/living/simple_animal/tribbles.dm +++ b/code/modules/mob/living/simple_animal/tribbles.dm @@ -54,10 +54,8 @@ var/global/totaltribbles = 0 //global variable so it updates for all tribbles, /mob/living/simple_animal/tribble/attackby(var/obj/item/weapon/O as obj, var/mob/user as mob, params) if(istype(O, /obj/item/weapon/scalpel)) to_chat(user, "You try to neuter the tribble, but it's moving too much and you fail!") - else if(istype(O, /obj/item/weapon/cautery)) to_chat(user, "You try to un-neuter the tribble, but it's moving too much and you fail!") - ..() @@ -100,7 +98,6 @@ var/global/totaltribbles = 0 //global variable so it updates for all tribbles, ..() to_chat(user, "You nuzzle the tribble and it trills softly.") - /obj/item/toy/tribble/dropped(mob/user as mob) //now you can't item form them to get rid of them all so easily ..() new /mob/living/simple_animal/tribble(user.loc) @@ -111,7 +108,6 @@ var/global/totaltribbles = 0 //global variable so it updates for all tribbles, T.gestation = src.gestation to_chat(user, "The tribble gets up and wanders around.") - qdel(src) /obj/item/toy/tribble/attackby(var/obj/item/weapon/O as obj, var/mob/user as mob) //neutering and un-neutering @@ -119,14 +115,12 @@ var/global/totaltribbles = 0 //global variable so it updates for all tribbles, if(istype(O, /obj/item/weapon/scalpel) && src.gestation != null) gestation = null to_chat(user, "You neuter the tribble so that it can no longer re-produce.") - else if (istype(O, /obj/item/weapon/cautery) && src.gestation == null) gestation = 0 to_chat(user, "You fuse some recently cut tubes together, it should be able to reproduce again.") - //|| Tribble Cage - Lovingly lifted from the lamarr-cage || /obj/structure/tribble_cage name = "Lab Cage" @@ -202,11 +196,9 @@ var/global/totaltribbles = 0 //global variable so it updates for all tribbles, return else to_chat(usr, text("\blue You kick the lab cage.")) - for(var/mob/O in oviewers()) if ((O.client && !( O.blinded ))) to_chat(O, text("\red [] kicks the lab cage.", usr)) - src.health -= 2 healthcheck() return diff --git a/code/modules/mob/living/simple_animal/vox.dm b/code/modules/mob/living/simple_animal/vox.dm index 78fff8e8c86..3b34ddaf143 100644 --- a/code/modules/mob/living/simple_animal/vox.dm +++ b/code/modules/mob/living/simple_animal/vox.dm @@ -47,7 +47,6 @@ M.show_message("\red \b The [O] bounces harmlessly off of [src]. ") else to_chat(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]. ") @@ -62,12 +61,10 @@ return to_chat(src, "\red You launch a razor-sharp quill at [target]!") - for(var/mob/O in oviewers()) if ((O.client && !( O.blinded ))) to_chat(O, "\red [src] launches a razor-sharp quill at [target]!") - var/obj/item/weapon/arrow/quill/Q = new(loc) Q.fingerprintslast = src.ckey Q.throw_at(target,10,30) @@ -75,7 +72,6 @@ spawn(100) to_chat(src, "\red You feel a fresh quill slide into place.") - quills++ /mob/living/simple_animal/vox/armalis/verb/message_mob() @@ -98,17 +94,14 @@ if(istype(M, /mob/dead/observer) || M.stat == DEAD) to_chat(src, "Not even the armalis can speak to the dead.") - return to_chat(M, "\blue Like lead slabs crashing into the ocean, alien thoughts drop into your mind: [text]") - if(istype(M,/mob/living/carbon/human)) var/mob/living/carbon/human/H = M if(H.species.name == "Vox") return to_chat(H, "\red Your nose begins to bleed...") - H.drip(1) /mob/living/simple_animal/vox/armalis/verb/shriek() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 739c70e2446..92b05eda277 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -48,7 +48,6 @@ for(var/datum/gas/trace_gas in environment.trace_gases) to_chat(usr, "\blue [trace_gas.type]: [trace_gas.moles] \n") - usr.show_message(t, 1) /mob/proc/show_message(msg, type, alt, alt_type)//Message, type of message (1 or 2), alternative message, alt message type (1 or 2) @@ -73,10 +72,8 @@ // Added voice muffling for Issue 41. if(stat == UNCONSCIOUS || (sleeping > 0 && stat != 2)) to_chat(src, "... You can almost hear someone talking ...") - else to_chat(src, msg) - return // Show a message to all mobs in sight of this one @@ -176,7 +173,6 @@ if(C.rig_restrict_helmet) to_chat(src, "\red You must fasten the helmet to a hardsuit first. (Target the head and use on a hardsuit)")// Stop eva helms equipping. - else equip_to_slot_if_possible(C, slot) else @@ -213,7 +209,6 @@ if(!disable_warning) to_chat(src, "\red You are unable to equip that.")//Only print if del_on_fail is false - return 0 equip_to_slot(W, slot, redraw_mob) //This proc should not ever fail. @@ -356,7 +351,6 @@ var/list/slot_equipment_priority = list( \ if(!H.w_uniform) if(!disable_warning) to_chat(H, "\red You need a jumpsuit before you can attach this [name].") - return 0 if( !(slot_flags & SLOT_BELT) ) return 0 @@ -417,7 +411,6 @@ var/list/slot_equipment_priority = list( \ if(!H.w_uniform) if(!disable_warning) to_chat(H, "\red You need a jumpsuit before you can attach this [name].") - return 0 if( !(slot_flags & SLOT_ID) ) return 0 @@ -433,7 +426,6 @@ var/list/slot_equipment_priority = list( \ if(!H.w_uniform) if(!disable_warning) to_chat(H, "\red You need a jumpsuit before you can attach this [name].") - return 0 if(slot_flags & SLOT_DENYPOCKET) return @@ -445,7 +437,6 @@ var/list/slot_equipment_priority = list( \ if(!H.w_uniform) if(!disable_warning) to_chat(H, "\red You need a jumpsuit before you can attach this [name].") - return 0 if(slot_flags & SLOT_DENYPOCKET) return 0 @@ -456,17 +447,14 @@ var/list/slot_equipment_priority = list( \ if(!H.wear_suit) if(!disable_warning) to_chat(H, "\red You need a suit before you can attach this [name].") - return 0 if(!H.wear_suit.allowed) if(!disable_warning) to_chat(usr, "You somehow have a suit with no defined allowed items for suit storage, stop that.") - return 0 if(src.w_class > 4) if(!disable_warning) to_chat(usr, "The [name] is too big to attach.") - return 0 if( istype(src, /obj/item/device/pda) || istype(src, /obj/item/weapon/pen) || is_type_in_list(src, H.wear_suit.allowed) ) if(H.s_store) @@ -534,7 +522,6 @@ var/list/slot_equipment_priority = list( \ if((is_blind(src) || usr.stat) && !isobserver(src)) to_chat(src, "Something is there but you can't see it.") - return 1 face_atom(A) @@ -642,7 +629,6 @@ var/list/slot_equipment_priority = list( \ else to_chat(src, "The game appears to have misplaced your mind datum, so we can't show you your notes.") - /mob/verb/add_memory(msg as message) set name = "Add Note" set category = "IC" @@ -655,7 +641,6 @@ var/list/slot_equipment_priority = list( \ else to_chat(src, "The game appears to have misplaced your mind datum, so we can't show you your notes.") - /mob/proc/store_memory(msg as message, popup, sane = 1) msg = copytext(msg, 1, MAX_MESSAGE_LEN) @@ -674,7 +659,6 @@ var/list/slot_equipment_priority = list( \ set src in usr if(usr != src) to_chat(usr, "No.") - var/msg = input(usr,"Set the flavor text in your 'examine' verb. Can also be used for OOC notes about your character.","Flavor Text",html_decode(flavor_text)) as message|null if(msg != null) @@ -703,19 +687,16 @@ var/list/slot_equipment_priority = list( \ if (!abandon_allowed) to_chat(usr, "Respawning is disabled.") - return if (stat != DEAD || !ticker) to_chat(usr, "You must be dead to use this!") - return log_game("[key_name(usr)] has respawned.") to_chat(usr, "Make sure to play a different character, and please roleplay correctly!") - if(!client) log_game("[key_name(usr)] respawn failed due to disconnect.") return @@ -744,7 +725,6 @@ var/list/slot_equipment_priority = list( \ is_admin = 1 else if(stat != DEAD || istype(src, /mob/new_player)) to_chat(usr, "\blue You must be observing to use this!") - return if(is_admin && stat == DEAD) @@ -960,7 +940,6 @@ var/list/slot_equipment_priority = list( \ if(!is_active()) return 0 to_chat(src, message) - return 1 /mob/proc/is_muzzled() @@ -1209,12 +1188,10 @@ mob/proc/yank_out_object() if(usr.stat == 1) to_chat(usr, "You are unconcious and cannot do that!") - return if(usr.restrained()) to_chat(usr, "You are restrained and cannot do that!") - return var/mob/S = src @@ -1229,21 +1206,17 @@ mob/proc/yank_out_object() if(!valid_objects.len) if(self) to_chat(src, "You have nothing stuck in your body that is large enough to remove.") - else to_chat(U, "[src] has nothing stuck in their wounds that is large enough to remove.") - return var/obj/item/weapon/selection = input("What do you want to yank out?", "Embedded objects") in valid_objects if(self) to_chat(src, "You attempt to get a good grip on [selection] in your body.") - else to_chat(U, "You attempt to get a good grip on [selection] in [S]'s body.") - if(!do_after(U, 80, target = S)) return if(!selection || !S || !U) @@ -1298,12 +1271,10 @@ mob/proc/yank_out_object() if(jobban_isbanned(usr, "NPC")) to_chat(usr, "You are banned from playing as NPC's.") - return if(!ticker || ticker.current_state < 3) to_chat(src, "You can't respawn as an NPC before the game starts!") - return if((usr in respawnable_list) && (stat==2 || istype(usr,/mob/dead/observer))) @@ -1328,7 +1299,6 @@ mob/proc/yank_out_object() respawnable_list += usr else to_chat(usr, "You are not dead or you have given up your right to be respawned!") - return @@ -1338,7 +1308,6 @@ mob/proc/yank_out_object() var/timedifference_text timedifference_text = time2text(mouse_respawn_time * 600 - timedifference,"mm:ss") to_chat(src, "You may only spawn again as a mouse more than [mouse_respawn_time] minutes after your death. You have [timedifference_text] left.") - return //find a viable mouse candidate @@ -1354,12 +1323,10 @@ mob/proc/yank_out_object() else to_chat(src, "Unable to find any unwelded vents to spawn mice at.") - if(host) host.ckey = src.ckey to_chat(host, "You are now a mouse. Try to avoid interaction with players, and do not give hints away that you are more than a simple rodent.") - /mob/proc/assess_threat() //For sec bot threat assessment return diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index 72e3286525f..fcbcd410a89 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -263,7 +263,6 @@ else if(state < GRAB_NECK) if(isslime(affecting)) to_chat(assailant, "You squeeze [affecting], but nothing interesting happens.") - return assailant.visible_message("[assailant] has reinforced \his grip on [affecting] (now neck)!") @@ -320,7 +319,6 @@ if(I_HELP) /*if(force_down) to_chat(assailant, "You no longer pin [affecting] to the ground.") - force_down = 0 return*///This is a very basic demonstration of a new feature based on attacking someone with the grab, based on intent. //This specific example would allow you to stop pinning people to the floor without moving away from them. @@ -348,21 +346,17 @@ /*if(last_hit_zone == "eyes") if(state < GRAB_NECK) to_chat(assailant, "You require a better grab to do this.") - return if((affected.head && affected.head.flags & HEADCOVERSEYES) || \ (affected.wear_mask && affected.wear_mask.flags & MASKCOVERSEYES) || \ (affected.glasses && affected.glasses.flags & GLASSESCOVERSEYES)) to_chat(assailant, "You're going to need to remove the eye covering first.") - return if(!affected.internal_organs_by_name["eyes"]) to_chat(assailant, "You cannot locate any eyes on [affecting]!") - return assailant.visible_message("[assailant] presses \his fingers into [affecting]'s eyes!") to_chat(affecting, "You feel immense pain as digits are being pressed into your eyes!") - assailant.attack_log += text("\[[time_stamp()]\] Pressed fingers into the eyes of [affecting.name] ([affecting.ckey])") affecting.attack_log += text("\[[time_stamp()]\] Had fingers pressed into their eyes by [assailant.name] ([assailant.ckey])") msg_admin_attack("[key_name(assailant)] has pressed his fingers into [key_name(affecting)]'s eyes.") @@ -372,13 +366,11 @@ if(M.stat != 2) to_chat(M, "\red You go blind!")*///This is a demonstration of adding a new damaging type based on intent as well as hitzone. - //This specific example would allow you to squish people's eyes with a GRAB_NECK. if(I_DISARM) //This checks that the user is on disarm intent. /* if(state < GRAB_AGGRESSIVE) to_chat(assailant, "You require a better grab to do this.") - return if(!force_down) assailant.visible_message("[user] is forcing [affecting] to the ground!") @@ -391,7 +383,6 @@ return else to_chat(assailant, "You are already pinning [affecting] to the ground.") - return*///This is an example of something being done with an agressive grab + disarm intent. return diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 9abffc4284c..1f2e0e7b456 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -474,7 +474,6 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM) if(usr.sleeping) to_chat(usr, "\red You are already sleeping") - return else if(alert(src,"You sure you want to sleep for a while?","Sleep","Yes","No") == "Yes") @@ -487,7 +486,6 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM) resting = !resting to_chat(src, "\blue You are now [resting ? "resting" : "getting up"]") - /proc/is_blind(A) if(iscarbon(A)) var/mob/living/carbon/C = A @@ -558,16 +556,13 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM) lname = "[lname] " to_chat(M, "[lname][follow][message]") - /proc/notify_ghosts(var/message, var/ghost_sound = null) //Easy notification of ghosts. for(var/mob/dead/observer/O in player_list) if(O.client) to_chat(O, "[message]") - if(ghost_sound) to_chat(O, sound(ghost_sound)) - /mob/proc/switch_to_camera(var/obj/machinery/camera/C) if (!C.can_use() || stat || (get_dist(C, src) > 1 || machine != src || blinded || !canmove)) return 0 @@ -649,7 +644,6 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM) break //That's a suitable name! to_chat(src, "Sorry, that [role]-name wasn't appropriate, please try another. It's possibly too long/short, has bad characters or is already taken.") - if(!newname) //we'll stick with the oldname then return diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 71ab4ba944f..68913c6ad25 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -51,13 +51,11 @@ var/module = R.get_selected_module() if(!module) to_chat(usr, "\red You have no module selected.") - return R.cycle_modules() R.uneq_numbered(module) else to_chat(usr, "\red This mob type cannot throw items.") - return @@ -66,19 +64,16 @@ var/mob/living/carbon/C = usr if(!C.get_active_hand()) to_chat(usr, "\red You have nothing to drop in your hand.") - return drop_item() else if(isrobot(usr)) var/mob/living/silicon/robot/R = usr if(!R.get_selected_module()) to_chat(usr, "\red You have no module selected.") - return R.deselect_module(R.get_selected_module()) else to_chat(usr, "\red This mob type cannot drop items.") - return //This gets called when you press the delete button. @@ -87,7 +82,6 @@ if(!usr.pulling) to_chat(usr, "\blue You are not pulling anything.") - return usr.stop_pulling() @@ -234,14 +228,12 @@ if(M.pulling == mob) if(!M.restrained() && M.stat == 0 && M.canmove && mob.Adjacent(M)) to_chat(src, "\blue You're restrained! You can't move!") - return 0 else M.stop_pulling() if(mob.pinned.len) to_chat(src, "\blue You're pinned to a wall by [mob.pinned[1]]!") - return 0 var/turf/T = mob.loc @@ -401,7 +393,6 @@ var/turf/simulated/floor/stepTurf = get_step(L, direct) if(stepTurf.flags & NOJAUNT) to_chat(L, "Holy energies block your path.") - L.notransform = 1 spawn(2) L.notransform = 0 @@ -451,7 +442,6 @@ to_chat(src, "You push off of [dense_object_backup] to propel yourself.") - return 1 return 0 diff --git a/code/modules/mob/mob_transformation_simple.dm b/code/modules/mob/mob_transformation_simple.dm index d60c4d7d9a0..856879acf38 100644 --- a/code/modules/mob/mob_transformation_simple.dm +++ b/code/modules/mob/mob_transformation_simple.dm @@ -6,7 +6,6 @@ if(istype(src,/mob/new_player)) to_chat(usr, "\red cannot convert players who have not entered yet.") - return if(!new_type) @@ -17,12 +16,10 @@ if( !ispath(new_type) ) to_chat(usr, "Invalid type path (new_type = [new_type]) in change_mob_type(). Contact a coder.") - return if( new_type == /mob/new_player ) to_chat(usr, "\red cannot convert into a new_player mob type.") - return var/mob/M @@ -33,7 +30,6 @@ if(!M || !ismob(M)) to_chat(usr, "Type path is not a mob (new_type = [new_type]) in change_mob_type(). Contact a coder.") - qdel(M) return diff --git a/code/modules/mob/new_player/login.dm b/code/modules/mob/new_player/login.dm index 44db9388315..f6e2441e876 100644 --- a/code/modules/mob/new_player/login.dm +++ b/code/modules/mob/new_player/login.dm @@ -3,7 +3,6 @@ if(join_motd) to_chat(src, "
      [join_motd]
      ") - if(!mind) mind = new /datum/mind(key) mind.active = 1 diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index d539b051208..ffb6f6c13b8 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -121,12 +121,10 @@ to_chat(src, sound(null, repeat = 0, wait = 0, volume = 85, channel = 1))// MAD JAMS cant last forever yo - observer.started_as_observer = 1 close_spawn_windows() var/obj/O = locate("landmark*Observer-Start") to_chat(src, "\blue Now teleporting.") - observer.loc = O.loc observer.timeofdeath = world.time // Set the time of death so that the respawn timer works correctly. client.prefs.update_preview_icon(1) @@ -147,14 +145,12 @@ if(href_list["late_join"]) if(!ticker || ticker.current_state != GAME_STATE_PLAYING) to_chat(usr, "\red The round is either not ready, or has already finished...") - return if(client.prefs.species in whitelisted_species) if(!is_alien_whitelisted(src, client.prefs.species) && config.usealienwhitelist) to_chat(src, alert("You are currently not whitelisted to play [client.prefs.species].")) - return 0 LateChoices() @@ -166,13 +162,11 @@ if(!enter_allowed) to_chat(usr, "\blue There is an administrative lock on entering the game!") - return if(client.prefs.species in whitelisted_species) if(!is_alien_whitelisted(src, client.prefs.species) && config.usealienwhitelist) to_chat(src, alert("You are currently not whitelisted to play [client.prefs.species].")) - return 0 AttemptLateSpawn(href_list["SelectedJob"],client.prefs.spawnpoint) @@ -214,7 +208,6 @@ if( (id_max - id_min) > 100 ) //Basic exploit prevention to_chat(usr, "The option ID difference is too big. Please contact administration or the database admin.") - return for(var/optionid = id_min; optionid <= id_max; optionid++) @@ -234,7 +227,6 @@ if( (id_max - id_min) > 100 ) //Basic exploit prevention to_chat(usr, "The option ID difference is too big. Please contact administration or the database admin.") - return for(var/optionid = id_min; optionid <= id_max; optionid++) @@ -267,15 +259,12 @@ return 0 if(!ticker || ticker.current_state != GAME_STATE_PLAYING) to_chat(usr, "\red The round is either not ready, or has already finished...") - return 0 if(!enter_allowed) to_chat(usr, "\blue There is an administrative lock on entering the game!") - return 0 if(!IsJobAvailable(rank)) to_chat(src, alert("[rank] is not available. Please try another.")) - return 0 job_master.AssignRole(src, rank, 1) @@ -315,7 +304,6 @@ join_message = S.msg else to_chat(character, "Your chosen spawnpoint ([S.display_name]) is unavailable for your chosen job. Spawning you at the Arrivals shuttle instead.") - character.loc = pick(latejoin) join_message = "has arrived on the station" else @@ -431,7 +419,6 @@ to_chat(src, sound(null, repeat = 0, wait = 0, volume = 85, channel = 1))// MAD JAMS cant last forever yo - if(mind) mind.active = 0 //we wish to transfer the key manually if(mind.assigned_role == "Clown") //give them a clownname if they are a clown diff --git a/code/modules/mob/new_player/poll.dm b/code/modules/mob/new_player/poll.dm index 11aa3b9a084..4ce44be1fd8 100644 --- a/code/modules/mob/new_player/poll.dm +++ b/code/modules/mob/new_player/poll.dm @@ -60,7 +60,6 @@ if(!found) to_chat(usr, "\red Poll question details not found.") - return switch(polltype) @@ -318,7 +317,6 @@ if(!validpoll) to_chat(usr, "\red Poll is not valid.") - return var/DBQuery/select_query2 = dbcon.NewQuery("SELECT id FROM [format_table_name("poll_option")] WHERE id = [optionid] AND pollid = [pollid]") @@ -332,7 +330,6 @@ if(!validoption) to_chat(usr, "\red Poll option is not valid.") - return var/alreadyvoted = 0 @@ -347,12 +344,10 @@ if(!multichoice && alreadyvoted) to_chat(usr, "\red You already voted in this poll.") - return if(multichoice && (alreadyvoted >= multiplechoiceoptions)) to_chat(usr, "\red You already have more than [multiplechoiceoptions] logged votes on this poll. Enough is enough. Contact the database admin if this is an error.") - return var/adminrank = "Player" @@ -364,7 +359,6 @@ insert_query.Execute() to_chat(usr, "\blue Vote successful.") - usr << browse(null,"window=playerpoll") @@ -390,7 +384,6 @@ if(!validpoll) to_chat(usr, "\red Poll is not valid.") - return var/alreadyvoted = 0 @@ -404,7 +397,6 @@ if(alreadyvoted) to_chat(usr, "\red You already sent your feedback for this poll.") - return var/adminrank = "Player" @@ -419,14 +411,12 @@ if(!text_pass) to_chat(usr, "The text you entered was blank, contained illegal characters or was too long. Please correct the text and submit again.") - return var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO [format_table_name("poll_textreply")] (id ,datetime ,pollid ,ckey ,ip ,replytext ,adminrank) VALUES (null, Now(), [pollid], '[usr.ckey]', '[usr.client.address]', '[replytext]', '[adminrank]')") insert_query.Execute() to_chat(usr, "\blue Feedback logging successful.") - usr << browse(null,"window=playerpoll") @@ -452,7 +442,6 @@ if(!validpoll) to_chat(usr, "\red Poll is not valid.") - return var/DBQuery/select_query2 = dbcon.NewQuery("SELECT id FROM [format_table_name("poll_option")] WHERE id = [optionid] AND pollid = [pollid]") @@ -466,7 +455,6 @@ if(!validoption) to_chat(usr, "\red Poll option is not valid.") - return var/alreadyvoted = 0 @@ -480,7 +468,6 @@ if(alreadyvoted) to_chat(usr, "\red You already voted in this poll.") - return var/adminrank = "Player" @@ -492,5 +479,4 @@ insert_query.Execute() to_chat(usr, "\blue Vote successful.") - usr << browse(null,"window=playerpoll") \ No newline at end of file diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index 5cb41408c45..e5b12ed022b 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -43,12 +43,10 @@ if(!src.client.holder) if(!config.dsay_allowed) to_chat(src, "Deadchat is globally muted.") - return if(client && !(client.prefs.toggles & CHAT_DEAD)) to_chat(usr, "You have deadchat muted.") - return say_dead_direct("[pick("complains","moans","whines","laments","blubbers")], \"[message]\"", src) diff --git a/code/modules/mob/spirit/mask/mask.dm b/code/modules/mob/spirit/mask/mask.dm index 2777905e9d4..8ae366ef16a 100644 --- a/code/modules/mob/spirit/mask/mask.dm +++ b/code/modules/mob/spirit/mask/mask.dm @@ -21,7 +21,6 @@ to_chat(src, "You start following [cultist.get_display_name()].") - /mob/spirit/mask/verb/urge_cultist() set category = "Mask" set name = "Urge cultist" @@ -33,7 +32,6 @@ var/newUrge = stripped_input(usr, "", "Set Urge", "") cultist.set_urge(newUrge) to_chat(src, "You urge [cultist.owner.name] to [newUrge].") - cult_log("controlled by [key_name_admin(src)] has urged [key_name_admin(cultist.owner)] to [newUrge].") /mob/spirit/mask/verb/set_cult_name() @@ -48,7 +46,6 @@ return cultist.set_cult_name(newName) to_chat(src, "You grant [cultist.owner.name] the secret name of [newName].") - if (cultist.owner) cult_log("[key_name_admin(src)] has set [key_name_admin(cultist.owner)] to \'[newName]\'") @@ -62,7 +59,6 @@ for(var/obj/cult_viewpoint/viewpoint in cult_viewpoints) viewpoint.set_urge(newUrge) to_chat(src, "You urge the entire cult to [newUrge].") - cult_log("[key_name_admin(src)] has urged the entire cult to [newUrge]") @@ -95,7 +91,6 @@ to_chat(src, "You have set your name to [name].") - /mob/spirit/mask/proc/pick_cultist() var/list/cultists = list() for(var/obj/cult_viewpoint/viewpoint in cult_viewpoints) @@ -139,12 +134,10 @@ for(var/datum/mind/H in ticker.mode.cult) if (H.current) to_chat(H.current, "[usr.name]: [input]") - for(var/mob/spirit/spirit in spirits) to_chat(spirit, "[usr.name]: [input]") - /obj/effect/proc_holder/spell/aoe_turf/shatter_lights name = "Spread Shadows" desc = "This spell breaks lights near the mask." @@ -202,7 +195,6 @@ var/imbue_value = talismans[talisman] if (!talisman) to_chat(usr, "You choose not to create a talisman.") - revert_cast(usr) return @@ -215,7 +207,6 @@ var/target_rune = input("Pick a teleport target", "Teleport Rune", null, null) as null|anything in engwords if (!target_rune) to_chat(usr, "You choose not to create a talisman.") - revert_cast(usr) return summon_type = list(/obj/item/weapon/paper/talisman) diff --git a/code/modules/mob/spirit/movement.dm b/code/modules/mob/spirit/movement.dm index 65b2a8c1bbe..65a992c1932 100644 --- a/code/modules/mob/spirit/movement.dm +++ b/code/modules/mob/spirit/movement.dm @@ -38,11 +38,9 @@ mob/spirit/proc/Spirit_Move(direct) if (!currentView) to_chat(U, "As a spirit, you may only track cultists.") - U.follow_target = target to_chat(U, "Now following [currentView.get_cult_name()].") - spawn (0) while (U.follow_target == target) if (U.follow_target == null) @@ -61,4 +59,3 @@ mob/spirit/verb/toggle_acceleration() acceleration = !acceleration to_chat(usr, "Acceleration has been toggled [acceleration ? "on" : "off"].") - diff --git a/code/modules/mob/spirit/spirit.dm b/code/modules/mob/spirit/spirit.dm index 116191ef851..a9b10f8224f 100644 --- a/code/modules/mob/spirit/spirit.dm +++ b/code/modules/mob/spirit/spirit.dm @@ -58,14 +58,11 @@ mob/spirit/Topic(href, href_list) ..() to_chat(usr, "Spirit Href = [href]") - for (var/tempref in href_list) to_chat(usr, "Spirit href list [tempref] = [href_list[tempref]]") - if (href_list["track"]) to_chat(usr, "Got to tracking.") - var/mob/target = locate(href_list["track"]) in mob_list var/mob/spirit/A = locate(href_list["track2"]) in spirits if(A && target) diff --git a/code/modules/mob/spirit/viewpoint.dm b/code/modules/mob/spirit/viewpoint.dm index 240672b21a7..90814317124 100644 --- a/code/modules/mob/spirit/viewpoint.dm +++ b/code/modules/mob/spirit/viewpoint.dm @@ -37,12 +37,10 @@ var/obj/cult_viewpoint/list/cult_viewpoints = list() set src in usr if (src.urge) to_chat(owner, "\red \b You feel the urge to [src.urge]") - else to_chat(owner, "\b You feel no supernatural compulsions.") - /obj/cult_viewpoint/verb/reach_out() set category = "Cult" set desc = "Reach out for your gods presence." @@ -52,13 +50,10 @@ var/obj/cult_viewpoint/list/cult_viewpoints = list() for(var/mob/spirit/mask/currentMask in spirits) if (currentMask.is_active()) to_chat(owner, "\red \b You feel the reassuring presence of your god.") - to_chat(currentMask, "[get_display_name()] has reached out to you.") - return to_chat(owner, "\b You feel a chilling absence.") - handle_missing_mask() @@ -70,15 +65,12 @@ var/obj/cult_viewpoint/list/cult_viewpoints = list() switch(favor) if(FAVOR_PLEASED) to_chat(owner, "\red \b You bask in your gods favor.") - if(FAVOR_INDIFFERENT) to_chat(owner, "\red \b You feel nothing.") - if(FAVOR_DISPLEASED) to_chat(owner, "\red \b You cringe at your gods displeasure.") - /obj/cult_viewpoint/verb/pray_to_mask() set category = "Cult" set desc = "Pray to your god" @@ -92,12 +84,10 @@ var/obj/cult_viewpoint/list/cult_viewpoints = list() cult_log("[key_name(usr,0)](Pray):[input]") to_chat(owner, "You pray to Nar'Sie: [input]") - for(var/mob/spirit/spirit in spirits) to_chat(spirit, "[get_display_name()] prays : [input]") - // PROCS /obj/cult_viewpoint/proc/set_favor(var/newFavor) favor = newFavor @@ -133,13 +123,11 @@ var/obj/cult_viewpoint/list/cult_viewpoints = list() if (newName) cult_name = newName to_chat(owner, "\red \b You have been blessed with the secret name of '[newName]'.") - else cult_name = null to_chat(owner, "\red \b Your god has taken your secret name.") - /obj/cult_viewpoint/proc/get_display_name() if(istype(src,/obj/effect/rune)) return name @@ -174,7 +162,6 @@ var/obj/cult_viewpoint/list/cult_viewpoints = list() return else to_chat(owner, "\b You cannot become a mask of Nar'Sie because a Mask already exists.") - mask_has_been_found() return diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 6ecf69a81b1..5e3641803ff 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -30,7 +30,6 @@ if(client) to_chat(src, sound(null, repeat = 0, wait = 0, volume = 85, channel = 1))// stop the jams for AIs - var/mob/living/silicon/ai/O = new (loc,,,1)//No MMI but safety is in effect. O.invisibility = 0 O.aiRestorePowerRoutine = 0 @@ -56,7 +55,6 @@ loc_landmark = tripai if (!loc_landmark) to_chat(O, "Oh god sorry we can't find an unoccupied AI spawn location, so we're spawning you on top of someone.") - for(var/obj/effect/landmark/start/sloc in landmarks_list) if (sloc.name == "AI") loc_landmark = sloc @@ -110,10 +108,8 @@ qdel(src) to_chat(new_spirit, "You are a Mask of Nar'sie now. You are a tiny fragment of the unknowable entity that is the god.") - to_chat(new_spirit, "Your job is to help your acolytes complete their goals. Be spooky. Do evil.") - new_spirit.set_name() // let spirits identify cultists @@ -214,7 +210,6 @@ new_xeno.key = key to_chat(new_xeno, "You are now an alien.") - new_xeno.update_pipe_vision() spawn(0)//To prevent the proc from returning null. qdel(src) @@ -251,7 +246,6 @@ new_slime.key = key to_chat(new_slime, "You are now a slime. Skreee!") - new_slime.update_pipe_vision() spawn(0)//To prevent the proc from returning null. qdel(src) @@ -275,7 +269,6 @@ new_corgi.key = key to_chat(new_corgi, "You are now a Corgi. Yap Yap!") - new_corgi.update_pipe_vision() spawn(0)//To prevent the proc from returning null. qdel(src) @@ -307,7 +300,6 @@ to_chat(new_mob, "You suddenly feel more... animalistic.") - new_mob.update_pipe_vision() spawn() qdel(src) @@ -323,7 +315,6 @@ new_mob.key = key new_mob.a_intent = I_HARM to_chat(new_mob, "You feel more... animalistic") - new_mob.update_pipe_vision() qdel(src) diff --git a/code/modules/mob/typing_indicator.dm b/code/modules/mob/typing_indicator.dm index bd232accab6..49d9a7aad48 100644 --- a/code/modules/mob/typing_indicator.dm +++ b/code/modules/mob/typing_indicator.dm @@ -85,7 +85,6 @@ var/global/image/typing_indicator prefs.save_preferences(src) to_chat(src, "You will [(prefs.toggles & SHOW_TYPING) ? "no longer" : "now"] display a typing indicator.") - // Clear out any existing typing indicator. if(prefs.toggles & SHOW_TYPING) if(istype(mob)) mob.set_typing_indicator(0) diff --git a/code/modules/nano/modules/crew_monitor.dm b/code/modules/nano/modules/crew_monitor.dm index d4fdb1e368c..848530c3c1d 100644 --- a/code/modules/nano/modules/crew_monitor.dm +++ b/code/modules/nano/modules/crew_monitor.dm @@ -7,7 +7,6 @@ var/turf/T = get_turf(nano_host()) if (!T || !(T.z in config.player_levels)) to_chat(usr, "Unable to establish a connection: You're too far away from the station!") - return 0 if(href_list["track"]) if(isAI(usr)) diff --git a/code/modules/nano/modules/law_manager.dm b/code/modules/nano/modules/law_manager.dm index e8ae6b8b748..df00504cf1f 100644 --- a/code/modules/nano/modules/law_manager.dm +++ b/code/modules/nano/modules/law_manager.dm @@ -135,17 +135,14 @@ if(href_list["notify_laws"]) to_chat(owner, "Law Notice") - owner.laws.show_laws(owner) if(isAI(owner)) var/mob/living/silicon/ai/AI = owner for(var/mob/living/silicon/robot/R in AI.connected_robots) to_chat(R, "Law Notice") - R.laws.show_laws(R) if(usr != owner) to_chat(usr, "Laws displayed.") - return 1 return 0 diff --git a/code/modules/nano/nanomapgen.dm b/code/modules/nano/nanomapgen.dm index 1518da77b78..62ad6649e20 100644 --- a/code/modules/nano/nanomapgen.dm +++ b/code/modules/nano/nanomapgen.dm @@ -34,20 +34,17 @@ if (currentZ < 0 || currentZ > world.maxz) to_chat(usr, "NanoMapGen: ERROR: currentZ ([currentZ]) must be between 1 and [world.maxz]") - sleep(3) return NANOMAP_TERMINALERR if (startX > endX) to_chat(usr, "NanoMapGen: ERROR: startX ([startX]) cannot be greater than endX ([endX])") - sleep(3) return NANOMAP_TERMINALERR if (startY > endX) to_chat(usr, "NanoMapGen: ERROR: startY ([startY]) cannot be greater than endY ([endY])") - sleep(3) return NANOMAP_TERMINALERR @@ -60,7 +57,6 @@ log_to_dd("NanoMapGen: GENERATE MAP ([startX],[startY],[currentZ]) to ([endX],[endY],[currentZ])") to_chat(usr, "NanoMapGen: GENERATE MAP ([startX],[startY],[currentZ]) to ([endX],[endY],[currentZ])") - var/count = 0; for(var/WorldX = startX, WorldX <= endX, WorldX++) for(var/WorldY = startY, WorldY <= endY, WorldY++) @@ -88,7 +84,6 @@ to_chat(usr, "NanoMapGen: Done. File [mapFilename] uploaded to your cache.") - if (Tile.Width() != NANOMAP_MAX_ICON_DIMENSION || Tile.Height() != NANOMAP_MAX_ICON_DIMENSION) return NANOMAP_BADOUTPUT diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm index 890c904d118..7675d3b2c81 100644 --- a/code/modules/nano/nanoui.dm +++ b/code/modules/nano/nanoui.dm @@ -458,7 +458,6 @@ nanoui is used to open and update nano browser uis // to_chat(user, list2json_usecache(send_data))// used for debugging //NANO DEBUG HOOK - user << output(list2params(list(list2json_usecache(send_data))),"[window_id].browser:receiveUpdateData") /** diff --git a/code/modules/ninja/energy_katana.dm b/code/modules/ninja/energy_katana.dm index 85ff99ace23..5e6a1cbcb32 100644 --- a/code/modules/ninja/energy_katana.dm +++ b/code/modules/ninja/energy_katana.dm @@ -67,7 +67,6 @@ if(msg) to_chat(user, "[msg]") - /obj/item/weapon/katana/energy/New() ..() spark_system = new /datum/effect/system/spark_spread() diff --git a/code/modules/ninja/martial_art.dm b/code/modules/ninja/martial_art.dm index 441aa02109f..0903425f89d 100644 --- a/code/modules/ninja/martial_art.dm +++ b/code/modules/ninja/martial_art.dm @@ -23,7 +23,6 @@ "[user] sticks the [src]'s needle \his arm and presses the button.") to_chat(user, "The nanomachines in the [src] flow through your bloodstream.") - var/datum/martial_art/ninja_martial_art/N = new/datum/martial_art/ninja_martial_art(null) N.teach(user) @@ -33,7 +32,6 @@ return 0 else to_chat(user, "The [src] has been used already!") - return 1 // Ninja martial art datum @@ -48,7 +46,6 @@ ..() H.middleClickOverride = new /datum/middleClickOverride/ninja_martial_art() to_chat(H, "You have been taugh the ways of the Creeping Widow.
      \) - Your stikes on harm intent will deal more damage.
      Using middle mouse button on a nearby person while on harm intent will send them flying backwards.
      \ Your grabs will instantly be aggressive while you are using this style.
      Using middle mouse button while on harm intent and behind a person will put them in a silencing choke hold.
      \ Using middle mouse button on a nearby person while on disarm intent will wrench their wrist, causing them to drop what they are holding.
      " @@ -68,7 +65,6 @@ spawn(50) has_focus = 1 return 1 to_chat(A, "You are not focused enough to use that move yet!") - return 0 return A.pointed(D) @@ -77,12 +73,10 @@ A.face_atom(D) if(A.dir != D.dir) // If the user's direction is not the same as the target's after A.face_atom(D) you are not behind them, and cannot use this ability. to_chat(A, "You cannot grab [D] from that angle!") - return 0 if(has_choke_hold) // Are we already choking someone? to_chat(A, "You are have a target in your grip!") - return 0 has_choke_hold = 1 @@ -112,9 +106,7 @@ sleep(5) to_chat(A, "You feel [D] go limp in your grip.") - to_chat(D, "You feel your consciousness slip away as [A] strangles you!") - D.AdjustParalysis(20) has_choke_hold = 0 @@ -140,7 +132,6 @@ spawn(50) has_focus = 1 return 1 to_chat(A, "You are not focused enough to use that move yet!") - return 0 return A.pointed(D) diff --git a/code/modules/ninja/suit/SpiderOS.dm b/code/modules/ninja/suit/SpiderOS.dm index 7d5d8e3216d..871e8215bbd 100644 --- a/code/modules/ninja/suit/SpiderOS.dm +++ b/code/modules/ninja/suit/SpiderOS.dm @@ -12,7 +12,6 @@ to_chat(affecting, "The interface is locked!") - /obj/item/clothing/suit/space/space_ninja/proc/display_spideros() if(!affecting) return//If no mob is wearing the suit. I almost forgot about this variable. var/mob/living/carbon/human/U = affecting @@ -196,7 +195,6 @@ if(!affecting||U.stat||!s_initialized)//Check to make sure the guy is wearing the suit after clicking and it's on. to_chat(U, "Your suit must be worn and active to use this function.") - U << browse(null, "window=spideros")//Closes the window. return @@ -220,7 +218,6 @@ return if(isnull(P)||P.toff)//So it doesn't freak out if the object no-longer exists. to_chat(display_to, "Error: unable to deliver message.") - display_spideros() return @@ -230,15 +227,12 @@ if("Inject") if( (href_list["tag"]=="radium"? (reagents.get_reagent_amount("radium"))<=(a_boost*a_transfer) : !reagents.get_reagent_amount(href_list["tag"])) )//Special case for radium. If there are only a_boost*a_transfer radium units left. to_chat(display_to, "Error: the suit cannot perform this function. Out of [href_list["name"]].") - else reagents.reaction(U, 2) reagents.trans_id_to(U, href_list["tag"], href_list["tag"]=="nutriment"?5:a_transfer)//Nutriment is a special case since it's very potent. Shouldn't influence actual refill amounts or anything. to_chat(display_to, "Injecting...") - to_chat(U, "You feel a tiny prick and a sudden rush of substance in to your veins.") - if("Trigger Ability") var/ability_name = href_list["name"]+href_list["cost"]//Adds the name and cost to create the full proc name. var/proc_arguments//What arguments to later pass to the proc, if any. @@ -258,7 +252,6 @@ safety = 0 if(!safety) to_chat(U, "[href_list["name"]] suddenly triggered!") - call(src,ability_name)(proc_arguments) if("Eject Disk") @@ -274,11 +267,9 @@ else to_chat(U, "ERROR: Could not eject disk.") - if("Copy to Disk") var/datum/tech/current_data = locate(href_list["target"]) to_chat(U, "[current_data.name] successfully [(!t_disk.stored) ? "copied" : "overwritten"] to disk.") - t_disk.stored = current_data diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm index f676132c335..936f947758d 100644 --- a/code/modules/ninja/suit/suit.dm +++ b/code/modules/ninja/suit/suit.dm @@ -31,23 +31,18 @@ Contents: if(!suitActive) if(!istype(user.wear_suit, /obj/item/clothing/suit/space/space_ninja)) to_chat(user, "ERROR: Unable to locate user.\nABORTING...") - return 0 if(!istype(user.head, /obj/item/clothing/head/helmet/space/space_ninja)) to_chat(user, "ERROR: Unable to locate hood.\nABORTING...") - return 0 if(!istype(user.gloves, /obj/item/clothing/gloves/space_ninja)) to_chat(user, "ERROR: Unable to locate gloves.\nABORTING...") - return 0 if(!istype(user.shoes, /obj/item/clothing/shoes/space_ninja)) to_chat(user, "ERROR: Unable to locate foot gear.\nABORTING...") - return 0 if(!istype(user.wear_mask, /obj/item/clothing/mask/gas/voice/space_ninja)) to_chat(user, "ERROR: Unable to locate mask.\nABORTING...") - return 0 suitHood = user.head diff --git a/code/modules/ninja/suit/suit_attackby.dm b/code/modules/ninja/suit/suit_attackby.dm index fb834cdb469..620c2261782 100644 --- a/code/modules/ninja/suit/suit_attackby.dm +++ b/code/modules/ninja/suit/suit_attackby.dm @@ -6,7 +6,6 @@ var/obj/item/weapon/stock_parts/cell/CELL if(CELL.maxcharge > cell.maxcharge && suitGloves) to_chat(U, "Higher maximum capacity detected.\nUpgrading...") - if (n_gloves && n_gloves.candrain && do_after(U,s_delay, target = U)) U.drop_item() CELL.loc = src @@ -19,9 +18,7 @@ old_cell.updateicon() cell = CELL to_chat(U, "Upgrade complete. Maximum capacity: [round(cell.maxcharge/100)]%") - else to_chat(U, "Procedure interrupted. Protocol terminated.") - return ..() \ No newline at end of file diff --git a/code/modules/ninja/suit/suit_initialisation.dm b/code/modules/ninja/suit/suit_initialisation.dm index a93c8680975..f1abfbe725a 100644 --- a/code/modules/ninja/suit/suit_initialisation.dm +++ b/code/modules/ninja/suit/suit_initialisation.dm @@ -9,7 +9,6 @@ if(usr.mind.special_role == "Ninja") if(suitBusy) to_chat(usr, "ERROR: Suit systems busy, cannot initiate [suitActive ? "de-activation" : "activation"] protocals at this time.") - return suitBusy = 1 @@ -17,33 +16,26 @@ if(suitActive && (alert("Confirm suit systems shutdown? This cannot be halted once it has started.", "Confirm Shutdown", "Yes", "No") == "Yes")) to_chat(usr, "Now de-initializing...") - sleep(15) to_chat(usr, "Logging off, [usr.real_name]. Shutting down SpiderOS.") - sleep(10) to_chat(usr, "Primary system status: OFFLINE.\nBackup system status: OFFLINE.") - sleep(5) to_chat(usr, "VOID-shift device status: OFFLINE.\nCLOAK-tech device status: OFFLINE.") - //TODO: Shut down any active abilities sleep(10) to_chat(usr, "Disconnecting neural-net interface... Success.") - usr.hud_used.instantiate() usr.regenerate_icons() sleep(5) to_chat(usr, "Disengaging neural-net interface... Success.") - sleep(10) to_chat(usr, "Unsecuring external locking mechanism...\nNeural-net abolished.\nOperation status: FINISHED.") - //TODO: Grant verbs toggle_suit_lock(usr) usr.regenerate_icons() @@ -53,45 +45,35 @@ else if(!suitActive) // Activate the suit. to_chat(usr, "Now initializing...") - sleep(15) to_chat(usr, "Now establishing neural-net interface...") - if(usr.mind.special_role != "Ninja") - to_chat(usr, "FĆAL �Rr�R: µ§er n¤t rec¤gnized, c-c¤ntr-r¤£§-£§ £¤cked.") - + to_chat(usr, "FĆAL �Rr�R: ŧer nt recgnized, c-cntr-r䣧-ç äcked.") return sleep(10) to_chat(usr, "Neural-net established. Now monitoring brainwave pattern. \nBrainwave pattern GREEN, proceeding.") - sleep(10) to_chat(usr, "Securing external locking mechanism...") - if(!toggle_suit_lock(usr)) return sleep(5) to_chat(usr, "Suit secured, extending neural-net interface...") - usr.hud_used.human_hud('icons/mob/screen1_NinjaHUD.dmi',"#ffffff",255) usr.regenerate_icons() sleep(10) to_chat(usr, "VOID-shift device status: ONLINE.\nCLOAK-tech device status:ONLINE") - sleep(5) to_chat(usr, "Primary system status: ONLINE.\nBackup system status: ONLINE.") - if(suitCell) to_chat(usr, "Current energy capacity: [suitCell.charge]/[suitCell.maxcharge].") - sleep(10) to_chat(usr, "All systems operational. Welcome to SpiderOS, [usr.real_name].") - //TODO: Grant ninja verbs here. suitBusy = 0 suitActive = 1 @@ -99,8 +81,6 @@ else suitBusy = 0 to_chat(usr, "NOTICE: Suit de-activation protocals aborted.") - else - to_chat(usr, "FĆAL �Rr�R: µ§er n¤t rec¤gnized, c-c¤ntr-r¤£§-£§ £¤cked.") - + to_chat(usr, "FĆAL �Rr�R: ŧer nt recgnized, c-cntr-r䣧-ç äcked.") return \ No newline at end of file diff --git a/code/modules/paperwork/carbonpaper.dm b/code/modules/paperwork/carbonpaper.dm index 9599878593e..643c5b1fbb7 100644 --- a/code/modules/paperwork/carbonpaper.dm +++ b/code/modules/paperwork/carbonpaper.dm @@ -42,11 +42,9 @@ copy.fields = c.fields copy.updateinfolinks() to_chat(usr, "You tear off the carbon-copy!") - c.copied = 1 copy.iscopy = 1 copy.update_icon() c.update_icon() else to_chat(usr, "There are no more carbon copies attached to this paper!") - diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index ce52a5e6b8c..fbb26b650a8 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -50,7 +50,6 @@ if(istype(W, /obj/item/weapon/paper)) toppaper = W to_chat(user, "You clip the [W] onto \the [src].") - update_icon() else if(istype(toppaper) && istype(W, /obj/item/weapon/pen)) @@ -105,7 +104,6 @@ haspen = W to_chat(usr, "You slot the pen into \the [src].") - else if(href_list["write"]) var/obj/item/weapon/P = locate(href_list["write"]) @@ -149,7 +147,6 @@ toppaper = P to_chat(usr, "You move [P.name] to the top.") - //Update everything attack_self(usr) update_icon() diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index 576c7e1ace7..23a0f3eec7e 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -45,11 +45,9 @@ var/list/alldepartments = list() if(!emagged) emagged = 1 to_chat(user, "The transmitters realign to an unknown source!") - else to_chat(user, "You swipe the card through [src], but nothing happens.") - /obj/machinery/photocopier/faxmachine/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) var/data[0] if(scan) @@ -103,7 +101,6 @@ var/list/alldepartments = list() copyitem.loc = usr.loc usr.put_in_hands(copyitem) to_chat(usr, "You take \the [copyitem] out of \the [src].") - copyitem = null else var/obj/item/I = usr.get_active_hand() @@ -112,7 +109,6 @@ var/list/alldepartments = list() copyitem = I I.loc = src to_chat(usr, "You insert \the [I] into \the [src].") - flick(insert_anim, src) if(href_list["scan"]) @@ -270,4 +266,3 @@ var/list/alldepartments = list() for(var/client/C in admins) if(R_EVENT & C.holder.rights) to_chat(C, msg) - diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index f09eefd3e79..cd52d4424e3 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -36,7 +36,6 @@ /obj/structure/filingcabinet/attackby(obj/item/P as obj, mob/user as mob, params) if(istype(P, /obj/item/weapon/paper) || istype(P, /obj/item/weapon/folder) || istype(P, /obj/item/weapon/photo) || istype(P, /obj/item/weapon/paper_bundle) || istype(P, /obj/item/documents)) to_chat(user, "You put [P] in [src].") - user.drop_item() P.loc = src icon_state = "[initial(icon_state)]-open" @@ -47,16 +46,13 @@ playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) anchored = !anchored to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src].") - else to_chat(user, "You can't put [P] in [src]!") - /obj/structure/filingcabinet/attack_hand(mob/user as mob) if(contents.len <= 0) to_chat(user, "\The [src] is empty.") - return user.set_machine(src) @@ -82,11 +78,9 @@ if(prob(25)) step_rand(I) to_chat(user, "You pull \a [I] out of [src] at random.") - return to_chat(user, "You find nothing in [src].") - /obj/structure/filingcabinet/Topic(href, href_list) if(href_list["retrieve"]) usr << browse("", "window=filingcabinet") // Close the menu diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index 7ff2875a6e5..12f9e13a4e9 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -33,7 +33,6 @@ user.drop_item() W.loc = src to_chat(user, "You put the [W] into \the [src].") - update_icon() else if(istype(W, /obj/item/weapon/pen)) var/n_name = input(usr, "What would you like to label the folder?", "Folder Labelling", null) as text|null diff --git a/code/modules/paperwork/frames.dm b/code/modules/paperwork/frames.dm index a8fca4f0831..f988cf117cc 100644 --- a/code/modules/paperwork/frames.dm +++ b/code/modules/paperwork/frames.dm @@ -71,7 +71,6 @@ update_icon() else to_chat(user, "There is nothing to remove from \the [src].") - else if(istype(I, /obj/item/weapon/crowbar)) playsound(src, 'sound/items/Crowbar.ogg', 100, 1) user.visible_message("[user] breaks down \the [src].", "You break down \the [src].") @@ -91,7 +90,6 @@ update_icon() else to_chat(user, "\The [src] already contains \a [displayed].") - else return ..() @@ -106,17 +104,14 @@ for(var/obj/O in user.loc.contents) //Let's see if it already has a poster on it or too much stuff if(istype(O, /obj/structure/sign)) to_chat(user, "\The [T] is far too cluttered to place \a [src]!") - return stuff_on_wall++ if(stuff_on_wall >= 4) to_chat(user, "\The [T] is far too cluttered to place \a [src]!") - return to_chat(user, "You start place \the [src] on \the [T].") - var/px = 0 var/py = 0 var/newdir = getRelativeDirection(user, T) @@ -132,7 +127,6 @@ px = -32 else to_chat(user, "You cannot reach \the [T] from here!") - return user.unEquip(src) @@ -233,11 +227,9 @@ if(istype(I, /obj/item/weapon/grenade) || istype(I, /obj/item/weapon/c4)) if(explosive) to_chat(user, "There is already a device attached behind \the [src], remove it first.") - return 1 if(!tilted) to_chat(user, "\The [src] needs to be already tilted before being rigged with \the [I].") - return 1 user.visible_message("[user] is fiddling around behind \the [src].", "You begin to secure \the [I] behind \the [src].") if(do_after(user, 150, target = src)) diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm index bc03f335be8..8dbfbd9c1b4 100644 --- a/code/modules/paperwork/handlabeler.dm +++ b/code/modules/paperwork/handlabeler.dm @@ -16,27 +16,21 @@ if(!labels_left) to_chat(user, "No labels left.") - return if(!label || !length(label)) to_chat(user, "No text set.") - return if(length(A.name) + length(label) > 64) to_chat(user, "Label too big.") - return if(ishuman(A)) to_chat(user, "You can't label humans.") - return if(issilicon(A)) to_chat(user, "You can't label cyborgs.") - return if(istype(A, /obj/item/weapon/reagent_containers/glass)) to_chat(user, "The label can't stick to the [A.name]. (Try using a pen)") - return user.visible_message("[user] labels [A] as [label].", \ @@ -48,16 +42,12 @@ icon_state = "labeler[mode]" if(mode) to_chat(user, "You turn on \the [src].") - //Now let them chose the text. var/str = copytext(reject_bad_text(input(user,"Label text?","Set label","")),1,MAX_NAME_LEN) if(!str || !length(str)) to_chat(user, "Invalid text.") - return label = str to_chat(user, "You set the text to '[str]'.") - else to_chat(user, "You turn off \the [src].") - diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index fb4d7816dd9..bf847a06c0a 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -58,7 +58,6 @@ else to_chat(user, "You have to go closer if you want to read it.") - /obj/item/weapon/paper/proc/show_content(var/mob/user, var/forceshow = 0, var/forcestars = 0, var/infolinks = 0, var/view = 1) var/datum/asset/assets = get_asset_datum(/datum/asset/simple/paper) assets.send(user) @@ -83,7 +82,6 @@ if((CLUMSY in usr.mutations) && prob(50)) to_chat(usr, "You cut yourself on the paper.") - return var/n_name = sanitize(copytext(input(usr, "What would you like to label the paper?", "Paper Labelling", name) as text, 1, MAX_MESSAGE_LEN)) if((loc == usr && usr.stat == 0)) @@ -128,7 +126,6 @@ var/mob/living/carbon/human/H = M if(H == user) to_chat(user, "You wipe off your face with [src].") - H.lip_style = null H.update_body() else @@ -316,7 +313,6 @@ else to_chat(user, "\red You must hold \the [P] steady to burn \the [src].") - /obj/item/weapon/paper/Topic(href, href_list) ..() if(!usr || (usr.stat || usr.restrained())) @@ -346,7 +342,6 @@ for(var/bad in paper_blacklist) if(findtext(t,bad)) to_chat(usr, "\blue You think to yourself, \"Hm.. this is only paper...\"") - log_admin("PAPER: [key_name(usr)] tried to use forbidden word in [src]: [bad].") message_admins("PAPER: [key_name_admin(usr)] tried to use forbidden word in [src]: [bad].") return @@ -383,7 +378,6 @@ var/obj/item/weapon/paper/carbon/C = P if (!C.iscopy && !C.copied) to_chat(user, "Take off the carbon copy first.") - add_fingerprint(user) return var/obj/item/weapon/paper_bundle/B = new(src.loc) @@ -420,7 +414,6 @@ if(h_user.client) h_user.client.screen -= src h_user.put_in_hands(B) to_chat(user, "You clip the [P.name] to [(src.name == "paper") ? "the paper" : src.name].") - src.loc = B P.loc = B B.amount++ @@ -442,14 +435,12 @@ if(istype(P, /obj/item/weapon/stamp/clown)) if(!clown) to_chat(user, "You are totally unable to use the stamp. HONK!") - return stamp(P) to_chat(user, "You stamp the paper with your rubber stamp.") - else if(istype(P, /obj/item/weapon/lighter)) burnpaper(P, user) diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index e43c47f01c3..a99efb09294 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -25,7 +25,6 @@ var/obj/item/weapon/paper/carbon/C = P if (!C.iscopy && !C.copied) to_chat(user, "Take off the carbon copy first.") - add_fingerprint(user) return @@ -33,7 +32,6 @@ if(screen == 2) screen = 1 to_chat(user, "You add [(P.name == "paper") ? "the paper" : P.name] to [(src.name == "paper bundle") ? "the paper bundle" : src.name].") - user.unEquip(P) P.loc = src if(istype(user,/mob/living/carbon/human)) @@ -45,7 +43,6 @@ if(screen == 2) screen = 1 to_chat(user, "You add [(W.name == "photo") ? "the photo" : W.name] to [(src.name == "paper bundle") ? "the paper bundle" : src.name].") - user.unEquip(W) W.loc = src else if(istype(W, /obj/item/weapon/lighter)) @@ -59,7 +56,6 @@ if(screen == 2) screen = 1 to_chat(user, "You add \the [W.name] to [(src.name == "paper bundle") ? "the paper bundle" : src.name].") - qdel(W) else if(istype(W, /obj/item/stack/tape_roll)) @@ -100,14 +96,12 @@ else to_chat(user, "\red You must hold \the [P] steady to burn \the [src].") - /obj/item/weapon/paper_bundle/examine(mob/user) if(..(user, 1)) src.show_content(user) else to_chat(user, "It is too far away.") - /obj/item/weapon/paper_bundle/proc/show_content(mob/user as mob) var/dat var/obj/item/weapon/W = src[page] @@ -169,7 +163,6 @@ var/obj/item/weapon/W = src[page] usr.put_in_hands(W) to_chat(usr, "You remove the [W.name] from the bundle.") - if(amount == 1) var/obj/item/weapon/paper/P = src[1] usr.unEquip(src) @@ -184,7 +177,6 @@ update_icon() else to_chat(usr, "You need to hold it in your hands to change pages.") - if (istype(src.loc, /mob)) src.attack_self(src.loc) updateUsrDialog() @@ -209,7 +201,6 @@ set src in usr to_chat(usr, "You loosen the bundle.") - for(var/obj/O in src) O.loc = usr.loc O.layer = initial(O.layer) diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index b5528b41375..cd3afbd400d 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -55,7 +55,6 @@ temp = H.organs_by_name["l_hand"] if(temp && !temp.is_usable()) to_chat(H, "You try to move your [temp.name], but cannot!") - return if(amount >= 1) amount-- @@ -77,11 +76,9 @@ P.loc = user.loc user.put_in_hands(P) to_chat(user, "You take [P] out of the [src].") - else to_chat(user, "[src] is empty!") - add_fingerprint(user) return @@ -93,7 +90,6 @@ user.drop_item() i.loc = src to_chat(user, "You put [i] in [src].") - papers.Add(i) amount++ @@ -102,12 +98,10 @@ if(..(user, 1)) if(amount) to_chat(usr, "There " + (amount > 1 ? "are [amount] papers" : "is one paper") + " in the bin.") - else to_chat(usr, "There are no papers in the bin.") - /obj/item/weapon/paper_bin/update_icon() if(amount < 1) icon_state = "paper_bin0" @@ -134,10 +128,8 @@ P.loc = user.loc user.put_in_hands(P) to_chat(user, "You take [P] out of the [src].") - else to_chat(user, "[src] is empty!") - add_fingerprint(user) return diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index afea1699041..46d080adb6f 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -26,7 +26,6 @@ /obj/item/weapon/pen/suicide_act(mob/user) to_chat(viewers(user), "[user] starts scribbling numbers over \himself with the [src.name]! It looks like \he's trying to commit sudoku.") - return (BRUTELOSS) /obj/item/weapon/pen/blue @@ -112,9 +111,7 @@ if(!force) if(M.can_inject(user, 1)) to_chat(user, "You stab [M] with the pen.") - // to_chat(M, "You feel a tiny prick!") - . = 1 add_logs(M, user, "stabbed", object="[name]") @@ -165,7 +162,6 @@ throwforce = initial(throwforce) playsound(user, 'sound/weapons/saberoff.ogg', 5, 1) to_chat(user, "[src] can now be concealed.") - else on = 1 force = 18 @@ -177,7 +173,6 @@ throwforce = 35 playsound(user, 'sound/weapons/saberon.ogg', 5, 1) to_chat(user, "[src] is now active.") - update_icon() /obj/item/weapon/pen/edagger/update_icon() diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index d7b67f42045..d6b4b6ad213 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -64,7 +64,6 @@ sleep(15) else to_chat(usr, "\The [copyitem] can't be copied by \the [src].") - break use_power(active_power_usage) @@ -74,12 +73,10 @@ copyitem.loc = usr.loc usr.put_in_hands(copyitem) to_chat(usr, "You take \the [copyitem] out of \the [src].") - copyitem = null updateUsrDialog() else if(check_ass()) to_chat(ass, "You feel a slight pressure on your ass.") - updateUsrDialog() else if(href_list["min"]) if(copies > 1) @@ -121,29 +118,24 @@ copyitem = O O.loc = src to_chat(user, "You insert \the [O] into \the [src].") - flick(insert_anim, src) updateUsrDialog() else to_chat(user, "There is already something in \the [src].") - else if(istype(O, /obj/item/device/toner)) if(toner <= 10) //allow replacing when low toner is affecting the print darkness user.drop_item() to_chat(user, "You insert the toner cartridge into \the [src].") - var/obj/item/device/toner/T = O toner += T.toner_amount qdel(O) updateUsrDialog() else to_chat(user, "This cartridge is not yet ready for replacement! Use up the rest of the toner.") - else if(istype(O, /obj/item/weapon/wrench)) playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) anchored = !anchored to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src].") - else if(istype(O, /obj/item/weapon/grab)) //For ass-copying. var/obj/item/weapon/grab/G = O if(ismob(G.affecting) && G.affecting != ass) diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index 679d466dfd7..b63dcc2750c 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -69,14 +69,12 @@ else to_chat(user, "\red You must hold \the [P] steady to burn \the [src].") - /obj/item/weapon/photo/examine(mob/user) if(..(user, 1) || isobserver(user)) show(user) else to_chat(user, "It is too far away.") - /obj/item/weapon/photo/proc/show(mob/user as mob) usr << browse_rsc(img, "tmp_photo.png") usr << browse("[name]" \ @@ -179,7 +177,6 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s size = nsize to_chat(usr, "Camera will now take [size]x[size] photos.") - /obj/item/device/camera/attack(mob/living/carbon/human/M as mob, mob/user as mob) return @@ -190,17 +187,14 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s else src.icon_state = icon_off to_chat(user, "You switch the camera [on ? "on" : "off"].") - return /obj/item/device/camera/attackby(obj/item/I as obj, mob/user as mob, params) if(istype(I, /obj/item/device/camera_film)) if(pictures_left) to_chat(user, "[src] still has some film in it!") - return to_chat(user, "You insert [I] into [src].") - user.drop_item() qdel(I) pictures_left = pictures_max @@ -311,7 +305,6 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s pictures_left-- desc = "A polaroid camera. It has [pictures_left] photos left." to_chat(user, "[pictures_left] photos left.") - icon_state = icon_off on = 0 if(user.mind && !(user.mind.assigned_role == "Chaplain")) @@ -435,10 +428,8 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s /obj/item/device/camera/digital/captureimage(atom/target, mob/user, flag) if(saved_pictures.len >= max_storage) to_chat(user, "Maximum photo storage capacity reached.") - return to_chat(user, "Picture saved.") - var/x_c = target.x - (size-1)/2 var/y_c = target.y + (size-1)/2 var/z_c = target.z @@ -464,11 +455,9 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s if(saved_pictures.len == 0) to_chat(usr, "No images saved.") - return if(pictures_left == 0) to_chat(usr, "There is no film left to print.") - return var/datum/picture/P = null @@ -484,7 +473,6 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s if(saved_pictures.len == 0) to_chat(usr, "No images saved") - return var/datum/picture/P = null P = input("Select image to delete:",P) as null|anything in saved_pictures @@ -530,12 +518,10 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s camera.c_tag = user.name to_chat(user, "You switch the camera [on ? "on" : "off"].") - /obj/item/device/videocam/examine(mob/user) if(..(user, 1)) to_chat(user, "This video camera can send live feeds to the entertainment network. It's [camera ? "" : "in"]active.") - /obj/item/device/videocam/hear_talk(mob/M as mob, msg) if (camera && on) if(get_dist(src, M) <= canhear_range) @@ -560,4 +546,3 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s 'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\ 'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg') to_chat(user, pick(creepyasssounds)) - diff --git a/code/modules/paperwork/silicon_photography.dm b/code/modules/paperwork/silicon_photography.dm index 825124568c1..83740eac7ee 100644 --- a/code/modules/paperwork/silicon_photography.dm +++ b/code/modules/paperwork/silicon_photography.dm @@ -32,12 +32,10 @@ to_chat(C.connected_ai, "Image recorded and saved by [name]") to_chat(usr, "Image recorded and saved to remote database")//feedback to the Cyborg player that the picture was taken - else injectaialbum(P) to_chat(usr, "Image recorded") - /obj/item/device/camera/siliconcam/proc/selectpicture(obj/item/device/camera/siliconcam/cam) if(!cam) cam = getsource() @@ -46,7 +44,6 @@ var/find if(cam.aipictures.len == 0) to_chat(usr, "No images saved") - return for(var/datum/picture/t in cam.aipictures) nametemp += t.fields["name"] @@ -67,7 +64,6 @@ P.show(usr) to_chat(usr, P.desc) - // TG uses a special garbage collector.. qdel(P) qdel(P) //so 10 thousand pictures items are not left in memory should an AI take them and then view them all. @@ -80,7 +76,6 @@ cam.aipictures -= selection to_chat(usr, "Image deleted") - /obj/item/device/camera/siliconcam/ai_camera/can_capture_turf(turf/T, mob/user) var/mob/living/silicon/ai = user return ai.TurfAdjacent(T) @@ -95,17 +90,14 @@ src.in_camera_mode = 0 to_chat(usr, "Camera Mode deactivated") - /obj/item/device/camera/siliconcam/proc/camera_mode_on() src.in_camera_mode = 1 to_chat(usr, "Camera Mode activated") - /obj/item/device/camera/siliconcam/ai_camera/printpicture(mob/user, datum/picture/P) injectaialbum(P) to_chat(usr, "Image recorded") - /obj/item/device/camera/siliconcam/robot_camera/printpicture(mob/user, datum/picture/P) injectmasteralbum(P) diff --git a/code/modules/pda/PDA.dm b/code/modules/pda/PDA.dm index c491ae5559c..96c5eedff2d 100755 --- a/code/modules/pda/PDA.dm +++ b/code/modules/pda/PDA.dm @@ -297,18 +297,15 @@ var/global/list/obj/item/device/pda/PDAs = list() notifying_programs.Cut() overlays.Cut() to_chat(usr, "You press the reset button on \the [src].") - else to_chat(usr, "You cannot do this while restrained.") - /obj/item/device/pda/proc/remove_id() if (id) if (ismob(loc)) var/mob/M = loc M.put_in_hands(id) to_chat(usr, "You remove the ID from the [name].") - else id.forceMove(get_turf(src)) id = null @@ -326,12 +323,10 @@ var/global/list/obj/item/device/pda/PDAs = list() remove_id() else to_chat(usr, "This PDA does not have an ID in it.") - else to_chat(usr, "You cannot do this while restrained.") - /obj/item/device/pda/verb/verb_remove_pen() set category = "Object" set name = "Remove pen" @@ -348,17 +343,14 @@ var/global/list/obj/item/device/pda/PDAs = list() if(M.get_active_hand() == null) M.put_in_hands(O) to_chat(usr, "You remove \the [O] from \the [src].") - return O.forceMove(get_turf(src)) else to_chat(usr, "This PDA does not have a pen in it.") - else to_chat(usr, "You cannot do this while restrained.") - /obj/item/device/pda/proc/id_check(mob/user as mob, choice as num)//To check for IDs; 1 for in-pda use, 2 for out of pda use. if(choice == 1) if (id) @@ -388,7 +380,6 @@ var/global/list/obj/item/device/pda/PDAs = list() cartridge.update_programs(src) update_shortcuts() to_chat(user, "You insert [cartridge] into [src].") - if(cartridge.radio) cartridge.radio.hostpda = src @@ -396,7 +387,6 @@ var/global/list/obj/item/device/pda/PDAs = list() var/obj/item/weapon/card/id/idcard = C if(!idcard.registered_name) to_chat(user, "\The [src] rejects the ID.") - return if(!owner) owner = idcard.registered_name @@ -404,31 +394,26 @@ var/global/list/obj/item/device/pda/PDAs = list() ownrank = idcard.rank name = "PDA-[owner] ([ownjob])" to_chat(user, "Card scanned.") - else //Basic safety check. If either both objects are held by user or PDA is on ground and card is in hand. if(((src in user.contents) && (C in user.contents)) || (istype(loc, /turf) && in_range(src, user) && (C in user.contents)) ) if( can_use(user) )//If they can still act. id_check(user, 2) to_chat(user, "You put the ID into \the [src]'s slot.") - else if(istype(C, /obj/item/device/paicard) && !src.pai) user.drop_item() C.forceMove(src) pai = C to_chat(user, "You slot \the [C] into [src].") - else if(istype(C, /obj/item/weapon/pen)) var/obj/item/weapon/pen/O = locate() in src if(O) to_chat(user, "There is already a pen in \the [src].") - else user.drop_item() C.forceMove(src) to_chat(user, "You slide \the [C] into \the [src].") - /obj/item/device/pda/attack(mob/living/C as mob, mob/living/user as mob) if (istype(C, /mob/living/carbon) && scanmode) scanmode.scan_mob(C, user) @@ -491,7 +476,6 @@ var/global/list/obj/item/device/pda/PDAs = list() if (t) if(hidden_uplink && hidden_uplink.check_trigger(usr, lowertext(t), lowertext(lock_code))) to_chat(usr, "The PDA softly beeps.") - close(usr) else t = sanitize(copytext(t, 1, 20)) diff --git a/code/modules/pda/ai.dm b/code/modules/pda/ai.dm index d012905ccd8..b8b95276c06 100644 --- a/code/modules/pda/ai.dm +++ b/code/modules/pda/ai.dm @@ -23,7 +23,6 @@ var/datum/data/pda/app/messenger/M = find_program(/datum/data/pda/app/messenger) if(!M) to_chat(usr, "Cannot use messenger!") - var/list/plist = M.available_pdas() if (plist) var/c = input(usr, "Please select a PDA") as null|anything in sortList(plist) @@ -42,7 +41,6 @@ var/datum/data/pda/app/messenger/M = find_program(/datum/data/pda/app/messenger) if(!M) to_chat(usr, "Cannot use messenger!") - var/HTML = "AI PDA Message Log" for(var/index in M.tnote) if(index["sent"]) @@ -64,7 +62,6 @@ to_chat(usr, "PDA sender/receiver toggled [(M.toff ? "Off" : "On")]!") - /obj/item/device/pda/ai/verb/cmd_toggle_pda_silent() set category = "AI IM" set name = "Toggle Ringer" @@ -76,7 +73,6 @@ M.notify_silent = !M.notify_silent to_chat(usr, "PDA ringer toggled [(M.notify_silent ? "Off" : "On")]!") - /obj/item/device/pda/ai/can_use() var/mob/living/silicon/ai/AI = usr if(!istype(AI)) diff --git a/code/modules/pda/app.dm b/code/modules/pda/app.dm index 70690af26ae..45b2e79aec3 100644 --- a/code/modules/pda/app.dm +++ b/code/modules/pda/app.dm @@ -25,7 +25,6 @@ if(L) to_chat(L, "\icon[pda] [message]") - nanomanager.update_user_uis(L, pda) // Update the receiving user's PDA UI so that they can see the new message if(!notify_silent) diff --git a/code/modules/pda/chatroom.dm b/code/modules/pda/chatroom.dm index b965076971a..d5758b161f4 100644 --- a/code/modules/pda/chatroom.dm +++ b/code/modules/pda/chatroom.dm @@ -141,7 +141,6 @@ var/list/chatrooms = list(new /datum/chatroom("General Discussion")) if(!.) to_chat(usr, "ERROR: Messaging server is not responding.") - /datum/data/pda/app/chatroom/Topic(href, list/href_list) if(!pda.can_use()) return diff --git a/code/modules/pda/messenger.dm b/code/modules/pda/messenger.dm index fb64add2b86..c5f6375f82f 100644 --- a/code/modules/pda/messenger.dm +++ b/code/modules/pda/messenger.dm @@ -107,7 +107,6 @@ if(!P) to_chat(usr, "PDA not found.") - var/datum/data/pda/messenger_plugin/plugin = locate(href_list["plugin"]) if(plugin && (plugin in pda.cartridge.messenger_plugins)) plugin.messenger = src @@ -168,7 +167,6 @@ if(useMS && useTC) // only send the message if it's stable if(useTC != 2) // Does our recipient have a broadcaster on their level? to_chat(U, "ERROR: Cannot reach recipient.") - return useMS.send_pda_message("[P.owner]","[pda.owner]","[t]") tnote.Add(list(list("sent" = 1, "owner" = "[P.owner]", "job" = "[P.ownjob]", "message" = "[t]", "target" = "\ref[P]"))) @@ -185,7 +183,6 @@ else to_chat(U, "ERROR: Messaging server is not responding.") - /datum/data/pda/app/messenger/proc/available_pdas() var/list/names = list() var/list/plist = list() @@ -193,7 +190,6 @@ if (toff) to_chat(usr, "Turn on your receiver in order to send messages.") - return for(var/A in PDAs) diff --git a/code/modules/pda/radio.dm b/code/modules/pda/radio.dm index 1f8b1d06c69..c64ea02ce7c 100644 --- a/code/modules/pda/radio.dm +++ b/code/modules/pda/radio.dm @@ -32,7 +32,6 @@ /obj/item/radio/integrated/proc/post_signal(var/freq, var/key, var/value, var/key2, var/value2, var/key3, var/value3,var/key4, var/value4, s_filter) // to_chat(world, "Post: [freq]: [key]=[value], [key2]=[value2]") - var/datum/radio_frequency/frequency = radio_controller.return_frequency(freq) if(!frequency) diff --git a/code/modules/pda/utilities.dm b/code/modules/pda/utilities.dm index 47c963d633a..0f4fcd79741 100644 --- a/code/modules/pda/utilities.dm +++ b/code/modules/pda/utilities.dm @@ -69,10 +69,8 @@ var/mob/living/carbon/human/H = C if (!istype(H.dna, /datum/dna)) to_chat(user, "No fingerprints found on [H]") - else to_chat(user, "[H]'s Fingerprints: [md5(H.dna.uni_identity)]") - scan_blood(C, user) /datum/data/pda/utility/scanmode/dna/scan_atom(atom/A as mob|obj|turf|area, mob/user as mob) @@ -81,17 +79,14 @@ /datum/data/pda/utility/scanmode/dna/proc/scan_blood(atom/A, mob/user) if (!A.blood_DNA) to_chat(user, "No blood found on [A]") - if(A.blood_DNA) qdel(A.blood_DNA) else to_chat(user, "Blood found on [A]. Analysing...") - spawn(15) for(var/blood in A.blood_DNA) to_chat(user, "Blood type: [A.blood_DNA[blood]]\nDNA: [blood]") - /datum/data/pda/utility/scanmode/halogen base_name = "Halogen Counter" icon = "exclamation-circle" @@ -114,17 +109,13 @@ if(A.reagents.reagent_list.len > 0) var/reagents_length = A.reagents.reagent_list.len to_chat(user, "[reagents_length] chemical agent[reagents_length > 1 ? "s" : ""] found.") - for(var/re in A.reagents.reagent_list) to_chat(user, "\t [re]") - else to_chat(user, "No active chemical agents found in [A].") - else to_chat(user, "No significant chemical agents found in [A].") - /datum/data/pda/utility/scanmode/gas base_name = "Gas Scanner" icon = "tachometer" @@ -205,7 +196,5 @@ // Inform the user to_chat(user, "Paper scanned and OCRed to notekeeper.")//concept of scanning paper copyright brainoblivion 2009 - else to_chat(user, "Error scanning [A].") - diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index e3ff5b6a9c4..edefabf2aff 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -214,33 +214,25 @@ if(..(user, 1)) if(stat & BROKEN) to_chat(user, "Looks broken.") - return if(opened) if(has_electronics && terminal) to_chat(user, "The cover is [opened==2?"removed":"open"] and the power cell is [ cell ? "installed" : "missing"].") - else if (!has_electronics && terminal) to_chat(user, "There are some wires but no any electronics.") - else if (has_electronics && !terminal) to_chat(user, "Electronics installed but not wired.") - else /* if (!has_electronics && !terminal) */ to_chat(user, "There is no electronics nor connected wires.") - else if (stat & MAINT) to_chat(user, "The cover is closed. Something wrong with it: it doesn't work.") - else if (malfhack) to_chat(user, "The cover is broken. It may be hard to force it open.") - else to_chat(user, "The cover is closed.") - // update the APC icon to show the three base states // also add overlays for indicator lights /obj/machinery/power/apc/update_icon() @@ -425,12 +417,10 @@ if (has_electronics==1) if (terminal) to_chat(user, "Disconnect wires first.") - return playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) to_chat(user, "You are trying to remove the power control board...")//lpeters - fixed grammar issues - if(do_after(user, 50, target = src)) if (has_electronics==1) has_electronics = 0 @@ -451,7 +441,6 @@ else if (istype(W, /obj/item/weapon/crowbar) && !((stat & BROKEN) || malfhack) ) if(coverlocked && !(stat & MAINT)) to_chat(user, "The cover is locked and cannot be opened.") - return else opened = 1 @@ -459,12 +448,10 @@ else if (istype(W, /obj/item/weapon/stock_parts/cell) && opened) // trying to put a cell inside if(cell) to_chat(user, "There is a power cell already installed.") - return else if (stat & MAINT) to_chat(user, "There is no connector for your power cell.") - return user.drop_item() W.loc = src @@ -479,7 +466,6 @@ if (cell) to_chat(user, "Close the APC first.")//Less hints more mystery! - return else if (has_electronics==1 && terminal) @@ -487,61 +473,47 @@ stat &= ~MAINT playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) to_chat(user, "You screw the circuit electronics into place.") - else if (has_electronics==2) has_electronics = 1 stat |= MAINT playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) to_chat(user, "You unfasten the electronics.") - else /* has_electronics==0 */ to_chat(user, "There is nothing to secure.") - return update_icon() else if(emagged) to_chat(user, "The interface is broken.") - else wiresexposed = !wiresexposed to_chat(user, "The wires have been [wiresexposed ? "exposed" : "unexposed"]") - update_icon() else if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) // trying to unlock the interface with an ID card if(emagged) to_chat(user, "The interface is broken.") - else if(opened) to_chat(user, "You must close the cover to swipe an ID card.") - else if(wiresexposed) to_chat(user, "You must close the panel") - else if(stat & (BROKEN|MAINT)) to_chat(user, "Nothing happens.") - else if(src.allowed(usr) && !isWireCut(APC_WIRE_IDSCAN)) locked = !locked to_chat(user, "You [ locked ? "lock" : "unlock"] the APC interface.") - update_icon() else to_chat(user, "Access denied.") - else if (istype(W, /obj/item/stack/cable_coil) && !terminal && opened && has_electronics!=2) if (src.loc:intact) to_chat(user, "You must remove the floor plating in front of the APC first.") - return var/obj/item/stack/cable_coil/C = W if(C.amount < 10) to_chat(user, "You need more wires.") - return to_chat(user, "You start adding cables to the APC frame...") - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) if(do_after(user, 20, target = src)) if (C.amount >= 10 && !terminal && opened && has_electronics != 2) @@ -561,10 +533,8 @@ else if (istype(W, /obj/item/weapon/wirecutters) && terminal && opened && has_electronics!=2) if (src.loc:intact) to_chat(user, "You must remove the floor plating in front of the APC first.") - return to_chat(user, "You begin to cut the cables...") - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) if(do_after(user, 50, target = src)) if(terminal && opened && has_electronics!=2) @@ -575,27 +545,22 @@ return new /obj/item/stack/cable_coil(loc,10) to_chat(user, "You cut the cables and dismantle the power terminal.") - qdel(terminal) // qdel else if (istype(W, /obj/item/weapon/apc_electronics) && opened && has_electronics==0 && !((stat & BROKEN) || malfhack)) to_chat(user, "You trying to insert the power control board into the frame...") - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) if(do_after(user, 10, target = src)) if(has_electronics==0) has_electronics = 1 to_chat(user, "You place the power control board inside the frame.") - qdel(W) // qdel else if (istype(W, /obj/item/weapon/apc_electronics) && opened && has_electronics==0 && ((stat & BROKEN) || malfhack)) to_chat(user, "You cannot put the board inside, the frame is damaged.") - return else if (istype(W, /obj/item/weapon/weldingtool) && opened && has_electronics==0 && !terminal) var/obj/item/weapon/weldingtool/WT = W if (WT.get_fuel() < 3) to_chat(user, "You need more welding fuel to complete this task.") - return user.visible_message("[user.name] welds [src].", \ "You start welding the APC frame...", \ @@ -629,10 +594,8 @@ else if (istype(W, /obj/item/mounted/frame/apc_frame) && opened && ((stat & BROKEN) || malfhack)) if (has_electronics) to_chat(user, "You cannot repair this APC until you remove the electronics still inside.") - return to_chat(user, "You begin to replace the damaged APC frame...") - if(do_after(user, 50, target = src)) user.visible_message(\ "[user.name] has replaced the damaged APC frame with new one.",\ @@ -673,19 +636,15 @@ if (!(emagged || malfhack)) // trying to unlock with an emag card if(opened) to_chat(user, "You must close the cover to swipe an ID card.") - else if(wiresexposed) to_chat(user, "You must close the panel first") - else if(stat & (BROKEN|MAINT)) to_chat(user, "Nothing happens.") - else flick("apc-spark", src) emagged = 1 locked = 0 to_chat(user, "You emag the APC interface.") - update_icon() // attack with hand - remove cell (if cover open) or interact with the APC @@ -704,7 +663,6 @@ s.set_up(3, 1, src) s.start() to_chat(H, "The APC power currents surge erratically, damaging your chassis!") - H.adjustFireLoss(10,0) else if(src.cell && src.cell.charge > 0) if(H.nutrition < 450) @@ -716,7 +674,6 @@ src.cell.charge = 0 to_chat(user, "You slot your fingers into the APC interface and siphon off some of the stored charge for your own use.") - if(src.cell.charge < 0) src.cell.charge = 0 if(H.nutrition > 500) @@ -724,10 +681,8 @@ src.charging = 1 else to_chat(user, "You are already fully charged.") - else to_chat(user, "There is no charge to draw from that APC.") - return if(usr == user && opened && (!issilicon(user))) @@ -742,7 +697,6 @@ src.cell = null user.visible_message("[user.name] removes the power cell from [src.name]!", "You remove the power cell.") // to_chat(user, "You remove the power cell.") - charging = 0 src.update_icon() return @@ -883,14 +837,12 @@ // if (area.name == "AI Chamber") // spawn(10) // to_chat(world, " [area.name] [area.power_equip]") - else area.power_light = 0 area.power_equip = 0 area.power_environ = 0 // if (area.name == "AI Chamber") // to_chat(world, "[area.power_equip]") - area.power_change() /obj/machinery/power/apc/proc/isWireCut(var/wireIndex) @@ -915,7 +867,6 @@ ) if(!loud) to_chat(user, "\The [src] has AI control disabled!") - user << browse(null, "window=apc") user.unset_machine() return 0 @@ -928,11 +879,9 @@ if(H.getBrainLoss() >= 60) for(var/mob/M in viewers(src, null)) to_chat(M, "[H] stares cluelessly at [src] and drools.") - return 0 else if(prob(H.getBrainLoss())) to_chat(user, "You momentarily forget how to use [src].") - return 0 return 1 @@ -1024,10 +973,8 @@ if(get_malf_status(malfai)==1) if (malfai.malfhacking) to_chat(malfai, "You are already hacking an APC.") - return 0 to_chat(malfai, "Beginning override of APC systems. This takes some time, and you cannot perform other actions during the process.") - malfai.malfhack = src malfai.malfhacking = 1 sleep(600) @@ -1044,7 +991,6 @@ else src.malfai = usr to_chat(malfai, "Hack complete. The APC is now under your exclusive control.") - update_icon() else if (href_list["occupyapc"]) @@ -1059,7 +1005,6 @@ if(istype(usr, /mob/living/silicon)) if(emagged || aidisabled || (stat & (BROKEN|MAINT))) to_chat(usr, "The APC does not respond to the command.") - else locked = !locked update_icon() @@ -1082,11 +1027,9 @@ return if(istype(malf.loc, /obj/machinery/power/apc)) // Already in an APC to_chat(malf, "You must evacuate your current apc first.") - return if(!malf.can_shunt) to_chat(malf, "You cannot shunt.") - return if(!(src.z in config.station_levels)) return @@ -1127,7 +1070,6 @@ else to_chat(src.occupier, "Primary core damaged, unable to return core processes.") - if(forced) src.occupier.loc = src.loc src.occupier.death() @@ -1143,7 +1085,6 @@ src.locked = 1 if (src.cell.charge > 0) // to_chat(world, "blew APC in [src.loc.loc]") - src.cell.charge = 0 cell.corrupt() src.malfhack = 1 diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 7597b31a57e..9253c19a5aa 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -121,12 +121,10 @@ By design, d1 is the smallest direction and d2 is the highest ///// Z-Level Stuff /* if(src.d1 == 12 || src.d2 == 12) to_chat(user, "You must cut this cable from above.") - return */ ///// Z-Level Stuff /* if(breaker_box) to_chat(user, "\red This cable is connected to nearby breaker box. Use breaker box to interact with it.") - return */ if (shock(user, 50)) @@ -160,7 +158,6 @@ By design, d1 is the smallest direction and d2 is the highest var/obj/item/stack/cable_coil/coil = W if (coil.get_amount() < 1) to_chat(user, "Not enough cable") - return coil.cable_join(src, user) @@ -169,11 +166,9 @@ By design, d1 is the smallest direction and d2 is the highest if(powernet && (powernet.avail > 0)) // is it powered? to_chat(user, "[powernet.avail]W in power network.") - else to_chat(user, "The cable is not powered.") - shock(user, 5, 0.2) else @@ -520,11 +515,9 @@ obj/structure/cable/proc/cableColor(var/colorC) user.visible_message("\The [user] repairs some burn damage on \the [M]'s [S.name] with \the [src].") else if(S.open != 2) to_chat(user, "The damage is far too severe to patch over externally.") - return 1 else if(S.open != 2) to_chat(user, "Nothing to fix!") - else return ..() @@ -554,15 +547,12 @@ obj/structure/cable/proc/cableColor(var/colorC) if(get_amount() == 1) to_chat(user, "A short piece of power cable.") - else if(get_amount() == 2) to_chat(user, "A piece of power cable.") - else to_chat(user, "A coil of power cable. There are [get_amount()] lengths of cable in the coil.") - /obj/item/stack/cable_coil/verb/make_restraint() set name = "Make Cable Restraints" set category = "Object" @@ -572,16 +562,13 @@ obj/structure/cable/proc/cableColor(var/colorC) if(!istype(usr.loc,/turf)) return if(src.amount <= 14) to_chat(usr, "You need at least 15 lengths to make restraints!") - return var/obj/item/weapon/restraints/handcuffs/cable/B = new /obj/item/weapon/restraints/handcuffs/cable(usr.loc) B.color = color to_chat(usr, "You wind some cable together to make some restraints.") - src.use(15) else to_chat(usr, "You cannot do that.") - ..() // Items usable on a cable coil : @@ -593,19 +580,16 @@ obj/structure/cable/proc/cableColor(var/colorC) src.amount-- new/obj/item/stack/cable_coil(user.loc, 1,color) to_chat(user, "You cut a piece off the cable coil.") - src.update_icon() return else if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/C = W if(C.amount >= MAXCOIL) to_chat(user, "The coil is too long, you cannot add any more cable to it.") - return if( (C.amount + src.amount <= MAXCOIL) ) to_chat(user, "You join the cable coils together.") - C.give(src.amount) // give it cable src.use(src.amount) // make sure this one cleans up right return @@ -613,7 +597,6 @@ obj/structure/cable/proc/cableColor(var/colorC) else var/amt = MAXCOIL - C.amount to_chat(user, "You transfer [amt] length\s of cable from one coil to the other.") - C.give(amt) src.use(amt) return @@ -664,17 +647,14 @@ obj/structure/cable/proc/cableColor(var/colorC) if(!T.can_have_cabling()) to_chat(user, "You can only lay cables on catwalks and plating!") - return if(get_amount() < 1) // Out of cable to_chat(user, "There is no cable left!") - return if(get_dist(T,user) > 1) // Too far to_chat(user, "You can't lay cable at a place that far away!") - return else @@ -688,7 +668,6 @@ obj/structure/cable/proc/cableColor(var/colorC) for(var/obj/structure/cable/LC in T) if(LC.d2 == dirn && LC.d1 == 0) to_chat(user, "There's already a cable at that position!") - return var/obj/structure/cable/C = get_new_cable(T) @@ -731,7 +710,6 @@ obj/structure/cable/proc/cableColor(var/colorC) if(get_dist(C, user) > 1) // make sure it's close enough to_chat(user, "You can't lay cable at a place that far away.") - return @@ -745,7 +723,6 @@ obj/structure/cable/proc/cableColor(var/colorC) if(C.d1 == dirn || C.d2 == dirn) if(U.intact) // can't place a cable if the floor is complete to_chat(user, "You can't lay cable there unless the floor tiles are removed.") - return else // cable is pointing at us, we're standing on an open tile @@ -756,7 +733,6 @@ obj/structure/cable/proc/cableColor(var/colorC) for(var/obj/structure/cable/LC in U) // check to make sure there's not a cable there already if(LC.d1 == fdirn || LC.d2 == fdirn) to_chat(user, "There's already a cable at that position.") - return var/obj/structure/cable/NC = new(U) @@ -803,7 +779,6 @@ obj/structure/cable/proc/cableColor(var/colorC) continue if((LC.d1 == nd1 && LC.d2 == nd2) || (LC.d1 == nd2 && LC.d2 == nd1) ) // make sure no cable matches either direction to_chat(user, "There's already a cable at that position.") - return diff --git a/code/modules/power/cable_heavyduty.dm b/code/modules/power/cable_heavyduty.dm index 5f99ee3b59f..87a25032eb7 100644 --- a/code/modules/power/cable_heavyduty.dm +++ b/code/modules/power/cable_heavyduty.dm @@ -17,11 +17,9 @@ if(istype(W, /obj/item/weapon/wirecutters)) to_chat(usr, "\blue These cables are too tough to be cut with those [W.name].") - return else if(istype(W, /obj/item/stack/cable_coil)) to_chat(usr, "\blue You will need heavier cables to connect to these.") - return else ..() diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 6a480a89d06..7dda66629d7 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -59,14 +59,11 @@ if(..(user, 1)) if(maxcharge <= 2500) to_chat(user, "[desc]\nThe manufacturer's label states this cell has a power rating of [maxcharge], and that you should not swallow it.\nThe charge meter reads [round(src.percent() )]%.") - else to_chat(user, "This power cell has an exciting chrome finish, as it is an uber-capacity cell type! It has a power rating of [maxcharge]!\nThe charge meter reads [round(src.percent() )]%.") - if(crit_fail) to_chat(user, "\red This power cell seems to be faulty.") - /obj/item/weapon/stock_parts/cell/attack_self(mob/user as mob) src.add_fingerprint(user) return @@ -78,7 +75,6 @@ to_chat(user, "You inject the solution into the power cell.") - if(S.reagents.has_reagent("plasma", 5)) rigged = 1 diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index a3e7c0d75c8..81af0089e6f 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -122,7 +122,6 @@ if(istype(W, /obj/item/weapon/wrench)) anchored = !anchored to_chat(user, "\blue You [anchored ? "secure" : "unsecure"] the bolts holding [src] to the floor.") - use_power = anchored reconnect() else diff --git a/code/modules/power/generator_type2.dm b/code/modules/power/generator_type2.dm index 52a66625d30..46a6fe20320 100644 --- a/code/modules/power/generator_type2.dm +++ b/code/modules/power/generator_type2.dm @@ -74,7 +74,6 @@ // to_chat(world, "POWER: [lastgen] W generated at [efficiency*100]% efficiency and sinks sizes [cold_air_heat_capacity], [hot_air_heat_capacity]") - input1.parent.update = 1 input2.parent.update = 1 diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 76b19dda201..04ffbc5c0a4 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -183,7 +183,6 @@ var/const/GRAV_NEEDS_WRENCH = 3 if(GRAV_NEEDS_SCREWDRIVER) if(istype(I, /obj/item/weapon/screwdriver)) to_chat(user, "You secure the screws of the framework.") - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) broken_state++ if(GRAV_NEEDS_WELDING) @@ -191,7 +190,6 @@ var/const/GRAV_NEEDS_WRENCH = 3 var/obj/item/weapon/weldingtool/WT = I if(WT.remove_fuel(1, user)) to_chat(user, "You mend the damaged framework.") - playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) broken_state++ if(GRAV_NEEDS_PLASTEEL) @@ -200,16 +198,13 @@ var/const/GRAV_NEEDS_WRENCH = 3 if(PS.amount >= 10) PS.use(10) to_chat(user, "You add the plating to the framework.") - playsound(src.loc, 'sound/machines/click.ogg', 75, 1) broken_state++ else to_chat(user, "You need 10 sheets of plasteel.") - if(GRAV_NEEDS_WRENCH) if(istype(I, /obj/item/weapon/wrench)) to_chat(user, "You secure the plating to the framework.") - playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) set_fix() else diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index ade62f2144e..3890b433eaf 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -31,21 +31,17 @@ switch(src.stage) if(1) to_chat(usr, "It's an empty frame.") - if(2) to_chat(usr, "It's wired.") - if(3) to_chat(usr, "The casing is closed.") - /obj/machinery/light_construct/attackby(obj/item/weapon/W as obj, mob/living/user as mob, params) src.add_fingerprint(user) if (istype(W, /obj/item/weapon/wrench)) if (src.stage == 1) playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) to_chat(usr, "You begin deconstructing [src].") - if (!do_after(usr, 30, target = src)) return new /obj/item/stack/sheet/metal( get_turf(src.loc), sheets_refunded ) @@ -55,12 +51,10 @@ qdel(src) if (src.stage == 2) to_chat(usr, "You have to remove the wires first.") - return if (src.stage == 3) to_chat(usr, "You have to unscrew the case first.") - return if(istype(W, /obj/item/weapon/wirecutters)) @@ -276,19 +270,15 @@ switch(status) if(LIGHT_OK) to_chat(user, "[desc] It is turned [on? "on" : "off"].") - if(LIGHT_EMPTY) to_chat(user, "[desc] The [fitting] has been removed.") - if(LIGHT_BURNED) to_chat(user, "[desc] The [fitting] is burnt out.") - if(LIGHT_BROKEN) to_chat(user, "[desc] The [fitting] has been smashed.") - // attack with item - insert light (if right type), otherwise try to break the light /obj/machinery/light/attackby(obj/item/W, mob/living/user, params) @@ -305,7 +295,6 @@ if(istype(W, /obj/item/weapon/light)) if(status != LIGHT_EMPTY) to_chat(user, "There is a [fitting] already inserted.") - return else src.add_fingerprint(user) @@ -313,7 +302,6 @@ if(istype(L, light_type)) status = L.status to_chat(user, "You insert the [L.name].") - switchcount = L.switchcount rigged = L.rigged brightness_range = L.brightness_range @@ -333,7 +321,6 @@ explode() else to_chat(user, "This type of light requires a [fitting].") - return // attempt to break the light @@ -345,7 +332,6 @@ if(prob(1+W.force * 5)) to_chat(user, "You hit the light, and it smashes!") - for(var/mob/M in viewers(src)) if(M == user) continue @@ -384,7 +370,6 @@ return to_chat(user, "You stick \the [W] into the light socket!") - if(has_power() && (W.flags & CONDUCT)) var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, src) @@ -423,7 +408,6 @@ /obj/machinery/light/attack_alien(mob/living/carbon/alien/humanoid/user)//So larva don't go breaking light bulbs. if(status == LIGHT_EMPTY||status == LIGHT_BROKEN) to_chat(user, "\green That object is useless to you.") - return else if (status == LIGHT_OK||status == LIGHT_BURNED) user.do_attack_animation(src) @@ -435,7 +419,6 @@ if(M.melee_damage_upper == 0) return if(status == LIGHT_EMPTY||status == LIGHT_BROKEN) to_chat(M, "\red That object is useless to you.") - return else if (status == LIGHT_OK||status == LIGHT_BURNED) M.do_attack_animation(src) @@ -451,7 +434,6 @@ if(status == LIGHT_EMPTY) to_chat(user, "There is no [fitting] in this light.") - return // make it burn hands if not wearing fire-insulated gloves @@ -470,14 +452,11 @@ if(prot > 0 || (RESIST_HEAT in user.mutations)) to_chat(user, "You remove the light [fitting]") - else if(TK in user.mutations) to_chat(user, "You telekinetically remove the light [fitting].") - else to_chat(user, "You try to remove the light [fitting], but you burn your hand on it!") - var/obj/item/organ/external/affecting = H.get_organ("[user.hand ? "l" : "r" ]_hand") if(affecting.take_damage( 0, 5 )) // 5 burn damage H.UpdateDamageIcon() @@ -487,7 +466,6 @@ to_chat(user, "You remove the light [fitting].") - // create a light tube/bulb item and put it in the user's hand var/obj/item/weapon/light/L = new light_type() L.status = status @@ -513,11 +491,9 @@ /obj/machinery/light/attack_tk(mob/user) if(status == LIGHT_EMPTY) to_chat(user, "There is no [fitting] in this light.") - return to_chat(user, "You telekinetically remove the light [fitting].") - // create a light tube/bulb item and put it in the user's hand var/obj/item/weapon/light/L = new light_type() L.status = status @@ -697,7 +673,6 @@ to_chat(user, "You inject the solution into the [src].") - if(S.reagents.has_reagent("plasma", 5)) log_admin("LOG: [user.name] ([user.ckey]) injected a light with plasma, rigging it to explode.") diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 062978045ec..bc1599674a2 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -52,11 +52,9 @@ return if(active) to_chat(usr, "The generator is on.") - else to_chat(usr, "The generator is off.") - /obj/machinery/power/port_gen/emp_act(severity) var/duration = 6000 //ten minutes switch(severity) @@ -154,16 +152,12 @@ /obj/machinery/power/port_gen/pacman/examine(mob/user) ..(user) to_chat(user, "\The [src] appears to be producing [power_gen*power_output] W.") - to_chat(user, "There [sheets == 1 ? "is" : "are"] [sheets] sheet\s left in the hopper.") - if(IsBroken()) to_chat(user, "\The [src] seems to have broken down.") - if(overheating) to_chat(user, "\The [src] is overheating!") - /obj/machinery/power/port_gen/pacman/HasFuel() var/needed_sheets = power_output / time_per_sheet if(sheets >= needed_sheets - sheet_left) @@ -278,10 +272,8 @@ var/amount = min((max_sheets - sheets), addstack.amount) if(amount < 1) to_chat(user, "The [src.name] is full!") - return to_chat(user, "You add [amount] sheet\s to the [src.name].") - sheets += amount addstack.use(amount) nanomanager.update_uis(src) @@ -292,12 +284,10 @@ if(!anchored) connect_to_network() to_chat(user, "You secure the generator to the floor.") - else disconnect_from_network() to_chat(user, "You unsecure the generator from the floor.") - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) anchored = !anchored @@ -306,10 +296,8 @@ playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) if(panel_open) to_chat(user, "You open the access panel.") - else to_chat(user, "You close the access panel.") - else if(istype(O, /obj/item/weapon/storage/part_replacer) && panel_open) exchange_parts(user, O) return diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index 72c9f0e4eb5..5dd8f2e36ea 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -45,7 +45,6 @@ var/global/list/rad_collectors = list() return else to_chat(user, "\red The controls are locked!") - return ..() @@ -53,18 +52,15 @@ var/global/list/rad_collectors = list() /obj/machinery/power/rad_collector/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/device/multitool)) to_chat(user, "The [W.name] detects that [last_power]W were recently produced.") - return 1 else if(istype(W, /obj/item/device/analyzer) && P) atmosanalyzer_scan(P.air_contents, user) else if(istype(W, /obj/item/weapon/tank/plasma)) if(!src.anchored) to_chat(user, "\red The [src] needs to be secured to the floor first.") - return 1 if(src.P) to_chat(user, "\red There's already a plasma tank loaded.") - return 1 user.drop_item() src.P = W @@ -77,7 +73,6 @@ var/global/list/rad_collectors = list() else if(istype(W, /obj/item/weapon/wrench)) if(P) to_chat(user, "\blue Remove the plasma tank first.") - return 1 playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) src.anchored = !src.anchored @@ -93,14 +88,11 @@ var/global/list/rad_collectors = list() if(active) src.locked = !src.locked to_chat(user, "The controls are now [src.locked ? "locked." : "unlocked."]") - else src.locked = 0 //just in case it somehow gets locked to_chat(user, "\red The controls can only be locked when the [src] is active") - else to_chat(user, "\red Access denied!") - return 1 else ..() diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index e69bd179ed9..4f0d72e1511 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -66,7 +66,6 @@ if (src.anchored || usr:stat) to_chat(usr, "It is fastened to the floor!") - return 0 src.dir = turn(src.dir, 90) return 1 @@ -129,20 +128,17 @@ if(state == 2) if(!powernet) to_chat(user, "The emitter isn't connected to a wire.") - return 1 if(!src.locked) if(src.active==1) src.active = 0 to_chat(user, "You turn off the [src].") - message_admins("Emitter turned off by [key_name_admin(user)] in ([x], [y], [z] - JMP)",0,1) log_game("Emitter turned off by [key_name(user)] in [x], [y], [z]") investigate_log("turned off by [key_name(usr)]","singulo") else src.active = 1 to_chat(user, "You turn on the [src].") - src.shot_number = 0 src.fire_delay = maximum_fire_delay message_admins("Emitter turned on by [key_name_admin(user)] in ([x], [y], [z] - JMP)",0,1) @@ -151,10 +147,8 @@ update_icon() else to_chat(user, "\red The controls are locked!") - else to_chat(user, "\red The [src] needs to be firmly secured to the floor first.") - return 1 @@ -230,7 +224,6 @@ if(istype(W, /obj/item/weapon/wrench)) if(active) to_chat(user, "Turn off the [src] first.") - return switch(state) if(0) @@ -249,19 +242,16 @@ src.anchored = 0 if(2) to_chat(user, "\red The [src.name] needs to be unwelded from the floor.") - return if(istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W if(active) to_chat(user, "Turn off the [src] first.") - return switch(state) if(0) to_chat(user, "\red The [src.name] needs to be wrenched to the floor.") - if(1) if (WT.remove_fuel(0,user)) playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) @@ -272,11 +262,9 @@ if(!src || !WT.isOn()) return state = 2 to_chat(user, "You weld the [src] to the floor.") - connect_to_network() else to_chat(user, "\red You need more welding fuel to complete this task.") - if(2) if (WT.remove_fuel(0,user)) playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) @@ -287,30 +275,24 @@ if(!src || !WT.isOn()) return state = 1 to_chat(user, "You cut the [src] free from the floor.") - disconnect_from_network() else to_chat(user, "\red You need more welding fuel to complete this task.") - return if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda)) if(emagged) to_chat(user, "\red The lock seems to be broken") - return if(src.allowed(user)) if(active) src.locked = !src.locked to_chat(user, "The controls are now [src.locked ? "locked." : "unlocked."]") - else src.locked = 0 //just in case it somehow gets locked to_chat(user, "\red The controls can only be locked when the [src] is online") - else to_chat(user, "\red Access denied.") - return if(default_deconstruction_screwdriver(user, "emitter_open", "emitter", W)) diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 320f2d8dc6c..5bf41aac044 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -80,7 +80,6 @@ field_generator power level display if(get_dist(src, user) <= 1)//Need to actually touch the thing to turn it on if(src.active >= 1) to_chat(user, "You are unable to turn off the [src.name] once it is online!") - return 1 else user.visible_message("[user.name] turns on the [src.name].", \ @@ -92,14 +91,12 @@ field_generator power level display src.add_fingerprint(user) else to_chat(user, "The [src] needs to be firmly secured to the floor first!") - return /obj/machinery/field/generator/attackby(obj/item/W, mob/user, params) if(active) to_chat(user, "The [src] needs to be off!") - return else if(istype(W, /obj/item/weapon/wrench)) switch(state) @@ -120,14 +117,12 @@ field_generator power level display src.anchored = 0 if(2) to_chat(user, "The [src.name] needs to be unwelded from the floor!") - return else if(istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W switch(state) if(0) to_chat(user, "The [src.name] needs to be wrenched to the floor!") - return if(1) if (WT.remove_fuel(0,user)) @@ -139,7 +134,6 @@ field_generator power level display if(!src || !WT.isOn()) return state = 2 to_chat(user, "You weld the field generator to the floor.") - else return if(2) @@ -152,7 +146,6 @@ field_generator power level display if(!src || !WT.isOn()) return state = 1 to_chat(user, "You cut \the [src] free from the floor.") - else return else diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index 48c980f39fe..1c43e1a829d 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -25,10 +25,8 @@ /obj/singularity/narsie/large/New() ..() to_chat(world, "NAR-SIE HAS RISEN") - to_chat(world, pick(sound('sound/hallucinations/im_here1.ogg'), sound('sound/hallucinations/im_here2.ogg'))) - var/area/A = get_area(src) if(A) notify_ghosts("Nar-Sie has risen in \the [A.name]. Reach out to the Geometer to be given a new shell for your soul.") @@ -41,7 +39,6 @@ /obj/singularity/narsie/large/attack_ghost(mob/dead/observer/user as mob) if(!(src in view())) to_chat(user, "Your soul is too far away.") - return makeNewConstruct(/mob/living/simple_animal/construct/harvester, user, null, 1) new /obj/effect/effect/sleep_smoke(user.loc) @@ -80,7 +77,6 @@ if(M.stat == CONSCIOUS) if(!iscultist(M)) to_chat(M, "You feel your sanity crumble away in an instant as you gaze upon [src.name]...") - M.apply_effect(3, STUN) @@ -128,15 +124,12 @@ /obj/singularity/narsie/proc/acquire(var/mob/food) to_chat(target, "NAR-SIE HAS LOST INTEREST IN YOU") - target = food if(ishuman(target)) to_chat(target, "NAR-SIE HUNGERS FOR YOUR SOUL") - else to_chat(target, "NAR-SIE HAS CHOSEN YOU TO LEAD HIM TO HIS NEXT MEAL") - //Wizard narsie /obj/singularity/narsie/wizard grav_pull = 0 diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm index 3f9b639dc46..cff8c2ee9fa 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm @@ -97,7 +97,6 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin return if (src.anchored) to_chat(usr, "It is fastened to the floor!") - return 0 src.dir = turn(src.dir, 270) return 1 @@ -111,7 +110,6 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin return if (src.anchored) to_chat(usr, "It is fastened to the floor!") - return 0 src.dir = turn(src.dir, 90) return 1 @@ -238,7 +236,6 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin temp_state++ else to_chat(user, "You need one length of cable to wire the [src.name]!") - return if(2) if(iswirecutter(O))//TODO:Shock user if its on? @@ -293,7 +290,6 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin return if (src.anchored) to_chat(usr, "It is fastened to the floor!") - return 0 src.dir = turn(src.dir, 270) return 1 @@ -307,7 +303,6 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin return if (src.anchored) to_chat(usr, "It is fastened to the floor!") - return 0 src.dir = turn(src.dir, 90) return 1 diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index a5e7d111c69..8101269762e 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -87,7 +87,6 @@ if(!interface_control) to_chat(usr, "ERROR: Request timed out. Check wire contacts.") - return if( href_list["close"] ) diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index df8cceb0fdf..ba516cd2181 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -391,7 +391,6 @@ var/obj/item/clothing/glasses/meson/MS = H.glasses if(MS.vision_flags == SEE_TURFS) to_chat(H, "You look directly into the [src.name], good thing you had your protective eyewear on!") - return M.apply_effect(3, STUN) diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 3d998c45545..d55394f83bd 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -131,11 +131,9 @@ terminal = term terminal.master = src to_chat(user, "Terminal found.") - break if(!terminal) to_chat(user, "No power source found.") - return stat &= ~BROKEN update_icon() @@ -153,24 +151,20 @@ if(terminal) //is there already a terminal ? to_chat(user, "This SMES already has a power terminal!") - return if(!panel_open) //is the panel open ? to_chat(user, "You must open the maintenance panel first!") - return var/turf/T = get_turf(user) if (T.intact) //is the floor plating removed ? to_chat(user, "You must first remove the floor plating!") - return var/obj/item/stack/cable_coil/C = I if(C.amount < 10) to_chat(user, "You need more wires.") - return //build the terminal and link it to the network @@ -183,11 +177,9 @@ var/turf/T = get_turf(terminal) if (T.intact) //is the floor plating removed ? to_chat(user, "You must first expose the power terminal!") - return to_chat(user, "You begin to dismantle the power terminal...") - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) if(do_after(user, 50, target = src)) @@ -311,7 +303,6 @@ /obj/machinery/power/smes/proc/make_terminal(const/mob/user) if (user.loc == loc) to_chat(user, "You must not be on the same tile as the [src].") - return 1 //Direction the terminal will face to @@ -324,15 +315,12 @@ var/turf/tempLoc = get_step(src, reverse_direction(tempDir)) if (istype(tempLoc, /turf/space)) to_chat(user, "You can't build a terminal on space.") - return 1 else if (istype(tempLoc)) if(tempLoc.intact) to_chat(user, "You must remove the floor plating first.") - return 1 to_chat(user, "You start adding cable to the [src].") - if(do_after(user, 50, target = src)) var/turf/T = get_turf(user) var/obj/structure/cable/N = T.get_cable_node() //get the connecting node cable, if there's one diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index d998d93556b..44f78fa4e38 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -248,7 +248,6 @@ new /obj/machinery/power/solar(get_turf(src), src) else to_chat(user, "You need two sheets of glass to put them into a solar panel.") - return return 1 @@ -420,7 +419,6 @@ if(do_after(user, 20, target = src)) if (src.stat & BROKEN) to_chat(user, "The broken glass falls out.") - var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) new /obj/item/weapon/shard( src.loc ) var/obj/item/weapon/circuitboard/solar_control/M = new /obj/item/weapon/circuitboard/solar_control( A ) @@ -433,7 +431,6 @@ qdel(src) else to_chat(user, "You disconnect the monitor.") - var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) var/obj/item/weapon/circuitboard/solar_control/M = new /obj/item/weapon/circuitboard/solar_control( A ) for (var/obj/C in src) diff --git a/code/modules/power/supermatter/sm_shard.dm b/code/modules/power/supermatter/sm_shard.dm index 10adc4c9814..e95b51cf828 100644 --- a/code/modules/power/supermatter/sm_shard.dm +++ b/code/modules/power/supermatter/sm_shard.dm @@ -45,7 +45,6 @@ if(ismob(AM)) var/mob/M = AM to_chat(M, "\red You step on \the [src]!") - playsound(src.loc, 'sound/effects/glass_step_sm.ogg', 70, 1) // not sure how to handle metal shards with sounds if(ishuman(M)) var/mob/living/carbon/human/H = M @@ -68,7 +67,6 @@ /obj/item/weapon/shard/supermatter/attack_hand(var/mob/user) if(!istype(user,/mob/living/carbon/human/nucleation)) to_chat(user, pick( "\red You think twice before touching that without protection.",) - "\red You don't want to touch that without some protection.", "\red You probably should get something else to pick that up.", "\red You aren't sure that's a good idea.", diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index fa663b37ca6..dcce2bb23ae 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -226,9 +226,7 @@ for(var/mob/M in mob_list) to_chat(M, 'sound/effects/supermatter.ogg')//everyone goan know bout this - to_chat(M, "A horrible screeching fills your ears, and a wave of dread washes over you...") - qdel(src) return(gain) diff --git a/code/modules/power/switch.dm b/code/modules/power/switch.dm index 07a6ddf558e..cba253be5f0 100644 --- a/code/modules/power/switch.dm +++ b/code/modules/power/switch.dm @@ -25,21 +25,17 @@ ..(user) if(on) to_chat(user, "The switch is in the on position") - else to_chat(user, "The switch is in the off position") - /obj/structure/powerswitch/attack_ai(mob/user) to_chat(user, "\red You're an AI. This is a manual switch. It's not going to work.") - return /obj/structure/powerswitch/attack_hand(mob/user) if(busy) to_chat(user, "\red This switch is already being toggled.") - return ..() diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index 305e2c0fc9a..dd20b4fde12 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -59,7 +59,6 @@ var/list/blacklisted_tesla_types = list(/obj/machinery/atmospherics, to_chat(user, "The amount of orbiting mini-balls is [orbiting_balls.len].") - /obj/singularity/energy_ball/proc/move_the_basket_ball(var/move_amount) for(var/i = 0, i < move_amount, i++) var/move_dir = pick(alldirs) diff --git a/code/modules/power/treadmill.dm b/code/modules/power/treadmill.dm index 88c7aae1995..8ae75a982a4 100644 --- a/code/modules/power/treadmill.dm +++ b/code/modules/power/treadmill.dm @@ -170,7 +170,6 @@ ..() to_chat(user, "The display reads:
      [line1]
      [line2]
      ") - /obj/machinery/treadmill_monitor/update_icon() overlays.Cut() if(stat & NOPOWER || !total_joules || !on) diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm index 0ab93b6d825..7df58795f43 100644 --- a/code/modules/power/turbine.dm +++ b/code/modules/power/turbine.dm @@ -121,11 +121,9 @@ locate_machinery() if(turbine) to_chat(user, "Turbine connected.") - stat &= ~BROKEN else to_chat(user, "Turbine not connected.") - stat |= BROKEN return @@ -282,11 +280,9 @@ locate_machinery() if(compressor) to_chat(user, "Compressor connected.") - stat &= ~BROKEN else to_chat(user, "Compressor not connected.") - stat |= BROKEN return diff --git a/code/modules/procedural_mapping/mapGenerator.dm b/code/modules/procedural_mapping/mapGenerator.dm index 24c0fa2bbda..645c6e786de 100644 --- a/code/modules/procedural_mapping/mapGenerator.dm +++ b/code/modules/procedural_mapping/mapGenerator.dm @@ -154,29 +154,22 @@ //maxx maxy and current z so that if you fuck up, you only fuck up one entire z level instead of the entire universe if(!startInput || !endInput) to_chat(src, "Missing Input") - return var/list/startCoords = splittext(startInput, ";") var/list/endCoords = splittext(endInput, ";") if(!startCoords || !endCoords) to_chat(src, "Invalid Coords") - to_chat(src, "Start Input: [startInput]") - to_chat(src, "End Input: [endInput]") - return var/turf/Start = locate(text2num(startCoords[1]),text2num(startCoords[2]),text2num(startCoords[3])) var/turf/End = locate(text2num(endCoords[1]),text2num(endCoords[2]),text2num(endCoords[3])) if(!Start || !End) to_chat(src, "Invalid Turfs") - to_chat(src, "Start Coords: [startCoords[1]] - [startCoords[2]] - [startCoords[3]]") - to_chat(src, "End Coords: [endCoords[1]] - [endCoords[2]] - [endCoords[3]]") - return var/list/clusters = list("None"=CLUSTER_CHECK_NONE,"All"=CLUSTER_CHECK_ALL,"Sames"=CLUSTER_CHECK_SAMES,"Differents"=CLUSTER_CHECK_DIFFERENTS, \ @@ -190,7 +183,6 @@ if(moduleClusters != "None") if(!clusters[moduleClusters]) to_chat(src, "Invalid Cluster Flags") - return theCluster = clusters[moduleClusters] else @@ -202,12 +194,8 @@ to_chat(src, "Defining Region") - N.defineRegion(Start, End) to_chat(src, "Region Defined") - to_chat(src, "Generating Region") - N.generate() to_chat(src, "Generated Region") - diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index 2bb8334967d..0022a4e1f80 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -49,11 +49,9 @@ else to_chat(user, "\blue You can only inscribe a metal bullet.")//because inscribing beanbags is silly - else to_chat(user, "\blue There is no bullet in the casing to inscribe anything into.") - /obj/item/ammo_casing/proc/newshot() //For energy weapons, shotgun shells and wands (!). if (!BB) BB = new projectile_type(src) @@ -125,7 +123,6 @@ if(num_loaded) if(!silent) to_chat(user, "You load [num_loaded] shell\s into \the [src]!") - A.update_icon() update_icon() @@ -134,7 +131,6 @@ if(A) user.put_in_hands(A) to_chat(user, "You remove a round from \the [src]!") - update_icon() /obj/item/ammo_box/update_icon() diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index bd288a8e405..7a3718d1642 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -69,7 +69,6 @@ proc/shoot_with_empty_chamber(mob/living/user as mob|obj) to_chat(user, "*click*") - playsound(user, 'sound/weapons/emptyclick.ogg', 40, 1) return @@ -100,7 +99,6 @@ var/mob/living/M = user if ((CLUMSY in M.mutations) && prob(50)) to_chat(M, "[src] blows up in your face.") - M.take_organ_damage(0,20) M.drop_item() qdel(src) @@ -108,27 +106,22 @@ if (!user.IsAdvancedToolUser() || istype(user, /mob/living/simple_animal/diona)) to_chat(user, "You don't have the dexterity to do this!") - return if(istype(user, /mob/living)) var/mob/living/M = user if (HULK in M.mutations) to_chat(M, "Your meaty finger is much too large for the trigger guard!") - return if(ishuman(user)) var/mob/living/carbon/human/H = user if(H.get_species() == "Golem") to_chat(user, "Your metal fingers don't fit in the trigger guard!") - return if(H.get_species() == "Shadowling") to_chat(user, "The muzzle flash would cause damage to your form!") - return if(H.martial_art && H.martial_art.name == "The Sleeping Carp") //great dishonor to famiry to_chat(user, "Use of ranged weaponry would bring dishonor to the clan.") - return add_fingerprint(user) @@ -139,7 +132,6 @@ if (!ready_to_fire()) if (world.time % 3) //to prevent spam to_chat(user, "[src] is not ready to fire again!") - return if(heavy_weapon) @@ -308,7 +300,6 @@ user.death() else to_chat(user, "Ow...") - user.apply_effect(110,STAMINA,0) del(in_chamber) mouthshoot = 0 @@ -339,11 +330,9 @@ if(!F) if(user.l_hand != src && user.r_hand != src) to_chat(user, "You'll need [src] in your hands to do that.") - return user.drop_item() to_chat(user, "You click [S] into place on [src].") - if(S.on) set_light(0) F = S @@ -355,11 +344,9 @@ if(F) if(user.l_hand != src && user.r_hand != src) to_chat(user, "You'll need [src] in your hands to do that.") - return for(var/obj/item/device/flashlight/seclite/S in src) to_chat(user, "You unscrew the seclite from [src].") - F = null S.loc = get_turf(user) update_gunlight(user) @@ -380,11 +367,9 @@ var/mob/living/carbon/human/user = usr if(!isturf(user.loc)) to_chat(user, "You cannot turn the light on while in this [user.loc].") - F.on = !F.on to_chat(user, "You toggle the gunlight [F.on ? "on":"off"].") - playsound(user, 'sound/weapons/empty.ogg', 100, 1) update_gunlight(user) return diff --git a/code/modules/projectiles/guns/alien.dm b/code/modules/projectiles/guns/alien.dm index 07ea0669a2b..eeb775be84a 100644 --- a/code/modules/projectiles/guns/alien.dm +++ b/code/modules/projectiles/guns/alien.dm @@ -35,7 +35,6 @@ ..(user) to_chat(user, "It has [spikes] [spikes == 1 ? "spike" : "spikes"] remaining.") - /obj/item/weapon/gun/launcher/spikethrower/update_icon() icon_state = "spikethrower[spikes]" @@ -47,7 +46,6 @@ var/mob/living/carbon/human/H = user if(H.species && H.species.name != "Vox" && H.species.name != "Vox Armalis") to_chat(user, "\red \The [src] does not respond to you!") - return 0 return 1 @@ -92,7 +90,6 @@ ..() return to_chat(user, "\red \The [src] is far too large for you to pick up.") - return /obj/item/weapon/gun/energy/noisecannon/process_chambered() //Does not have ammo. diff --git a/code/modules/projectiles/guns/energy/advtaser.dm b/code/modules/projectiles/guns/energy/advtaser.dm index fdeba3bd119..8601a388f15 100644 --- a/code/modules/projectiles/guns/energy/advtaser.dm +++ b/code/modules/projectiles/guns/energy/advtaser.dm @@ -22,7 +22,6 @@ charge_cost = 500 fire_sound = 'sound/weapons/taser2.ogg' to_chat(user, "\red [src.name] is now set to Disable.") - projectile_type = "/obj/item/projectile/beam/disabler" modifystate = "advtaserdisable" fire_delay = 0 @@ -31,7 +30,6 @@ charge_cost = 2000 fire_sound = 'sound/weapons/Taser.ogg' to_chat(user, "\red [src.name] is now set to stun.") - projectile_type = "/obj/item/projectile/energy/electrode" modifystate = "advtaserstun" fire_delay = 15 diff --git a/code/modules/projectiles/guns/energy/blueshield.dm b/code/modules/projectiles/guns/energy/blueshield.dm index d136a75e834..914b92e19a6 100644 --- a/code/modules/projectiles/guns/energy/blueshield.dm +++ b/code/modules/projectiles/guns/energy/blueshield.dm @@ -23,7 +23,6 @@ to_chat(user, "You adjust [src.name] to the kill setting.") - else fire_mode = 0 charge_cost = 2000 @@ -35,5 +34,4 @@ to_chat(user, "You adjust [src.name] to the stun setting.") - update_icon() \ No newline at end of file diff --git a/code/modules/projectiles/guns/energy/hos.dm b/code/modules/projectiles/guns/energy/hos.dm index 14f9c82e4f8..6bcb9992c4d 100644 --- a/code/modules/projectiles/guns/energy/hos.dm +++ b/code/modules/projectiles/guns/energy/hos.dm @@ -19,7 +19,6 @@ charge_cost = 1000 fire_sound = 'sound/weapons/Laser.ogg' to_chat(user, "\red [src.name] is now set to kill.") - projectile_type = "/obj/item/projectile/beam" modifystate = "hoslaserkill" fire_delay = 0 @@ -28,7 +27,6 @@ charge_cost = 500 fire_sound = 'sound/weapons/taser2.ogg' to_chat(user, "\red [src.name] is now set to disable.") - projectile_type = "/obj/item/projectile/beam/disabler" modifystate = "hoslaserdisable" fire_delay = 0 @@ -37,7 +35,6 @@ charge_cost = 2000 fire_sound = 'sound/weapons/taser.ogg' to_chat(user, "\red [src.name] is now set to stun.") - projectile_type = "/obj/item/projectile/energy/electrode" modifystate = "hoslaserstun" fire_delay = 15 diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index c1243cf0911..096cd26da3a 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -126,7 +126,6 @@ obj/item/weapon/gun/energy/laser/retro if(istype(M.wear_suit, /obj/item/clothing/suit/bluetag)) return 1 to_chat(M, "\red You need to be wearing your laser tag vest!") - return 0 /obj/item/weapon/gun/energy/laser/redtag @@ -145,5 +144,4 @@ obj/item/weapon/gun/energy/laser/retro if(istype(M.wear_suit, /obj/item/clothing/suit/redtag)) return 1 to_chat(M, "\red You need to be wearing your laser tag vest!") - return 0 \ No newline at end of file diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm index 1b9b955721d..5bc164c5d76 100644 --- a/code/modules/projectiles/guns/energy/nuclear.dm +++ b/code/modules/projectiles/guns/energy/nuclear.dm @@ -20,7 +20,6 @@ charge_cost = 1000 fire_sound = 'sound/weapons/Laser.ogg' to_chat(user, "\red [src.name] is now set to kill.") - projectile_type = "/obj/item/projectile/beam" modifystate = "energykill" if(1) @@ -28,7 +27,6 @@ charge_cost = 500 fire_sound = 'sound/weapons/Taser2.ogg' to_chat(user, "\red [src.name] is now set to disable.") - projectile_type = "/obj/item/projectile/beam/disabler" modifystate = "energystun" update_icon() @@ -99,19 +97,15 @@ for (var/mob/living/M in range(0,src)) //Only a minor failure, enjoy your radiation if you're in the same tile or carrying it if (src in M.contents) to_chat(M, "\red Your gun feels pleasantly warm for a moment.") - else to_chat(M, "\red You feel a warm sensation.") - M.apply_effect(rand(3,120), IRRADIATE) lightfail = 1 else for (var/mob/living/M in range(rand(1,4),src)) //Big failure, TIME FOR RADIATION BITCHES if (src in M.contents) to_chat(M, "\red Your gun's reactor overloads!") - to_chat(M, "\red You feel a wave of heat wash over you.") - M.apply_effect(300, IRRADIATE) crit_fail = 1 //break the gun so it stops recharging processing_objects.Remove(src) @@ -180,7 +174,6 @@ charge_cost = 500 fire_sound = 'sound/weapons/Laser.ogg' to_chat(user, "\red [src.name] is now set to kill.") - projectile_type = /obj/item/projectile/beam modifystate = "energykill" fire_delay = 0 @@ -189,7 +182,6 @@ charge_cost = 1000 fire_sound = 'sound/weapons/Taser.ogg' to_chat(user, "\red [src.name] is now set to stun.") - projectile_type = /obj/item/projectile/energy/electrode modifystate = "energystun" fire_delay = 15 diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm index 88d14a67e36..bc7704d709a 100644 --- a/code/modules/projectiles/guns/energy/pulse.dm +++ b/code/modules/projectiles/guns/energy/pulse.dm @@ -22,21 +22,18 @@ charge_cost = 50 fire_sound = 'sound/weapons/Taser.ogg' to_chat(user, "\red [src.name] is now set to stun.") - projectile_type = "/obj/item/projectile/energy/electrode" if(0) mode = 1 charge_cost = 100 fire_sound = 'sound/weapons/Laser.ogg' to_chat(user, "\red [src.name] is now set to kill.") - projectile_type = "/obj/item/projectile/beam" if(1) mode = 2 charge_cost = 200 fire_sound = 'sound/weapons/pulse.ogg' to_chat(user, "\red [src.name] is now set to DESTROY.") - projectile_type = "/obj/item/projectile/beam/pulse" return @@ -63,7 +60,6 @@ attack_self(mob/living/user as mob) to_chat(user, "\red [src.name] has three settings, and they are all DESTROY.") - /obj/item/weapon/gun/energy/pulse_rifle/carbine name = "pulse carbine" desc = "A compact variant of the pulse rifle with less firepower but easier storage." diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 2a157bf667c..bb556a4f178 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -51,14 +51,12 @@ mode = 1 charge_cost = 1000 to_chat(user, "\red The [src.name] is now set to increase yield.") - projectile_type = "/obj/item/projectile/energy/florayield" modifystate = "florayield" if(1) mode = 0 charge_cost = 1000 to_chat(user, "\red The [src.name] is now set to induce mutations.") - projectile_type = "/obj/item/projectile/energy/floramut" modifystate = "floramut" update_icon() @@ -120,12 +118,10 @@ obj/item/weapon/gun/energy/staff/focus if(projectile_type == "/obj/item/projectile/forcebolt") charge_cost = 200 to_chat(user, "\red The [src.name] will now strike a small area.") - projectile_type = "/obj/item/projectile/forcebolt/strong" else charge_cost = 100 to_chat(user, "\red The [src.name] will now strike only a single person.") - projectile_type = "/obj/item/projectile/forcebolt" */ @@ -179,11 +175,9 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. set popup_menu = 0 if(usr.stat || !(istype(usr,/mob/living/carbon/human))) to_chat(usr, "You are unable to focus down the scope of the rifle.") - return if(!zoom && usr.get_active_hand() != src) to_chat(usr, "You are too distracted to look down the scope, perhaps if it was in your active hand this might work better") - return if(usr.client.view == world.view) @@ -200,7 +194,6 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. to_chat(usr, "Zoom mode [zoom?"en":"dis"]abled.") - /obj/item/weapon/gun/energy/kinetic_accelerator name = "proto-kinetic accelerator" desc = "According to Nanotrasen accounting, this is mining equipment. It's been modified for extreme power output to crush rocks, but often serves as a miner's first defense against hostile alien life; it's not very powerful unless used in a low pressure environment." @@ -249,7 +242,6 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. playsound(src.loc, 'sound/weapons/kenetic_reload.ogg', 60, 1) else if(user) to_chat(usr, "You silently charge [src].") - recently_fired = 0 update_icon() @@ -302,19 +294,16 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. if(power_supply) to_chat(user, "[src] is [round(power_supply.percent())]% charged.") - /obj/item/weapon/gun/energy/plasmacutter/attackby(var/obj/item/A, var/mob/user) if(istype(A, /obj/item/stack/sheet/mineral/plasma)) var/obj/item/stack/sheet/S = A S.use(1) power_supply.give(10000) to_chat(user, "You insert [A] in [src], recharging it.") - else if(istype(A, /obj/item/weapon/ore/plasma)) qdel(A) power_supply.give(5000) to_chat(user, "You insert [A] in [src], recharging it.") - else ..() @@ -388,13 +377,11 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. if(0) mode = 1 to_chat(user, "[name] is now set to orange.") - projectile_type = "/obj/item/projectile/beam/wormhole/orange" modifystate = "wormhole_projector_orange" if(1) mode = 0 to_chat(user, "[name] is now set to blue.") - projectile_type = "/obj/item/projectile/beam/wormhole" modifystate = "wormhole_projector" update_icon() diff --git a/code/modules/projectiles/guns/energy/temperature.dm b/code/modules/projectiles/guns/energy/temperature.dm index 88f92bad688..1e0eb5d08c2 100644 --- a/code/modules/projectiles/guns/energy/temperature.dm +++ b/code/modules/projectiles/guns/energy/temperature.dm @@ -43,7 +43,6 @@ if(istype(W, /obj/item/weapon/card/emag) && !emagged) emagged = 1 to_chat(user, "You double the gun's temperature cap! Targets hit by searing beams will burst into flames!") - desc = "A gun that changes the body temperature of its targets. Its temperature cap has been hacked." /obj/item/weapon/gun/energy/temperature/Topic(href, href_list) diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm index c4e382ffbdc..13f92bcef86 100644 --- a/code/modules/projectiles/guns/magic.dm +++ b/code/modules/projectiles/guns/magic.dm @@ -34,7 +34,6 @@ var/area/A = get_area(user) if(istype(A, /area/wizard_station)) to_chat(user, "You know better than to violate the security of The Den, best wait until you leave to use [src].") - return else no_den_usage = 0 @@ -64,5 +63,4 @@ /obj/item/weapon/gun/magic/shoot_with_empty_chamber(mob/living/user as mob|obj) to_chat(user, "The [name] whizzles quietly.") - return \ No newline at end of file diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm index bd922c6a9cf..6be4e0936bf 100644 --- a/code/modules/projectiles/guns/magic/wand.dm +++ b/code/modules/projectiles/guns/magic/wand.dm @@ -29,13 +29,11 @@ ..(user) to_chat(user, "Has [charges] charge\s remaining.") - /obj/item/weapon/gun/magic/wand/attack_self(mob/living/user as mob) if(charges) zap_self(user) else to_chat(user, "The [name] whizzles quietly.") - ..() /obj/item/weapon/gun/magic/wand/attack(atom/target as mob, mob/living/user as mob) @@ -46,7 +44,6 @@ /obj/item/weapon/gun/magic/wand/afterattack(atom/target as mob, mob/living/user as mob) if(!charges && !drained) to_chat(user, "The [name] whizzles quietly.") - icon_state = "[icon_state]-drained" drained = 1 return @@ -55,7 +52,6 @@ var/area/A = get_area(user) if(istype(A, /area/wizard_station)) to_chat(user, "You know better than to violate the security of The Den, best wait until you leave to use [src].") - return else no_den_usage = 0 @@ -78,7 +74,6 @@ var/message ="You irradiate yourself with pure energy! " message += pick("Do not pass go. Do not collect 200 zorkmids.","You feel more confident in your spell casting skills.","You Die...","Do you want your possessions identified?") to_chat(user, message) - user.adjustOxyLoss(500) charges-- ..() @@ -101,7 +96,6 @@ user.heal_overall_damage(user.getBruteLoss(), user.getFireLoss()) user.reagents.clear_reagents() to_chat(user, "You feel great!") - charges-- ..() diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm index a01cf749057..d6fb9d9aff0 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -67,25 +67,21 @@ magazine = AM magazine.loc = src to_chat(user, "You load a new magazine into \the [src].") - chamber_round() A.update_icon() update_icon() return 1 else if (magazine) to_chat(user, "There's already a magazine in \the [src].") - if(istype(A, /obj/item/weapon/suppressor)) var/obj/item/weapon/suppressor/S = A if(can_suppress) if(!silenced) if(user.l_hand != src && user.r_hand != src) to_chat(user, "You'll need [src] in your hands to do that.") - return user.drop_item() to_chat(user, "You screw [S] onto [src].") - silenced = A S.oldsound = fire_sound S.initial_w_class = w_class @@ -96,11 +92,9 @@ return else to_chat(user, "[src] already has a suppressor.") - return else to_chat(user, "You can't seem to figure out how to fit [S] on [src].") - return return 0 @@ -112,7 +106,6 @@ ..() return to_chat(user, "You unscrew [silenced] from [src].") - user.put_in_hands(silenced) fire_sound = S.oldsound w_class = S.initial_w_class @@ -128,10 +121,8 @@ magazine.update_icon() magazine = null to_chat(user, "You pull the magazine out of \the [src]!") - else to_chat(user, "There's no magazine in \the [src].") - update_icon() return @@ -139,7 +130,6 @@ ..(user) to_chat(user, "Has [get_ammo()] round\s remaining.") - /obj/item/weapon/gun/projectile/proc/get_ammo(var/countchambered = 1) var/boolets = 0 //mature var names for mature people if (chambered && countchambered) diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 148cac3cd6d..b56344ce039 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -37,13 +37,11 @@ if(istype(AM, text2path(mag_type))) if(magazine) to_chat(user, "You perform a tactical reload on \the [src], replacing the magazine.") - magazine.forceMove(get_turf(src.loc)) magazine.update_icon() magazine = null else to_chat(user, "You insert the magazine into \the [src].") - user.remove_from_mob(AM) magazine = AM magazine.forceMove(src) @@ -62,13 +60,11 @@ burst_size = 1 fire_delay = 0 to_chat(user, "You switch to semi-automatic.") - else burst_size = initial(burst_size) fire_delay = initial(fire_delay) to_chat(user, "You switch to [burst_size] round burst.") - playsound(user, 'sound/weapons/empty.ogg', 100, 1) update_icon() return @@ -149,7 +145,6 @@ /obj/item/weapon/gun/projectile/automatic/l6_saw/attack_self(mob/user as mob) cover_open = !cover_open to_chat(user, "You [cover_open ? "open" : "close"] [src]'s cover.") - update_icon() /obj/item/weapon/gun/projectile/automatic/l6_saw/update_icon() @@ -160,7 +155,6 @@ /obj/item/weapon/gun/projectile/automatic/l6_saw/afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, flag, params) //what I tried to do here is just add a check to see if the cover is open or not and add an icon_state change because I can't figure out how c-20rs do it with overlays if(cover_open) to_chat(user, "[src]'s cover is open! Close it before firing!") - else ..() update_icon() @@ -181,11 +175,9 @@ to_chat(user, "You remove the magazine from [src].") - /obj/item/weapon/gun/projectile/automatic/l6_saw/attackby(var/obj/item/A as obj, mob/user as mob, params) if(!cover_open && istype(A, mag_type)) to_chat(user, "[src]'s cover is closed! You can't insert a new mag!") - return ..() @@ -255,17 +247,14 @@ burst_size = initial(burst_size) fire_delay = initial(fire_delay) to_chat(user, "You switch to [burst_size] round burst.") - if(1) select = 2 to_chat(user, "You switch to grenades.") - if(2) select = 0 burst_size = 1 fire_delay = 0 to_chat(user, "You switch to semi-auto.") - playsound(user, 'sound/weapons/empty.ogg', 100, 1) update_icon() return diff --git a/code/modules/projectiles/guns/projectile/crossbow.dm b/code/modules/projectiles/guns/projectile/crossbow.dm index f4c5ec993f7..3645899ab21 100644 --- a/code/modules/projectiles/guns/projectile/crossbow.dm +++ b/code/modules/projectiles/guns/projectile/crossbow.dm @@ -43,7 +43,6 @@ /obj/item/weapon/arrow/rod/removed(mob/user) if(throwforce == 15) // The rod has been superheated - we don't want it to be useable when removed from the bow. to_chat(user, "[src] shatters into a scattering of overstressed metal shards as it leaves the crossbow.") - var/obj/item/weapon/shard/shrapnel/S = new() S.loc = get_turf(src) qdel(src) @@ -82,7 +81,6 @@ /obj/item/weapon/gun/launcher/crossbow/special_check(user) if(tension <= 0) to_chat(user, "\red \The [src] is not drawn back!") - return 0 return 1 @@ -114,7 +112,6 @@ if(!in_chamber) to_chat(user, "You don't have anything nocked to [src].") - return if(user.restrained()) @@ -136,7 +133,6 @@ if(tension>=max_tension) tension = max_tension to_chat(usr, "[src] clunks as you draw the string to its maximum tension!") - else user.visible_message("[usr] draws back the string of [src]!","You continue drawing back the string of [src]!") spawn(25) increase_tension(user) @@ -167,23 +163,19 @@ W.loc = src cell = W to_chat(user, "You jam [cell] into [src] and wire it to the firing coil.") - superheat_rod(user) else to_chat(user, "[src] already has a cell installed.") - else if(istype(W, /obj/item/weapon/screwdriver)) if(cell) var/obj/item/C = cell C.loc = get_turf(user) to_chat(user, "You jimmy [cell] out of [src] with [W].") - cell = null else to_chat(user, "[src] doesn't have a cell installed.") - else ..() @@ -195,7 +187,6 @@ if(!istype(in_chamber,/obj/item/weapon/arrow/rod)) return to_chat(user, "[in_chamber] plinks and crackles as it begins to glow red-hot.") - in_chamber.throwforce = 15 in_chamber.icon_state = "metal-rod-superheated" cell.use(500) @@ -239,7 +230,6 @@ if(tension>=max_tension) tension = max_tension to_chat(usr, "[src] clunks as you draw the string to its maximum tension!") - else user.visible_message("[usr] draws back the string of [src]!","You continue drawing back the string of [src]!") spawn(25) increase_tension(user) @@ -261,20 +251,15 @@ switch(buildstate) if(1) to_chat(user, "It has a loose rod frame in place.") - if(2) to_chat(user, "It has a steel backbone welded in place.") - if(3) to_chat(user, "It has a steel backbone and a cell mount installed.") - if(4) to_chat(user, "It has a steel backbone, plastic lath and a cell mount installed.") - if(5) to_chat(user, "It has a steel cable loosely strung across the lath.") - /obj/item/weapon/crossbowframe/attackby(obj/item/W as obj, mob/user as mob, params) if(istype(W,/obj/item/stack/rods)) if(buildstate == 0) @@ -282,12 +267,10 @@ if(R.amount >= 3) R.use(3) to_chat(user, "\blue You assemble a backbone of rods around the wooden stock.") - buildstate++ update_icon() else to_chat(user, "\blue You need at least three rods to complete this task.") - return else if(istype(W,/obj/item/weapon/weldingtool)) if(buildstate == 1) @@ -296,7 +279,6 @@ if(!src || !T.isOn()) return playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1) to_chat(user, "\blue You weld the rods into place.") - buildstate++ update_icon() return @@ -306,23 +288,19 @@ if(C.amount >= 5) C.use(5) to_chat(user, "\blue You wire a crude cell mount into the top of the crossbow.") - buildstate++ update_icon() else to_chat(user, "\blue You need at least five segments of cable coil to complete this task.") - return else if(buildstate == 4) if(C.amount >= 5) C.use(5) to_chat(user, "\blue You string a steel cable across the crossbow's lath.") - buildstate++ update_icon() else to_chat(user, "\blue You need at least five segments of cable coil to complete this task.") - return else if(istype(W,/obj/item/stack/sheet/mineral/plastic)) if(buildstate == 3) @@ -330,17 +308,14 @@ if(P.amount >= 3) P.use(3) to_chat(user, "\blue You assemble and install a heavy plastic lath onto the crossbow.") - buildstate++ update_icon() else to_chat(user, "\blue You need at least three plastic sheets to complete this task.") - return else if(istype(W,/obj/item/weapon/screwdriver)) if(buildstate == 5) to_chat(user, "\blue You secure the crossbow's various parts.") - new /obj/item/weapon/gun/launcher/crossbow(get_turf(src)) qdel(src) return diff --git a/code/modules/projectiles/guns/projectile/grenade launcher.dm b/code/modules/projectiles/guns/projectile/grenade launcher.dm index f8d4f5161a3..28dc0c3a4b9 100644 --- a/code/modules/projectiles/guns/projectile/grenade launcher.dm +++ b/code/modules/projectiles/guns/projectile/grenade launcher.dm @@ -30,7 +30,6 @@ /obj/item/weapon/gun/launcher/attack(mob/living/M as mob, mob/living/user as mob, def_zone) if (M == user && user.zone_sel.selecting == "mouth") to_chat(user, "\red Shooting yourself with \a [src] is pretty tricky. You can't seem to manage it.") - return ..() @@ -41,7 +40,6 @@ if (!user.IsAdvancedToolUser()) to_chat(user, "\red You don't have the dexterity to do this!") - return 0 add_fingerprint(user) @@ -58,7 +56,6 @@ if (!ready_to_fire()) if (world.time % 3) //to prevent spam to_chat(user, "[src] is not ready to fire again!") - return 0 if(!chamber_round()) //CHECK diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index 8b3d522592c..2cb3c849e4b 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -33,7 +33,6 @@ num_loaded++ if(num_loaded) to_chat(user, "You load [num_loaded] shell\s into \the [src]!") - A.update_icon() update_icon() chamber_round() @@ -50,11 +49,9 @@ num_unloaded++ if (num_unloaded) to_chat(user, "You unload [num_unloaded] shell\s from [src]!") - else to_chat(user, "[src] is empty.") - /obj/item/weapon/gun/projectile/revolver/get_ammo(var/countchambered = 0, var/countempties = 1) var/boolets = 0 //mature var names for mature people if (chambered && countchambered) @@ -67,7 +64,6 @@ ..(user) to_chat(user, "[get_ammo(0,0)] of those are live rounds.") - /obj/item/weapon/gun/projectile/revolver/verb/spin_revolver() set name = "Spin cylinder" set desc = "Fun when you're bored out of your skull." @@ -103,7 +99,6 @@ return 1 if(prob(70 - (magazine.ammo_count() * 10))) //minimum probability of 10, maximum of 60 to_chat(M, "[src] blows up in your face!") - M.take_organ_damage(0,20) M.drop_item() qdel(src) @@ -121,7 +116,6 @@ if(src && input && !M.stat && in_range(M,src)) name = input to_chat(M, "You name the gun [input]. Say hello to your new friend.") - return 1 /obj/item/weapon/gun/projectile/revolver/detective/verb/reskin_gun() @@ -141,7 +135,6 @@ if(src && choice && !M.stat && in_range(M,src)) icon_state = options[choice] to_chat(M, "Your gun is now skinned as [choice]. Say hello to your new friend.") - return 1 /obj/item/weapon/gun/projectile/revolver/detective/attackby(var/obj/item/A as obj, mob/user as mob, params) @@ -149,7 +142,6 @@ if(istype(A, /obj/item/weapon/screwdriver) || istype(A, /obj/item/weapon/conversion_kit)) if(magazine.caliber == "38") to_chat(user, "You begin to reinforce the barrel of [src].") - if(magazine.ammo_count()) afterattack(user, user) //you know the drill user.visible_message("[src] goes off!", "[src] goes off in your face!") @@ -157,7 +149,6 @@ if(do_after(user, 30, target = src)) if(magazine.ammo_count()) to_chat(user, "You can't modify it!") - return if (istype(A, /obj/item/weapon/conversion_kit)) ghettomodded = 0 @@ -166,10 +157,8 @@ magazine.caliber = "357" desc = "[initial(desc)] The barrel and chamber assembly seems to have been modified." to_chat(user, "You reinforce the barrel of [src]! Now it will fire .357 rounds.") - else to_chat(user, "You begin to revert the modifications to [src].") - if(magazine.ammo_count()) afterattack(user, user) //and again user.visible_message("[src] goes off!", "[src] goes off in your face!") @@ -177,7 +166,6 @@ if(do_after(user, 30, target = src)) if(magazine.ammo_count()) to_chat(user, "You can't modify it!") - return ghettomodded = 0 magazine.caliber = "38" @@ -187,7 +175,6 @@ - /obj/item/weapon/gun/projectile/revolver/mateba name = "\improper Unica 6 auto-revolver" desc = "A retro high-powered autorevolver typically used by officers of the New Russia military. Uses .357 ammo." //>10mm hole >.357 diff --git a/code/modules/projectiles/guns/projectile/rocket.dm b/code/modules/projectiles/guns/projectile/rocket.dm index f791a1da1c7..e667d9323ce 100644 --- a/code/modules/projectiles/guns/projectile/rocket.dm +++ b/code/modules/projectiles/guns/projectile/rocket.dm @@ -20,7 +20,6 @@ if(..(user, 2)) to_chat(user, "\blue [rockets.len] / [max_rockets] rockets.") - /obj/item/weapon/gun/rocketlauncher/attackby(obj/item/I as obj, mob/user as mob, params) if(istype(I, /obj/item/ammo_casing/rocket)) if(rockets.len < max_rockets) @@ -28,13 +27,10 @@ I.loc = src rockets += I to_chat(user, "\blue You put the rocket in [src].") - to_chat(user, "\blue [rockets.len] / [max_rockets] rockets.") - else to_chat(usr, "\red [src] cannot hold more rockets.") - /obj/item/weapon/gun/rocketlauncher/can_fire() return rockets.len @@ -52,4 +48,3 @@ return else to_chat(usr, "\red [src] is empty.") - diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index c300748a98d..90402f0e57c 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -30,7 +30,6 @@ num_loaded++ if(num_loaded) to_chat(user, "You load [num_loaded] shell\s into \the [src]!") - A.update_icon() update_icon() @@ -75,7 +74,6 @@ if (chambered) to_chat(user, "A [chambered.BB ? "live" : "spent"] one is in the chamber.") - /obj/item/weapon/gun/projectile/shotgun/isHandgun() //You cannot, in fact, holster a shotgun. return 0 @@ -120,7 +118,6 @@ /obj/item/weapon/gun/projectile/shotgun/boltaction/attackby(var/obj/item/A as obj, mob/user as mob) if(!bolt_open) to_chat(user, "The bolt is closed!") - return . = ..() @@ -128,7 +125,6 @@ ..(user) to_chat(user, "The bolt is [bolt_open ? "open" : "closed"].") - /obj/item/weapon/gun/projectile/shotgun/boltaction/enchanted name = "enchanted bolt action rifle" desc = "Careful not to lose your head." @@ -196,11 +192,9 @@ num_unloaded++ if (num_unloaded) to_chat(user, "You break open \the [src] and unload [num_unloaded] shell\s.") - else to_chat(user, "[src] is empty.") - /obj/item/weapon/gun/projectile/revolver/doublebarrel/isHandgun() //contrary to popular opinion, double barrels are not, shockingly, handguns return 0 @@ -226,11 +220,9 @@ slot_flags = SLOT_BACK icon_state = "ishotgunsling" to_chat(user, "You tie the lengths of cable to the shotgun, making a sling.") - update_icon() else to_chat(user, "You need at least ten lengths of cable if you want to make a sling.") - return // Sawing guns related procs // @@ -245,7 +237,6 @@ /obj/item/weapon/gun/projectile/proc/sawoff(mob/user as mob) if(sawn_state == SAWN_OFF) to_chat(user, "\The [src] is already shortened.") - return if(sawn_state == SAWN_SAWING) diff --git a/code/modules/projectiles/guns/syringe_gun.dm b/code/modules/projectiles/guns/syringe_gun.dm index 01b41bb0c13..0e43d550c85 100644 --- a/code/modules/projectiles/guns/syringe_gun.dm +++ b/code/modules/projectiles/guns/syringe_gun.dm @@ -31,12 +31,10 @@ /obj/item/weapon/gun/syringe/examine(mob/user) ..(user) to_chat(user, "Can hold [max_syringes] syringe\s. Has [syringes.len] syringe\s remaining.") - /obj/item/weapon/gun/syringe/attack_self(mob/living/user as mob) if(!syringes.len) to_chat(user, "[src] is empty.") - return 0 var/obj/item/weapon/reagent_containers/syringe/S = syringes[syringes.len] @@ -47,7 +45,6 @@ syringes.Remove(S) to_chat(user, "You unload [S] from \the [src]!") - return 1 /obj/item/weapon/gun/syringe/attackby(var/obj/item/A as obj, mob/user as mob, var/show_msg = 1, params) @@ -55,13 +52,11 @@ if(syringes.len < max_syringes) user.drop_item() to_chat(user, "You load [A] into \the [src]!") - syringes.Add(A) A.forceMove(src) return 1 else to_chat(usr, "[src] cannot hold more syringes.") - return 0 /obj/item/weapon/gun/syringe/rapidsyringe diff --git a/code/modules/projectiles/medbeam.dm b/code/modules/projectiles/medbeam.dm index ca210f345b0..04f8f4b6862 100644 --- a/code/modules/projectiles/medbeam.dm +++ b/code/modules/projectiles/medbeam.dm @@ -68,7 +68,6 @@ if(get_dist(H,current_target)>max_range || !los_check(H,current_target)) LoseTarget() to_chat(H, "You lose control of the beam!") - return if(current_target) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index d329a5f7a96..5a028a1084a 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -141,7 +141,6 @@ if(silenced) playsound(loc, hitsound, 5, 1, -1) to_chat(M, "\red You've been shot in the [parse_zone(def_zone)] by the [src.name]!") - else playsound(loc, hitsound, 20, 1, -1) visible_message("\red [A.name] is hit by the [src.name] in the [parse_zone(def_zone)]!")//X has fired Y is now given by the guns so you cant tell who shot you if you could not see the shooter @@ -211,7 +210,6 @@ if(!Angle) Angle=round(Get_Angle(src,current)) // to_chat(world, "[Angle] angle") - //overlays.Cut() //var/icon/I=new(initial(icon),icon_state) //using initial(icon) makes sure that the angle for that is reset as well //I.Turn(Angle) @@ -232,26 +230,22 @@ //Not sure if using whiles for this is good while(pixel_x_offset > 16) // to_chat(world, "Pre-adjust coords (x++): xy [pixel_x] xy offset [pixel_x_offset]") - pixel_x_offset -= 32 pixel_x -= 32 new_x++// x++ while(pixel_x_offset < -16) // to_chat(world, "Pre-adjust coords (x--): xy [pixel_x] xy offset [pixel_x_offset]") - pixel_x_offset += 32 pixel_x += 32 new_x-- while(pixel_y_offset > 16) // to_chat(world, "Pre-adjust coords (y++): py [pixel_y] py offset [pixel_y_offset]") - pixel_y_offset -= 32 pixel_y -= 32 new_y++ while(pixel_y_offset < -16) // to_chat(world, "Pre-adjust coords (y--): py [pixel_y] py offset [pixel_y_offset]") - pixel_y_offset += 32 pixel_y += 32 new_y-- diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 29b1295691f..e86d8e7a739 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -240,18 +240,15 @@ f.hotspot_expose(1000,CELL_VOLUME) if((x == 1 || x == world.maxx || y == 1 || y == world.maxy)) // to_chat(world, "deleting") - //qdel(src) //Delete if it passes the world edge broken = 1 return if(kill_count < 1) // to_chat(world, "deleting") - //qdel(src) broken = 1 kill_count-- // to_chat(world, "[x] [y]") - if(!bumped && !isturf(original)) if(loc == get_turf(original)) if(!(original in permutated)) @@ -267,7 +264,6 @@ first = 0 if(broken) // to_chat(world, "breaking") - break else last = get_turf(src.loc) @@ -279,7 +275,6 @@ return /*cleanup(reference) //Waits .3 seconds then removes the overlay. // to_chat(world, "setting invisibility") - sleep(50) src.invisibility = 101 return*/ diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 7a4c6f937f7..7d8c9abbe8f 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -68,11 +68,9 @@ break if(old_stat != DEAD) to_chat(target, "You feel great!") - else to_chat(target, "You rise with a start, you're alive!!!") - /obj/item/projectile/magic/teleport name = "bolt of teleportation" icon_state = "bluespace" @@ -242,7 +240,6 @@ proc/wabbajack(mob/living/M) to_chat(new_mob, "Your form morphs into that of a [randomize].") - qdel(M) return new_mob @@ -266,9 +263,7 @@ proc/wabbajack(mob/living/M) if(H.mind) H.mind.transfer_to(S) to_chat(S, "You are an animated statue. You cannot move when monitored, but are nearly invincible and deadly when unobserved!") - to_chat(S, "Do not harm [firer.name], your creator.") - H = change H.loc = S qdel(src) diff --git a/code/modules/projectiles/targeting.dm b/code/modules/projectiles/targeting.dm index be32a5a58af..921cc49c60f 100644 --- a/code/modules/projectiles/targeting.dm +++ b/code/modules/projectiles/targeting.dm @@ -4,11 +4,9 @@ firerate = !firerate if (firerate == 0) to_chat(loc, "You will now continue firing when your target moves.") - else to_chat(loc, "You will now only fire once, then lower your aim, when your target moves.") - /obj/item/weapon/gun/verb/lower_aim() set name = "Lower Aim" set category = "Object" @@ -87,7 +85,6 @@ Fire(T,usr, reflex = 1) else if(!told_cant_shoot) to_chat(M, "\red They can't be hit from here!") - told_cant_shoot = 1 spawn(30) told_cant_shoot = 0 @@ -105,7 +102,6 @@ proc/GunTrace(X1,Y1,X2,Y2,Z=1,exc_obj,PX1=16,PY1=16,PX2=16,PY2=16) // to_chat(bluh, "Tracin' [X1],[Y1] to [X2],[Y2] on floor [Z].") - var/turf/T var/mob/living/M if(X1==X2) @@ -157,14 +153,12 @@ mob/living/proc/Targeted(var/obj/item/weapon/gun/I) //Self explanitory. else if(I.target.len >= 5) if(ismob(I.loc)) to_chat(I.loc, "You can only target 5 people at once!") - return else return for(var/mob/living/K in viewers(usr)) to_chat(K, 'sound/weapons/TargetOn.ogg') - if(!targeted_by) targeted_by = list() targeted_by += I I.lock_time = world.time + 20 //Target has 2 second to realize they're targeted and stop (or target the opponent). @@ -194,7 +188,6 @@ mob/living/proc/Targeted(var/obj/item/weapon/gun/I) //Self explanitory. /*if(m_intent == "run" && T.client.target_can_move == 1 && T.client.target_can_run == 0 && (ishuman(T))) to_chat(src, "\red Your move intent is now set to walk, as your targeter permits it.")//Self explanitory. - set_m_intent("walk")*/ //Processing the aiming. Should be probably in separate object with process() but lasy. @@ -223,7 +216,6 @@ mob/living/proc/NotTargeted(var/obj/item/weapon/gun/I) if(!I.silenced) for(var/mob/living/M in viewers(src)) to_chat(M, 'sound/weapons/TargetOff.ogg') - targeted_by -= I I.target.Remove(src) //De-target them if(!I.target.len) @@ -276,10 +268,8 @@ client/verb/ToggleGunMode() gun_mode = !gun_mode if(gun_mode) to_chat(usr, "You will now take people captive.") - else to_chat(usr, "You will now shoot where you target.") - for(var/obj/item/weapon/gun/G in usr) G.stop_aim() remove_gun_icons() @@ -294,12 +284,10 @@ client/verb/ToggleGunMode() target_can_move = !target_can_move if(target_can_move) to_chat(usr, "Target may now walk.") - //usr.gun_run_icon = new /obj/screen/gun/run(null) //adding icon for running permission screen += usr.gun_run_icon else to_chat(usr, "Target may no longer move.") - target_can_run = 0 qdel(usr.gun_run_icon) //no need for icon for running permission @@ -315,15 +303,12 @@ client/verb/ToggleGunMode() for(var/mob/living/M in G.target) if(target_can_move) to_chat(M, "Your character may now walk at the discretion of their targeter.") - if(!target_can_run && (ishuman(M))) to_chat(M, "\red Your move intent is now set to walk, as your targeter permits it.") - M.set_m_intent("walk") else to_chat(M, "\red Your character will now be shot if they move.") - mob/living/proc/set_m_intent(var/intent) if (intent != "walk" && intent != "run") return 0 @@ -339,11 +324,9 @@ client/verb/AllowTargetRun() target_can_run = !target_can_run if(target_can_run) to_chat(usr, "Target may now run.") - else to_chat(usr, "Target may no longer run.") - //Updating running permission button if(usr.gun_run_icon) usr.gun_run_icon.icon_state = "no_run[target_can_run]" @@ -356,11 +339,9 @@ client/verb/AllowTargetRun() for(var/mob/living/M in G.target) if(target_can_run) to_chat(M, "Your character may now run at the discretion of their targeter.") - else to_chat(M, "\red Your character will now be shot if they run.")*/ - client/verb/AllowTargetClick() set hidden=1 @@ -368,11 +349,9 @@ client/verb/AllowTargetClick() target_can_click = !target_can_click if(target_can_click) to_chat(usr, "Target may now use items.") - else to_chat(usr, "Target may no longer use items.") - if(usr.item_use_icon) usr.item_use_icon.icon_state = "no_item[target_can_click]" usr.item_use_icon.name = "[target_can_click ? "Disallow" : "Allow"] Item Use" @@ -384,7 +363,5 @@ client/verb/AllowTargetClick() for(var/mob/living/M in G.target) if(target_can_click) to_chat(M, "Your character may now use items at the discretion of their targeter.") - else to_chat(M, "\red Your character will now be shot if they use items.") - diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 809201da056..1b2e9a0b3d4 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -304,14 +304,12 @@ var/const/INGEST = 2 if(!C.no_message) to_chat(M, "\blue \icon[my_atom] [C.mix_message]") - if(istype(my_atom, /obj/item/slime_extract)) var/obj/item/slime_extract/ME2 = my_atom ME2.Uses-- if(ME2.Uses <= 0) // give the notification that the slime core is dead for(var/mob/M in seen) to_chat(M, "\blue \icon[my_atom] The [my_atom]'s power is consumed in the reaction.") - ME2.name = "used slime extract" ME2.desc = "This extract has been used up." @@ -555,14 +553,12 @@ var/const/INGEST = 2 for(var/datum/reagent/D in reagent_list) if(D.id == reagent_id) // to_chat(world, "proffering a data-carrying reagent ([reagent_id])") - return D.data /datum/reagents/proc/set_data(var/reagent_id, var/new_data) for(var/datum/reagent/D in reagent_list) if(D.id == reagent_id) // to_chat(world, "reagent data set ([reagent_id])") - D.data = new_data /datum/reagents/proc/copy_data(var/datum/reagent/current_reagent) diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index d70399f8d86..59efbc9970b 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -111,7 +111,6 @@ /obj/machinery/chem_dispenser/ui_interact(mob/user, ui_key = "main",var/datum/nanoui/ui = null, var/force_open = 1) if(broken_requirements.len) to_chat(user, "[src] is broken. [broken_requirements[broken_requirements[1]]]") - return @@ -209,28 +208,23 @@ else if(!user.drop_item()) to_chat(user, "\The [B] is stuck to you!") - return qdel(B) broken_requirements -= broken_requirements[1] to_chat(user, "You fix [src].") - return if(src.beaker) to_chat(user, "Something is already loaded into the machine.") - return if(istype(B, /obj/item/weapon/reagent_containers/glass) || istype(B, /obj/item/weapon/reagent_containers/food/drinks)) src.beaker = B if(!user.drop_item()) to_chat(user, "\The [B] is stuck to you!") - return B.forceMove(src) to_chat(user, "You set [B] on the machine.") - nanomanager.update_uis(src) // update all UIs attached to src if(!icon_beaker) icon_beaker = image('icons/obj/chemical.dmi', src, "disp_beaker") //randomize beaker overlay position. @@ -243,14 +237,12 @@ if(istype(B, /obj/item/device/multitool)) if(hackedcheck == 0) to_chat(user, hack_message) - dispensable_reagents += hacked_reagents hackedcheck = 1 return else to_chat(user, unhack_message) - dispensable_reagents -= hacked_reagents hackedcheck = 0 return @@ -353,7 +345,6 @@ if(istype(I, /obj/item/weapon/reagent_containers/glass)) if(panel_open) to_chat(user, "Close the maintenance panel first.") - return ..() else @@ -370,12 +361,10 @@ if(anchored) anchored = 0 to_chat(user, "\The [src] can now be moved.") - else if(!anchored) anchored = 1 to_chat(user, "\The [src] is now secured.") - if(panel_open) if(istype(I, /obj/item/weapon/crowbar)) if(beaker) @@ -441,16 +430,13 @@ if(src.beaker) to_chat(user, "A beaker is already loaded into the machine.") - return if(!user.drop_item()) to_chat(user, "\The [B] is stuck to you!") - return src.beaker = B B.forceMove(src) to_chat(user, "You add the beaker to the machine!") - src.updateUsrDialog() icon_state = "mixer1" @@ -458,17 +444,14 @@ if(src.loaded_pill_bottle) to_chat(user, "A pill bottle is already loaded into the machine.") - return if(!user.drop_item()) to_chat(user, "\The [B] is stuck to you!") - return src.loaded_pill_bottle = B B.forceMove(src) to_chat(user, "You add the pill bottle into the dispenser slot!") - src.updateUsrDialog() return @@ -811,7 +794,6 @@ return 1 else to_chat(user, "You can't use the [src.name] while it's panel is opened!") - return 1 else ..() @@ -902,7 +884,6 @@ else if(!user.drop_item()) to_chat(user, "\The [O] is stuck to you!") - return src.beaker = O O.forceMove(src) @@ -912,7 +893,6 @@ if(holdingitems && holdingitems.len >= limit) to_chat(usr, "The machine cannot hold anymore items.") - return 1 //Fill machine with the plantbag! @@ -924,20 +904,17 @@ holdingitems += G if(holdingitems && holdingitems.len >= limit) //Sanity checking so the blender doesn't overfill to_chat(user, "You empty the plant bag into the All-In-One grinder.") - src.updateUsrDialog() return 0 if (!is_type_in_list(O, blend_items) && !is_type_in_list(O, juice_items)) to_chat(user, "Cannot refine into a reagent.") - return 1 user.unEquip(O) diff --git a/code/modules/reagents/Chemistry-Readme.dm b/code/modules/reagents/Chemistry-Readme.dm index c4aed49df82..e0540151f7d 100644 --- a/code/modules/reagents/Chemistry-Readme.dm +++ b/code/modules/reagents/Chemistry-Readme.dm @@ -228,12 +228,9 @@ About the Tools: system you'll need to add something like this in its new proc: to_chat(var/datum/reagents/R = new/datum/reagents(100), <<< create a new datum , 100 is the maximum_volume of the new holder datum.) - to_chat(reagents = R, <<< assign the new datum to the objects reagents var) - to_chat(R.my_atom = src, <<< set the holders my_atom to src so that we know where we are.) - This can also be done by calling a convenience proc: atom/proc/create_reagents(var/max_volume) diff --git a/code/modules/reagents/dartgun.dm b/code/modules/reagents/dartgun.dm index e8b9104a163..4fb705dbcf9 100644 --- a/code/modules/reagents/dartgun.dm +++ b/code/modules/reagents/dartgun.dm @@ -61,13 +61,11 @@ if(..(user, 2)) if(beakers.len) to_chat(user, "[R.volume] units of [R.name]") - /obj/item/weapon/gun/dartgun/attackby(obj/item/I as obj, mob/user as mob, params) if(istype(I, /obj/item/weapon/dart_cartridge)) @@ -75,7 +73,6 @@ if(!D.darts) to_chat(user, "[D] is empty.") - return 0 if(cartridge) @@ -83,34 +80,28 @@ src.remove_cartridge() else to_chat(user, "There's already a cartridge in [src].") - return 0 user.drop_item() cartridge = D D.forceMove(src) to_chat(user, "You slot [D] into [src].") - update_icon() return if(istype(I, /obj/item/weapon/reagent_containers/glass)) if(!istype(I, container_type)) to_chat(user, "[I] doesn't seem to fit into [src].") - return if(beakers.len >= max_beakers) to_chat(user, "[src] already has [max_beakers] beakers in it - another one isn't going to fit!") - return var/obj/item/weapon/reagent_containers/glass/beaker/B = I if(!user.drop_item()) to_chat(user, "\The [B] is stuck to you!") - return B.forceMove(src) beakers += B to_chat(user, "You pop the cartridge out of [src].") - var/obj/item/weapon/dart_cartridge/C = cartridge C.forceMove(get_turf(src)) C.update_icon() @@ -156,11 +146,9 @@ var/obj/item/weapon/reagent_containers/syringe/S = get_mixed_syringe() if(!S) to_chat(user, "There are no darts in [src]!") - return if(!S.reagents) to_chat(user, "There are no reagents available!") - return cartridge.darts-- src.update_icon() @@ -204,7 +192,6 @@ D.reagents.trans_to(M, 15) to_chat(M, "You feel a slight prick.") - qdel(D) break if(D) @@ -285,7 +272,6 @@ if(beakers[index]) var/obj/item/weapon/reagent_containers/glass/beaker/B = beakers[index] to_chat(usr, "You remove [B] from [src].") - mixing -= B beakers -= B B.forceMove(get_turf(src)) @@ -301,7 +287,6 @@ to_chat(usr, "[src] is empty.") - /obj/item/weapon/gun/dartgun/vox name = "alien dart gun" desc = "A small gas-powered dartgun, fitted for nonhuman hands." diff --git a/code/modules/reagents/grenade_launcher.dm b/code/modules/reagents/grenade_launcher.dm index a2a74dc9635..9b9484ba60e 100644 --- a/code/modules/reagents/grenade_launcher.dm +++ b/code/modules/reagents/grenade_launcher.dm @@ -21,7 +21,6 @@ if(..(user, 2)) to_chat(user, "\blue [grenades.len] / [max_grenades] [ammo_name]s.") - /obj/item/weapon/gun/grenadelauncher/attackby(obj/item/I as obj, mob/user as mob, params) if((istype(I, ammo_type))) @@ -30,13 +29,10 @@ I.loc = src grenades += I to_chat(user, "\blue You put the [ammo_name] in the [name].") - to_chat(user, "\blue [grenades.len] / [max_grenades] [ammo_name]s.") - else to_chat(usr, "\red The grenade launcher cannot hold more [ammo_name]s.") - /obj/item/weapon/gun/grenadelauncher/afterattack(obj/target, mob/user , flag) if (istype(target, /obj/item/weapon/storage/backpack )) @@ -53,12 +49,10 @@ else to_chat(usr, "\red The [name] is empty.") - /obj/item/weapon/gun/grenadelauncher/proc/fire_grenade(atom/target, mob/user) for(var/mob/O in viewers(world.view, user)) O.show_message(text("\red [] fired a [ammo_name]!", user), 1) to_chat(user, "\red You fire the [name]!") - var/obj/item/weapon/grenade/chem_grenade/F = grenades[1] //Now with less copypasta! grenades -= F F.loc = user.loc @@ -100,19 +94,15 @@ I.loc = src grenades += I to_chat(user, "\blue You put the [ammo_name] in the [name].") - to_chat(user, "\blue [grenades.len] / [max_grenades] [ammo_name]s.") - icon_state = "piecannon1" else to_chat(usr, "\red The grenade launcher cannot hold more [ammo_name]s.") - /obj/item/weapon/gun/grenadelauncher/piecannon/fire_grenade(atom/target, mob/user) for(var/mob/O in viewers(world.view, user)) O.show_message(text("\red [] fired a [ammo_name]!", user), 1) to_chat(user, "\red You fire the [name]!") - var/obj/item/weapon/reagent_containers/food/snacks/pie/P = grenades[1] //Now with less copypasta! grenades -= P P.loc = user.loc diff --git a/code/modules/reagents/newchem/Blob-Reagents.dm b/code/modules/reagents/newchem/Blob-Reagents.dm index 58b5b392609..f4fcdf9a2b1 100644 --- a/code/modules/reagents/newchem/Blob-Reagents.dm +++ b/code/modules/reagents/newchem/Blob-Reagents.dm @@ -151,4 +151,3 @@ totalmessage += message_living totalmessage += "!" to_chat(M, "[totalmessage]") - diff --git a/code/modules/reagents/newchem/chem_heater.dm b/code/modules/reagents/newchem/chem_heater.dm index 52f2fdffd0f..b3c6c6a5e8c 100644 --- a/code/modules/reagents/newchem/chem_heater.dm +++ b/code/modules/reagents/newchem/chem_heater.dm @@ -75,14 +75,12 @@ if(istype(I, /obj/item/weapon/reagent_containers/glass)) if(beaker) to_chat(user, "A beaker is already loaded into the machine.") - return if(user.drop_item()) beaker = I I.forceMove(src) to_chat(user, "You add the beaker to the machine!") - icon_state = "mixer1b" nanomanager.update_uis(src) diff --git a/code/modules/reagents/newchem/disease.dm b/code/modules/reagents/newchem/disease.dm index 07f60778364..18fbc812a28 100644 --- a/code/modules/reagents/newchem/disease.dm +++ b/code/modules/reagents/newchem/disease.dm @@ -65,7 +65,6 @@ holder.del_reagent("spore") //apparently this never metabolizes and stays in forever unless you have 45 units of atrazine in you or some stupid thing like that. if(prob(1)) to_chat(M, "Your mouth tastes funny.") - if(prob(1) && prob(25)) if(iscarbon(M)) var/mob/living/carbon/C = M diff --git a/code/modules/reagents/newchem/drinks.dm b/code/modules/reagents/newchem/drinks.dm index 136ae63936e..323bb24e832 100644 --- a/code/modules/reagents/newchem/drinks.dm +++ b/code/modules/reagents/newchem/drinks.dm @@ -28,7 +28,6 @@ M.say("[sonic_message]") else to_chat(M, "[sonic_message ]") - ..() return @@ -133,7 +132,6 @@ datum/reagent/ethanol/synthanol/reaction_mob(var/mob/M, var/method=TOUCH, var/vo if(method == INGEST) to_chat(M, pick("That was awful!", "Yuck!")) - /datum/reagent/ethanol/synthanol/robottears name = "Robot Tears" id = "robottears" diff --git a/code/modules/reagents/newchem/drugs.dm b/code/modules/reagents/newchem/drugs.dm index 0d06bbd0e34..6d8a7d4117f 100644 --- a/code/modules/reagents/newchem/drugs.dm +++ b/code/modules/reagents/newchem/drugs.dm @@ -18,7 +18,6 @@ var/smoke_message = pick("You feel relaxed.", "You feel calmed.", "You feel less stressed.", "You feel more placid.", "You feel more undivided.") if(prob(5)) to_chat(M, "[smoke_message]") - if(prob(50)) M.AdjustParalysis(-1) M.AdjustStunned(-1) @@ -51,16 +50,13 @@ M.emote(pick("twitch", "twitch_s", "grumble", "laugh")) if(prob(8)) to_chat(M, "You feel great!") - M.reagents.add_reagent("methamphetamine", rand(1,2)) M.emote(pick("laugh", "giggle")) if(prob(6)) to_chat(M, "You feel warm.") - M.bodytemperature += rand(1,10) if(prob(4)) to_chat(M, "You feel kinda awful!") - M.adjustToxLoss(1) M.jitteriness += 30 M.emote(pick("groan", "moan")) @@ -109,12 +105,10 @@ M.emote(pick("smile", "grin", "yawn", "laugh", "drool")) if(prob(10)) to_chat(M, "You feel pretty chill.") - M.bodytemperature-- M.emote("smile") if(prob(5)) to_chat(M, "You feel too chill!") - M.emote(pick("yawn", "drool")) M.Stun(1) M.adjustToxLoss(1) @@ -122,7 +116,6 @@ M.bodytemperature -= 20 if(prob(2)) to_chat(M, "Your skin feels all rough and dry.") - M.adjustBruteLoss(2) ..() return @@ -239,7 +232,6 @@ var/high_message = pick("You feel amped up.", "You feel ready.", "You feel like you can push it to the limit.") if(prob(5)) to_chat(M, "[high_message]") - M.AdjustParalysis(-5) M.AdjustStunned(-5) M.AdjustWeakened(-5) @@ -301,10 +293,8 @@ var/high_message = pick("really buff", "on top of the world","like you're made of steel", "energized", "invigorated", "full of energy") if(prob(8)) to_chat(M, "[high_message]!") - if(prob(5)) to_chat(M, "You cannot breathe!") - M.adjustOxyLoss(15) M.Stun(1) M.losebreath++ @@ -326,7 +316,6 @@ M.emote(pick("laugh","giggle","smile")) if(prob(5)) to_chat(M, "[pick("You feel hungry.","Your stomach rumbles.","You feel cold.","You feel warm.")]") - if(prob(4)) M.confused = max(M.confused, 10) if(volume >= 50 && prob(25)) @@ -401,12 +390,10 @@ M.adjustToxLoss(1) if(2) to_chat(M, "[M] can't seem to control their legs!") - M.Weaken(8) M.adjustToxLoss(1) if(3) to_chat(M, "[M]'s hands flip out and flail everywhere!") - M.drop_l_hand() M.drop_r_hand() M.adjustToxLoss(1) @@ -446,7 +433,6 @@ high_message = "0100011101001111010101000101010001000001010001110100111101000110010000010101001101010100!" if(prob(5)) to_chat(M, "[high_message]") - M.AdjustParalysis(-2) M.AdjustStunned(-2) M.AdjustWeakened(-2) @@ -495,7 +481,6 @@ high_message = "01010100010100100100000101001110010100110100001101000101010011100100010001000101010011100100001101000101." if(prob(5)) to_chat(M, "[high_message]") - ..() return @@ -507,7 +492,6 @@ M.apply_effect(STUTTER, 5) if(prob(10)) to_chat(M, "You experience a violent electrical discharge!") - playsound(get_turf(M), 'sound/effects/eleczap.ogg', 75, 1) //Lightning effect for electrical discharge visualization var/icon/I=new('icons/obj/zap.dmi',"lightningend") diff --git a/code/modules/reagents/newchem/food.dm b/code/modules/reagents/newchem/food.dm index c87d6c209ee..ed65daca83a 100644 --- a/code/modules/reagents/newchem/food.dm +++ b/code/modules/reagents/newchem/food.dm @@ -13,7 +13,6 @@ datum/reagent/questionmark/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) M.Weaken(2) to_chat(M, "Ugh! Eating that was a terrible idea!") - datum/reagent/egg name = "Egg" id = "egg" @@ -203,15 +202,12 @@ datum/reagent/fungus/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) var/ranchance = rand(1,10) if(ranchance == 1) to_chat(M, "You feel very sick.") - M.reagents.add_reagent("toxin", rand(1,5)) else if(ranchance <= 5) to_chat(M, "That tasted absolutely FOUL.") - else to_chat(M, "Yuck!") - /datum/reagent/chicken_soup name = "Chicken soup" id = "chicken_soup" @@ -240,14 +236,12 @@ datum/reagent/msg/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) to_chat(M, "That tasted amazing!") - /datum/reagent/msg/on_mob_life(var/mob/living/M as mob) if(prob(5)) if(prob(10)) M.adjustToxLoss(rand(2.4)) if(prob(7)) to_chat(M, "A horrible migraine overpowers you.") - M.Stun(rand(2,5)) ..() return @@ -295,7 +289,6 @@ datum/reagent/cheese/reaction_turf(var/turf/T, var/volume) /datum/reagent/fake_cheese/overdose_process(var/mob/living/M as mob) if(prob(8)) to_chat(M, "You feel something squirming in your stomach. Your thoughts turn to cheese and you begin to sweat.") - M.adjustToxLoss(rand(1,2)) ..() @@ -403,12 +396,10 @@ datum/reagent/ectoplasm/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) var/spooky_eat = pick("Ugh, why did you eat that? Your mouth feels haunted. Haunted with bad flavors.", "Ugh, why did you eat that? It has the texture of ham aspic. From the 1950s. Left out in the sun.", "Ugh, why did you eat that? It tastes like a ghost fart.", "Ugh, why did you eat that? It tastes like flavor died.") to_chat(M, "[spooky_eat]") - /datum/reagent/ectoplasm/on_mob_life(var/mob/living/M as mob) var/spooky_message = pick("You notice something moving out of the corner of your eye, but nothing is there...", "Your eyes twitch, you feel like something you can't see is here...", "You've got the heebie-jeebies.", "You feel uneasy.", "You shudder as if cold...", "You feel something gliding across your back...") if(prob(8)) to_chat(M, "[spooky_message]") - ..() return @@ -457,14 +448,11 @@ datum/reagent/ectoplasm/reaction_turf(var/turf/T, var/volume) /datum/reagent/hydrogenated_soybeanoil/overdose_process(var/mob/living/M as mob) if(prob(33)) to_chat(M, "You feel horribly weak.") - if(prob(10)) to_chat(M, "You cannot breathe!") - M.adjustOxyLoss(5) if(prob(5)) to_chat(M, "You feel a sharp pain in your chest!") - M.adjustOxyLoss(25) M.Stun(5) M.Paralyse(10) @@ -543,7 +531,6 @@ datum/reagent/ectoplasm/reaction_turf(var/turf/T, var/volume) M.reagents.add_reagent(pick("blood", "corn_syrup", "synthflesh", "hydrogenated_soybeanoil", "porktonium", "toxic_slurry"), 0.8) else if(prob(6)) to_chat(M, "[pick("You feel ill.","Your stomach churns.","You feel queasy.","You feel sick.")]") - M.emote(pick("groan","moan")) ..() return @@ -571,25 +558,21 @@ datum/reagent/pepperoni/reaction_mob(var/mob/living/M, var/method=TOUCH, var/vol if(H.wear_mask) to_chat(H, "The pepperoni bounces off your mask!") - return if(H.head) to_chat(H, "Your mask protects you from the errant pepperoni!") - return if(prob(50)) M.adjustBruteLoss(1) playsound(M, 'sound/effects/woodhit.ogg', 50, 1) to_chat(M, "A slice of pepperoni slaps you!") - else M.emote("burp") to_chat(M, "My goodness, that was tasty!") - /datum/chemical_reaction/pepperoni name = "Pepperoni" id = "pepperoni" @@ -609,16 +592,13 @@ datum/reagent/pepperoni/reaction_mob(var/mob/living/M, var/method=TOUCH, var/vol /datum/reagent/cholesterol/on_mob_life(var/mob/living/M as mob) if(volume >= 25 && prob(volume*0.15)) to_chat(M, "Your chest feels [pick("weird","uncomfortable","nasty","gross","odd","unusual","warm")]!") - M.adjustToxLoss(rand(1,2)) else if(volume >= 45 && prob(volume*0.08)) to_chat(M, "Your chest [pick("hurts","stings","aches","burns")]!") - M.adjustToxLoss(rand(2,4)) M.Stun(1) else if(volume >= 150 && prob(volume*0.01)) to_chat(M, "Your chest is burning with pain!") - M.Stun(1) M.Weaken(1) if(ishuman(M)) diff --git a/code/modules/reagents/newchem/medicine.dm b/code/modules/reagents/newchem/medicine.dm index f61f5e850b7..c678a891fd8 100644 --- a/code/modules/reagents/newchem/medicine.dm +++ b/code/modules/reagents/newchem/medicine.dm @@ -18,12 +18,10 @@ datum/reagent/silver_sulfadiazine/reaction_mob(var/mob/living/M as mob, var/meth M.adjustFireLoss(-volume) if(show_message) to_chat(M, "The silver sulfadiazine soothes your burns.") - if(method == INGEST) M.adjustToxLoss(0.5*volume) if(show_message) to_chat(M, "You feel sick...") - ..() return @@ -47,13 +45,11 @@ datum/reagent/styptic_powder/reaction_mob(var/mob/living/M as mob, var/method=TO M.adjustBruteLoss(-volume) if(show_message) to_chat(M, "The styptic powder stings like hell as it closes some of your wounds!") - M.emote("scream") if(method == INGEST) M.adjustToxLoss(0.5*volume) if(show_message) to_chat(M, "You feel gross!") - ..() return @@ -94,7 +90,6 @@ datum/reagent/synthflesh/reaction_mob(var/mob/living/M, var/method=TOUCH, var/vo M.adjustFireLoss(-1.5*volume) if(show_message) to_chat(M, "The synthetic flesh integrates itself into your wounds, healing you.") - ..() return @@ -637,9 +632,7 @@ datum/reagent/strange_reagent/reaction_mob(var/mob/living/M as mob, var/method=T var/mob/dead/observer/ghost = M.get_ghost() if(ghost) to_chat(ghost, "Your are attempting to be revived with Strange Reagent. Return to your body if you want to be revived! (Verbs -> Ghost -> Re-enter corpse)") - to_chat(ghost, sound('sound/effects/genetics.ogg')) - M.visible_message("[M] doesn't appear to respond, perhaps try again later?") if(!M.suiciding && !ghost && !(NOCLONE in M.mutations)) M.visible_message("[M] seems to rise from the dead!") diff --git a/code/modules/reagents/newchem/newchem_procs.dm b/code/modules/reagents/newchem/newchem_procs.dm index 83aca86397d..8d10a449a18 100644 --- a/code/modules/reagents/newchem/newchem_procs.dm +++ b/code/modules/reagents/newchem/newchem_procs.dm @@ -78,7 +78,6 @@ R.addiction_act_stage5(M) if(prob(20) && (world.timeofday > (R.last_addiction_dose + ADDICTION_TIME))) //Each addiction lasts 8 minutes before it can end to_chat(M, "You no longer feel reliant on [R.name]!") - addiction_list.Remove(R) update_total() @@ -135,7 +134,6 @@ if(prob(4)) to_chat(M, "You feel a dull headache.") - /datum/reagent/proc/addiction_act_stage3(var/mob/living/M as mob) if(prob(8)) M.emote("twitch_s") @@ -144,33 +142,27 @@ if(prob(4)) to_chat(M, "You begin craving [name]!") - /datum/reagent/proc/addiction_act_stage4(var/mob/living/M as mob) if(prob(8)) M.emote("twitch") if(prob(4)) to_chat(M, "You have the strong urge for some [name]!") - if(prob(4)) to_chat(M, "You REALLY crave some [name]!") - /datum/reagent/proc/addiction_act_stage5(var/mob/living/M as mob) if(prob(8)) M.emote("twitch") if(prob(6)) to_chat(M, "Your stomach lurches painfully!") - M.visible_message("[M] gags and retches!") M.Stun(rand(2,4)) M.Weaken(rand(2,4)) if(prob(5)) to_chat(M, "You feel like you can't live without [name]!") - if(prob(5)) to_chat(M, "You would DIE for some [name] right now!") - /datum/reagent/proc/reagent_deleted() return diff --git a/code/modules/reagents/newchem/other.dm b/code/modules/reagents/newchem/other.dm index 63c45c77776..7cd45d056d3 100644 --- a/code/modules/reagents/newchem/other.dm +++ b/code/modules/reagents/newchem/other.dm @@ -266,7 +266,6 @@ datum/reagent/super_hairgrownium/on_mob_life(var/mob/living/M as mob) var/obj/item/clothing/mask/fakemoustache = new /obj/item/clothing/mask/fakemoustache H.equip_to_slot(fakemoustache, slot_wear_mask) to_chat(H, "Hair bursts forth from your every follicle!") - ..() return @@ -294,7 +293,6 @@ datum/reagent/fartonium/on_mob_life(var/mob/living/M as mob) if(holder.has_reagent("simethicone")) if(prob(25)) to_chat(M, "[pick("Oh god, something doesn't feel right!", "IT HURTS!", "FUCK!", "Something is seriously wrong!", "THE PAIN!", "You feel like you're gonna die!")]") - M.adjustBruteLoss(1) if(prob(10)) M.custom_emote(1,"strains, but nothing happens.") diff --git a/code/modules/reagents/newchem/pyro.dm b/code/modules/reagents/newchem/pyro.dm index 2b8c8e388a0..31623753852 100644 --- a/code/modules/reagents/newchem/pyro.dm +++ b/code/modules/reagents/newchem/pyro.dm @@ -363,7 +363,6 @@ datum/reagent/blackpowder/reaction_turf(var/turf/T, var/volume) //oh shit if((H.r_ear && (H.r_ear.flags & EARBANGPROTECT)) || (H.l_ear && (H.l_ear.flags & EARBANGPROTECT)) || (H.head && (H.head.flags & HEADBANGPROTECT))) ear_safety++ to_chat(M, "BANG") - if(!ear_safety) M.Stun(max(10/distance, 3)) M.Weaken(max(10/distance, 3)) @@ -371,16 +370,13 @@ datum/reagent/blackpowder/reaction_turf(var/turf/T, var/volume) //oh shit M.ear_deaf = max(M.ear_deaf,15) if (M.ear_damage >= 15) to_chat(M, "Your ears start to ring badly!") - if(prob(M.ear_damage - 10 + 5)) to_chat(M, "You can't hear anything!") - M.disabilities |= DEAF else if (M.ear_damage >= 5) to_chat(M, "Your ears start to ring!") - /datum/chemical_reaction/sonic_powder/on_reaction(var/datum/reagents/holder, var/created_volume) if(holder.has_reagent("stabilizing_agent")) return @@ -396,7 +392,6 @@ datum/reagent/blackpowder/reaction_turf(var/turf/T, var/volume) //oh shit if((H.r_ear && (H.r_ear.flags & EARBANGPROTECT)) || (H.l_ear && (H.l_ear.flags & EARBANGPROTECT)) || (H.head && (H.head.flags & HEADBANGPROTECT))) ear_safety++ to_chat(C, "BANG") - if(!ear_safety) M.Stun(max(10/distance, 3)) M.Weaken(max(10/distance, 3)) @@ -404,15 +399,12 @@ datum/reagent/blackpowder/reaction_turf(var/turf/T, var/volume) //oh shit M.ear_deaf = max(M.ear_deaf,15) if (M.ear_damage >= 15) to_chat(M, "Your ears start to ring badly!") - if(prob(M.ear_damage - 10 + 5)) to_chat(M, "You can't hear anything!") - M.disabilities |= DEAF else if (M.ear_damage >= 5) to_chat(M, "Your ears start to ring!") - holder.remove_reagent("sonic_powder", created_volume) /datum/reagent/phlogiston diff --git a/code/modules/reagents/newchem/toxins.dm b/code/modules/reagents/newchem/toxins.dm index b82e4c266ab..b602e282b1f 100644 --- a/code/modules/reagents/newchem/toxins.dm +++ b/code/modules/reagents/newchem/toxins.dm @@ -35,7 +35,6 @@ M.reagents.add_reagent("histamine",10) else to_chat(M, "You feel a burning sensation in your throat...") - M.emote("drool") /datum/reagent/histamine/on_mob_life(var/mob/living/M as mob) @@ -44,7 +43,6 @@ M.emote(pick("twitch", "grumble", "sneeze", "cough")) if(prob(10)) to_chat(M, "Your eyes itch.") - M.emote(pick("blink", "sneeze")) M.eye_blurry += 3 if(prob(10)) @@ -53,7 +51,6 @@ M.emote("grumble") if(prob(5)) to_chat(M, "You're getting a rash!") - M.adjustBruteLoss(2) ..() return @@ -61,7 +58,6 @@ /datum/reagent/histamine/overdose_process(var/mob/living/M as mob) if(prob(2)) to_chat(M, "You feel mucus running down the back of your throat.") - M.adjustToxLoss(1) M.jitteriness += 4 M.emote("sneeze", "cough") @@ -72,7 +68,6 @@ M.adjustOxyLoss(5) else if(prob(7)) to_chat(M, "Your chest hurts!") - M.emote(pick("cough","gasp")) M.adjustOxyLoss(3) ..() @@ -202,12 +197,10 @@ M.emote("drool") if(prob(10)) to_chat(M, "You cannot breathe!") - M.losebreath += 1 M.emote("gasp") if(prob(8)) to_chat(M, "You feel horrendously weak!") - M.Stun(2) M.adjustToxLoss(2) ..() @@ -245,7 +238,6 @@ M.emote(pick("twitch", "laugh", "sneeze", "cry")) if(prob(20)) to_chat(M, "Something tickles!") - M.emote(pick("laugh", "giggle")) if(prob(15)) M.visible_message("[M] scratches at an itch.") @@ -254,13 +246,11 @@ M.emote("grumble") if(prob(10)) to_chat(M, "So itchy!") - M.adjustBruteLoss(2) if(prob(6)) M.reagents.add_reagent("histamine", rand(1,3)) if(prob(2)) to_chat(M, "AHHHHHH!") - M.adjustBruteLoss(5) M.Weaken(5) M.jitteriness += 6 @@ -303,7 +293,6 @@ if(volume < 5) to_chat(M, "The blueish acidic substance stings you, but isn't concentrated enough to harm you!") - if(volume >=5 && volume <=10) if(!H.unacidable) M.take_organ_damage(0,max(volume-5,2)*4) @@ -318,10 +307,8 @@ qdel(H.wear_mask) H.update_inv_wear_mask() to_chat(H, "\red Your mask melts away but protects you from the acid!") - else to_chat(H, "\red Your mask protects you from the acid!") - return if(H.head) @@ -329,10 +316,8 @@ qdel(H.head) H.update_inv_head() to_chat(H, "\red Your helmet melts away but protects you from the acid") - else to_chat(H, "\red Your helmet protects you from the acid!") - return if(!H.unacidable) @@ -349,7 +334,6 @@ I.desc = "Looks like this was \an [O] some time ago." for(var/mob/M in viewers(5, O)) to_chat(M, "\red \the [O] melts.") - qdel(O) /datum/chemical_reaction/facid @@ -375,16 +359,13 @@ M.adjustToxLoss(rand(5,25)) if(prob(33)) to_chat(M, "You feel horribly weak.") - M.Stun(2) if(prob(10)) to_chat(M, "You cannot breathe!") - M.adjustOxyLoss(10) M.losebreath++ if(prob(10)) to_chat(M, "Your chest is burning with pain!") - M.adjustOxyLoss(10) M.losebreath++ M.Stun(3) @@ -429,7 +410,6 @@ if(6 to 10) if(prob(8)) to_chat(M, "You feel [pick("weak", "horribly weak", "numb", "like you can barely move", "tingly")].") - M.Stun(1) else if(prob(8)) M.emote(pick("drool", "tremble")) @@ -441,10 +421,8 @@ M.losebreath++ if(prob(9)) to_chat(M, "You can't [pick("move", "feel your legs", "feel your face", "feel anything")]!") - if(prob(7)) to_chat(M, "You can't breathe!") - M.losebreath += 3 ..() return @@ -580,11 +558,9 @@ switch(rand(1,3)) if(1) to_chat(M, "You feel hungry...") - if(2) M.adjustToxLoss(1) to_chat(M, "Your stomach grumbles painfully!") - else if(prob(60)) var/fat_to_burn = max(round(M.nutrition/100,1), 5) @@ -629,7 +605,6 @@ M.eye_blurry += 5 if(prob(8)) to_chat(M, "You feel [pick("weak", "horribly weak", "numb", "like you can barely move", "tingly")].") - M.Stun(1) else if(prob(8)) M.emote(pick("drool","pale", "gasp")) @@ -640,7 +615,6 @@ M.emote(pick("drool", "faint", "pale", "gasp", "collapse")) else if(prob(8)) to_chat(M, "You can't [pick("breathe", "move", "feel your legs", "feel your face", "feel anything")]!") - M.losebreath++ ..() return @@ -702,7 +676,6 @@ M.jitteriness = 1000 if(prob(5)) to_chat(M, "You can't breathe!") - M.emote(pick("gasp", "choke", "cough")) M.losebreath++ if(61 to INFINITY) @@ -850,7 +823,6 @@ M.adjustToxLoss(rand(2.4)) if(prob(7)) to_chat(M, "A horrible migraine overpowers you.") - M.Stun(rand(2,5)) if(prob(7)) M.fakevomit(1) @@ -898,7 +870,6 @@ if(iscarbon(M)) if(method == TOUCH || method==INGEST) to_chat(M, "OH SHIT ANTS!!!!") - M.emote("scream") M.adjustBruteLoss(4) diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm index 0a36f59d428..09776677502 100644 --- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm +++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm @@ -221,7 +221,6 @@ to_chat(M, "\blue You feel a chill!") - slimefireproof name = "Slime Fireproof" id = "m_fireproof" diff --git a/code/modules/reagents/oldchem/reagents/_reagent_base.dm b/code/modules/reagents/oldchem/reagents/_reagent_base.dm index 11dc147ace6..9221c42f0c8 100644 --- a/code/modules/reagents/oldchem/reagents/_reagent_base.dm +++ b/code/modules/reagents/oldchem/reagents/_reagent_base.dm @@ -40,13 +40,11 @@ if(can_become_addicted) if(prob(self.addiction_chance) && !is_type_in_list(self, M.reagents.addiction_list)) to_chat(M, "You suddenly feel invigorated and guilty...") - var/datum/reagent/new_reagent = new self.type() new_reagent.last_addiction_dose = world.timeofday M.reagents.addiction_list.Add(new_reagent) else if(is_type_in_list(self, M.reagents.addiction_list)) to_chat(M, "You feel slightly better, but for how long?") - for(var/A in M.reagents.addiction_list) var/datum/reagent/AD = A if(AD && istype(AD, self)) diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm index 1a24670b2a7..2d85730193f 100644 --- a/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm +++ b/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm @@ -75,16 +75,13 @@ var/obj/item/weapon/paper/paperaffected = O paperaffected.clearpaper() to_chat(usr, "The solution melts away the ink on the paper.") - if(istype(O,/obj/item/weapon/book)) if(volume >= 5) var/obj/item/weapon/book/affectedbook = O affectedbook.dat = null to_chat(usr, "The solution melts away the ink on the book.") - else to_chat(usr, "It wasn't enough...") - return /datum/reagent/ethanol/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//Splashing people with ethanol isn't quite as good as fuel. diff --git a/code/modules/reagents/oldchem/reagents/reagents_food.dm b/code/modules/reagents/oldchem/reagents/reagents_food.dm index b15bb4ab26d..05a3fad7808 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_food.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_food.dm @@ -451,7 +451,6 @@ /datum/reagent/sugar/overdose_start(var/mob/living/M as mob) to_chat(M, "You pass out from hyperglycemic shock!") - M.emote("collapse") ..() diff --git a/code/modules/reagents/oldchem/reagents/reagents_toxin.dm b/code/modules/reagents/oldchem/reagents/reagents_toxin.dm index 1a1b1e6ea76..9fc7592d346 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_toxin.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_toxin.dm @@ -65,7 +65,6 @@ /datum/reagent/slimejelly/on_mob_life(var/mob/living/M as mob) if(prob(10)) to_chat(M, "\red Your insides are burning!") - M.adjustToxLoss(rand(20,60)*REM) else if(prob(40)) M.adjustBruteLoss(-5*REM) @@ -85,13 +84,9 @@ var/mob/living/carbon/human/human = M if(human.species.name != "Shadow") to_chat(M, "\red Your flesh rapidly mutates!") - to_chat(M, "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.") - to_chat(M, "\red Your body reacts violently to light. \green However, it naturally heals in darkness.") - to_chat(M, "Aside from your new traits, you are mentally unchanged and retain your prior obligations.") - human.set_species("Shadow") ..() return @@ -270,12 +265,10 @@ if(H.wear_mask) to_chat(H, "\red Your mask protects you from the acid!") - return if(H.head) to_chat(H, "\red Your helmet protects you from the acid!") - return if(!M.unacidable) @@ -297,7 +290,6 @@ if(volume < 10) to_chat(M, "The greenish acidic substance stings you, but isn't concentrated enough to harm you!") - if(volume >=10 && volume <=25) if(!H.unacidable) M.take_organ_damage(0,min(max(volume-10,2)*2,20)) @@ -322,7 +314,6 @@ I.desc = "Looks like this was \an [O] some time ago." for(var/mob/M in viewers(5, O)) to_chat(M, "\red \the [O] melts.") - qdel(O) @@ -441,11 +432,9 @@ safe_thing = victim.glasses if ( eyes_covered && mouth_covered ) to_chat(victim, "\red Your [safe_thing] protects you from the pepperspray!") - return else if ( mouth_covered ) // Reduced effects if partially protected to_chat(victim, "\red Your [safe_thing] protect you from most of the pepperspray!") - if(prob(5)) victim.emote("scream") victim.eye_blurry = max(M.eye_blurry, 3) @@ -457,7 +446,6 @@ return else if ( eyes_covered ) // Eye cover is better than mouth cover to_chat(victim, "\red Your [safe_thing] protects your eyes from the pepperspray!") - victim.eye_blurry = max(M.eye_blurry, 3) victim.damageoverlaytemp = 30 return @@ -465,7 +453,6 @@ if(prob(5)) victim.emote("scream") to_chat(victim, "\red You're sprayed directly in the eyes with pepperspray!") - victim.eye_blurry = max(M.eye_blurry, 5) victim.eye_blind = max(M.eye_blind, 2) victim.confused = max(M.confused, 6) diff --git a/code/modules/reagents/oldchem/reagents/reagents_water.dm b/code/modules/reagents/oldchem/reagents/reagents_water.dm index 99c4b2f6499..df9e0b29b64 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_water.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_water.dm @@ -256,7 +256,6 @@ if(method == INGEST) to_chat(M, "Oh god, why did you drink that?") - /datum/reagent/fishwater/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom if(prob(30)) // Nasty, you drank this stuff? 30% chance of the fakevomit (non-stunning version) @@ -309,16 +308,13 @@ switch(data) if(1 to 4) to_chat(M, "Something sizzles in your veins!") - M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2) if(5 to 12) to_chat(M, "You feel an intense burning inside of you!") - M.adjustFireLoss(1) M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2) if(13 to INFINITY) to_chat(M, "You suddenly ignite in a holy fire!") - for(var/mob/O in viewers(M, null)) O.show_message(text("[] suddenly bursts into flames!", M), 1) M.fire_stacks = min(5,M.fire_stacks + 3) @@ -335,15 +331,12 @@ if(method == TOUCH) if(H.wear_mask) to_chat(H, "\red Your mask protects you from the holy water!") - return else if(H.head) to_chat(H, "\red Your helmet protects you from the holy water!") - return else to_chat(M, "Something holy interferes with your powers!") - M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2) diff --git a/code/modules/reagents/pandemic.dm b/code/modules/reagents/pandemic.dm index d532216c8db..bec2b92f049 100644 --- a/code/modules/reagents/pandemic.dm +++ b/code/modules/reagents/pandemic.dm @@ -275,7 +275,6 @@ if(stat & (NOPOWER|BROKEN)) return if(beaker) to_chat(user, "A beaker is already loaded into the machine!") - return if(!user.drop_item()) return @@ -283,7 +282,6 @@ beaker = I beaker.loc = src to_chat(user, "You add the beaker to the machine.") - src.updateUsrDialog() icon_state = "mixer1" diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 3f86de28f0d..e8df519fe43 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -81,11 +81,9 @@ if(is_open_container()) if(reagents.total_volume >= volume) to_chat(user, "span class='warning'>\The [src] is full.") - return else reagents.add_reagent("water", min(volume - reagents.total_volume, amount_per_transfer_from_this)) to_chat(user, "You fill [src] from [source].") - return ..() \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index fa7915ed167..b92aceb4c79 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -73,16 +73,13 @@ var/datum/reagents/R = reagent_list[mode] if(!R.total_volume) to_chat(user, "The injector is empty.") - return if (!istype(M)) return if (R.total_volume && M.can_inject(user, 1, penetrate_thick = bypass_protection)) to_chat(user, "You inject [M] with the injector.") - to_chat(M, "You feel a tiny prick!") - R.add_reagent(M) if(M.reagents) var/datum/reagent/injected = chemical_reagents_list[reagent_ids[mode]] @@ -95,7 +92,6 @@ var/trans = R.trans_to(M, amount_per_transfer_from_this) to_chat(user, "[trans] units injected. [R.total_volume] units remaining.") - return /obj/item/weapon/reagent_containers/borghypo/attack_self(mob/user as mob) @@ -107,7 +103,6 @@ charge_tick = 0 //Prevents wasted chems/cell charge if you're cycling through modes. var/datum/reagent/R = chemical_reagents_list[reagent_ids[mode]] to_chat(user, "Synthesizer is now producing '[R.name]'.") - return /obj/item/weapon/reagent_containers/borghypo/examine(mob/user) @@ -120,9 +115,7 @@ var/datum/reagent/R = locate() in RS.reagent_list if(R) to_chat(user, "It currently has [R.volume] units of [R.name] stored.") - empty = 0 if(empty) to_chat(user, "It is currently empty. Allow some time for the internal syntheszier to produce more.") - diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index f91d6cfe619..2fedf8dd27f 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -18,12 +18,10 @@ if(target.reagents.total_volume >= target.reagents.maximum_volume) to_chat(user, "\red [target] is full.") - return if(!target.is_open_container() && !ismob(target) && !istype(target,/obj/item/weapon/reagent_containers/food) && !istype(target, /obj/item/clothing/mask/cigarette)) //You can inject humans and food but you cant remove the shit. to_chat(user, "\red You cannot directly fill this object.") - return var/trans = 0 @@ -56,7 +54,6 @@ to_chat(user, "\blue You transfer [trans] units of the solution.") - if (src.reagents.total_volume<=0) filled = 0 icon_state = "[initial(icon_state)]" @@ -96,7 +93,6 @@ trans = src.reagents.trans_to(target, amount_per_transfer_from_this) to_chat(user, "\blue You transfer [trans] units of the solution.") - if (src.reagents.total_volume<=0) filled = 0 icon_state = "[initial(icon_state)]" @@ -105,19 +101,16 @@ if(!target.is_open_container() && !istype(target,/obj/structure/reagent_dispensers)) to_chat(user, "\red You cannot directly remove reagents from [target].") - return if(!target.reagents.total_volume) to_chat(user, "\red [target] is empty.") - return var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) to_chat(user, "\blue You fill the [src] with [trans] units of the solution.") - filled = 1 icon_state = "[initial(icon_state)][filled]" diff --git a/code/modules/reagents/reagent_containers/drugs.dm b/code/modules/reagents/reagent_containers/drugs.dm index c7afd1b5f90..db162b6f7cc 100644 --- a/code/modules/reagents/reagent_containers/drugs.dm +++ b/code/modules/reagents/reagent_containers/drugs.dm @@ -25,33 +25,27 @@ if(!target.reagents.total_volume && target.reagents) to_chat(user, "\red [target] is empty.") - return if(reagents.total_volume >= reagents.maximum_volume) to_chat(user, "\red [src] is full.") - return for(var/datum/reagent/A in target.reagents.reagent_list) if(A.reagent_state != 1) to_chat(user, "\red You can only put powders in [src].") - return var/trans = target.reagents.trans_to(src, target:amount_per_transfer_from_this) to_chat(user, "\blue You fill [src] with [trans] units of the contents of [target].") - else if(target.is_open_container() && target.reagents) //Something like a glass. Player probably wants to transfer TO it. if(!reagents.total_volume) to_chat(user, "\red [src] is empty.") - return if(target.reagents.total_volume >= target.reagents.maximum_volume) to_chat(user, "\red [target] is full.") - return // /vg/: Logging transfers of bad things @@ -68,7 +62,6 @@ var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this) to_chat(user, "\blue You transfer [trans] units of the solution to [target].") - //Safety for dumping stuff into a ninja suit. It handles everything through attackby() and this is unnecessary. /*else if(istype(target, /obj/machinery/bunsen_burner)) @@ -83,10 +76,8 @@ var/tmp_label = sanitize(input(user, "Enter a label for [src.name]","Label",src.label_text)) if(length(tmp_label) > 10) to_chat(user, "\red The label can be at most 10 characters long.") - else to_chat(user, "\blue You set the label to \"[tmp_label]\".") - src.label_text = tmp_label src.update_name_label() diff --git a/code/modules/reagents/reagent_containers/food/cans.dm b/code/modules/reagents/reagent_containers/food/cans.dm index b0544abd4a0..9aaf72b6f8c 100644 --- a/code/modules/reagents/reagent_containers/food/cans.dm +++ b/code/modules/reagents/reagent_containers/food/cans.dm @@ -9,7 +9,6 @@ if (canopened == 0) playsound(src.loc,'sound/effects/canopen.ogg', rand(10,50), 1) to_chat(user, "You open the drink with an audible pop!") - canopened = 1 flags |= OPENCONTAINER else @@ -18,7 +17,6 @@ attack(mob/M as mob, mob/user as mob, def_zone) if (canopened == 0) to_chat(user, "You need to open the drink!") - return return ..(M, user, def_zone) @@ -27,11 +25,9 @@ if(!proximity) return if(istype(target, /obj/structure/reagent_dispensers) && (canopened == 0)) to_chat(user, "You need to open the drink!") - return else if(target.is_open_container() && (canopened == 0)) to_chat(user, "You need to open the drink!") - return else return ..(target, user, proximity) @@ -41,21 +37,16 @@ return if(!reagents || reagents.total_volume==0) to_chat(user, "\blue \The [src] is empty!") - else if (reagents.total_volume<=src.volume/4) to_chat(user, "\blue \The [src] is almost empty!") - else if (reagents.total_volume<=src.volume*0.66) to_chat(user, "\blue \The [src] is half full!") - else if (reagents.total_volume<=src.volume*0.90) to_chat(user, "\blue \The [src] is almost full!") - else to_chat(user, "\blue \The [src] is full!")*/ - //DRINKS /obj/item/weapon/reagent_containers/food/drinks/cans/cola diff --git a/code/modules/reagents/reagent_containers/food/condiment.dm b/code/modules/reagents/reagent_containers/food/condiment.dm index 5dee4c1c9d2..e1fb06f1be7 100644 --- a/code/modules/reagents/reagent_containers/food/condiment.dm +++ b/code/modules/reagents/reagent_containers/food/condiment.dm @@ -40,12 +40,10 @@ if(!R || !R.total_volume) to_chat(user, "\red None of [src] left, oh no!") - return 0 if(M == user) to_chat(M, "\blue You swallow some of contents of the [src].") - if(reagents.total_volume) reagents.reaction(M, INGEST) spawn(0) @@ -88,32 +86,26 @@ if(!target.reagents.total_volume) to_chat(user, "\red [target] is empty.") - return if(reagents.total_volume >= reagents.maximum_volume) to_chat(user, "\red [src] is full.") - return var/trans = target.reagents.trans_to(src, target:amount_per_transfer_from_this) to_chat(user, "\blue You fill [src] with [trans] units of the contents of [target].") - //Something like a glass or a food item. Player probably wants to transfer TO it. else if(target.is_open_container() || istype(target, /obj/item/weapon/reagent_containers/food/snacks)) if(!reagents.total_volume) to_chat(user, "\red [src] is empty.") - return if(target.reagents.total_volume >= target.reagents.maximum_volume) to_chat(user, "\red you can't add anymore to [target].") - return var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this) to_chat(user, "\blue You transfer [trans] units of the condiment to [target].") - /obj/item/weapon/reagent_containers/food/condiment/on_reagent_change() if(!possible_states.len) return @@ -239,18 +231,15 @@ if(istype(target, /obj/item/weapon/reagent_containers/food/snacks)) if(!reagents.total_volume) to_chat(user, "You tear open [src], but there's nothing in it.") - qdel(src) return if(target.reagents.total_volume >= target.reagents.maximum_volume) to_chat(user, "You tear open [src], but [target] is stacked so high that it just drips off!")//Not sure if food can ever be full, but better safe than sorry. - qdel(src) return else to_chat(user, "You tear open [src] above [target] and the condiments drip onto it.") - src.reagents.trans_to(target, amount_per_transfer_from_this) qdel(src) diff --git a/code/modules/reagents/reagent_containers/food/drinks.dm b/code/modules/reagents/reagent_containers/food/drinks.dm index 492ddd60223..d6a5d37012a 100644 --- a/code/modules/reagents/reagent_containers/food/drinks.dm +++ b/code/modules/reagents/reagent_containers/food/drinks.dm @@ -23,7 +23,6 @@ /obj/item/weapon/reagent_containers/food/drinks/attack(mob/M as mob, mob/user as mob, def_zone) if(!reagents || !reagents.total_volume) to_chat(user, " None of [src] left, oh no!") - return 0 if(istype(M, /mob/living/carbon)) @@ -47,34 +46,28 @@ var/obj/item/weapon/reagent_containers/food/drinks/cans/cantarget = target if(cantarget.canopened == 0) to_chat(user, "You need to open the drink you want to pour into!") - return if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us. if(!target.reagents.total_volume) to_chat(user, " [target] is empty.") - return if(reagents.total_volume >= reagents.maximum_volume) to_chat(user, " [src] is full.") - return var/trans = target.reagents.trans_to(src, target:amount_per_transfer_from_this) to_chat(user, " You fill [src] with [trans] units of the contents of [target].") - else if(target.is_open_container()) //Something like a glass. Player probably wants to transfer TO it. if(!reagents.total_volume) to_chat(user, " [src] is empty.") - return if(target.reagents.total_volume >= target.reagents.maximum_volume) to_chat(user, " [target] is full.") - return @@ -88,7 +81,6 @@ var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this) to_chat(user, " You transfer [trans] units of the solution to [target].") - if(isrobot(user)) //Cyborg modules that include drinks automatically refill themselves, but drain the borg's cell if(refill in drinks) // Only synthesize drinks var/mob/living/silicon/robot/bro = user @@ -97,12 +89,10 @@ to_chat(user, "Now synthesizing [trans] units of [refillName]...") - spawn(300) reagents.add_reagent(refill, trans) to_chat(user, "Cyborg [src] refilled.") - return /obj/item/weapon/reagent_containers/food/drinks/attackby(var/obj/item/I, mob/user as mob, params) @@ -112,7 +102,6 @@ if(src.reagents) src.reagents.chem_temp += 15 to_chat(user, "You heat [src] with [I].") - src.reagents.handle_reactions() /obj/item/weapon/reagent_containers/food/drinks/examine(mob/user) @@ -120,21 +109,16 @@ return if(!reagents || reagents.total_volume==0) to_chat(user, " \The [src] is empty!") - else if (reagents.total_volume<=src.volume/4) to_chat(user, " \The [src] is almost empty!") - else if (reagents.total_volume<=src.volume*0.66) to_chat(user, " \The [src] is half full!")// We're all optimistic, right?! - else if (reagents.total_volume<=src.volume*0.90) to_chat(user, " \The [src] is almost full!") - else to_chat(user, " \The [src] is full!") - //////////////////////////////////////////////////////////////////////////////// /// Drinks. END //////////////////////////////////////////////////////////////////////////////// diff --git a/code/modules/reagents/reagent_containers/food/sandwich.dm b/code/modules/reagents/reagent_containers/food/sandwich.dm index 07bc96abbf1..75919c4314f 100644 --- a/code/modules/reagents/reagent_containers/food/sandwich.dm +++ b/code/modules/reagents/reagent_containers/food/sandwich.dm @@ -26,18 +26,15 @@ if(src.contents.len > sandwich_limit) to_chat(user, "\red If you put anything else on \the [src] it's going to collapse.") - return else if(istype(W,/obj/item/weapon/shard)) to_chat(user, "\blue You hide [W] in \the [src].") - user.drop_item() W.loc = src update() return else if(istype(W,/obj/item/weapon/reagent_containers/food/snacks)) to_chat(user, "\blue You layer [W] over \the [src].") - var/obj/item/weapon/reagent_containers/F = W F.reagents.trans_to(src, F.reagents.total_volume) user.drop_item() @@ -88,7 +85,6 @@ var/obj/item/O = pick(contents) to_chat(user, "\blue You think you can see [O.name] in there.") - /obj/item/weapon/reagent_containers/food/snacks/csandwich/attack(mob/M as mob, mob/user as mob, def_zone) var/obj/item/shard @@ -103,7 +99,6 @@ if(H && shard && M == user) //This needs a check for feeding the food to other people, but that could be abusable. to_chat(H, "\red You lacerate your mouth on a [shard.name] in the sandwich!") - H.adjustBruteLoss(5) //TODO: Target head if human. ..() */ \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index 705e3ab625d..d2754ba5972 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -22,7 +22,6 @@ if(!reagents.total_volume) if(M == usr) to_chat(usr, "You finish eating \the [src].") - usr.visible_message("[usr] finishes eating \the [src].") usr.unEquip(src) //so icons update :[ @@ -41,7 +40,6 @@ /obj/item/weapon/reagent_containers/food/snacks/attack(mob/M as mob, mob/user as mob, def_zone) if(reagents && !reagents.total_volume) //Shouldn't be needed but it checks to see if it has anything left in it. to_chat(user, "None of [src] left, oh no!") - M.unEquip(src) //so icons update :[ qdel(src) return 0 @@ -63,15 +61,12 @@ return else if (bitecount==1) to_chat(user, "\blue \The [src] was bitten by someone!") - else if (bitecount<=3) to_chat(user, "\blue \The [src] was bitten [bitecount] times!") - else to_chat(user, "\blue \The [src] was bitten multiple times!") - /obj/item/weapon/reagent_containers/food/snacks/attackby(obj/item/weapon/W, mob/user, params) if(istype(W,/obj/item/weapon/pen)) var/n_name = sanitize(copytext(input(usr, "What would you like to name this dish?", "Food Renaming", null) as text, 1, MAX_NAME_LEN)) @@ -87,7 +82,6 @@ if(U.contents.len >= U.max_contents) to_chat(user, "You cannot fit anything else on your [U].") - return user.visible_message( \ @@ -139,7 +133,6 @@ if(!iscarbon(user)) return 1 to_chat(user, "\red You slip [W] inside [src].") - user.unEquip(W) if ((user.client && user.s_active != src)) user.client.screen -= W @@ -156,7 +149,6 @@ !(locate(/obj/item/weapon/storage/bag/tray) in src.loc) \ ) to_chat(user, "\red You cannot slice [src] here! You need a table or at least a tray to do it.") - return 1 var/slices_lost = 0 if (!inaccurate) @@ -202,7 +194,6 @@ else if(ismouse(M)) var/mob/living/simple_animal/mouse/N = M to_chat(N, text("\blue You nibble away at [src].")) - if(prob(50)) N.visible_message("[N] nibbles away at [src].", "") //N.emote("nibbles away at the [src]") @@ -519,11 +510,9 @@ if(!(clr in list("blue","green","mime","orange","purple","rainbow","red","yellow"))) to_chat(usr, "\blue The egg refuses to take on this color!") - return to_chat(usr, "\blue You color \the [src] [clr]") - icon_state = "egg-[clr]" item_color = clr else @@ -1153,7 +1142,6 @@ On_Consume() if(prob(unpopped)) //lol ...what's the point? to_chat(usr, "\red You bite down on an un-popped kernel!") - unpopped = max(0, unpopped-1) ..() @@ -1615,7 +1603,6 @@ if(!proximity) return if(istype(O,/obj/structure/sink) && !wrapped) to_chat(user, "You place [src] under a stream of water...") - user.drop_item() forceMove(get_turf(O)) return Expand() @@ -1623,7 +1610,6 @@ var/obj/machinery/computer/camera_advanced/xenobio/X = O X.monkeys++ to_chat(user, "You feed [src] to the [X]. It now has [X.monkeys] monkey cubes stored.") - qdel(src) return ..() @@ -1653,7 +1639,6 @@ icon_state = "monkeycube" desc = "Just add water!" to_chat(user, "You unwrap the cube.") - wrapped = 0 /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped @@ -2843,7 +2828,6 @@ user.put_in_hands( pizza ) to_chat(user, "\red You take the [src.pizza] out of the [src].") - src.pizza = null update_icon() return @@ -2858,7 +2842,6 @@ user.put_in_hands( box ) to_chat(user, "\red You remove the topmost [src] from your hand.") - box.update_icon() update_icon() return @@ -2898,14 +2881,11 @@ update_icon() to_chat(user, "\red You put the [box] ontop of the [src]!") - else to_chat(user, "\red The stack is too high!") - else to_chat(user, "\red Close the [box] first!") - return if( istype(I, /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/) ) // Long ass fucking object name @@ -2918,10 +2898,8 @@ update_icon() to_chat(user, "\red You put the [I] in the [src]!") - else to_chat(user, "\red You try to push the [I] through the lid but it doesn't work!") - return if( istype(I, /obj/item/weapon/pen/) ) @@ -3225,11 +3203,9 @@ if(isturf(loc)) new /obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough(loc) to_chat(user, "You flatten [src].") - qdel(src) else to_chat(user, "You need to put [src] on a surface to roll it out!") - else ..() diff --git a/code/modules/reagents/reagent_containers/food/snacks/meat.dm b/code/modules/reagents/reagent_containers/food/snacks/meat.dm index 1b65d110cb3..dc9999a7f4c 100644 --- a/code/modules/reagents/reagent_containers/food/snacks/meat.dm +++ b/code/modules/reagents/reagent_containers/food/snacks/meat.dm @@ -18,7 +18,6 @@ new /obj/item/weapon/reagent_containers/food/snacks/rawcutlet(src) new /obj/item/weapon/reagent_containers/food/snacks/rawcutlet(src) to_chat(user, "You cut the meat in thin strips.") - qdel(src) else ..() diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm index aa291bee0d0..190b02c60d7 100644 --- a/code/modules/reagents/reagent_containers/glass_containers.dm +++ b/code/modules/reagents/reagent_containers/glass_containers.dm @@ -52,16 +52,13 @@ if (!is_open_container()) to_chat(user, "Airtight lid seals it completely.") - /obj/item/weapon/reagent_containers/glass/attack_self() ..() if (is_open_container()) to_chat(usr, "You put the lid on \the [src].") - flags ^= OPENCONTAINER else to_chat(usr, "You take the lid off \the [src].") - flags |= OPENCONTAINER update_icon() @@ -77,7 +74,6 @@ if(ismob(target) && target.reagents && reagents.total_volume) to_chat(user, "You splash the solution onto [target].") - var/mob/living/M = target var/list/injected = list() for(var/datum/reagent/R in reagents.reagent_list) @@ -101,27 +97,22 @@ if(!target.reagents.total_volume && target.reagents) to_chat(user, "[target] is empty.") - return if(reagents.total_volume >= reagents.maximum_volume) to_chat(user, "[src] is full.") - return var/trans = target.reagents.trans_to(src, target:amount_per_transfer_from_this) to_chat(user, "You fill [src] with [trans] units of the contents of [target].") - else if(target.is_open_container() && target.reagents) //Something like a glass. Player probably wants to transfer TO it. if(!reagents.total_volume) to_chat(user, "[src] is empty.") - return if(target.reagents.total_volume >= target.reagents.maximum_volume) to_chat(user, "[target] is full.") - return // /vg/: Logging transfers of bad things @@ -138,10 +129,8 @@ var/trans = reagents.trans_to(target, amount_per_transfer_from_this) to_chat(user, "You transfer [trans] units of the solution to [target].") - else if(istype(target, /obj/item/weapon/reagent_containers/glass) && !target.is_open_container()) to_chat(user, "You cannot fill [target] while it is sealed.") - return /*else if(istype(target, /obj/machinery/bunsen_burner)) @@ -155,7 +144,6 @@ else if(reagents.total_volume) to_chat(user, "You splash the solution onto [target].") - reagents.reaction(target, TOUCH) spawn(5) reagents.clear_reagents() return @@ -168,16 +156,13 @@ if(reagents) reagents.chem_temp += 15 to_chat(user, "You heat [src] with [I].") - reagents.handle_reactions() if(istype(I, /obj/item/weapon/pen) || istype(I, /obj/item/device/flashlight/pen)) var/tmp_label = sanitize(input(user, "Enter a label for [name]","Label",label_text)) if(length(tmp_label) > MAX_NAME_LEN) to_chat(user, "The label can be at most [MAX_NAME_LEN] characters long.") - else to_chat(user, "You set the label to \"[tmp_label]\".") - label_text = tmp_label update_name_label() if(istype(I,/obj/item/weapon/storage/bag)) @@ -246,14 +231,12 @@ return if (assembly) to_chat(usr, "You detach [assembly] from \the [src]") - usr.put_in_hands(assembly) assembly = null update_icon() else to_chat(usr, "There is no assembly to remove.") - /obj/item/weapon/reagent_containers/glass/beaker/proc/heat_beaker() if(reagents) reagents.chem_temp += 30 @@ -263,7 +246,6 @@ if (istype(W,/obj/item/device/assembly_holder)) if (assembly) to_chat(usr, "The [src] already has an assembly.") - return ..() assembly = W user.drop_item() @@ -362,7 +344,6 @@ /obj/item/weapon/reagent_containers/glass/bucket/attackby(var/obj/D, mob/user as mob, params) if(isprox(D)) to_chat(user, "You add [D] to [src].") - qdel(D) user.put_in_hands(new /obj/item/weapon/bucket_sensor) user.unEquip(src) diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 268004299c0..22466811e3e 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -18,16 +18,13 @@ /obj/item/weapon/reagent_containers/hypospray/attack(mob/living/M, mob/user) if(!reagents.total_volume) to_chat(user, "\red [src] is empty.") - return if(!istype(M)) return if(reagents.total_volume && (ignore_flags || M.can_inject(user, 1))) to_chat(user, "\blue You inject [M] with [src].") - to_chat(M, "\red You feel a tiny prick!") - src.reagents.add_reagent(M) if(M.reagents) var/list/injected = list() @@ -46,7 +43,6 @@ var/trans = reagents.trans_to(M, amount_per_transfer_from_this) to_chat(user, "\blue [trans] units injected. [reagents.total_volume] units remaining in [src].") - return /obj/item/weapon/reagent_containers/hypospray/CMO/New() @@ -107,11 +103,9 @@ ..(user) if(reagents && reagents.reagent_list.len) to_chat(user, "\blue It is currently loaded.") - else to_chat(user, "\blue It is spent.") - /obj/item/weapon/reagent_containers/hypospray/autoinjector/teporone //basilisks name = "teporone autoinjector" desc = "A rapid way to regulate your body's temperature in the event of a hardsuit malfunction at the cost of some shortness of breath." diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index c4920fb395b..4af5ab79bc7 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -34,7 +34,6 @@ if(target.is_open_container() != 0 && target.reagents) if(!target.reagents.total_volume) to_chat(user, "[target] is empty. Cant dissolve [src].") - return // /vg/: Logging transfers of bad things @@ -49,7 +48,6 @@ log_game("[user.name] ([user.ckey]) added [reagents.get_reagent_ids(1)] to \a [target] with [src].") to_chat(user, "You dissolve [src] in [target].") - reagents.trans_to(target, reagents.total_volume) for(var/mob/O in viewers(2, user)) O.show_message("[user] puts something in [target].", 1) diff --git a/code/modules/reagents/reagent_containers/robodropper.dm b/code/modules/reagents/reagent_containers/robodropper.dm index c039a747255..b035b2aea12 100644 --- a/code/modules/reagents/reagent_containers/robodropper.dm +++ b/code/modules/reagents/reagent_containers/robodropper.dm @@ -16,12 +16,10 @@ if(target.reagents.total_volume >= target.reagents.maximum_volume) to_chat(user, "\red [target] is full.") - return if(!target.is_open_container() && !ismob(target) && !istype(target,/obj/item/weapon/reagent_containers/food)) //You can inject humans and food but you cant remove the shit. to_chat(user, "\red You cannot directly fill this object.") - return @@ -65,7 +63,6 @@ to_chat(user, "\blue You transfer [trans] units of the solution.") - if (src.reagents.total_volume<=0) filled = 0 icon_state = "[initial(icon_state)]" @@ -92,7 +89,6 @@ trans = src.reagents.trans_to(target, amount_per_transfer_from_this) to_chat(user, "\blue You transfer [trans] units of the solution.") - if (src.reagents.total_volume<=0) filled = 0 icon_state = "[initial(icon_state)]" @@ -101,19 +97,16 @@ if(!target.is_open_container() && !istype(target,/obj/structure/reagent_dispensers)) to_chat(user, "\red You cannot directly remove reagents from [target].") - return if(!target.reagents.total_volume) to_chat(user, "\red [target] is empty.") - return var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) to_chat(user, "\blue You fill the dropper with [trans] units of the solution.") - filled = 1 icon_state = "[initial(icon_state)][filled]" diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index b1c9f631e26..32a0e752913 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -28,22 +28,18 @@ if(istype(A, /obj/structure/reagent_dispensers) && get_dist(src,A) <= 1) //this block copypasted from reagent_containers/glass, for lack of a better solution if(!A.reagents.total_volume && A.reagents) to_chat(user, "\The [A] is empty.") - return if(reagents.total_volume >= reagents.maximum_volume) to_chat(user, "\The [src] is full.") - return var/trans = A.reagents.trans_to(src, A:amount_per_transfer_from_this) to_chat(user, "You fill \the [src] with [trans] units of the contents of \the [A].") - return if(reagents.total_volume < amount_per_transfer_from_this) to_chat(user, "\The [src] is empty!") - return spray(A) @@ -85,12 +81,10 @@ spray_currentrange = (spray_currentrange == 1 ? spray_maxrange : 1) to_chat(user, "You [amount_per_transfer_from_this == 10 ? "remove" : "fix"] the nozzle. You'll now use [amount_per_transfer_from_this] units per spray.") - /obj/item/weapon/reagent_containers/spray/examine(mob/user) if(..(user, 0) && user==src.loc) to_chat(user, "[round(src.reagents.total_volume)] units left.") - /obj/item/weapon/reagent_containers/spray/verb/empty() set name = "Empty Spray Bottle" @@ -102,7 +96,6 @@ return if(isturf(usr.loc) && src.loc == usr) to_chat(usr, "You empty \the [src] onto the floor.") - reagents.reaction(usr.loc) src.reagents.clear_reagents() @@ -217,7 +210,6 @@ to_chat(user, "You adjust the output switch. You'll now use [amount_per_transfer_from_this] units per spray.") - // Plant-B-Gone /obj/item/weapon/reagent_containers/spray/plantbgone // -- Skie name = "Plant-B-Gone" diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index fffd08b3352..5c7e6d0ca4c 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -63,7 +63,6 @@ if(mode == SYRINGE_BROKEN) to_chat(user, "\red This syringe is broken!") - return /* if (user.a_intent == I_HARM && ismob(target)) @@ -78,27 +77,22 @@ if(reagents.total_volume >= reagents.maximum_volume) to_chat(user, "\red The syringe is full.") - return if(ismob(target))//Blood! if(istype(target, /mob/living/carbon/slime)) to_chat(user, "\red You are unable to locate any blood.") - return if(src.reagents.has_reagent("blood")) to_chat(user, "\red There is already a blood sample in this syringe") - return if(istype(target, /mob/living/carbon))//maybe just add a blood reagent to all mobs. Then you can suck them dry...With hundreds of syringes. Jolly good idea. var/mob/living/carbon/T = target if(!T.dna) to_chat(usr, "You are unable to locate any blood. (To be specific, your target seems to be missing their DNA datum)") - return if(NOCLONE in T.mutations) //target done been et, no more blood in him to_chat(user, "\red You are unable to locate any blood.") - return @@ -107,7 +101,6 @@ var/mob/living/carbon/human/H = T if(H.species.flags & NO_BLOOD) to_chat(usr, "You are unable to locate any blood.") - return if(H.wear_suit && istype(H.wear_suit,/obj/item/clothing/suit/space)) time = 60 @@ -122,7 +115,6 @@ var/amount = src.reagents.maximum_volume - src.reagents.total_volume if(amount == 0) to_chat(usr, "The syringe is full!") - return var/datum/reagent/B @@ -142,7 +134,6 @@ src.reagents.handle_reactions() to_chat(user, "\blue You take a blood sample from [target]") - for(var/mob/O in viewers(4, user)) O.show_message("\red [user] takes a blood sample from [target].", 1) else @@ -151,18 +142,15 @@ else //if not mob if(!target.reagents.total_volume) to_chat(user, "\red [target] is empty.") - return if(!target.is_open_container() && !istype(target,/obj/structure/reagent_dispensers) && !istype(target,/obj/item/slime_extract)) to_chat(user, "\red You cannot directly remove reagents from this object.") - return var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) // transfer from, transfer to - who cares? to_chat(user, "\blue You fill the syringe with [trans] units of the solution.") - if (reagents.total_volume >= reagents.maximum_volume) mode=!mode update_icon() @@ -170,24 +158,20 @@ if(SYRINGE_INJECT) if(!reagents.total_volume) to_chat(user, "\red The Syringe is empty.") - return if(istype(target, /obj/item/weapon/implantcase/chem)) return if(!target.is_open_container() && !ismob(target) && !istype(target, /obj/item/weapon/reagent_containers/food) && !istype(target, /obj/item/slime_extract) && !istype(target, /obj/item/clothing/mask/cigarette) && !istype(target, /obj/item/weapon/storage/fancy/cigarettes)) to_chat(user, "\red You cannot directly fill this object.") - return if(istype(target, /obj/item/clothing/mask/cigarette)) var/obj/item/clothing/mask/cigarette/C = target if(istype(C.loc, /obj/item/weapon/storage/fancy/cigarettes)) to_chat(user, "\red You cannot inject a cigarette while it's still in the pack.") - return if(target.reagents.total_volume >= target.reagents.maximum_volume) to_chat(user, "\red [target] is full.") - return var/mob/living/carbon/human/H = target @@ -195,11 +179,9 @@ var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting) if(!affected) to_chat(user, "\The [H] is missing that limb!") - return /* else if(affected.status & ORGAN_ROBOT) to_chat(user, "You cannot inject a robotic limb.") - return */ if(ismob(target) && target != user) @@ -275,7 +257,6 @@ else trans = src.reagents.trans_to(target, amount_per_transfer_from_this) to_chat(user, "\blue You inject [trans] units of the solution. The syringe now contains [src.reagents.total_volume] units.") - if (reagents.total_volume <= 0 && mode==SYRINGE_INJECT) mode = SYRINGE_DRAW update_icon() @@ -327,7 +308,6 @@ if (!affecting || (affecting.status & ORGAN_DESTROYED) || affecting.is_stump()) to_chat(user, "They are missing that limb!") - return var/hit_area = affecting.name @@ -406,29 +386,24 @@ if(reagents.total_volume >= reagents.maximum_volume) to_chat(user, "\red The syringe is full.") - return if(ismob(target)) if(istype(target, /mob/living/carbon))//I Do not want it to suck 50 units out of people to_chat(usr, "This needle isn't designed for drawing blood.") - return else //if not mob if(!target.reagents.total_volume) to_chat(user, "\red [target] is empty.") - return if(!target.is_open_container() && !istype(target,/obj/structure/reagent_dispensers)) to_chat(user, "\red You cannot directly remove reagents from this object.") - return var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) // transfer from, transfer to - who cares? to_chat(user, "\blue You fill the syringe with [trans] units of the solution.") - if (reagents.total_volume >= reagents.maximum_volume) mode=!mode update_icon() @@ -436,17 +411,14 @@ if(SYRINGE_INJECT) if(!reagents.total_volume) to_chat(user, "\red The Syringe is empty.") - return if(istype(target, /obj/item/weapon/implantcase/chem)) return if(!target.is_open_container() && !ismob(target) && !istype(target, /obj/item/weapon/reagent_containers/food)) to_chat(user, "\red You cannot directly fill this object.") - return if(target.reagents.total_volume >= target.reagents.maximum_volume) to_chat(user, "\red [target] is full.") - return if(ismob(target) && target != user) @@ -461,7 +433,6 @@ spawn(5) var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this) to_chat(user, "\blue You inject [trans] units of the solution. The syringe now contains [src.reagents.total_volume] units.") - if (reagents.total_volume >= reagents.maximum_volume && mode==SYRINGE_INJECT) mode = SYRINGE_DRAW update_icon() diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 04857089fb9..23f09e6c95b 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -27,15 +27,12 @@ if(!..(user, 2)) return to_chat(user, "\blue It contains:") - if(reagents && reagents.reagent_list.len) for(var/datum/reagent/R in reagents.reagent_list) to_chat(user, "\blue [R.volume] units of [R.name]") - else to_chat(user, "\blue Nothing.") - /obj/structure/reagent_dispensers/verb/set_APTFT() //set amount_per_transfer_from_this set name = "Set transfer amount" set category = "Object" @@ -120,7 +117,6 @@ if(rig) to_chat(usr, "There is some kind of device rigged to the tank.") - /obj/structure/reagent_dispensers/fueltank/attack_hand() if (rig) usr.visible_message("[usr] begins to detach [rig] from \the [src].", "You begin to detach [rig] from \the [src]") @@ -134,7 +130,6 @@ if (istype(W,/obj/item/device/assembly_holder) && accepts_rig) if (rig) to_chat(user, "\red There is another device in the way.") - return ..() user.visible_message("[user] begins rigging [W] to \the [src].", "You begin rigging [W] to \the [src]") if(do_after(user, 20, target = src)) diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 59bda4fe8c3..b093048d5e5 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -223,7 +223,6 @@ /obj/machinery/conveyor_switch/attack_hand(mob/user) if(!allowed(user)) to_chat(user, "Access denied.") - return diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm index 5c961aefb89..948973bc3bc 100644 --- a/code/modules/recycling/disposal-construction.dm +++ b/code/modules/recycling/disposal-construction.dm @@ -91,7 +91,6 @@ if(anchored) to_chat(usr, "You must unfasten the pipe before rotating it.") - return dir = turn(dir, -90) @@ -105,7 +104,6 @@ if(anchored) to_chat(usr, "You must unfasten the pipe before flipping it.") - return dir = turn(dir, 180) @@ -167,7 +165,6 @@ var/turf/T = src.loc if(T.intact) to_chat(user, "You can only attach the [nicetype] if the floor plating is removed.") - return var/obj/structure/disposalpipe/CP = locate() in T @@ -175,11 +172,9 @@ if(CP) // There's something there if(!istype(CP,/obj/structure/disposalpipe/trunk)) to_chat(user, "The [nicetype] requires a trunk underneath it in order to work.") - return else // Nothing under, fuck. to_chat(user, "The [nicetype] requires a trunk underneath it in order to work.") - return else if(CP) @@ -189,7 +184,6 @@ pdir = CP.dir if(pdir & dpdir) to_chat(user, "There is already a [nicetype] at that location.") - return @@ -202,7 +196,6 @@ else density = 1 to_chat(user, "You detach the [nicetype] from the underfloor.") - else anchored = 1 if(ispipe) @@ -211,7 +204,6 @@ else density = 1 // We don't want disposal bins or outlets to go density 0 to_chat(user, "You attach the [nicetype] to the underfloor.") - playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) update() @@ -221,11 +213,9 @@ if(W.remove_fuel(0,user)) playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1) to_chat(user, "Welding the [nicetype] in place.") - if(do_after(user, 20, target = src)) if(!src || !W.isOn()) return to_chat(user, "The [nicetype] has been welded in place!") - update() // TODO: Make this neat if(ispipe) // Pipe @@ -265,9 +255,7 @@ return else to_chat(user, "You need more welding fuel to complete this task.") - return else to_chat(user, "You need to attach it to the plating first!") - return diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 0f549f7b39b..4301d393391 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -70,35 +70,29 @@ if(istype(I, /obj/item/weapon/screwdriver)) if(contents.len > 0) to_chat(user, "Eject the items first!") - return if(mode==0) // It's off but still not unscrewed mode=-1 // Set it to doubleoff l0l playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) to_chat(user, "You remove the screws around the power connection.") - return else if(mode==-1) mode=0 playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) to_chat(user, "You attach the screws around the power connection.") - return else if(istype(I,/obj/item/weapon/weldingtool) && mode==-1) if(contents.len > 0) to_chat(user, "Eject the items first!") - return var/obj/item/weapon/weldingtool/W = I if(W.remove_fuel(0,user)) playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1) to_chat(user, "You start slicing the floorweld off the disposal unit.") - if(do_after(user,20, target = src)) if(!src || !W.isOn()) return to_chat(user, "You sliced the floorweld off the disposal unit.") - var/obj/structure/disposalconstruct/C = new (src.loc) src.transfer_fingerprints_to(C) C.ptype = 6 // 6 = disposal unit @@ -109,12 +103,10 @@ return else to_chat(user, "You need more welding fuel to complete this task.") - return if(istype(I, /obj/item/weapon/melee/energy/blade)) to_chat(user, "You can't place that item inside the disposal unit.") - return if(istype(I, /obj/item/weapon/storage)) @@ -155,7 +147,6 @@ I.loc = src to_chat(user, "You place \the [I] into the [src].") - for(var/mob/M in viewers(src)) if(M == user) continue @@ -186,12 +177,10 @@ // must be awake, not stunned or whatever msg = "[user.name] climbs into the [src]." to_chat(user, "You climb into the [src].") - else if(target != user && !user.restrained() && !user.stat && !user.weakened && !user.stunned && !user.paralysis) msg = "[user.name] stuffs [target.name] into the [src]!" to_chat(user, "You stuff [target.name] into the [src]!") - user.attack_log += text("\[[time_stamp()]\] Has placed [key_name(target)] in disposals.") target.attack_log += text("\[[time_stamp()]\] Has been placed in disposals by [key_name(user)]") if(target.ckey) @@ -251,7 +240,6 @@ if(user && user.loc == src) to_chat(usr, "\red You cannot reach the controls from inside.") - return // Clumsy folks can only flush it. @@ -292,12 +280,10 @@ /obj/machinery/disposal/Topic(href, href_list) if(usr.loc == src) to_chat(usr, "\red You cannot reach the controls from inside.") - return if(mode==-1 && !href_list["eject"]) // only allow ejecting if mode is -1 to_chat(usr, "\red The disposal units power is disabled.") - return if(..()) @@ -652,7 +638,6 @@ for (var/mob/M in hearers(src.loc.loc)) to_chat(M, "CLONG, clong!") - playsound(src.loc, 'sound/effects/clang.ogg', 50, 0, 0) // called to vent all gas in holder to a location @@ -900,17 +885,14 @@ var/turf/uloc = user.loc var/atom/wloc = W.loc to_chat(user, "Slicing the disposal pipe.") - sleep(30) if(!W.isOn()) return if(user.loc == uloc && wloc == W.loc) welded() else to_chat(user, "You must stay still while welding the pipe.") - else to_chat(user, "You need more welding fuel to cut the pipe.") - return // called when pipe is cut with welder @@ -1051,7 +1033,6 @@ playsound(src.loc, 'sound/machines/twobeep.ogg', 100, 1) var/tag = uppertext(TAGGERLOCATIONS[O.currTag]) to_chat(user, "\blue Changed filter to [tag]") - updatedesc() @@ -1220,17 +1201,14 @@ var/turf/uloc = user.loc var/atom/wloc = W.loc to_chat(user, "Slicing the disposal pipe.") - sleep(30) if(!W.isOn()) return if(user.loc == uloc && wloc == W.loc) welded() else to_chat(user, "You must stay still while welding the pipe.") - else to_chat(user, "You need more welding fuel to cut the pipe.") - return // would transfer to next pipe segment, but we are in a trunk @@ -1338,24 +1316,20 @@ mode=1 playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) to_chat(user, "You remove the screws around the power connection.") - return else if(mode==1) mode=0 playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) to_chat(user, "You attach the screws around the power connection.") - return else if(istype(I,/obj/item/weapon/weldingtool) && mode==1) var/obj/item/weapon/weldingtool/W = I if(W.remove_fuel(0,user)) playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1) to_chat(user, "You start slicing the floorweld off the disposal outlet.") - if(do_after(user,20, target = src)) if(!src || !W.isOn()) return to_chat(user, "You sliced the floorweld off the disposal outlet.") - var/obj/structure/disposalconstruct/C = new (src.loc) src.transfer_fingerprints_to(C) C.ptype = 7 // 7 = outlet @@ -1366,7 +1340,6 @@ return else to_chat(user, "You need more welding fuel to complete this task.") - return diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index b872867ad07..f10a50be115 100755 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -32,7 +32,6 @@ if(sortTag != O.currTag) var/tag = uppertext(TAGGERLOCATIONS[O.currTag]) to_chat(user, "*[tag]*") - sortTag = O.currTag playsound(loc, 'sound/machines/twobeep.ogg', 100, 1) @@ -40,7 +39,6 @@ var/str = copytext(sanitize(input(user,"Label text?","Set label","")),1,MAX_NAME_LEN) if(!str || !length(str)) to_chat(user, "Invalid text.") - return user.visible_message("[user] labels [src] as [str].") name = "[name] ([str])" @@ -60,7 +58,6 @@ to_chat(user, "You need more paper.") - /obj/item/smallDelivery name = "small parcel" desc = "A small wrapped package." @@ -89,7 +86,6 @@ if(sortTag != O.currTag) var/tag = uppertext(TAGGERLOCATIONS[O.currTag]) to_chat(user, "*[tag]*") - sortTag = O.currTag playsound(loc, 'sound/machines/twobeep.ogg', 100, 1) @@ -97,7 +93,6 @@ var/str = copytext(sanitize(input(user,"Label text?","Set label","")),1,MAX_NAME_LEN) if(!str || !length(str)) to_chat(user, "Invalid text.") - return user.visible_message("[user] labels [src] as [str].") name = "[name] ([str])" @@ -115,7 +110,6 @@ - /obj/item/stack/packageWrap name = "package wrapper" icon = 'icons/obj/items.dmi' @@ -168,7 +162,6 @@ O.loc = P else to_chat(user, "You need more paper.") - return else if(istype (target, /obj/structure/closet)) var/obj/structure/closet/O = target @@ -182,11 +175,9 @@ O.loc = P else to_chat(user, "You need more paper.") - return else to_chat(user, "The object you are trying to wrap is unsuitable for the sorting machinery.") - return user.visible_message("[user] wraps [target].") @@ -317,24 +308,20 @@ c_mode=1 playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) to_chat(user, "You remove the screws around the power connection.") - return else if(c_mode==1) c_mode=0 playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) to_chat(user, "You attach the screws around the power connection.") - return else if(istype(I,/obj/item/weapon/weldingtool) && c_mode==1) var/obj/item/weapon/weldingtool/W = I if(W.remove_fuel(0,user)) playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1) to_chat(user, "You start slicing the floorweld off the delivery chute.") - if(do_after(user,20, target = src)) if(!src || !W.isOn()) return to_chat(user, "You sliced the floorweld off the delivery chute.") - var/obj/structure/disposalconstruct/C = new (src.loc) C.ptype = 8 // 8 = Delivery chute C.update() @@ -344,5 +331,4 @@ return else to_chat(user, "You need more welding fuel to complete this task.") - return diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm index f97fcc956a0..146f803edfb 100644 --- a/code/modules/research/circuitprinter.dm +++ b/code/modules/research/circuitprinter.dm @@ -120,30 +120,25 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis). return else to_chat(user, "You can't load the [src.name] while it's opened.") - return if (disabled) return if (!linked_console) to_chat(user, "The [name] must be linked to an R&D console first!") - return 1 if (O.is_open_container()) return if (!istype(O, /obj/item/stack/sheet/glass) && !istype(O, /obj/item/stack/sheet/mineral/gold) && !istype(O, /obj/item/stack/sheet/mineral/diamond)) to_chat(user, "You cannot insert this item into the [name]!") - return if (stat) return if (busy) to_chat(user, "The [name] is busy. Please wait for completion of previous operation.") - return var/obj/item/stack/sheet/stack = O if ((TotalMaterials() + stack.perunit) > max_material_amount) to_chat(user, "The [name] is full. Please remove glass from the protolathe in order to insert more.") - return var/amount = round(input("How many sheets do you want to add?") as num) @@ -155,7 +150,6 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis). busy = 1 use_power(max(1000, (MINERAL_MATERIAL_AMOUNT*amount/10))) to_chat(user, "You add [amount] sheets to the [src.name].") - if(istype(stack, /obj/item/stack/sheet/glass)) g_amount += amount * MINERAL_MATERIAL_AMOUNT else if(istype(stack, /obj/item/stack/sheet/mineral/gold)) diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm index 346b6437347..5a3bba6ae86 100644 --- a/code/modules/research/destructive_analyzer.dm +++ b/code/modules/research/destructive_analyzer.dm @@ -64,31 +64,25 @@ Note: Must be placed within 3 tiles of the R&D Console return if (!linked_console) to_chat(user, "The [src.name] must be linked to an R&D console first!") - return if (busy) to_chat(user, "The [src.name] is busy right now.") - return if (istype(O, /obj/item) && !loaded_item) if(!O.origin_tech) to_chat(user, "This doesn't seem to have a tech origin!") - return var/list/temp_tech = ConvertReqString2List(O.origin_tech) if (temp_tech.len == 0) to_chat(user, "You cannot deconstruct this item!") - return if(!user.drop_item()) to_chat(user, "\The [O] is stuck to your hand, you cannot put it in the [src.name]!") - return busy = 1 loaded_item = O O.loc = src to_chat(user, "You add the [O.name] to the [src.name]!") - flick("d_analyzer_la", src) spawn(10) icon_state = "d_analyzer_l" diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index aef6ced8f01..f0e3c089cfd 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -130,39 +130,32 @@ if(!checkCircumstances(O)) to_chat(user, "The [O] is not yet valid for the [src] and must be completed!") - return if (disabled) return if (!linked_console) to_chat(user, "The [src] must be linked to an R&D console first!") - return if (loaded_item) to_chat(user, "The [src] is already loaded.") - return if (istype(O, /obj/item)) if(!O.origin_tech) to_chat(user, "This doesn't seem to have a tech origin!") - return var/list/temp_tech = ConvertReqString2List(O.origin_tech) if (temp_tech.len == 0) to_chat(user, "You cannot experiment on this item!") - return if(O.reliability < 90 && O.crit_fail == 0) to_chat(usr, "Item is neither reliable enough or broken enough to learn from.") - return if(!user.drop_item()) return loaded_item = O O.loc = src to_chat(user, "You add the [O.name] to the machine.") - flick("h_lathe_load", src) return @@ -518,7 +511,6 @@ visible_message("[src] improves [exp_on], drawing the life essence of those nearby!") for(var/mob/living/m in view(4,src)) to_chat(m, "You feel your flesh being torn from you, mists of blood drifting to [src]!") - m.take_overall_damage(50) investigate_log("Experimentor has taken 50 brute a blood sacrifice from [m]", "experimentor") var/list/reqs = ConvertReqString2List(exp_on.origin_tech) @@ -568,17 +560,14 @@ else if(recentlyExperimented) to_chat(usr, "[src] has been used too recently!") - return else if(!loaded_item) updateUsrDialog() //Set the interface to unloaded mode to_chat(usr, "[src] is not currently loaded!") - return else if(!process || process != loaded_item) //Interface exploit protection (such as hrefs or swapping items with interface set to old item) updateUsrDialog() //Refresh interface to update interface hrefs to_chat(usr, "Interface failure detected in [src]. Please try again.") - return var/dotype if(text2num(scantype) == SCANTYPE_DISCOVER) @@ -651,7 +640,6 @@ if(revealed) if(cooldown) to_chat(user, "[src] does not react!") - return else if(src.loc == user) cooldown = TRUE @@ -661,7 +649,6 @@ else to_chat(user, "You aren't quite sure what to do with this, yet.") - //////////////// RELIC PROCS ///////////////////////////// /obj/item/weapon/relic/proc/throwSmoke(turf/where) @@ -692,7 +679,6 @@ var/message = "[src] begans to shake, and in the distance the sound of rampaging animals arises!" visible_message(message) to_chat(user, message) - var/animals = rand(1,25) var/counter var/list/valid_animals = list(/mob/living/simple_animal/parrot,/mob/living/simple_animal/butterfly,/mob/living/simple_animal/pet/cat,/mob/living/simple_animal/pet/corgi,/mob/living/simple_animal/crab,/mob/living/simple_animal/pet/fox,/mob/living/simple_animal/lizard,/mob/living/simple_animal/mouse,/mob/living/simple_animal/pet/pug,/mob/living/simple_animal/hostile/bear,/mob/living/simple_animal/hostile/poison/bees,/mob/living/simple_animal/hostile/carp) @@ -702,7 +688,6 @@ warn_admins(user, "Mass Mob Spawn") if(prob(60)) to_chat(user, "[src] falls apart!") - qdel(src) /obj/item/weapon/relic/proc/rapidDupe(mob/user) @@ -729,7 +714,6 @@ /obj/item/weapon/relic/proc/explode(mob/user) to_chat(user, "[src] begins to heat up!") - spawn(rand(35,100)) if(src.loc == user) visible_message("The [src]'s top opens, releasing a powerful blast!") @@ -739,7 +723,6 @@ /obj/item/weapon/relic/proc/teleport(mob/user) to_chat(user, "The [src] begins to vibrate!") - spawn(rand(10,30)) var/turf/userturf = get_turf(user) if(src.loc == user && userturf.z != ZLEVEL_CENTCOMM) //Because Nuke Ops bringing this back on their shuttle, then looting the ERT area is 2fun4you! diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm index 4e0408b8bbc..a528c643809 100644 --- a/code/modules/research/message_server.dm +++ b/code/modules/research/message_server.dm @@ -114,9 +114,7 @@ var/global/list/obj/machinery/message_server/message_servers = list() /obj/machinery/message_server/attack_hand(user as mob) // to_chat(user, "\blue There seem to be some parts missing from this server. They should arrive on the station in a few days, give or take a few CentComm delays.") - to_chat(user, "You toggle PDA message passing from [active ? "On" : "Off"] to [active ? "Off" : "On"]") - active = !active update_icon() diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm index 80153dbd534..16748fbb46b 100644 --- a/code/modules/research/protolathe.dm +++ b/code/modules/research/protolathe.dm @@ -113,17 +113,14 @@ Note: Must be placed west/left of and R&D console to function. return 1 else to_chat(user, "You can't load the [src.name] while it's opened.") - return 1 if (disabled) return if (!linked_console) to_chat(user, " The [src.name] must be linked to an R&D console first!") - return 1 if (busy) to_chat(user, "The [src.name] is busy. Please wait for completion of previous operation.") - return 1 if (O.is_open_container()) return @@ -134,7 +131,6 @@ Note: Must be placed west/left of and R&D console to function. if(!materials.has_space( materials.get_item_material_amount(O) )) to_chat(user, "The [src.name]'s material bin is full! Please remove material before adding more.") - return 1 var/obj/item/stack/sheet/stack = O @@ -148,7 +144,6 @@ Note: Must be placed west/left of and R&D console to function. busy = 1 use_power(max(1000, (MINERAL_MATERIAL_AMOUNT*amount_inserted/10))) to_chat(user, "You add [amount_inserted] sheets to the [src.name].") - var/stackname = stack.name src.overlays += "protolathe_[stackname]" sleep(10) diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 469948a5c78..c294ad8cff1 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -160,20 +160,17 @@ proc/CallMaterialName(ID) if(istype(D, /obj/item/weapon/disk)) if(t_disk || d_disk) to_chat(user, "A disk is already loaded into the machine.") - return if(istype(D, /obj/item/weapon/disk/tech_disk)) t_disk = D else if (istype(D, /obj/item/weapon/disk/design_disk)) d_disk = D else to_chat(user, "Machine cannot accept disks in that format.") - return if(!user.drop_item()) return D.loc = src to_chat(user, "You add the disk to the machine!") - else ..() src.updateUsrDialog() @@ -186,7 +183,6 @@ proc/CallMaterialName(ID) emagged = 1 to_chat(user, "You disable the security protocols") - /obj/machinery/computer/rdconsole/Topic(href, href_list) if(..()) return 1 @@ -270,7 +266,6 @@ proc/CallMaterialName(ID) if(linked_destroy.busy) to_chat(usr, " The destructive analyzer is busy at the moment.") - else if(linked_destroy.loaded_item) linked_destroy.loaded_item.loc = linked_destroy.loc linked_destroy.loaded_item = null @@ -295,7 +290,6 @@ proc/CallMaterialName(ID) if(linked_destroy) if(linked_destroy.busy) to_chat(usr, "The destructive analyzer is busy at the moment.") - else var/choice = input("Proceeding will destroy loaded item.") in list("Proceed", "Cancel") if(choice == "Cancel" || !linked_destroy) return @@ -309,7 +303,6 @@ proc/CallMaterialName(ID) if(!linked_destroy.hacked) if(!linked_destroy.loaded_item) to_chat(usr, "The destructive analyzer appears to be empty.") - screen = 1.0 return if((linked_destroy.loaded_item.reliability >= 99 - (linked_destroy.decon_mod * 3)) || linked_destroy.loaded_item.crit_fail) @@ -349,7 +342,6 @@ proc/CallMaterialName(ID) screen = 0.0 if(!sync) to_chat(usr, "You must connect to the network first!") - else griefProtection() //Putting this here because I dont trust the sync process spawn(30) @@ -647,7 +639,6 @@ proc/CallMaterialName(ID) return 1 if(!allowed(user) && !isobserver(user)) to_chat(user, "Access denied.") - return 1 interact(user) diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm index 50367612755..79eca347423 100644 --- a/code/modules/research/rdmachines.dm +++ b/code/modules/research/rdmachines.dm @@ -60,11 +60,9 @@ var/temp_wire = href_list["wire"] if (!istype(usr.get_active_hand(), /obj/item/device/multitool)) to_chat(usr, "You need a multitool!") - else if(src.wires[temp_wire]) to_chat(usr, "You can't pulse a cut wire.") - else if(src.hack_wire == href_list["wire"]) src.hacked = !src.hacked @@ -80,7 +78,6 @@ if(href_list["cut"]) if (!istype(usr.get_active_hand(), /obj/item/weapon/wirecutters)) to_chat(usr, "You need wirecutters!") - else var/temp_wire = href_list["wire"] wires[temp_wire] = !wires[temp_wire] diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index bd23c33fce9..3bd5bad2f57 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -210,7 +210,6 @@ usr.set_machine(src) if(!src.allowed(usr) && !emagged) to_chat(usr, "\red You do not have the required access level") - return if(href_list["main"]) @@ -339,7 +338,6 @@ playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) emagged = 1 to_chat(user, "\blue You you disable the security protocols") - src.updateUsrDialog() /obj/machinery/r_n_d/server/core diff --git a/code/modules/research/xenoarchaeology/artifact/artifact.dm b/code/modules/research/xenoarchaeology/artifact/artifact.dm index 940a40f954b..3087ad35a72 100644 --- a/code/modules/research/xenoarchaeology/artifact/artifact.dm +++ b/code/modules/research/xenoarchaeology/artifact/artifact.dm @@ -82,7 +82,6 @@ user.visible_message("\blue[user] extends [P] towards [src].","\blue You extend [P] towards [src].") if(do_after(user,40, target = src)) to_chat(user, "\blue \icon[P] [src] has been excavated to a depth of [2*src.excavation_level]cm.") - return if (istype(W, /obj/item/weapon/pickaxe)) @@ -90,12 +89,10 @@ to_chat(user, "\red You start [P.drill_verb] [src].") - if(!do_after(user,P.digspeed, target = src)) return to_chat(user, "\blue You finish [P.drill_verb] [src].") - excavation_level += P.excavation_amount if(excavation_level > 100) diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_gigadrill.dm b/code/modules/research/xenoarchaeology/artifact/artifact_gigadrill.dm index 065a617b9ea..d93b8f3573f 100644 --- a/code/modules/research/xenoarchaeology/artifact/artifact_gigadrill.dm +++ b/code/modules/research/xenoarchaeology/artifact/artifact_gigadrill.dm @@ -15,13 +15,11 @@ active = 0 icon_state = "gigadrill" to_chat(user, "\blue You press a button and [src] slowly spins down.") - else active = 1 icon_state = "gigadrill_mov" to_chat(user, "\blue You press a button and [src] shudders to life.") - /obj/machinery/giga_drill/Bump(atom/A) if(active && !drilling_turf) if(istype(A,/turf/simulated/mineral)) diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm b/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm index b12f431d206..d9041733d57 100644 --- a/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm +++ b/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm @@ -222,23 +222,19 @@ var/list/valid_secondary_effect_types = list(\ /obj/machinery/artifact/attack_hand(var/mob/user as mob) if (get_dist(user, src) > 1) to_chat(user, "\red You can't reach [src] from here.") - return if(ishuman(user) && user:gloves) to_chat(user, "You touch [src] with your gloved hands, [pick("but nothing of note happens","but nothing happens","but nothing interesting happens","but you notice nothing different","but nothing seems to have happened")].") - return src.add_fingerprint(user) if(my_effect.trigger == TRIGGER_TOUCH) to_chat(user, "You touch [src].") - my_effect.ToggleActivate() else to_chat(user, "You touch [src], [pick("but nothing of note happens","but nothing happens","but nothing interesting happens","but you notice nothing different","but nothing seems to have happened")].") - if(prob(25) && secondary_effect && secondary_effect.trigger == TRIGGER_TOUCH) secondary_effect.ToggleActivate(0) @@ -322,7 +318,6 @@ var/list/valid_secondary_effect_types = list(\ if(warn) to_chat(M, "You accidentally touch [src].") - ..() /obj/machinery/artifact/bullet_act(var/obj/item/projectile/P) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_affect_cold.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_affect_cold.dm index b98612c980a..89c74776f55 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_affect_cold.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_affect_cold.dm @@ -13,7 +13,6 @@ /datum/artifact_effect/cold/DoEffectTouch(var/mob/user) if(holder) to_chat(user, "\blue A chill passes up your spine!") - var/datum/gas_mixture/env = holder.loc.return_air() if(env) env.temperature = max(env.temperature - rand(5,50), 0) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_badfeeling.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_badfeeling.dm index 85c6b08432a..93a025336a0 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_badfeeling.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_badfeeling.dm @@ -33,11 +33,9 @@ if(prob(50)) if(prob(75)) to_chat(H, "[pick(drastic_messages)]") - else to_chat(H, "[pick(messages)]") - if(prob(50)) H.dizziness += rand(3,5) @@ -48,11 +46,9 @@ if(prob(5)) if(prob(75)) to_chat(H, "[pick(messages)]") - else to_chat(H, "[pick(drastic_messages)]") - if(prob(10)) H.dizziness += rand(3,5) return 1 @@ -64,11 +60,9 @@ if(prob(50)) if(prob(95)) to_chat(H, "[pick(drastic_messages)]") - else to_chat(H, "[pick(messages)]") - if(prob(50)) H.dizziness += rand(3,5) else if(prob(25)) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_cellcharge.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_cellcharge.dm index 37296545e74..ab66d1d0c6c 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_cellcharge.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_cellcharge.dm @@ -11,7 +11,6 @@ for (var/obj/item/weapon/stock_parts/cell/D in R.contents) D.charge += rand() * 100 + 50 to_chat(R, "\blue SYSTEM ALERT: Large energy boost detected!") - return 1 /datum/artifact_effect/cellcharge/DoEffectAura() @@ -26,7 +25,6 @@ for (var/obj/item/weapon/stock_parts/cell/D in M.contents) D.charge += 25 to_chat(M, "\blue SYSTEM ALERT: Energy boost detected!") - return 1 /datum/artifact_effect/cellcharge/DoEffectPulse() @@ -41,5 +39,4 @@ for (var/obj/item/weapon/stock_parts/cell/D in M.contents) D.charge += rand() * 100 to_chat(M, "\blue SYSTEM ALERT: Energy boost detected!") - return 1 diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_celldrain.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_celldrain.dm index 978d3b0a9f4..97c113b2fef 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_celldrain.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_celldrain.dm @@ -11,7 +11,6 @@ for (var/obj/item/weapon/stock_parts/cell/D in R.contents) D.charge = max(D.charge - rand() * 100, 0) to_chat(R, "\blue SYSTEM ALERT: Energy drain detected!") - return 1 return 1 @@ -28,7 +27,6 @@ for (var/obj/item/weapon/stock_parts/cell/D in M.contents) D.charge = max(D.charge - 50,0) to_chat(M, "\red SYSTEM ALERT: Energy drain detected!") - return 1 /datum/artifact_effect/celldrain/DoEffectPulse() @@ -43,5 +41,4 @@ for (var/obj/item/weapon/stock_parts/cell/D in M.contents) D.charge = max(D.charge - rand() * 150,0) to_chat(M, "\red SYSTEM ALERT: Energy drain detected!") - return 1 diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_goodfeeling.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_goodfeeling.dm index 31cd6c871ba..f52e8125e3f 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_goodfeeling.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_goodfeeling.dm @@ -31,11 +31,9 @@ if(prob(50)) if(prob(75)) to_chat(H, "[pick(drastic_messages)]") - else to_chat(H, "[pick(messages)]") - if(prob(50)) H.dizziness += rand(3,5) @@ -46,11 +44,9 @@ if(prob(5)) if(prob(75)) to_chat(H, "[pick(messages)]") - else to_chat(H, "[pick(drastic_messages)]") - if(prob(5)) H.dizziness += rand(3,5) return 1 @@ -62,11 +58,9 @@ if(prob(50)) if(prob(95)) to_chat(H, "[pick(drastic_messages)]") - else to_chat(H, "[pick(messages)]") - if(prob(50)) H.dizziness += rand(3,5) else if(prob(25)) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heal.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heal.dm index 341f2543f37..c46549d0d50 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heal.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heal.dm @@ -11,7 +11,6 @@ var/mob/living/carbon/C = toucher to_chat(C, "\blue You feel a soothing energy invigorate you.") - if(ishuman(toucher)) var/mob/living/carbon/human/H = toucher for(var/obj/item/organ/external/affecting in H.organs) @@ -44,7 +43,6 @@ if(prob(weakness * 100)) if(prob(10)) to_chat(C, "\blue You feel a soothing energy radiating from something nearby.") - C.adjustBruteLoss(-1 * weakness) C.adjustFireLoss(-1 * weakness) C.adjustToxLoss(-1 * weakness) @@ -60,7 +58,6 @@ var/weakness = GetAnomalySusceptibility(C) if(prob(weakness * 100)) to_chat(C, "\blue A wave of energy invigorates you.") - C.adjustBruteLoss(-5 * weakness) C.adjustFireLoss(-5 * weakness) C.adjustToxLoss(-5 * weakness) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heat.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heat.dm index 50b7c0a95a8..86828f7ef39 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heat.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heat.dm @@ -16,7 +16,6 @@ /datum/artifact_effect/heat/DoEffectTouch(var/mob/user) if(holder) to_chat(user, "\red You feel a wave of heat travel up your spine!") - var/datum/gas_mixture/env = holder.loc.return_air() if(env) env.temperature += rand(5,50) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_hurt.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_hurt.dm index be7cc57fb7e..fd221b470fb 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_hurt.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_hurt.dm @@ -9,7 +9,6 @@ if(iscarbon(toucher) && prob(weakness * 100)) var/mob/living/carbon/C = toucher to_chat(C, "\red A painful discharge of energy strikes you!") - C.adjustOxyLoss(rand(5,25) * weakness) C.adjustToxLoss(rand(5,25) * weakness) C.adjustBruteLoss(rand(5,25) * weakness) @@ -28,7 +27,6 @@ if(prob(weakness * 100)) if(prob(10)) to_chat(C, "\red You feel a painful force radiating from something nearby.") - C.adjustBruteLoss(1 * weakness) C.adjustFireLoss(1 * weakness) C.adjustToxLoss(1 * weakness) @@ -43,7 +41,6 @@ var/weakness = GetAnomalySusceptibility(C) if(prob(weakness * 100)) to_chat(C, "\red A wave of painful energy strikes you!") - C.adjustBruteLoss(3 * weakness) C.adjustFireLoss(3 * weakness) C.adjustToxLoss(3 * weakness) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_roboheal.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_roboheal.dm index e4b99fad1f0..6f698bb8ee3 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_roboheal.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_roboheal.dm @@ -11,7 +11,6 @@ if (istype(user, /mob/living/silicon/robot)) var/mob/living/silicon/robot/R = user to_chat(R, "\blue Your systems report damaged components mending by themselves!") - R.adjustBruteLoss(rand(-10,-30)) R.adjustFireLoss(rand(-10,-30)) return 1 @@ -22,7 +21,6 @@ for (var/mob/living/silicon/robot/M in range(src.effectrange,T)) if(prob(10)) to_chat(M, "\blue SYSTEM ALERT: Beneficial energy field detected!") - M.adjustBruteLoss(-1) M.adjustFireLoss(-1) M.updatehealth() @@ -33,7 +31,6 @@ var/turf/T = get_turf(holder) for (var/mob/living/silicon/robot/M in range(src.effectrange,T)) to_chat(M, "\blue SYSTEM ALERT: Structural damage has been repaired by energy pulse!") - M.adjustBruteLoss(-10) M.adjustFireLoss(-10) M.updatehealth() diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_robohurt.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_robohurt.dm index 3f542e17567..c7f4d7f9775 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_robohurt.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_robohurt.dm @@ -11,7 +11,6 @@ if (istype(user, /mob/living/silicon/robot)) var/mob/living/silicon/robot/R = user to_chat(R, "\red Your systems report severe damage has been inflicted!") - R.adjustBruteLoss(rand(10,50)) R.adjustFireLoss(rand(10,50)) return 1 @@ -22,7 +21,6 @@ for (var/mob/living/silicon/robot/M in range(src.effectrange,T)) if(prob(10)) to_chat(M, "\red SYSTEM ALERT: Harmful energy field detected!") - M.adjustBruteLoss(1) M.adjustFireLoss(1) M.updatehealth() @@ -33,7 +31,6 @@ var/turf/T = get_turf(holder) for (var/mob/living/silicon/robot/M in range(src.effectrange,T)) to_chat(M, "\red SYSTEM ALERT: Structural damage inflicted by energy pulse!") - M.adjustBruteLoss(10) M.adjustFireLoss(10) M.updatehealth() diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_sleepy.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_sleepy.dm index 4d4bf8babf2..7ff0af5bab1 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_sleepy.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_sleepy.dm @@ -13,13 +13,11 @@ if(ishuman(toucher) && prob(weakness * 100)) var/mob/living/carbon/human/H = toucher to_chat(H, pick("\blue You feel like taking a nap.","\blue You feel a yawn coming on.","\blue You feel a little tired.")) - H.drowsyness = min(H.drowsyness + rand(5,25) * weakness, 50 * weakness) H.eye_blurry = min(H.eye_blurry + rand(1,3) * weakness, 50 * weakness) return 1 else if(isrobot(toucher)) to_chat(toucher, "\red SYSTEM ALERT: CPU cycles slowing down.") - return 1 /datum/artifact_effect/sleepy/DoEffectAura() @@ -30,12 +28,10 @@ if(prob(weakness * 100)) if(prob(10)) to_chat(H, pick("\blue You feel like taking a nap.","\blue You feel a yawn coming on.","\blue You feel a little tired.")) - H.drowsyness = min(H.drowsyness + 1 * weakness, 25 * weakness) H.eye_blurry = min(H.eye_blurry + 1 * weakness, 25 * weakness) for (var/mob/living/silicon/robot/R in range(src.effectrange,holder)) to_chat(R, "\red SYSTEM ALERT: CPU cycles slowing down.") - return 1 /datum/artifact_effect/sleepy/DoEffectPulse() @@ -45,10 +41,8 @@ var/weakness = GetAnomalySusceptibility(H) if(prob(weakness * 100)) to_chat(H, pick("\blue You feel like taking a nap.","\blue You feel a yawn coming on.","\blue You feel a little tired.")) - H.drowsyness = min(H.drowsyness + rand(5,15) * weakness, 50 * weakness) H.eye_blurry = min(H.eye_blurry + rand(5,15) * weakness, 50 * weakness) for (var/mob/living/silicon/robot/R in range(src.effectrange,holder)) to_chat(R, "\red SYSTEM ALERT: CPU cycles slowing down.") - return 1 diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_stun.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_stun.dm index 2c2b613db4e..5c924d2bb6e 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_stun.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_stun.dm @@ -12,7 +12,6 @@ var/susceptibility = GetAnomalySusceptibility(C) if(prob(susceptibility * 100)) to_chat(C, "\red A powerful force overwhelms your consciousness.") - C.Weaken(rand(1,10) * susceptibility) C.stuttering += 30 * susceptibility C.Stun(rand(1,10) * susceptibility) @@ -24,7 +23,6 @@ var/susceptibility = GetAnomalySusceptibility(C) if(prob(10 * susceptibility)) to_chat(C, "\red Your body goes numb for a moment.") - C.Weaken(2) C.stuttering += 2 if(prob(10)) @@ -32,7 +30,6 @@ else if(prob(10)) to_chat(C, "\red You feel numb.") - /datum/artifact_effect/stun/DoEffectPulse() if(holder) var/turf/T = get_turf(holder) @@ -40,7 +37,6 @@ var/susceptibility = GetAnomalySusceptibility(C) if(prob(100 * susceptibility)) to_chat(C, "\red A wave of energy overwhelms your senses!") - C.SetWeakened(4 * susceptibility) C.stuttering = 4 * susceptibility if(prob(10)) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_teleport.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_teleport.dm index 7252d123ec6..2c22bb9810e 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_teleport.dm +++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_teleport.dm @@ -7,7 +7,6 @@ var/weakness = GetAnomalySusceptibility(user) if(prob(100 * weakness)) to_chat(user, "\red You are suddenly zapped away elsewhere!") - if (user.buckled) user.buckled.unbuckle_mob() @@ -27,7 +26,6 @@ var/weakness = GetAnomalySusceptibility(M) if(prob(100 * weakness)) to_chat(M, "\red You are displaced by a strange force!") - if(M.buckled) M.buckled.unbuckle_mob() @@ -47,7 +45,6 @@ var/weakness = GetAnomalySusceptibility(M) if(prob(100 * weakness)) to_chat(M, "\red You are displaced by a strange force!") - if(M.buckled) M.buckled.unbuckle_mob() diff --git a/code/modules/research/xenoarchaeology/chemistry.dm b/code/modules/research/xenoarchaeology/chemistry.dm index e69c92f9951..f417fc49792 100644 --- a/code/modules/research/xenoarchaeology/chemistry.dm +++ b/code/modules/research/xenoarchaeology/chemistry.dm @@ -94,7 +94,6 @@ obj/item/weapon/reagent_containers/glass/solution_tray/attackby(obj/item/weapon/ if(new_label) name = "solution tray ([new_label])" to_chat(user, "\blue You write on the label of the solution tray.") - else ..(W, user) diff --git a/code/modules/research/xenoarchaeology/finds/finds_fossils.dm b/code/modules/research/xenoarchaeology/finds/finds_fossils.dm index ec2ead4f34a..206280770e9 100644 --- a/code/modules/research/xenoarchaeology/finds/finds_fossils.dm +++ b/code/modules/research/xenoarchaeology/finds/finds_fossils.dm @@ -76,7 +76,6 @@ else src.desc = "Incomplete skeleton, looks like it could use [src.breq-src.bnum] more bones." to_chat(user, "Looks like it could use [src.breq-src.bnum] more bones.") - else ..() else if(istype(W,/obj/item/weapon/pen)) diff --git a/code/modules/research/xenoarchaeology/finds/finds_misc.dm b/code/modules/research/xenoarchaeology/finds/finds_misc.dm index f440015cf31..68293501b77 100644 --- a/code/modules/research/xenoarchaeology/finds/finds_misc.dm +++ b/code/modules/research/xenoarchaeology/finds/finds_misc.dm @@ -37,7 +37,6 @@ continue G.attackby(NG, user, params) to_chat(usr, "You add the newly-formed plasma glass to the stack. It now contains [NG.amount] sheets.") - //SN src = null qdel(src) return diff --git a/code/modules/research/xenoarchaeology/finds/finds_special.dm b/code/modules/research/xenoarchaeology/finds/finds_special.dm index ac10df89458..dc315b80640 100644 --- a/code/modules/research/xenoarchaeology/finds/finds_special.dm +++ b/code/modules/research/xenoarchaeology/finds/finds_special.dm @@ -130,7 +130,6 @@ var/target = pick("chest","groin","head","l_arm","r_arm","r_leg","l_leg","l_hand","r_hand","l_foot","r_foot") M.apply_damage(rand(5, 10), BRUTE, target) to_chat(M, "\red The skin on your [parse_zone(target)] feels like it's ripping apart, and a stream of blood flies out.") - var/obj/effect/decal/cleanable/blood/splatter/animated/B = new(M.loc) B.target_turf = pick(range(1, src)) B.blood_DNA = list() @@ -202,4 +201,3 @@ /obj/effect/shadow_wight/Bump(var/atom/obstacle) to_chat(obstacle, "\red You feel a chill run down your spine!") - diff --git a/code/modules/research/xenoarchaeology/finds/finds_talkingitem.dm b/code/modules/research/xenoarchaeology/finds/finds_talkingitem.dm index 356e9588d03..9cea4d29494 100644 --- a/code/modules/research/xenoarchaeology/finds/finds_talkingitem.dm +++ b/code/modules/research/xenoarchaeology/finds/finds_talkingitem.dm @@ -53,7 +53,6 @@ w.Add("[lowertext(seperate[next])]") // to_chat(world, "Adding [lowertext(seperate[next])] to [lowertext(seperate[Xa])]") - if(prob(30)) var/list/options = list("[holder_atom] seems to be listening intently to [source]...",\ "[holder_atom] seems to be focussing on [source]...",\ @@ -68,12 +67,10 @@ //set src in view() for(var/v in heard_words) to_chat(world, "[uppertext(v)]") - var/list/d = heard_words["[v]"] for(var/X in d) to_chat(world, "[X]")*/ - /datum/talking_atom/proc/SaySomething(var/word = null) if(!holder_atom) return @@ -125,5 +122,4 @@ for(var/mob/M in listening) to_chat(M, "\icon[holder_atom] [holder_atom] reverberates, \blue\"[msg]\"") - last_talk_time = world.time diff --git a/code/modules/research/xenoarchaeology/genetics/reconstitutor.dm b/code/modules/research/xenoarchaeology/genetics/reconstitutor.dm index 7205b3db313..1e491f1ac48 100644 --- a/code/modules/research/xenoarchaeology/genetics/reconstitutor.dm +++ b/code/modules/research/xenoarchaeology/genetics/reconstitutor.dm @@ -197,14 +197,12 @@ datum/genesequence pod1.biomass -= CLONE_BIOMASS else to_chat(usr, "\red \icon[src] Unable to locate cloning pod!") - else ..() /obj/machinery/computer/reconstitutor/Topic(href, href_list) if(href_list["insertpos"]) // to_chat(world, "inserting gene for genesequence [href_list["insertgenome"]] at pos [text2num(href_list["insertpos"])]") - var/sequence_num = text2num(href_list["sequence_num"]) var/insertpos = text2num(href_list["insertpos"]) diff --git a/code/modules/research/xenoarchaeology/machinery/artifact_harvester.dm b/code/modules/research/xenoarchaeology/machinery/artifact_harvester.dm index 95fdbe1103b..017dcb7157d 100644 --- a/code/modules/research/xenoarchaeology/machinery/artifact_harvester.dm +++ b/code/modules/research/xenoarchaeology/machinery/artifact_harvester.dm @@ -25,14 +25,12 @@ if(istype(I,/obj/item/weapon/anobattery)) if(!inserted_battery) to_chat(user, "\blue You insert [I] into [src].") - user.drop_item() I.loc = src src.inserted_battery = I updateDialog() else to_chat(user, "\red There is already a battery in [src].") - else return..() diff --git a/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm b/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm index ea953dad91b..22d644b5aa5 100644 --- a/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm +++ b/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm @@ -63,7 +63,6 @@ /obj/machinery/radiocarbon_spectrometer/attackby(var/obj/I as obj, var/mob/user as mob, params) if(scanning) to_chat(user, "You can't do that while [src] is scanning!") - else if(istype(I, /obj/item/stack/nanopaste)) var/choice = alert("What do you want to do with the nanopaste?","Radiometric Scanner","Scan nanopaste","Fix seal integrity") @@ -80,7 +79,6 @@ var/amount_transferred = min(src.reagents.maximum_volume - src.reagents.total_volume, G.reagents.total_volume) G.reagents.trans_to(src, amount_transferred) to_chat(user, "You empty [amount_transferred]u of coolant into [src].") - update_coolant() return else if(choice == "Empty coolant") @@ -88,7 +86,6 @@ var/amount_transferred = min(G.reagents.maximum_volume - G.reagents.total_volume, src.reagents.total_volume) src.reagents.trans_to(G, amount_transferred) to_chat(user, "You remove [amount_transferred]u of coolant from [src].") - update_coolant() return user.drop_item() @@ -335,14 +332,11 @@ scanning = 1 t_left_radspike = pick(5,10,15) to_chat(usr, "Scan initiated.") - else to_chat(usr, "Could not initiate scan, seal requires replacing.") - else to_chat(usr, "Insert an item to scan.") - if(href_list["maserWavelength"]) maser_wavelength = max(min(maser_wavelength + 1000 * text2num(href_list["maserWavelength"]), 10000), 1) diff --git a/code/modules/research/xenoarchaeology/tools/ano_device_battery.dm b/code/modules/research/xenoarchaeology/tools/ano_device_battery.dm index 241c6423510..9d6cf4fa460 100644 --- a/code/modules/research/xenoarchaeology/tools/ano_device_battery.dm +++ b/code/modules/research/xenoarchaeology/tools/ano_device_battery.dm @@ -41,7 +41,6 @@ if(istype(I, /obj/item/weapon/anobattery)) if(!inserted_battery) to_chat(user, "\blue You insert the battery.") - user.drop_item() I.loc = src inserted_battery = I @@ -105,7 +104,6 @@ //apply the touch effect to the holder if(holder) to_chat(holder, "the \icon[src] [src] held by [holder] shudders in your grasp.") - else src.loc.visible_message("the \icon[src] [src] shudders.") inserted_battery.battery_effect.DoEffectTouch(holder) diff --git a/code/modules/research/xenoarchaeology/tools/bunsen_burner.dm b/code/modules/research/xenoarchaeology/tools/bunsen_burner.dm index 12cc7646b07..c05eb88c8bb 100644 --- a/code/modules/research/xenoarchaeology/tools/bunsen_burner.dm +++ b/code/modules/research/xenoarchaeology/tools/bunsen_burner.dm @@ -13,13 +13,11 @@ if(istype(W, /obj/item/weapon/reagent_containers)) if(held_container) to_chat(user, "\red You must remove the [held_container] first.") - else user.drop_item(src) held_container = W held_container.loc = src to_chat(user, "\blue You put the [held_container] onto the [src].") - var/image/I = image("icon"=W, "layer"=FLOAT_LAYER) underlays += I if(heating) @@ -28,19 +26,16 @@ else to_chat(user, "\red You can't put the [W] onto the [src].") - /obj/machinery/bunsen_burner/attack_hand(mob/user as mob) if(held_container) underlays = null to_chat(user, "\blue You remove the [held_container] from the [src].") - held_container.loc = src.loc held_container.attack_hand(user) held_container = null else to_chat(user, "\red There is nothing on the [src].") - /obj/machinery/bunsen_burner/proc/try_heating() src.visible_message("\blue \icon[src] [src] hisses.") if(held_container && heating) diff --git a/code/modules/research/xenoarchaeology/tools/suspension_generator.dm b/code/modules/research/xenoarchaeology/tools/suspension_generator.dm index 8be15d1c212..0a26c42a821 100644 --- a/code/modules/research/xenoarchaeology/tools/suspension_generator.dm +++ b/code/modules/research/xenoarchaeology/tools/suspension_generator.dm @@ -33,7 +33,6 @@ if(prob(5)) to_chat(M, "\blue [pick("You feel tingly.","You feel like floating.","It is hard to speak.","You can barely move.")]") - if(field_type == "iron") for(var/mob/living/silicon/M in T) M.Weaken(3) @@ -41,7 +40,6 @@ if(prob(5)) to_chat(M, "\blue [pick("You feel tingly.","You feel like floating.","It is hard to speak.","You can barely move.")]") - for(var/obj/item/I in T) if(!suspension_field.contents.len) suspension_field.icon_state = "energynet" @@ -54,7 +52,6 @@ if(prob(5)) to_chat(M, "\blue [pick("You feel tingly.","You feel like floating.","It is hard to speak.","You can barely move.")]") - if(cell.charge <= 0) deactivate() @@ -124,7 +121,6 @@ activate() else to_chat(usr, "You are unable to activate [src] until it is properly secured on the ground.") - else deactivate() if(href_list["select_field"]) @@ -140,10 +136,8 @@ auth_card = I if(attempt_unlock(I)) to_chat(usr, "You insert [I], the console flashes \'Access granted.\'") - else to_chat(usr, "You insert [I], the console flashes \'Access denied.\'") - else if(href_list["ejectcard"]) if(auth_card) if(ishuman(usr)) @@ -174,7 +168,6 @@ cell = null to_chat(user, "You remove the power cell") - /obj/machinery/suspension_gen/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if (istype(W, /obj/item/weapon/screwdriver)) if(!open) @@ -183,7 +176,6 @@ else screwed = 1 to_chat(user, "You [screwed ? "screw" : "unscrew"] the battery panel.") - else if (istype(W, /obj/item/weapon/crowbar)) if(!locked) if(!screwed) @@ -193,17 +185,13 @@ else open = 1 to_chat(user, "You crowbar the battery panel [open ? "open" : "in place"].") - icon_state = "suspension[open ? (cell ? "1" : "0") : "2"]" else to_chat(user, "[src]'s safety locks are engaged, shut it down first.") - else to_chat(user, "Unscrew [src]'s battery panel first.") - else to_chat(user, "[src]'s security locks are engaged.") - else if (istype(W, /obj/item/weapon/wrench)) if(!suspension_field) if(anchored) @@ -211,39 +199,32 @@ else anchored = 1 to_chat(user, "You wrench the stabilising legs [anchored ? "into place" : "up against the body"].") - if(anchored) desc = "It is resting securely on four stubby legs." else desc = "It has stubby legs bolted up against it's body for stabilising." else to_chat(user, "You are unable to secure [src] while it is active!") - else if (istype(W, /obj/item/weapon/stock_parts/cell)) if(open) if(cell) to_chat(user, "There is a power cell already installed.") - else user.drop_item() W.loc = src cell = W to_chat(user, "You insert the power cell.") - icon_state = "suspension1" else if(istype(W, /obj/item/weapon/card)) var/obj/item/weapon/card/I = W if(!auth_card) if(attempt_unlock(I)) to_chat(user, "You swipe [I], the console flashes \'Access granted.\'") - else to_chat(user, "You swipe [I], console flashes \'Access denied.\'") - else to_chat(user, "Remove [auth_card] first.") - /obj/machinery/suspension_gen/proc/attempt_unlock(var/obj/item/weapon/card/C) if(!open) if(istype(C, /obj/item/weapon/card/emag) && cell.charge > 0) @@ -325,7 +306,6 @@ for(var/mob/M in T) to_chat(M, "You no longer feel like floating.") - M.SetWeakened(min(M.weakened, 3)) src.visible_message("\blue \icon[src] [src] deactivates with a gentle shudder.") @@ -344,7 +324,6 @@ if(anchored) to_chat(usr, "\red You cannot rotate [src], it has been firmly fixed to the floor.") - else dir = turn(dir, 90) @@ -355,7 +334,6 @@ if(anchored) to_chat(usr, "\red You cannot rotate [src], it has been firmly fixed to the floor.") - else dir = turn(dir, -90) diff --git a/code/modules/research/xenoarchaeology/tools/tools_anoscanner.dm b/code/modules/research/xenoarchaeology/tools/tools_anoscanner.dm index 0f012bcacdd..3ae1c15f660 100644 --- a/code/modules/research/xenoarchaeology/tools/tools_anoscanner.dm +++ b/code/modules/research/xenoarchaeology/tools/tools_anoscanner.dm @@ -28,7 +28,6 @@ to_chat(user, "[message]") - /obj/item/device/ano_scanner/proc/scan() last_scan_time = world.time nearest_artifact_distance = -1 diff --git a/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm b/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm index c0f369b2524..c1d8bda97ee 100644 --- a/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm +++ b/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm @@ -29,17 +29,14 @@ if(..(user, 2)) to_chat(user, "\blue Used to extract geological core samples - this one is [sampled_turf ? "full" : "empty"], and has [num_stored_bags] bag[num_stored_bags != 1 ? "s" : ""] remaining.") - /obj/item/device/core_sampler/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(istype(W,/obj/item/weapon/evidencebag)) if(num_stored_bags < 10) qdel(W) num_stored_bags += 1 to_chat(user, "\blue You insert the [W] into the core sampler.") - else to_chat(user, "\red The core sampler can not fit any more bags!") - else return ..() @@ -56,10 +53,8 @@ if(geo_data) if(filled_bag) to_chat(user, "\red The core sampler is full!") - else if(num_stored_bags < 1) to_chat(user, "\red The core sampler is out of sample bags!") - else //create a new sample bag which we'll fill with rock samples filled_bag = new /obj/item/weapon/evidencebag(src) @@ -81,15 +76,12 @@ filled_bag.w_class = 1 to_chat(user, "\blue You take a core sample of the [item_to_sample].") - else to_chat(user, "\red You are unable to take a sample of [item_to_sample].") - /obj/item/device/core_sampler/attack_self() if(filled_bag) to_chat(usr, "\blue You eject the full sample bag.") - var/success = 0 if(istype(src.loc, /mob)) var/mob/M = src.loc @@ -100,4 +92,3 @@ icon_state = "sampler0" else to_chat(usr, "\red The core sampler is empty.") - diff --git a/code/modules/research/xenoarchaeology/tools/tools_depthscanner.dm b/code/modules/research/xenoarchaeology/tools/tools_depthscanner.dm index 486d405b8fa..6bf829ba220 100644 --- a/code/modules/research/xenoarchaeology/tools/tools_depthscanner.dm +++ b/code/modules/research/xenoarchaeology/tools/tools_depthscanner.dm @@ -48,7 +48,6 @@ for(var/mob/L in range(src, 1)) to_chat(L, "\blue \icon[src] [src] pings.") - else if(istype(A,/obj/structure/boulder)) var/obj/structure/boulder/B = A if(B.artifact_find) @@ -68,7 +67,6 @@ for(var/mob/L in range(src, 1)) to_chat(L, "\blue \icon[src] [src] pings [pick("madly","wildly","excitedly","crazily")]!.") - /obj/item/device/depth_scanner/attack_self(var/mob/user as mob) return src.interact(user) diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm index ab2ad00f104..96746f780d8 100644 --- a/code/modules/research/xenobiology/xenobio_camera.dm +++ b/code/modules/research/xenobiology/xenobio_camera.dm @@ -151,7 +151,6 @@ to_chat(owner, "[X] now has [X.monkeys] monkeys left.") - /datum/action/monkey_recycle name = "Recycle Monkeys" action_type = AB_INNATE diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index f810c41878b..0599d141c08 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -20,14 +20,11 @@ if(istype(O, /obj/item/weapon/slimesteroid2)) if(enhanced == 1) to_chat(user, " This extract has already been enhanced!") - return ..() if(Uses == 0) to_chat(user, " You can't enhance a used extract!") - return ..() to_chat(user, "You apply the enhancer. It now has triple the amount of uses.") - Uses = 3 enhanced = 1 qdel(O) @@ -157,15 +154,12 @@ attack(mob/living/carbon/slime/M as mob, mob/user as mob) if(!istype(M, /mob/living/carbon/slime))//If target is not a slime. to_chat(user, " The potion only works on slimes!") - return ..() if(M.stat) to_chat(user, " The slime is dead!") - return..() if(M.mind) to_chat(user, " The slime resists!") - return ..() if(M.is_adult) var/mob/living/simple_animal/adultslime/pet = new /mob/living/simple_animal/adultslime(M.loc) @@ -197,7 +191,6 @@ qdel(src) to_chat(user, "You feed the slime the potion, removing it's powers and calming it.") - /obj/item/weapon/sentience_potion name = "sentience potion" desc = "A miraculous chemical mix that can raise the intelligence of creatures to human levels. Unlike normal slime potions, it can be absorbed by any nonsentient being." @@ -214,15 +207,12 @@ return if(!isanimal(M) || M.ckey) //only works on animals that aren't player controlled to_chat(user, "[M] is already too intelligent for this to work!") - return ..() if(M.stat) to_chat(user, "[M] is dead!") - return..() to_chat(user, "You offer the sentience potion to [M]...") - being_used = 1 var/list/candidates = pollCandidates("Do you want to play as [M.name]?", ROLE_SENTIENT, 0, 100) @@ -236,18 +226,14 @@ M.universal_speak = 1 M.faction |= "sentient" to_chat(M, "All at once it makes sense: you know what you are and who you are! Self awareness is yours!") - to_chat(M, "You are grateful to be self aware and owe [user] a great debt. Serve [user], and assist them in completing their goals at any cost.") - to_chat(user, "[M] accepts the potion and suddenly becomes attentive and aware. It worked!") - if(isanimal(M)) var/mob/living/simple_animal/S = M S.master_commander = user qdel(src) else to_chat(user, "[M] looks interested for a moment, but then looks back down. Maybe you should try again later.") - being_used = 0 ..() @@ -264,23 +250,18 @@ attack(mob/living/carbon/slime/M as mob, mob/user as mob) if(!istype(M, /mob/living/carbon/slime))//If target is not a slime. to_chat(user, " The steroid only works on baby slimes!") - return ..() if(M.is_adult) //Can't tame adults to_chat(user, " Only baby slimes can use the steroid!") - return..() if(M.stat) to_chat(user, " The slime is dead!") - return..() if(M.cores == 3) to_chat(user, " The slime already has the maximum amount of extract!") - return..() to_chat(user, "You feed the slime the steroid. It now has triple the amount of extract.") - M.cores = 3 qdel(src) @@ -305,14 +286,11 @@ ..() if(!istype(C)) to_chat(user, "The potion can only be used on items!") - return if(C.slowdown <= 0) to_chat(user, "The [C] can't be made any faster!") - return..() to_chat(user, "You slather the red gunk over the [C], making it faster.") - C.color = "#FF0000" C.slowdown = 0 qdel(src) @@ -334,14 +312,11 @@ return if(!istype(C)) to_chat(user, "The potion can only be used on clothing!") - return if(C.max_heat_protection_temperature == FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT) to_chat(user, "The [C] is already fireproof!") - return..() to_chat(user, "You slather the blue gunk over the [C], fireproofing it.") - C.name = "fireproofed [C.name]" C.color = "#000080" C.max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT @@ -507,20 +482,17 @@ for(var/mob/dead/observer/O in src.loc) if(!check_observer(O)) to_chat(O, "\red You are not eligible to become a golem.") - continue ghost = O break if(!ghost) to_chat(user, "The rune fizzles uselessly. There is no spirit nearby.") - return var/mob/living/carbon/human/golem/G = new /mob/living/carbon/human/golem G.change_gender(pick(MALE,FEMALE)) G.loc = src.loc G.key = ghost.key to_chat(G, "You are an adamantine golem. You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools. Serve [user], and assist them in completing their goals at any cost.") - qdel(src) @@ -531,7 +503,6 @@ if(A) to_chat(O, "\blue Golem rune created in [A.name]. (Teleport | Sign Up)") - Topic(href,href_list) if("signup" in href_list) var/mob/dead/observer/O = locate(href_list["signup"]) @@ -556,12 +527,9 @@ if(O in ghosts) ghosts.Remove(O) to_chat(O, "\red You are no longer signed up to be a golem.") - else if(!check_observer(O)) to_chat(O, "\red You are not eligible to become a golem.") - return ghosts.Add(O) to_chat(O, "\blue You are signed up to be a golem.") - diff --git a/code/modules/scripting/Parser/Keywords.dm b/code/modules/scripting/Parser/Keywords.dm index 9a52e1f39b0..4c186160838 100644 --- a/code/modules/scripting/Parser/Keywords.dm +++ b/code/modules/scripting/Parser/Keywords.dm @@ -83,7 +83,6 @@ var/const/Represents a special statement in the code triggered by a keyword. if(!ifstmt || !istype(ifstmt) || ifstmt.else_if) to_chat(usr, "NTSL: ELSE IF FAILED: [!ifstmt], [!istype(ifstmt)], [!istype(ifstmt) || ifstmt.else_if]")// Usr is unsafe as SHIT but JUST incase I forget this debug line like the fucking asset cache... - parser.errors += new/datum/scriptError/ExpectedToken("if statement", parser.curToken) return KW_FAIL @@ -112,7 +111,6 @@ var/const/Represents a special statement in the code triggered by a keyword. if(!stmt || !istype(stmt) || stmt.else_block) //Ensure that it is an if statement to_chat(usr, "NTSL: ELSE IF FAILED: [!stmt], [!istype(stmt)], [!istype(stmt) || stmt.else_block]")// Usr is unsafe as SHIT but JUST incase I forget this debug line like the fucking asset cache... - parser.errors += new/datum/scriptError/ExpectedToken("if statement", parser.curToken) return KW_FAIL diff --git a/code/modules/security_levels/keycard authentication.dm b/code/modules/security_levels/keycard authentication.dm index 8e46a0e4e27..d27820ac033 100644 --- a/code/modules/security_levels/keycard authentication.dm +++ b/code/modules/security_levels/keycard authentication.dm @@ -24,13 +24,11 @@ /obj/machinery/keycard_auth/attack_ai(mob/user as mob) to_chat(user, "The station AI is not to interact with these devices.") - return /obj/machinery/keycard_auth/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(stat & (NOPOWER|BROKEN)) to_chat(user, "This device is not powered.") - return if(istype(W,/obj/item/weapon/card/id)) var/obj/item/weapon/card/id/ID = W @@ -43,7 +41,6 @@ else if(screen == 2) if(event == "Emergency Response Team" && ert_reason == "Reason for ERT") to_chat(user, "Supply a reason for calling the ERT first!") - return event_triggered_by = usr broadcast_request() //This is the device making the initial event request. It needs to broadcast to other devices @@ -63,11 +60,9 @@ /obj/machinery/keycard_auth/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) if(user.stat || stat & (NOPOWER|BROKEN)) to_chat(user, "This device is not powered.") - return if(busy) to_chat(user, "This device is busy.") - return user.set_machine(src) @@ -88,11 +83,9 @@ return if(busy) to_chat(usr, "This device is busy.") - return if(usr.stat || stat & (BROKEN|NOPOWER)) to_chat(usr, "This device is without power.") - return if(href_list["triggerevent"]) event = href_list["triggerevent"] @@ -161,11 +154,9 @@ if("Emergency Response Team") if(is_ert_blocked()) to_chat(usr, "\red All Emergency Response Teams are dispatched and can not be called at this time.") - return to_chat(usr, "ERT request transmitted.") - if(admins.len) ERT_Announce(ert_reason , event_triggered_by) ert_reason = "Reason for ERT" diff --git a/code/modules/shuttle/assault_pod.dm b/code/modules/shuttle/assault_pod.dm index d386fc3774a..fe3d059a08a 100644 --- a/code/modules/shuttle/assault_pod.dm +++ b/code/modules/shuttle/assault_pod.dm @@ -56,5 +56,4 @@ to_chat(user, "Landing zone set.") - qdel(src) diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index fd2b2b74771..1f555693960 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -23,18 +23,15 @@ W = pda.id if (!W:access) //no access to_chat(user, "The access level of [W:registered_name]\'s card is not high enough. ") - return var/list/cardaccess = W:access if(!istype(cardaccess, /list) || !cardaccess.len) //no access to_chat(user, "The access level of [W:registered_name]\'s card is not high enough. ") - return if(!(access_heads in W:access)) //doesn't have this access to_chat(user, "The access level of [W:registered_name]\'s card is not high enough. ") - return 0 var/choice = alert(user, text("Would you like to (un)authorize a shortened launch time? [] authorization\s are still needed. Use abort to cancel all authorizations.", src.auth_need - src.authorized.len), "Shuttle Launch", "Authorize", "Repeal", "Abort") @@ -202,7 +199,6 @@ for(var/area/shuttle/escape/E in world) to_chat(E, 'sound/effects/hyperspace_begin.ogg') - if(time_left <= 0 && !shuttle_master.emergencyNoEscape) //move each escape pod to its corresponding transit dock for(var/obj/docking_port/mobile/pod/M in shuttle_master.mobile) @@ -211,7 +207,6 @@ //now move the actual emergency shuttle to its transit dock for(var/area/shuttle/escape/E in world) to_chat(E, 'sound/effects/hyperspace_progress.ogg') - enterTransit() mode = SHUTTLE_ESCAPE timer = world.time @@ -224,7 +219,6 @@ //now move the actual emergency shuttle to centcomm for(var/area/shuttle/escape/E in world) to_chat(E, 'sound/effects/hyperspace_end.ogg') - dock(shuttle_master.getDock("emergency_away")) mode = SHUTTLE_ENDGAME timer = 0 @@ -276,7 +270,6 @@ /obj/machinery/computer/shuttle/pod/emag_act(mob/user as mob) to_chat(user, " Access requirements overridden. The pod may now be launched manually at any time.") - admin_controlled = 0 icon_state = "dorm_emag" diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 49dde9cb4d9..2f7c0c06496 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -686,7 +686,6 @@ to_chat(usr, "Invalid shuttle requested.") else to_chat(usr, "Unable to comply.") - updateUsrDialog() /obj/machinery/computer/shuttle/emag_act(mob/user) @@ -695,7 +694,6 @@ emagged = 1 to_chat(user, "You fried the consoles ID checking system.") - /obj/machinery/computer/shuttle/ferry name = "transport ferry console" circuit = /obj/item/weapon/circuitboard/ferry diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index d67c5142175..3245f6872dc 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -559,7 +559,6 @@ /obj/machinery/computer/supplycomp/attack_hand(var/mob/user as mob) if(!allowed(user) && !isobserver(user)) to_chat(user, "Access denied.") - return 1 post_signal("supply") @@ -569,7 +568,6 @@ /obj/machinery/computer/supplycomp/emag_act(user as mob) if(!hacked) to_chat(user, "Special supplies unlocked.") - hacked = 1 return @@ -654,7 +652,6 @@ if(href_list["send"]) if(shuttle_master.supply.canMove()) to_chat(usr, "For safety reasons the automated supply shuttle cannot transport live organisms, classified nuclear weaponry or homing beacons.") - else if(shuttle_master.supply.getDockedId() == "supply_home") shuttle_master.toggleShuttle("supply", "supply_home", "supply_away", 1) investigate_log("[key_name(usr)] has sent the supply shuttle away. Remaining points: [shuttle_master.points]. Shuttle contents: [shuttle_master.sold_atoms]", "cargo") @@ -722,7 +719,6 @@ investigate_log("[key_name(usr)] has authorized an order for [P.name]. Remaining points: [shuttle_master.points].", "cargo") else to_chat(usr, "There are insufficient supply points for this request.") - break else if (href_list["rreq"]) diff --git a/code/modules/shuttle/syndicate.dm b/code/modules/shuttle/syndicate.dm index 0ce399c827b..b1afd14bcf5 100644 --- a/code/modules/shuttle/syndicate.dm +++ b/code/modules/shuttle/syndicate.dm @@ -17,7 +17,6 @@ if(href_list["move"]) if(challenge && world.time < SYNDICATE_CHALLENGE_TIMER) to_chat(usr, "You've issued a combat challenge to the station! You've got to give them at least [round(((SYNDICATE_CHALLENGE_TIMER - world.time) / 10) / 60)] more minutes to allow them to prepare.") - return 0 ..() @@ -33,7 +32,6 @@ if(href_list["move"]) if(z != ZLEVEL_CENTCOMM) to_chat(usr, "Pods are one way!") - return 0 ..() diff --git a/code/modules/surgery/dental_implant.dm b/code/modules/surgery/dental_implant.dm index fbe38ecd29f..2810617bd12 100644 --- a/code/modules/surgery/dental_implant.dm +++ b/code/modules/surgery/dental_implant.dm @@ -50,7 +50,6 @@ if(!Checks()) return to_chat(owner, "You grit your teeth and burst the implanted [target]!") - add_logs(owner, null, "swallowed an implanted pill", target) if(target.reagents.total_volume) target.reagents.reaction(owner, INGEST) diff --git a/code/modules/surgery/helpers.dm b/code/modules/surgery/helpers.dm index 1cd7feac6d7..a21a7422696 100644 --- a/code/modules/surgery/helpers.dm +++ b/code/modules/surgery/helpers.dm @@ -58,7 +58,6 @@ if(current_surgery.status == 1 ) M.surgeries -= current_surgery to_chat(user, "You stop the surgery.") - qdel(current_surgery) else if(istype(user.get_inactive_hand(), /obj/item/weapon/cautery) && current_surgery.can_cancel) M.surgeries -= current_surgery @@ -73,7 +72,6 @@ to_chat(user, "You need to hold a cautery in inactive hand to stop [M]'s surgery!") - return 1 return 0 diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm index 009bc7aac4b..45da3bce5b6 100644 --- a/code/modules/surgery/implant.dm +++ b/code/modules/surgery/implant.dm @@ -157,7 +157,6 @@ break if(istype(tool,/obj/item/weapon/cautery)) to_chat(user, "you prepare to close the cavity wall.") - else if(tool) user.visible_message("[user] starts putting \the [tool] inside [target]'s [get_cavity(affected)] cavity.", \ "You start putting \the [tool] inside [target]'s [get_cavity(affected)] cavity." ) @@ -174,17 +173,14 @@ if(istype(tool, /obj/item/weapon/disk/nuclear)) to_chat(user, "Central command would kill you if you implanted the disk into someone.") - return 0//fail if(istype(tool,/obj/item/organ)) to_chat(user, "This isn't the type of surgery for organ transplants!") - return 0//fail if(!user.canUnEquip(tool, 0)) to_chat(user, "[tool] is stuck to your hand, you can't put it in [target]!") - return 0 if(istype(tool,/obj/item/weapon/cautery)) @@ -192,14 +188,12 @@ else if(tool) if(IC) to_chat(user, "There seems to be something in there already!") - return 1 else user.visible_message(" [user] puts \the [tool] inside [target]'s [get_cavity(affected)] cavity.", \ " You put \the [tool] inside [target]'s [get_cavity(affected)] cavity." ) if((tool.w_class > get_max_wclass(affected)/2 && prob(50) && !(affected.status & ORGAN_ROBOT))) to_chat(user, " You tear some vessels trying to fit the object in the cavity.") - var/datum/wound/internal_bleeding/I = new () affected.wounds += I affected.owner.custom_pain("You feel something rip in your [affected.name]!", 1) @@ -216,7 +210,6 @@ return 1 else to_chat(user, "You don't find anything in [target]'s [target_zone].") - return 0 @@ -372,9 +365,7 @@ user.visible_message("[user] sucessfully removes [objects] objects from [H]'s [L.limb_name]!", "You sucessfully remove [objects] objects from [H]'s [L.limb_name].") else to_chat(user, "You find no objects embedded in [H]'s [L.limb_name]!") - else to_chat(user, "You can't find [target]'s [target_zone], let alone any objects embedded in it!") - return 1 \ No newline at end of file diff --git a/code/modules/surgery/organs/augments_eyes.dm b/code/modules/surgery/organs/augments_eyes.dm index b75e1699c09..679a98c98f4 100644 --- a/code/modules/surgery/organs/augments_eyes.dm +++ b/code/modules/surgery/organs/augments_eyes.dm @@ -37,7 +37,6 @@ HMN.update_eyes() if(aug_message && !special) to_chat(owner, "[aug_message]") - M.sight |= vision_flags /obj/item/organ/internal/cyberimp/eyes/remove(var/mob/living/carbon/M, var/special = 0) @@ -61,7 +60,6 @@ if(prob(10 * severity)) return to_chat(owner, "Static obfuscates your vision!") - owner.flash_eyes(visual = 1) diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index 622a484bb8b..a5af2caca3d 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -35,7 +35,6 @@ var/stun_amount = 5 + (severity-1 ? 0 : 5) owner.Stun(stun_amount) to_chat(owner, "Your body seizes up!") - return stun_amount @@ -73,7 +72,6 @@ if(!l_hand_obj && !r_hand_obj) to_chat(owner, "You are not holding any items, your hands relax...") - active = 0 else var/msg = 0 @@ -82,17 +80,13 @@ switch(msg) if(1) to_chat(owner, "Your left hand's grip tightens.") - if(2) to_chat(owner, "Your right hand's grip tightens.") - if(3) to_chat(owner, "Both of your hand's grips tighten.") - else release_items() to_chat(owner, "Your hands relax...") - l_hand_obj = null r_hand_obj = null @@ -110,13 +104,11 @@ A = pick(oview(range)) L_item.throw_at(A, range, 2) to_chat(owner, "Your left arm spasms and throws the [L_item.name]!") - if(R_item) A = pick(oview(range)) R_item.throw_at(A, range, 2) to_chat(owner, "Your right arm spasms and throws the [R_item.name]!") - /obj/item/organ/internal/cyberimp/brain/anti_drop/proc/release_items() if(!l_hand_ignore && l_hand_obj in owner.contents) l_hand_obj.flags ^= NODROP @@ -181,7 +173,6 @@ if(owner.nutrition <= hunger_threshold) synthesizing = 1 to_chat(owner, "You feel less hungry...") - owner.nutrition += 50 spawn(50) synthesizing = 0 @@ -192,7 +183,6 @@ owner.reagents.add_reagent("????",poison_amount / severity) //food poisoning to_chat(owner, "You feel like your insides are burning.") - /obj/item/organ/internal/cyberimp/chest/nutriment/plus name = "Nutriment pump implant PLUS" desc = "This implant will synthesize and pump into your bloodstream a small amount of nutriment when you are hungry." @@ -258,7 +248,6 @@ if(H.stat == CONSCIOUS) to_chat(H, "You feel your heart beating again!") - //ARM...THAT GO IN THE CHEST /obj/item/organ/internal/cyberimp/chest/arm_mod//dummy parent item for making arm-mod implants. works best with nodrop items that are sent to nullspace upon being dropped. name = "Arm-mounted item implant" @@ -276,7 +265,6 @@ /obj/item/organ/internal/cyberimp/chest/arm_mod/ui_action_click() if(overloaded)//ensure the implant isn't broken to_chat(owner, "The implant doesn't respond. It seems to be broken...") - return if(out)//check if the owner has the item out already owner.unEquip(holder, 1)//if he does, take it away. then, @@ -294,7 +282,6 @@ holder.loc = null//keep it in nullspace to_chat(owner, "You can't extend [holder] if you can't use your hands!") - /obj/item/organ/internal/cyberimp/chest/arm_mod/emp_act(severity)//if the implant gets EMPed... if(!owner || overloaded)//ensure that it's in an owner and that it's not already EMPed, then... return @@ -306,7 +293,6 @@ owner.visible_message("A loud bang comes from [owner]...") playsound(get_turf(owner), 'sound/effects/bang.ogg', 100, 1) to_chat(owner, "You feel an explosion erupt inside you as your chest implant breaks. Is it hot in here?") - owner.adjust_fire_stacks(20) owner.IgniteMob()//ignite the owner, as well as owner.say("AUUUUUUUUUUUUUUUUUUGH!!") diff --git a/code/modules/surgery/organs/autoimplanter.dm b/code/modules/surgery/organs/autoimplanter.dm index 117210f732f..5c2aa1193d9 100644 --- a/code/modules/surgery/organs/autoimplanter.dm +++ b/code/modules/surgery/organs/autoimplanter.dm @@ -9,7 +9,6 @@ /obj/item/device/autoimplanter/attack_self(mob/user)//when the object it used... if(!storedorgan) to_chat(user, "[src] currently has no implant stored.") - return storedorgan.insert(user)//insert stored organ into the user user.visible_message("[user] presses a button on [src], and you hear a short mechanical noise.", "You feel a sharp sting as [src] plunges into your body.") @@ -20,21 +19,17 @@ if(istype(I, /obj/item/organ/internal/cyberimp)) if(storedorgan) to_chat(user, "[src] already has an implant stored.") - return if(!user.drop_item()) return I.forceMove(src) storedorgan = I to_chat(user, "You insert the [I] into [src].") - else if(istype(I, /obj/item/weapon/screwdriver)) if(!storedorgan) to_chat(user, "There's no implant in [src] for you to remove.") - else storedorgan.forceMove(get_turf(user)) storedorgan = null to_chat(user, "You remove the [storedorgan] from [src].") - playsound(get_turf(user), 'sound/items/Screwdriver.ogg', 50, 1) diff --git a/code/modules/surgery/organs/blood.dm b/code/modules/surgery/organs/blood.dm index 5487df397dc..f2dd4c3c778 100644 --- a/code/modules/surgery/organs/blood.dm +++ b/code/modules/surgery/organs/blood.dm @@ -127,11 +127,9 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 update_body() var/word = pick("dizzy","woosey","faint") to_chat(src, "\red You feel [word]") - if(prob(1)) var/word = pick("dizzy","woosey","faint") to_chat(src, "\red You feel [word]") - if(oxyloss < 20) oxyloss += 3 if(BLOOD_VOLUME_BAD to BLOOD_VOLUME_OKAY) @@ -146,7 +144,6 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 Paralyse(rand(1,3)) var/word = pick("dizzy","woosey","faint") to_chat(src, "\red You feel very [word]") - if(BLOOD_VOLUME_SURVIVE to BLOOD_VOLUME_BAD) if(!pale) pale = 1 @@ -158,7 +155,6 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 Paralyse(rand(1,3)) var/word = pick("dizzy","woosey","faint") to_chat(src, "\red You feel extremely [word]") - if(0 to BLOOD_VOLUME_SURVIVE) death() diff --git a/code/modules/surgery/organs/body_egg.dm b/code/modules/surgery/organs/body_egg.dm index ef9d3a4ca4b..3653e3df327 100644 --- a/code/modules/surgery/organs/body_egg.dm +++ b/code/modules/surgery/organs/body_egg.dm @@ -10,7 +10,6 @@ ..() to_chat(finder, "You found an unknown alien organism in [owner]'s [parent_organ]!") - /obj/item/organ/internal/body_egg/insert(var/mob/living/carbon/M, special = 0) ..() owner.status_flags |= XENO_HOST diff --git a/code/modules/surgery/organs/organ.dm b/code/modules/surgery/organs/organ.dm index 7a9c0886191..3bce602694a 100644 --- a/code/modules/surgery/organs/organ.dm +++ b/code/modules/surgery/organs/organ.dm @@ -145,7 +145,6 @@ var/list/organ_cache = list() if(status & ORGAN_DEAD) to_chat(user, "The decay has set in.") - /obj/item/organ/proc/handle_germ_effects() //** Handle the effects of infections var/antibiotics = owner.reagents.get_reagent_amount("spaceacillin") diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm index 8312bc4c5bb..ac96bd0f775 100644 --- a/code/modules/surgery/organs/organ_external.dm +++ b/code/modules/surgery/organs/organ_external.dm @@ -294,7 +294,6 @@ var/obj/item/organ/external/stump/S = locate() in children if(S) // to_chat(world, "Extra healing to go around ([brute+burn]) and [owner] needs a replacement limb.") - */ //Sync the organ's damage with its wounds @@ -530,7 +529,6 @@ Note that amputating the affected organ does in fact remove the infection from t if (!(status & ORGAN_DEAD)) status |= ORGAN_DEAD to_chat(owner, "You can't feel your [name] anymore...") - owner.update_body(1) germ_level++ diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index d429f161928..1794a896207 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -303,7 +303,6 @@ if (germ_level > INFECTION_LEVEL_ONE) if(prob(1)) to_chat(owner, " Your skin itches.") - if (germ_level > INFECTION_LEVEL_TWO) if(prob(1)) spawn owner.vomit() @@ -460,13 +459,11 @@ if(organhonked < world.time) organhonked = world.time+900 to_chat(owner, "HONK") - owner.sleeping = 0 owner.stuttering = 20 owner.ear_deaf = 30 owner.Weaken(3) to_chat(owner, 'sound/items/AirHorn.ogg') - if(prob(30)) owner.Stun(10) owner.Paralyse(4) diff --git a/code/modules/surgery/organs/pain.dm b/code/modules/surgery/organs/pain.dm index 7fb022bc9fa..b2f6945b6f1 100644 --- a/code/modules/surgery/organs/pain.dm +++ b/code/modules/surgery/organs/pain.dm @@ -41,7 +41,6 @@ mob/living/carbon/proc/pain(var/partname, var/amount, var/force, var/burning = 0 if(msg && (msg != last_pain_message || prob(10))) last_pain_message = msg to_chat(src, msg) - next_pain_time = world.time + (100 - amount) @@ -66,7 +65,6 @@ mob/living/carbon/human/proc/custom_pain(var/message, var/flash_strength) if(msg && ((msg != last_pain_message) || (world.time >= next_pain_time))) last_pain_message = msg to_chat(src, msg) - next_pain_time = world.time + 100 mob/living/carbon/human/proc/handle_pain() diff --git a/code/modules/surgery/organs/parasites.dm b/code/modules/surgery/organs/parasites.dm index 62bf5a391c8..2d15efdd041 100644 --- a/code/modules/surgery/organs/parasites.dm +++ b/code/modules/surgery/organs/parasites.dm @@ -20,7 +20,6 @@ owner.reagents.add_reagent("histamine", 5) if(5) to_chat(owner, "You feel like something is tearing its way out of your skin...") - owner.reagents.add_reagent("histamine", 10) if(prob(30)) owner.emote("scream") diff --git a/code/modules/surgery/organs/subtypes/machine.dm b/code/modules/surgery/organs/subtypes/machine.dm index 7bcadd791bc..5d9bd517d3f 100644 --- a/code/modules/surgery/organs/subtypes/machine.dm +++ b/code/modules/surgery/organs/subtypes/machine.dm @@ -134,7 +134,6 @@ if(!special) to_chat(owner, "Error 404:Optical Sensors not found.") - . = ..() /obj/item/organ/internal/optical_sensor/surgeryize() diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index f23398b610c..83684822a26 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -88,17 +88,14 @@ I = tool if(target_zone != I.parent_organ || target.get_organ_slot(I.slot)) to_chat(user, "There is no room for [I] in [target]'s [parse_zone(target_zone)]!") - return -1 if(I.damage > (I.max_damage * 0.75)) to_chat(user, " \The [I] is in no state to be transplanted.") - return -1 if(target.get_int_organ(I)) to_chat(user, " \The [target] already has [I].") - return -1 if(affected) user.visible_message("[user] starts transplanting \the [tool] into [target]'s [affected.name].", \ @@ -127,7 +124,6 @@ var/list/organs = target.get_organs_zone(target_zone) if(!organs.len) to_chat(user, "There are no removeable organs in [target]'s [parse_zone(target_zone)]!") - return -1 else for(var/obj/item/organ/internal/O in organs) @@ -158,7 +154,6 @@ if(!hasorgans(target)) to_chat(user, "They do not have organs to mend!") - return for(var/obj/item/organ/internal/I in affected.internal_organs) if(I && I.damage > 0) @@ -172,12 +167,10 @@ "You start treating damage to [target]'s [I.name] with [tool_name]." ) to_chat(user, "[I] does not appear to be damaged.") - H.custom_pain("The pain in your [affected.name] is living hell!",1) else if(istype(tool, /obj/item/weapon/reagent_containers/food/snacks/organ)) to_chat(user, "[tool] was biten by someone! It's too damaged to use!") - return -1 ..() @@ -213,7 +206,6 @@ spread_germs_to_organ(I, user) if(!user.canUnEquip(I, 0)) to_chat(user, "[I] is stuck to your hand, you can't put it in [target]!") - return 0 if(affected) diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index 5d8d6406502..f8051575b05 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -241,13 +241,11 @@ var/braincase = target.named_organ_parent("brain") user.visible_message("[user] reaches into [target]'s head with [tool].", "You begin aligning [tool]'s light to the tumor on [target]'s brain...") to_chat(target, "A small part of your [braincase] pulses with agony as the light impacts it.") - ..() /datum/surgery_step/internal/dethrall/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) if(target.get_species() == "Lesser Shadowling") //Empowered thralls cannot be deconverted to_chat(target, "NOT LIKE THIS!") - user.visible_message("[target] suddenly slams upward and knocks down [user]!", \ "[target] suddenly bolts up and slams you with tremendous force!") user.resting = 0 //Remove all stuns diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index 3e685547ad1..da627a57f0d 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -233,7 +233,6 @@ if(istype(C)) if(!C.get_amount() >= 3) to_chat(user, "You need three or more cable pieces to repair this damage.") - return 2 C.use(3) return 1 @@ -291,20 +290,16 @@ if(I.status != ORGAN_ROBOT || I.robotic != 2) to_chat(user, "You can only implant cybernetic organs.") - if(target_zone != I.parent_organ || target.get_organ_slot(I.slot)) to_chat(user, "There is no room for [I] in [target]'s [parse_zone(target_zone)]!") - return -1 if(I.damage > (I.max_damage * 0.75)) to_chat(user, " \The [I] is in no state to be transplanted.") - return -1 if(target.get_int_organ(I)) to_chat(user, " \The [target] already has [I].") - return -1 user.visible_message("[user] begins reattaching [target]'s [tool].", \ @@ -316,7 +311,6 @@ if(target_zone != "chest") to_chat(user, " You must target the chest cavity.") - return -1 var/obj/item/device/mmi/M = tool @@ -329,27 +323,22 @@ if(!M.brainmob || !M.brainmob.client || !M.brainmob.ckey || M.brainmob.stat >= DEAD) to_chat(user, "That brain is not usable.") - return -1 if(!(affected.status & ORGAN_ROBOT)) to_chat(user, "You cannot install a computer brain into a meat enclosure.") - return -1 if(!target.species) to_chat(user, "You have no idea what species this person is. Report this on the bug tracker.") - return -1 if(!target.species.has_organ["brain"]) to_chat(user, "You're pretty sure [target.species.name_plural] don't normally have a brain.") - return -1 if(target.get_int_organ(/obj/item/organ/internal/brain/)) to_chat(user, "Your subject already has a brain.") - return -1 user.visible_message("[user] starts installing \the [tool] into [target]'s [affected.name].", \ @@ -364,7 +353,6 @@ return -1 if(!organs.len) to_chat(user, "There is no removeable organs in [target]'s [parse_zone(target_zone)]!") - return -1 else for(var/obj/item/organ/internal/O in organs) @@ -421,7 +409,6 @@ if(!user.canUnEquip(I, 0)) to_chat(user, "[I] is stuck to your hand, you can't put it in [target]!") - return 0 user.drop_item() @@ -529,27 +516,22 @@ if(!M.brainmob || !M.brainmob.client || !M.brainmob.ckey || M.brainmob.stat >= DEAD) to_chat(user, "That brain is not usable.") - return 2 if(!(affected.status & ORGAN_ROBOT)) to_chat(user, "You cannot install a computer brain into a meat enclosure.") - return 2 if(!target.species) to_chat(user, "You have no idea what species this person is. Report this on the bug tracker.") - return 2 if(!target.species.has_organ["brain"]) to_chat(user, "You're pretty sure [target.species.name_plural] don't normally have a brain.") - return 2 if(target.get_int_organ(/obj/item/organ/internal/brain/)) to_chat(user, "Your subject already has a brain.") - return 2 return 1 diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index e5aaf88613f..672ae3ac804 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -182,7 +182,6 @@ /proc/spread_germs_to_organ(obj/item/organ/E, mob/living/carbon/human/user) if(!istype(user) || !istype(E)) return // to_chat(world, "Germ spread: [E] : [E.owner]") - var/germ_level = user.germ_level if(user.gloves) germ_level = user.gloves.germ_level diff --git a/code/modules/telesci/telepad.dm b/code/modules/telesci/telepad.dm index 5d93e2ab280..0f1f7c8f582 100644 --- a/code/modules/telesci/telepad.dm +++ b/code/modules/telesci/telepad.dm @@ -48,7 +48,6 @@ M.buffer = src to_chat(user, "You save the data in the [I.name]'s buffer.") - if(exchange_parts(user, I)) return @@ -72,26 +71,21 @@ if(anchored) anchored = 0 to_chat(user, " The [src] can now be moved.") - else if(!anchored) anchored = 1 to_chat(user, " The [src] is now secured.") - if(istype(W, /obj/item/weapon/screwdriver)) if(stage == 0) playsound(src, 'sound/items/Screwdriver.ogg', 50, 1) to_chat(user, " You unscrew the telepad's tracking beacon.") - stage = 1 else if(stage == 1) playsound(src, 'sound/items/Screwdriver.ogg', 50, 1) to_chat(user, " You screw in the telepad's tracking beacon.") - stage = 0 if(istype(W, /obj/item/weapon/weldingtool) && stage == 1) playsound(src, 'sound/items/Welder.ogg', 50, 1) to_chat(user, " You disassemble the telepad.") - new /obj/item/stack/sheet/metal(get_turf(src)) new /obj/item/stack/sheet/glass(get_turf(src)) qdel(src) @@ -108,7 +102,6 @@ /obj/item/device/telepad_beacon/attack_self(mob/user as mob) if(user) to_chat(user, " Locked In") - new /obj/machinery/telepad_cargo(user.loc) playsound(src, 'sound/effects/pop.ogg', 100, 1, 1) qdel(src) @@ -144,7 +137,6 @@ ..(user) to_chat(user, "There are [round(rcell.charge/chargecost)] charge\s left.") - /obj/item/weapon/rcs/Destroy() if(rcell) qdel(rcell) @@ -157,13 +149,11 @@ mode = 1 playsound(src.loc, 'sound/effects/pop.ogg', 50, 0) to_chat(user, " The telepad locator has become uncalibrated.") - else mode = 0 playsound(src.loc, 'sound/effects/pop.ogg', 50, 0) to_chat(user, " You calibrate the telepad locator.") - /obj/item/weapon/rcs/emag_act(user as mob) if(!emagged) emagged = 1 @@ -171,5 +161,4 @@ s.set_up(5, 1, src) s.start() to_chat(user, " You emag the RCS. Activate it to toggle between modes.") - return diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm index 0c077bd1698..2640b61bd33 100644 --- a/code/modules/telesci/telesci_computer.dm +++ b/code/modules/telesci/telesci_computer.dm @@ -46,7 +46,6 @@ ..(user) to_chat(user, "There are [crystals.len ? crystals.len : "no"] bluespace crystal\s in the crystal slots.") - /obj/machinery/computer/telescience/initialize() ..() for(var/i = 1; i <= starting_crystals; i++) @@ -56,7 +55,6 @@ if(istype(W, /obj/item/weapon/ore/bluespace_crystal)) if(crystals.len >= max_crystals) to_chat(user, "There are not enough crystal slots.") - return user.drop_item() crystals += W @@ -76,7 +74,6 @@ telepad = M.buffer M.buffer = null to_chat(user, "You upload the data from the [W.name]'s buffer.") - updateUsrDialog() else ..() @@ -84,12 +81,10 @@ /obj/machinery/computer/telescience/emag_act(user as mob) if (!emagged) to_chat(user, "\blue You scramble the Telescience authentication key to an unknown signal. You should be able to teleport to more places now!") - emagged = 1 else to_chat(user, "\red The machine seems unaffected by the card swipe...") - /obj/machinery/computer/telescience/attack_ai(mob/user) src.attack_hand(user) diff --git a/code/modules/vehicle/train/train.dm b/code/modules/vehicle/train/train.dm index 33f5260728e..ea84d92c4ed 100644 --- a/code/modules/vehicle/train/train.dm +++ b/code/modules/vehicle/train/train.dm @@ -67,7 +67,6 @@ if(istype(load, /mob/living/carbon/human)) var/mob/living/D = load to_chat(D, "\red You hit [M]!") - msg_admin_attack("[key_name_admin(D)] hit [key_name_admin(M)] with [src].") @@ -88,7 +87,6 @@ var/turf/T = get_step_to(src, get_step(src, direction)) if(!T) to_chat(user, "You can't find a clear area to step onto.") - return 0 if(user != load) @@ -101,7 +99,6 @@ to_chat(user, "\blue You climb down from [src].") - return 1 /obj/vehicle/train/MouseDrop_T(var/atom/movable/C, mob/user as mob) @@ -113,7 +110,6 @@ if(!load(C)) to_chat(user, "\red You were unable to load [C] on [src].") - /obj/vehicle/train/attack_hand(mob/user as mob) if(user.stat || user.restrained() || !Adjacent(user)) return 0 @@ -150,17 +146,14 @@ /obj/vehicle/train/proc/attach_to(obj/vehicle/train/T, mob/user) if (get_dist(src, T) > 1) to_chat(user, "\red [src] is too far away from [T] to hitch them together.") - return if (lead) to_chat(user, "\red [src] is already hitched to something.") - return if (T.tow) to_chat(user, "\red [T] is already towing something.") - return //check for cycles. @@ -168,7 +161,6 @@ while (next_car) if (next_car == src) to_chat(user, "\red That seems very silly.") - return next_car = next_car.lead @@ -180,7 +172,6 @@ if(user) to_chat(user, "\blue You hitch [src] to [T].") - update_stats() @@ -188,7 +179,6 @@ /obj/vehicle/train/proc/unattach(mob/user) if (!lead) to_chat(user, "\red [src] is not hitched to anything.") - return lead.tow = null diff --git a/code/modules/vehicle/train/trains/ambulance.dm b/code/modules/vehicle/train/trains/ambulance.dm index 47bbaf647e0..6ef9e9822b2 100644 --- a/code/modules/vehicle/train/trains/ambulance.dm +++ b/code/modules/vehicle/train/trains/ambulance.dm @@ -143,7 +143,6 @@ if(is_train_head() && istype(load, /mob/living/carbon/human)) var/mob/living/carbon/human/D = load to_chat(D, "\red \b You ran over [H]!") - visible_message("\red \The [src] ran over [H]!") attack_log += text("\[[time_stamp()]\] ran over [key_name(H)], driven by [key_name(D)]") msg_admin_attack("[key_name_admin(D)] ran over [key_name_admin(H)]") @@ -171,7 +170,6 @@ if(..(user, 1)) to_chat(user, "The power light is [on ? "on" : "off"].\nThere are[key ? "" : " no"] keys in the ignition.") - /obj/vehicle/train/ambulance/engine/verb/check_power() set name = "Check power level" set category = "Object" @@ -182,12 +180,10 @@ if(!cell) to_chat(usr, "There is no power cell installed in [src].") - return to_chat(usr, "The power meter reads [round(cell.percent(), 0.01)]%") - /obj/vehicle/train/ambulance/engine/verb/start_engine() set name = "Start engine" set category = "Object" @@ -198,21 +194,17 @@ if(on) to_chat(usr, "The engine is already running.") - return turn_on() if (on) to_chat(usr, "You start [src]'s engine.") - else if(cell.charge < charge_use) to_chat(usr, "[src] is out of power.") - else to_chat(usr, "[src]'s engine won't start.") - /obj/vehicle/train/ambulance/engine/verb/stop_engine() set name = "Stop engine" set category = "Object" @@ -223,14 +215,12 @@ if(!on) to_chat(usr, "The engine is already stopped.") - return turn_off() if (!on) to_chat(usr, "You stop [src]'s engine.") - /obj/vehicle/train/ambulance/engine/verb/remove_key() set name = "Remove key" set category = "Object" diff --git a/code/modules/vehicle/train/trains/cargo/cargo_train.dm b/code/modules/vehicle/train/trains/cargo/cargo_train.dm index e36982ef1af..8df907b1420 100644 --- a/code/modules/vehicle/train/trains/cargo/cargo_train.dm +++ b/code/modules/vehicle/train/trains/cargo/cargo_train.dm @@ -139,7 +139,6 @@ if(is_train_head() && istype(load, /mob/living/carbon/human)) var/mob/living/carbon/human/D = load to_chat(D, "\red \b You ran over [H]!") - visible_message("\red \The [src] ran over [H]!") attack_log += text("\[[time_stamp()]\] ran over [key_name(H)], driven by [key_name(D)]") msg_admin_attack("[key_name_admin(D)] ran over [key_name_admin(H)]") @@ -168,10 +167,8 @@ return to_chat(user, "The power light is [on ? "on" : "off"].\nThere are[key ? "" : " no"] keys in the ignition.") - to_chat(user, "The charge meter reads [cell? round(cell.percent(), 0.01) : 0]%") - /obj/vehicle/train/cargo/engine/verb/start_engine() set name = "Start engine" set category = "Object" @@ -182,21 +179,17 @@ if(on) to_chat(usr, "The engine is already running.") - return turn_on() if (on) to_chat(usr, "You start [src]'s engine.") - else if(cell.charge < charge_use) to_chat(usr, "[src] is out of power.") - else to_chat(usr, "[src]'s engine won't start.") - /obj/vehicle/train/cargo/engine/verb/stop_engine() set name = "Stop engine" set category = "Object" @@ -207,14 +200,12 @@ if(!on) to_chat(usr, "The engine is already stopped.") - return turn_off() if (!on) to_chat(usr, "You stop [src]'s engine.") - /obj/vehicle/train/cargo/engine/verb/remove_key() set name = "Remove key" set category = "Object" diff --git a/code/modules/vehicle/vehicle.dm b/code/modules/vehicle/vehicle.dm index 42bcf1a9521..105f02148b7 100644 --- a/code/modules/vehicle/vehicle.dm +++ b/code/modules/vehicle/vehicle.dm @@ -87,7 +87,6 @@ open = !open update_icon() to_chat(user, "Maintenance panel is now [open ? "opened" : "closed"].") - else if(istype(W, /obj/item/weapon/crowbar) && cell && open) remove_cell(user) @@ -102,13 +101,10 @@ user.visible_message("\red [user] repairs [src]!","\blue You repair [src]!") else to_chat(user, "Unable to repair with the maintenance panel closed.") - else to_chat(user, "[src] does not need a repair.") - else to_chat(user, "Unable to repair while [src] is off.") - else if(hasvar(W,"force") && hasvar(W,"damtype")) switch(W.damtype) if("fire") @@ -211,7 +207,6 @@ locked = 0 to_chat(user, "You bypass [src]'s controls.") - /obj/vehicle/proc/explode() src.visible_message("\red [src] blows apart!", 1) var/turf/Tsec = get_turf(src) @@ -269,13 +264,11 @@ powercheck() to_chat(usr, "You install [C] in [src].") - /obj/vehicle/proc/remove_cell(var/mob/living/carbon/human/H) if(!cell) return to_chat(usr, "You remove [cell] from [src].") - cell.forceMove(get_turf(H)) H.put_in_hands(cell) cell = null diff --git a/code/world.dm b/code/world.dm index 3a0c990ae46..5ccf544ed59 100644 --- a/code/world.dm +++ b/code/world.dm @@ -83,18 +83,13 @@ var/global/datum/global_init/init = new () //world/Topic(href, href_list[]) // to_chat(world, "Received a Topic() call!") - // to_chat(world, "[href]") - // for(var/a in href_list) // to_chat(world, "[a]") - // if(href_list["hello"]) // to_chat(world, "Hello world!") - // return "Hello world!" // to_chat(world, "End of Topic() call.") - // ..() var/world_topic_spam_protect_ip = "0.0.0.0" @@ -186,15 +181,12 @@ var/world_topic_spam_protect_time = world.timeofday C.irc_admin = input["sender"] to_chat(C, 'sound/effects/adminhelp.ogg') - to_chat(C, message) - for(var/client/A in admins) if(A != C) to_chat(A, amessage) - return "Message Successful" else if("notes" in input) @@ -217,7 +209,6 @@ var/world_topic_spam_protect_time = world.timeofday for(var/client/C in clients) to_chat(C, "PR: [input["announce"]]") - /proc/keySpamProtect(var/addr) if(world_topic_spam_protect_ip == addr && abs(world_topic_spam_protect_time - world.time) < 50) spawn(50) @@ -235,7 +226,6 @@ var/world_topic_spam_protect_time = world.timeofday log_admin("[key_name(usr)] has requested an immediate world restart via client side debugging tools") spawn(0) to_chat(world, "Rebooting world immediately due to host request") - return ..(1) var/delay if(!isnull(time)) @@ -244,16 +234,13 @@ var/world_topic_spam_protect_time = world.timeofday delay = ticker.restart_timeout if(ticker.delay_end) to_chat(world, "An admin has delayed the round end.") - return to_chat(world, "Rebooting world in [delay/10] [delay > 10 ? "seconds" : "second"]. [reason]") - sleep(delay) if(blackbox) blackbox.save_all_data_to_sql() if(ticker.delay_end) to_chat(world, "Reboot was cancelled by an admin.") - return feedback_set_details("[feedback_c]","[feedback_r]") log_game("Rebooting world. [reason]") @@ -263,7 +250,6 @@ var/world_topic_spam_protect_time = world.timeofday to_chat(world, sound(pick('sound/AI/newroundsexy.ogg','sound/misc/apcdestroyed.ogg','sound/misc/bangindonk.ogg')))// random end sounds!! - LastyBatsy - processScheduler.stop() for(var/client/C in clients) @@ -289,7 +275,6 @@ var/world_topic_spam_protect_time = world.timeofday if(!istype(C.mob, /mob/dead)) log_access("AFK: [key_name(C)]") to_chat(C, "\red You have been inactive for more than 10 minutes and have been disconnected.") - del(C) if ( ((world.timeofday - sleep_check) > work_length) || ((world.timeofday - sleep_check) < 0) ) sleep(sleep_length) @@ -338,7 +323,6 @@ var/world_topic_spam_protect_time = world.timeofday fdel(F) to_chat(F, the_mode) - /hook/startup/proc/loadMusic() for(var/obj/machinery/media/jukebox/J in machines) J.process() From 522c0b16d3d5fc24e3a78f8adb0b677824bb9c30 Mon Sep 17 00:00:00 2001 From: Isaac Erwin Date: Tue, 5 Apr 2016 14:24:32 -0400 Subject: [PATCH 305/328] Fixes knee-high rainbow socks Knee-high rainbow socks are no longer one pixel too far to the right --- icons/mob/underwear.dmi | Bin 53161 -> 53158 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/underwear.dmi b/icons/mob/underwear.dmi index 928163c75ece63c4e68d2cbbe04ee55aef82338c..c212261f9ec2bf8c21874e1c701c2703148e8764 100644 GIT binary patch delta 29815 zcmY(q1z1#F_da|O1w~4cjzLr~=$2LxkPxIB>F&-0qI8IKj(~KRG)Q-Mm*kMb(8K%> z@AJIx_x-MGm>Krjb7Jki*1qqx?wt$A%z|T5MVD#D$yYF~wFdaR*u(x*SyFu^iM1Yt0)c#Q;wBy|CvSyv!z3 z@{t^2m_CuUdu#yjs+F+CtsM99N_UKJTFi`$j;YzJ=9W!}L1#r&=zDG0mpvEM^j>(` zOAMd}cE|raT<1#ZmAta`B1}{FS*m%M`!#CA#YGSLGHuwjQpfi?kse?vNTh1;@2jBQo=gOm=3srIz4Pr>&G2(P`Uo_^^U- zdsBmf4a>J$78!-pI;wyUHp_*2bzqg>+N{=Bzc-dCbsvPr*w_iXA}#Gr*Q?at-rf{s zn!M>uJD9DgxDco6)$5)nf45YPan1a|-yf^g8|6OOcy|stZWVLtG~uF%h>MF`ohmiR zDJ~|3I`ScIT~nbA&ysqu8=9El`$l(<>#mh7Zi%BGe$OSimKc{UzRPIqr20YN)((J= z+7brtHzr(M5k&-UhDUguc(E2;2TAN`s>38fa=%IB{K&-Z+fd&WCyW}F#(T7=>!Iar z<>{3-mKCIYz^5mPhjcy<3J_|3I9h83Rd95AH51>;w08+2!mK0lk6@h;pyb#k!Q-y8 zXrS2kVM}Mst)_@)-C5d z{!w_>H99eCo3Ap)OK*~97RD!5LMF1!))-Zb3&TK{&)}{T6L|H$gr(^o0RS!VUhIuh z`5+w%MgZ2422f`t|F3cOEj0n?}jv@TA<*VE#vdQfzqQbYwXq!PaOUUHY770wFK6>GE|&l(L#}R)-}0H3 zt4!1DC4pvF#{kR_b5Fo9iFqo{k|y9&R}DsZK55jCOJTN-%f(&iS9R!`R5pBa+j62q zi3fNoc_Z+851qODK>B07K$p;LVyb-MqiOT6x}vDOd%)~oZFr&C)kB~7<-IA=&^l)0*8UHDOJ6SM z<4Rc}BWcV`z2S-@P|+PN^9a+qTUub!XW9|^LzZQAT3)u7TUMAn^y>qBRpfTdn8O~y zu;(r3FRjX$I&s%z6SO~1PMp0^$qwMa8zUnlt%L+BAy2j0QiFi&wZSGs0&NgBXU&5T zefUg~J^}CUOqI4)=q`(+Y8*D`=WO=oY7~ycphir7=ba(g7m)&HMrP9OeGMj2_V9~3 zmDUyeEhK&$O``yFd2aP+?(*m)2Kb6Zpp^3Koa6kkpJj5-Z4&G0&v)d&9jvRu-`T}U zv0o8#Fr4GngDU;WB5gHc6y}dTFGknt@YEFk)s>IF@m|^oWz;zyFhn-!qh06RKCmeE zeI701iM40hh%PTT5Ei5e2{DrF7*^8?eKI}G``v4MBfRet2BdrYe=;DTW5@_R%cx!c zQ@z7|^=JNw@HP3nl2QrK<{?iAXH^!A2Xg-8&FM5Bi)n;f z@3Q@E3+A-xl@;5Js@dxoe;uD3188Mwyon;uN259Jqt{z=gXLQm$D| zbKhG#YuiGj)^?7N%z~qB63bdBW0+6y)${uuwS+-CU)v!-#S7a1F*#fEGny(}>r`;U z_|zK&SED^WJ)AU(4h{}l0xy>~=H})K;4BgMo%WN8Os=%-THC|E4dbR*oeF1{H0tCixeMAo6BUQ!ee1b`s7p0+ z-e2bPc#%T=bNVS=;syJ@E9`##N#IYr)=o9bdL0&f`^I9M!G6@enVA_@y%zSs%Y<>N z256z;jFM3&dtj|yh&&!UF3HxB1ooz9*HLaXoH%OX1`xnLP-Lh_$HbVyqvJS8eWDtQErHIW8Z2Px z)+Y?scM34cBHgjeMn9I~8my>ubvo>){QLv1DPd7`8nz&Gk_v18hk}m=NW?~8P}r#l zQoO`1?h;%hSnknWY|BaE|5$593H)%Jr{qHog2l<@z|@Re%X={RhKV#N{davG8mvuB>#x=+=&Q)mHgI za)0s%;l8w%{w8wVULUMm7`Of2+`fg;m&C&|a2`C$(f#9O0$S(v=|3>4e%;1~$79^m zM~zD9oV~sY5%`OLeaeJ>Kr;~tC~6{j#&QML%jxnMgc_Hx`4cjho2-g`zz3F~H|V=T zFJ2nP^@u0Rvi)ND@89a$LMT31)%vQ6-hvuTT2lOo z9VA}g+lat+G>PAFR*WjoBo2_>IG*Io=#zeaQL^pP)qtaNmR>9e zzoTL1vGek^PQA*kEiYE1mTZw=4f2s4ih_)hZ^n~^Z8+}Y62v4lX{r9T^ZM*NH5@^CY0&Kx z!M%wKalL!wX^~ zBZXoxJra2{|K(4GwztJQFMjvn0>4cF_w8+;+Cid3+3BbiRTY(v1emq|=C$zAK1j>G za%HlyI~hg`2ib9)f~o?A^DK^x^4yMB{5F{#S2VvnfeRW-Uo4c&(SAHIJ1_Hth?X4D`sbo9QE_n4 zl*DIm{<1e8Uoxc2{e0CyA99`Osw~qc^zb+eFIeIA11~ylwqMQcJ7D{J!rO0dUagNS zYaBn*-i2N(1%6S>iGoq`o}QrS^!cCeC|p21j3N`yC`tXN#$pbaaUYqZi;MImf*`K9 zJuxW>qf7X-69y(@{Eh&xR)zRbR{V;`VH(^?c&CdXC{>JR0nepL@B?o8sp`0WJw(0> zAu+>@=^c~vm+>;7dRc+h+7U)c4lwG}tCaF1u_VCXK~(0~`^d}vj{c;||51b1t8-i+)^eVYZV%L9DH{|d!`(*i+wwx> z0o(6}Cgf1dr3!R+gpy}8k%qnueE??-H?uP{mm4qlM!8bGFU&~7#51=Uf<!R*@v^9Kx2%^L6M!O_=hIe2(tA_X9#qC%4Vf#H@f0Kshx zV6`)%Qv&Aobezn3t~wH;lo&ubNF$gRm(QJ%PA;M4R_*CDF-|kAsmav_lUw90= zhG{lljh)&^hdg=`eZw$v*u7Ehx7tEkBP3K9S(voC=uf-{f!~n}`$7O~Y%l9ut)|Ls zY+z}EbBYsBuVcxiv=?qtDml7g87~Z%-4ZYw1rV`%BCi0F&6;entV{Fg>r>Iq1?F`H29pmOmd1PS&0PgeS#tAI;X}4XUA;C= z5-Eb=Vm-Kf8vs6J6UoZTK7al^@Rb8E)ria{G`G}0etb|?R`x9+;oeOG2_WRi$dlQ; z8I9_#N2{hbHWH$uep~cornMb^HW0=EHmhr%Fpe-#p4}_l60&RHfm+^`x7NW*h=MTY zrFCskzhfOnGJ9%=TAz?h#yQp9a#`9*0uF!M;^_)A3cmD@hFO{IG1Hu~iTCDNL7`V= z8p{)$)uZ|iq^O3Vh>lbmBl=@#{*v>g=);UWME*<1sk}Re2!kNv0$DtX&&eFrN*FgE z_Y!&fFlhD{h`xT4G=y>KL(#9RtxXLq4NJhTYC9eBNgn^)smaxpzU4cT9W zme6N(Yb?wdasev*03DLMw}*y@eRp;&M~|Z(;9`ALSHG7%dXE;2{Thu*8O_g6lFJ?q zfU}!Iujnc9vjQs06E4|hde#UytVcq^o-Th zhY}gJ!{f|cCU30txhp246QQ%P8cdPm zwq&(?s;m-&s-OB3xkmQUTow~09j}U@c{6wU`3~OU+qr99bODYKYl-nr?%qOYCv1)St3DP+&Q4!fXCoX# z2wDj;lUGz#t!@ryn3|ivg$RF9%{qnU>@QhR+o7N9W`GnGiNa|F!91Rzq<1PRvEFkc zv_4r`S=GCcYq=|44QEI|A<8JPF%sf%I|~hz@7}$0pI(d84TsV&(&Kl0m^6Pa{q1F$ zTqGqX)`K!IS(C3BD)jtL#AU;*uf?LC87~>v&ez`a%*g7fU`+mqMyz%+%Tr8J~N3cyhRoL(i(Cg*{QEcZV(OqqmV<++U1ORhxpbXOuR0&=kw7Np^dw6>KUh!l| zVq)TB!2m2SoW_Cz86pmN5blrodrYrhaUh9kw=p-P4v7|fhj?g`np|brIlgr-C3fqx zM=9s4m<8dIf3CP3NphGNfX+0DXC9k$d($SNzO$C@O(bqe9Zc!U7YhsH{wDXrN|kJky^Of@T>MwgRf*>ixqZBupc&y3$31c=TvC z2-*;5v*f?_JX~ql5ET`L8}C7Bo%*8ze&gO}?W>2IviqoZBNEd3vvh8?)@K>y8e?+N zheW-G+gD`+_B#Xu2RF-9spFOc@OvavdU#e)pt=n&v;#5>;8vEM$u6{mat7tj8(nBCCz}T#Wl$E|7@G zl$5aSRQDdsZXp5Wm|_>ikf7GXfdcjStL*m!TGLW^AvS2c(smClP%FKqg2*jJ5D1;o zLRo)*;#VpnbAuK1uHmNJZN|C=L?w(z3^b}cn6;MEWz~(}%8rSsJ)oq37ev=x2L!Of z3ywCj_9S>L-&s8=Y2s69Y~q_hk5t1My^{K|LVCYu?KA&QUa>()FFa+E79K85`M@BB zlV&1pL22{?z5)it891R*_C2w=lVo}Hy7f8zZlFtgngz6Cu#&ZLO=|f;*@%^|q&kwd z#kgMOC)D^Mq%0E;69k3{dkmXD-#P0PzGmC3?t9DWl)lAI!K%I<0aLZ~UJo>4zx+fI zVP%Q0`o7En=(5RG9xlO8lm^#e-ht?=LA02YQzd)< z_O|&Pv(uz@{Od0A(7vqdYBJ|KYT#4VtP=|_mA|EkYJpnh5D?6)#;uQ*h!NlU?Th){ zoPr}j`07mzBe3*w{y8y!E1P;HH@us@2+|xR_zP!ufpO3!Uh#D{_y?rp>S@b0e-;xBY$I=Q4%~3BcsWCoBNm@Src(mXq!SmVk`hCn<#z*ZW7R7#5 z;WMDp|D4sxc42S+c`5!Y8&iroOJhUBAVG_sjQ6;)mq^OQ5IQd)+4YOz~n zRFH|GN{5L`#CPxVT9&x*{&)*N3PGxtf}EkP`NAH~Vp{0zqS_GDQ6A!8QTT!&_fV}+ z1$7-FMmHm}#*U17tO(~A`3Ib%j)G^&fKX<%7cAxaSHinp%@A@R8uTpO7hG86F3(*& zq{ad`n4Om$28$Ih$jNpunP-pQ@Blwt_h3Ie{!ST0umNg~o^Ch4PI+-5&ZO-Aet1vxXU!EV!?+v%pwh|{d_botxhG55;|7{wfrw|PIQBp#9dAc8G z-ln0UF%{Q%3_b%yWM#v2idxQs1C2ee&JF>e2;pnB8PUTDRp-)I-p5`t(oH122XY0P zNdZfmA}-Rm2|Nub*y$tQZtTXWp%Knn&gYa_oxhQzXeV;(wobC%o=@6v|J8u2%_{{g zt<@2`<;2#J-c)FP{~Gv=G_~Xo<5*CAX~L(;{?Ew2Gy)Aq zg3L|pOr!cs7bijS-XAr|ycYOY4L3SV{f<&>%@ZeOT3hQ{ce%K=-nzq2|$rg@rvbIpgL= zb8j5;s?qO`&Wp7%WG>4Tc@qDryqLXxcciYo)!FyjT1oi=xqH=69f3>qGEweaK^6I~(DU<-_rh!=Ou6yOwwHktu!%T9)39*(z_%3nXYU{Lp#!N_yz8I;s2hG4me0>0bL} zf7H3X$m<3PeS%ptUFQy~S&yHT=o#X`S!4gkVNY*+fs>_WBhT~h!yndCCIfZ|*}r8| zM{laE1x&PdT0%pj>>cP>H7cc6S*)+Lm`R~mHCuEL#HElv@#l{W*y%C*R`}$~C;r@D ziRU@-OG*-K6j+aHb6^Ic#6MyATWA&ime;Lb=WLa%VrKTjd3T2R^i`M4%&BSy!jMpCSu9$Q= z?W3@z@_sH?duq{(Im&~=E8SLK3aaYKumO^DgKetmjKkAOVbMgVN1XYXy1iX(0Zr%N zuv0yS*#|sDEm%^~*3tRU%nVNPWWLE&C1c2>zj)xRCh$Qg;Fs z2i5g1uVLEYwa0D*OV!r;QA<#EnYDh@)mI|z+Iy(gUaKr45$VQXA1|S=wdeI~{yR_+ z$X@i9^;`6reNu(-nQ-Hr|IHs}=Ph=8VMcta`+1VWbL5=P$s-D~a0kVK>&Bbw@>$o;5HTjaa&P4yV7atmnd0=O#@a50J02#}cY#Ci=C9uZIsY7J(J=r!dFXXQh*X4yeogho?)cdhVZy8&KRMsE&3e6L zuW^_i7Gbfdi(X{xH*fE$<4JM{7aIDZ=6QYGXJ|;p&3uwT0jhe*_^xErqWAx~hW{bN4g7&24$yBAU zucKDqnDsAp&^woYc*qsd`&7LgtqZS<%yoO1iM24tl&D+!T8ArWfX5#`aG`Kg%88K`;3ctUz=q_621pL{~4OyQv~CyDB-j0JXAn;u9$+LNtOh zW7!?$;OS0F2~Sr1n!+(4I?<>ti738r2E zuSYiS za-COr*u${sacTE$`8ZK6YH^YsZ9@CAY@CI~e= z=t|;xtSkga~MR~1+mMut``|Mxm@za6^ zM=PLcn_^6&MG_7QQqXh_)>15cv0!X^u?;#aEuddkK4jbN{m^i(t;H~a-zF5e!e{3! zzhu{jY?d*^X?l)3>+^R@?M&fL2d<^6Y8(m9*8^yoZEd?IS0nr{Qi$UWu9CYpztE3_`L7u~Gj{RnLGTlmK)}gz4=yRAtoIMwm<6`0hT7v#G|eNzVQm&9%ZMk)@3;oiYqCPb^=WK|dxjs$D{# zkxA)zFz;OqqLFnY*e#*A73|QI93@xRq!JtXB4eD;Lt(uQd-Tvq)JT8FUtZvpATbz2 zq+5~`T=6Q=el~DhiE>eb#_eg5bsURsQD*J=BJavP*=j;4d523^gR2{wVc~XsQc}K& zfh$aYTmY(G9=JD19jg{;1tn8CNbnKFI-H`Y1wUfb@oNm*kJofPXKX&-ZwNu#T9l}h z(Q((nQ8yh;@q`y|T=wHg)C?vVI1%Poc?YA&zwm)L9G{QP#k2P%895~aBlDp*^u44j$p zVInbP@92Xv(=U){zUJ;EOWsH+Er4aGRI!-^1jeKuo@?t1D15D{*d43pB#w zRVIMfbP9_)w@ObLRT*3jxY+$&IkIcU-p}|Q74k`ry0&i3`}Kg}HF?(c7SCBgYtS9^ z8D$;|W1F%EK{{jp-TC3cq4{U3O_zqy{i8DohEIk&b8PuOHe}yAThxuCXbsKVt@i3` z-`sm0dNO!PF$7&LDvuzUUGr)IRGdFG|G9w1!^7*TP`Cs4H!E2){%*Mrs##FG4at^sAHIygM_akVs0sFJ(G2a(FMtz+=i9X`p4L4}jMu7K-~ z^aHE&&J?dbun093=f8jkhtT(eMsZODMRou`xQy~+?C~R ze$UMy|7F|SAtL zfNB9p5>4h^`kp9{ce{yh%b`1J-hW)-7{7^{r7t#*t9E6EdCYT1C|{Iv)=zf>KQ^~R z|5q!?I~JE>jAD>825ip`mj7?_+8`DgpftC&lQH^FIpmHD%}eV&nJpyCVs!J8%^h0w z9O&W+vSIqnc3SIJ`70f6)TGoWDdw&wiNY9w)Q z1l4}|;a1JXB`h_*0C7dPQF8rEZFDW>pPEQ`A~TE6Sc1H@P`j&P`^bSY!;xVf@-%hY ztTx=nM5!3mP0|g1AXVv|&I@{4c>}o|X>*>zQ2oT{Kk6$XWwgiX-nbKU{lVLYYm|4> zzx?0~Rf>SWBb(dbM|^A1lhzrc$VL*|r4oCIRxq zh$6xHv%Q~jgt%A%g*-oTH;XCCrr2y4!rk~WfVk-O?KQx*Z#Jm2@loW3p4N3~Ow775 zz-uJ1D7-F69F^q#1RTN#;(6`#3#dxf=wx@#j84WCiqR-58+MB~Bv3lS{!dq=A{$Bl zpkciH@E_N*dAkH2xnG(rq_QgsKMC4!bz6tUmrQq1(INEEwT5gf9&j}AsBa^SFUIv$ z96vmUPVu*UPjM1vL&8o@uf+MTQ{lB;rDY&*-$e zTeT=YJu`D=^&Pny>$Hy`f6sx8TCoWm_2Va)Ba<@PdFI1kJn7j{mg-LR@NE9DeaCIk zO3i#R7@8BN0%QOnuwSzq{TOq|mDLAox;e5TShdwZ#*PHFy`C5%Lau5rI;ue=bkLn~ z(8F4E`F!9p%s~=sEPh@|j~Baz%&!mE@@KB#fMJmA%EV{JE_UH`p+P>11YWyzM=t|s z#jnd$cMWjaIZE&(C|6}-{nh8ooykqxbB<|3!l!k@uzweK0*n3UbyeHhuPvRITe`*Ar^#*L{ zz}ZyKNc=QdBC`nRCC$sp9$4OH)W>auFTjibA-fCxiO46$fDyMJWjGUeKx;}s&%OyA zS@fk=(Umtnkle$~5Dea1%Q7#zg7EcBmG!5jQmn5T-%ZZBCyOz*+5Q-BKHl07+6qCv z$v+h+`)?u5jb0&EDEsge?cS8dVy*8X9IY=Px?GX1_b{nd`TI+4T4V2OjE9rTwA@fh zI=07k!0>-f-*VvDJB@JBunn1sJNoMZl(e9o_MM;$x1PPr*JG{&V)ML;8#eFOcJ%1@l|BY*&RRV&Uc2=t|29bMgI!^Sv|uG{MKU01 zaDg27Y2NRal~IhL8fseI*8HYzh+F~7@w{`Q+Bk5ZxY8om5=V}6_d8n$2l+Vp@5|YR z(EM43&vB-?*4I4Yt~?#C^cj4ZYRLRnJ10#?C;!;(b#OJ%#URv#J&z*-%0bvUd7K^S zF^%`5J09$JkoAk(+}g8p28Bz;3Qa^~GNuB_>mEZZ(b%!fLDaSoHg;^SK^9MQv|>=L zRB~?ehjlyN0xyJrb!~&!ocOL|Sk()1dF!_kZv4J<9O3a)>KSuQ&qFJOex!T<%%zr` zlbGRz0&32SZ~1KB$<4e(-l6<6!k)Jn=4!BojS+ZD5kDy;$jMpc*OAi6i?yRwdr8=@ zVmY7n!SjdEj~6045oXTlUZJsuh_XuiXX5O02hX-K6JJ()uQmg$)}|o;pPiM9b5aVi`^6cO8k3K2aFRXQtd0;&~qNKI-}lDfkvnS;0g9|MkNPj1W;} zBgkUIQl1GS+`vlVFbO|?zom=_+Jw$BiiZrxQDwh5{BGvnsvGz3;|GTZERjMl8q5VF zQJ1G2K=o#N$c5!>g9i`rX?rYJVfFnZzn8mWP{q0f$x^$S{#Z^5)WC}7ap_I<^!{nN z#bCa!Y<1m6rl2R#{x2HI>xYwxz6{MKYn{%5=On0Bo)Z~Jem#8j-~25%sE?b=nyQa$ zk|f0AOZRVg2HU*%*N#|1Db85Y|Iu@NruAFF;O~*$RcYr>1hTVwtykSa`aZz5(P%x-_X{ey2=R6I z7;R$u+fK_I^(9B4L8Xp@mGa7bG&Rmd)61L@~df${R zM|%1FnWc=k5LB%vY03szG)cGS1rHBEe%#vDc0$~X@JVZrg{3y{tVL|(`t+)mWz!k zhjH!tAG1)ii`ObVGkJsj57N)Cc5T4?r!>~C-y7n>T9gz zHC?Of#}8U&dg2*h5kN8fL;H=v#&Q)Q(S=gi_9If#*8S6r!a_XnCRlrWdryU1tle<> zyBW8QlmI2NkHfC1E(>mI6{eB&9rQ`}i0C&vKodxHZrSqX-b+I#Xvvq?(!vdC|GcuI z56RnJj5Z>Q>NshQ&s+t6wglSG-~1v$jwZ=cN?O`!)u2*C-OMZ(N1ZyN(=R=p4sxqU z#Kg_3htEd`1_vi0wel+R8_ts+CuwPEWFJF>)pOiwAClDlwxiV9gZd3_Kx8u28iZDN zaj&{+Ypl6VUh5|6ekP`zzn4&oIS#Vm9H4xTGPO4IT|JqV?e9QlvoITNQQFOU*U{YP zX_&jK<2d||{psqBo6}Or(O^eN)29!wtV?sk%fg`YKU6=5iVRXxQc%@vcx>z^ME#*A zdwY9%6_u>MK>L)kGIkKM_2x#=tzpB$9j%C5#q9L#Z0yrt*I9$k2^WwRp`saN$dcLJ zgHvyYoB?qfKF7OI^JtdrXjqP=thGS4Y!X(}VuWY_es}EHgD?^v-SqQltG2U4sEP?q z8_1@R5^2eiFJ_Z6Hz!BL&W_FA!6AnHV^LI6Qpm~*sIR1?)b)RVx$Ddi-M0WuL}St0 zMM+3z7#tjYqw>AE<@$O7$jE7BWq&KeO?qg5cKBf^*_ewWv$#3%NhM5Mv3A1}Ddw*r zX$;aTAtB-7LZ(WS$Jb_TEPetuoP$Olt`hB?LhqTIlx`VWST^9;*rvGaQ~9-1gk5(Q zR7}?;?ax+Y))an((;oBn?PH@0I{ne69%~?X9q23_{x%w*Kwn(Xdd>4&_N@bj1X~n+}De{XzsDgb!h^V-Pxw(e+U0(Y%2Y zdUIy&V*&SdJU`~wZe_ixxqR6KyQ!t;uFFBmws0yPdTHV5()=5VkPKl2&e>~*;H_Ih zwUw2XkUupC5iuN>B_~sjO-x8BfwBcG#&4Ck7*^VXh;EMhVq!;ck|T7VA(6Y_X_z7w>J98D$T!5GO1g}xR|5q~OpNZq+{`)Y?_BZXryN-cI5#q~HU=1^ zw>h>azNqg`F%c?AJ9?D63di5H5;EMogBs0gZ!X7D6v?wLWh4WX*Y3Y2$T6)|F!~)h)_kdRYl!2U3BU0b1$B@{(3u3&Ct1uaBTN#!F8+hK zn@b#2`}pB_lUfSmI1Wb6PI}O~E=mLLx_w|dbQ<-uGI+ z*1DX)djY2qAiKh# z=Z`-3BmiQvt6i$Zm}%jC7eXgGwgfkS?#xZt;jfxlG|LG3`}^&riOE20awhFsC5O6s zsQh)-o88mmv(~Wq_z_Msl)Bp*$+Vjkjv0NM`!lPm$s_Eu_dXSL9k-)(GbsE*LaQwq z!u0iex1*IJv}8Pm)E!7UaC1^@a!3qj2Icv#GI2hZ=jXrLyC86)9fP*9aMR%au+0G- zvDoBcLrTAqr{K;)7!-A+#%CauV*K;WQ}NzD`gypw(mXcDgO_!Wp-H;E;r*-m5;Qh3 zX|=9;!p~0`DR~=;NnThCxqtTGEsAJrQWkwL7!|m-|58?-=Da!F<$DVLd9r*T2j|$b zAWtYhNPZd*60K-&5iCUB-bZ&ep&`*ea=%5%*k2iR7Ckuk%)+asEW^;|06CoZ7w~Ag zpGB087$Gs%l+IC0m^KyR_^f)Yp_XmUk{p^Ej$TDfb!daKRn>D;iNM*X7K9!*skY+- zXY^U;rrX)F5K8zmWEl6%a6>$!QzEk`HK44idmy%Iv6DqNinqR%yDJUqSw~j1^hK4@%bb-5$>xV1- zyJfQ34;K0?+z#Fx3tX`RTz*(U|)PZAX6{s9fXTo9bA(RQqI-wrPRZQ9n<)Y!Y_@O=myPVjr~5e^gb)2B6%ih`T#qZEfuk zq`v~l_?-(ly*{|Py?zDl12I@xW9K4zY;Iy?v{ec!D=A4vw5oOH^~aB!hmBTf6b6dX zNmZQJEPCuW$efs1l^jCQLJxI;Obm8?tF!;D$H*2!wiS@5n8Pkt%A+sEg&o)o6pw_% z31Vh~$f`VFTbP->G1g#=8@t*mS6D5b-4%Tq*9-|Mf6BszQi7zFXXbV;Ja4K|Ib$C{ z5`u_3KHpt+G^)SNSG$$dH^TNx{i87i?N)C04i0wKY^2_o9aV#H0CZNpjZ_cjzeh)z zCXW%@+iJ$f^qjIGqr;qGxkDSF)ch(Qm%CLT<>kNq)z!Ik=Z;jL2~>uJ#FRH?7$5)o zLNV)xRm8I!1?xc5@S}!?dF^9x`2vyzLUFtH+|t@w+}*ua2U1;UZaVbz_Nu>sf6pg= z>lG6dBKNVE9Ra%g3RhIiEu9!3-1$krV>5B ziII`-BRj8n;J$d2oHTI`-4C}8Ws-R#k*7L$U|z?O+;%Hsnd?yquj65fnaC#+obbW8 z|MZs#ry6$EdRf#i2C1%6{v%_av1}EJy-{#)ri_k^OsO{hB?d$s95{eakm~i~1bq%i z`+}oe(I>t+`S}Js^NvK}FyZi-8I6Xk5owlpPEK5Td3ir6*dn357VAiNyHQ!5wAxw< zk%A9o1`0?nS%dlk2HC_fq`ICDYHDh1YqS&`Yo;-Lj*lIuF3wB7w(2=LLE9;zxh?BP zyWn}$-)COAP5(qt5Rx^OPY*$2xPk&k@Jp*6FjUFU&;KAuOa`QN!0f?02!NDP>gC1> z-UBGTdK!IPXu-`XEc{x)_?$;$&X$JXnbDg1o5km9Z#z3XI6_xfmqlCnqX1<5&F$?G zO(P{OkoE-gIdmZi6ZC{-3-XXc1i{_S+q*FpBPPXnl^3D`H}-8*N&^!D*<2R7cWP*zIx&mC9S-#Oe;tH&fKt7-7ke*|ArWB=2d`^7;$CtRu|dPoQ64de zoBH0JZqCuZ)$J)&xF$Bh#=%Dh&0cCAYbq!lV$&K6gaij4TS1t;HTs33zkT&%4yzf? zD}*k(rP^*)UO@r;4Dkmo_pMAof87S+PYTF)TFi0W&O2%l@wud=mrcA4p>;@%xK#_` z5J;aI&uRAX`lPB!4-)JpG9Gnr?d*toc<@7FWg=$~AgoHcQJ;#7`+Lt76)~ea39@Ty z)OkMb?(U9o=tFiqJ7^_nE>EkMAx>9;rneAybs%bVF?V$z8*rqF74zi;DzX z5j?0?pnT#%*sZ{X57!TSl?|6Vm~@Mh27deFY2;n{_}4G+iZUm~#*$=e)A%TQ35cc< zLeBDsrBv&k?$Fj~HX`fjXi#`kVIF&I<0uWBX(jlod@&p)E=4ii|KE(F^dz z+`^(2lEPmI0Kiiwo~ZC}{OIWDA9;B=93}%}y-*Yqg#K?cdZ)bXTz3e`x0~1O({gj~ zeaKeK(}BW*B{wAnB_(t$^VDm$!YrzzoHS1(^yw1>jN#{VX4&>}*QT5*Lb(1Q6zbgm{!~#`{_1sk zl2%hg4#5xz>r7SIz##9l{rl&AE-9QXYkXqj?Iat8Ee9VEdy

      3Yc6H=Zt(1 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 Date: Tue, 5 Apr 2016 17:54:07 -0400 Subject: [PATCH 306/328] Automatic changelog generation for PR #4097 --- html/changelogs/AutoChangeLog-pr-4097.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4097.yml diff --git a/html/changelogs/AutoChangeLog-pr-4097.yml b/html/changelogs/AutoChangeLog-pr-4097.yml new file mode 100644 index 00000000000..2fd1635f900 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4097.yml @@ -0,0 +1,5 @@ +author: Tastyfish +delete-after: True +changes: + - tweak: "Beepsky is no longer a pokemon." + - tweak: "pAI-controlled Bots now reliably speak human-understandable languages over the radio." From d20d47d734ad9a63f0f51276e6899ea31371d7e1 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 5 Apr 2016 18:34:36 -0400 Subject: [PATCH 307/328] Automatic changelog generation for PR #4095 --- html/changelogs/AutoChangeLog-pr-4095.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4095.yml diff --git a/html/changelogs/AutoChangeLog-pr-4095.yml b/html/changelogs/AutoChangeLog-pr-4095.yml new file mode 100644 index 00000000000..35d1abdf256 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4095.yml @@ -0,0 +1,7 @@ +author: Fox McCloud +delete-after: True +changes: + - rscadd: "Can spawn friendly animals with a new gold core reaction by injection with water" + - tweak: "Hostile animal spawn increased from 3 to 5 for hostile gold cores" + - tweak: "Swarmers, revenants, and morphs no longer gold core spawnable" + - bugfix: "Fixes invisible animal spawns from gold core/life reactions" From c2d999e730b9b83c72c5cfd36dabb5a80d748cbf Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 5 Apr 2016 18:34:42 -0400 Subject: [PATCH 308/328] Automatic changelog generation for PR #4096 --- html/changelogs/AutoChangeLog-pr-4096.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4096.yml diff --git a/html/changelogs/AutoChangeLog-pr-4096.yml b/html/changelogs/AutoChangeLog-pr-4096.yml new file mode 100644 index 00000000000..9b8e42710d2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4096.yml @@ -0,0 +1,4 @@ +author: Fox McCloud +delete-after: True +changes: + - rscadd: "Adds tape to the ArtVend" From 3d4e85f3e624b394e0479560dcafacf91a7ead04 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 5 Apr 2016 18:37:58 -0400 Subject: [PATCH 309/328] Automatic changelog generation for PR #4100 --- html/changelogs/AutoChangeLog-pr-4100.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4100.yml diff --git a/html/changelogs/AutoChangeLog-pr-4100.yml b/html/changelogs/AutoChangeLog-pr-4100.yml new file mode 100644 index 00000000000..783667ec9bb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4100.yml @@ -0,0 +1,4 @@ +author: Fox McCloud +delete-after: True +changes: + - tweak: "Can no longer use sentience potions on bots" From bb5e3bca6369b882dd80db4a58bcce37320ef055 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Tue, 5 Apr 2016 16:26:11 -0700 Subject: [PATCH 310/328] Fix remaining issues and sound shit --- code/__HELPERS/game.dm | 4 +- .../game/gamemodes/malfunction/malfunction.dm | 2 +- .../gamemodes/miniantags/morph/morph_event.dm | 4 +- .../gamemodes/miniantags/revenant/revenant.dm | 2 +- .../miniantags/slaughter/slaughter.dm | 2 +- code/game/gamemodes/shadowling/shadowling.dm | 3 +- .../shadowling/shadowling_abilities.dm | 2 +- .../special_shadowling_abilities.dm | 2 +- code/game/gamemodes/wizard/artefact.dm | 2 +- code/game/machinery/computer/cloning.dm | 2 +- code/game/objects/empulse.dm | 3 +- code/game/objects/explosion.dm | 2 +- code/game/sound.dm | 4 +- code/modules/admin/admin_memo.dm | 5 +- code/modules/admin/admin_verbs.dm | 2 +- code/modules/admin/topic.dm | 2 +- code/modules/admin/verbs/adminhelp.dm | 4 +- code/modules/admin/verbs/adminpm.dm | 2 +- code/modules/admin/verbs/playsound.dm | 12 ++--- code/modules/flufftext/Hallucination.dm | 46 +++++++++---------- .../living/simple_animal/friendly/mouse.dm | 4 +- code/modules/power/supermatter/supermatter.dm | 3 +- code/modules/projectiles/targeting.dm | 4 +- code/modules/reagents/Chemistry-Readme.dm | 6 +-- code/modules/shuttle/emergency.dm | 6 +-- code/modules/surgery/organs/organ_internal.dm | 2 +- code/world.dm | 2 +- 27 files changed, 65 insertions(+), 69 deletions(-) diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 3542948ae10..b386fce364f 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -486,14 +486,14 @@ proc/pollCandidates(var/Question, var/be_special_type, var/antag_age_check = 0, if(G.has_enabled_antagHUD) continue spawn(0) - to_chat(G, 'sound/misc/notice2.ogg')//Alerting them to their consideration + G << 'sound/misc/notice2.ogg'//Alerting them to their consideration switch(alert(G,Question,"Please answer in [poll_time/10] seconds!","Yes","No")) if("Yes") to_chat(G, "Choice registered: Yes.") if((world.time-time_passed)>poll_time)//If more than 30 game seconds passed. to_chat(G, "Sorry, you were too late for the consideration!") - to_chat(G, 'sound/machines/buzz-sigh.ogg') + G << 'sound/machines/buzz-sigh.ogg' return candidates += G if("No") diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm index ce257175636..79e864becf0 100644 --- a/code/game/gamemodes/malfunction/malfunction.dm +++ b/code/game/gamemodes/malfunction/malfunction.dm @@ -217,7 +217,7 @@ ticker.mode:to_nuke_or_not_to_nuke = 0 ticker.mode:explosion_in_progress = 1 for(var/mob/M in player_list) - to_chat(M, 'sound/machines/Alarm.ogg') + M << 'sound/machines/Alarm.ogg' var/obj/item/device/radio/R = new (src) var/AN = "Self-Destruct System" diff --git a/code/game/gamemodes/miniantags/morph/morph_event.dm b/code/game/gamemodes/miniantags/morph/morph_event.dm index 3a822467c66..2e11c65078c 100644 --- a/code/game/gamemodes/miniantags/morph/morph_event.dm +++ b/code/game/gamemodes/miniantags/morph/morph_event.dm @@ -9,7 +9,7 @@ return kill() var/mob/C = pick(candidates) key_of_morph = C.key - + if(!key_of_morph) return kill() @@ -23,7 +23,7 @@ player_mind.special_role = "Morph" ticker.mode.traitors |= player_mind to_chat(S, S.playstyle_string) - to_chat(S, 'sound/magic/Mutate.ogg') + S << 'sound/magic/Mutate.ogg' message_admins("[key_of_morph] has been made into morph by an event.") log_game("[key_of_morph] was spawned as a morph by an event.") return 1 diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index 2dba746824a..0e048b85df0 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -119,7 +119,7 @@ spawn(5) if(src.mind) src.mind.wipe_memory() - to_chat(src, 'sound/effects/ghost.ogg') + src << 'sound/effects/ghost.ogg' to_chat(src, "
      ") to_chat(src, "You are a revenant.") to_chat(src, "Your formerly mundane spirit has been infused with alien energies and empowered into a revenant.") diff --git a/code/game/gamemodes/miniantags/slaughter/slaughter.dm b/code/game/gamemodes/miniantags/slaughter/slaughter.dm index f288cf39435..6f97740f8d5 100644 --- a/code/game/gamemodes/miniantags/slaughter/slaughter.dm +++ b/code/game/gamemodes/miniantags/slaughter/slaughter.dm @@ -57,7 +57,7 @@ if(mind) to_chat(src, src.playstyle_string) to_chat(src, "You are not currently in the same plane of existence as the station. Ctrl+Click a blood pool to manifest.") - to_chat(src, 'sound/misc/demon_dies.ogg') + src << 'sound/misc/demon_dies.ogg' mind.current.verbs += /mob/living/simple_animal/slaughter/proc/slaughterWhisper if(!(vialspawned)) var/datum/objective/slaughter/objective = new diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm index ef098c87f91..5c6ca539f91 100644 --- a/code/game/gamemodes/shadowling/shadowling.dm +++ b/code/game/gamemodes/shadowling/shadowling.dm @@ -320,8 +320,7 @@ Made by Xhuis H.take_overall_damage(0, LIGHT_DAMAGE_TAKEN) if(H.stat != DEAD) to_chat(H, "The light burns you!")//Message spam to say "GET THE FUCK OUT" - - to_chat(H, 'sound/weapons/sear.ogg') + H << 'sound/weapons/sear.ogg' else if(light_amount < LIGHT_HEAL_THRESHOLD) H.heal_overall_damage(5, 5) H.adjustToxLoss(-5) diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index 5421789c0ea..b350a0556d3 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -565,7 +565,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) else if(issilicon(target)) var/mob/living/silicon/S = target to_chat(S, "ERROR $!(@ ERROR )#^! SENSORY OVERLOAD \[$(!@#") - to_chat(S, 'sound/misc/interference.ogg') + S << 'sound/misc/interference.ogg' playsound(S, 'sound/machines/warning-buzzer.ogg', 50, 1) var/datum/effect/system/spark_spread/sp = new /datum/effect/system/spark_spread sp.set_up(5, 1, S) diff --git a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm index 80be87570f2..98f81f1d128 100644 --- a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm @@ -156,7 +156,7 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N M.Weaken(10) to_chat(M, "An immense pressure slams you onto the ground!") to_chat(world, "\"VYSHA NERADA YEKHEZET U'RUU!!\"") - to_chat(world, 'sound/hallucinations/veryfar_noise.ogg') + world << 'sound/hallucinations/veryfar_noise.ogg' for(var/obj/machinery/power/apc/A in apcs) A.overload_lighting() var/mob/A = new /mob/living/simple_animal/ascendant_shadowling(H.loc) diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index ae6a9a30867..4dc42aacb4f 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -782,7 +782,7 @@ var/global/list/multiverse = list() GiveHint(target) else if(istype(I,/obj/item/weapon/bikehorn)) to_chat(target, "HONK") - to_chat(target, 'sound/items/AirHorn.ogg') + target << 'sound/items/AirHorn.ogg' target.ear_damage += rand(0,3) GiveHint(target) cooldown = world.time +cooldown_time diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 4e51c1e1dad..0818dccbe35 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -326,7 +326,7 @@ var/mob/selected = find_dead_player("[C.ckey]") if(!selected) return - to_chat(selected, 'sound/machines/chime.ogg')//probably not the best sound but I think it's reasonable + selected << 'sound/machines/chime.ogg' //probably not the best sound but I think it's reasonable var/answer = alert(selected,"Do you want to return to life?","Cloning","Yes","No") if(answer != "No" && pod.growclone(C)) diff --git a/code/game/objects/empulse.dm b/code/game/objects/empulse.dm index 6bf7b8dac11..ce7efc4fee3 100644 --- a/code/game/objects/empulse.dm +++ b/code/game/objects/empulse.dm @@ -15,8 +15,7 @@ light_range = heavy_range for(var/mob/M in range(heavy_range, epicenter)) - to_chat(M, 'sound/effects/EMPulse.ogg') - + M << 'sound/effects/EMPulse.ogg' for(var/atom/T in range(light_range, epicenter)) var/distance = get_dist(epicenter, T) if(distance < 0) diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm index d21767cb4c0..caaf79a9981 100644 --- a/code/game/objects/explosion.dm +++ b/code/game/objects/explosion.dm @@ -73,7 +73,7 @@ for(var/mob/M in world) if(M.z == epicenter.z) if(!(M in close)) // check if the mob can hear if(M.ear_deaf <= 0 || !M.ear_deaf) if(!istype(M.loc,/turf/space)) - to_chat(M, 'sound/effects/explosionfar.ogg') + M << 'sound/effects/explosionfar.ogg' if(heavy_impact_range > 1) var/datum/effect/system/explosion/E = new/datum/effect/system/explosion() diff --git a/code/game/sound.dm b/code/game/sound.dm index 264b5f93565..cecf12c657d 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -93,12 +93,12 @@ var/const/FALLOFF_SOUNDS = 0.5 S.falloff = (falloff ? falloff : FALLOFF_SOUNDS) if(!is_global) S.environment = 2 - to_chat(src, S) + src << S /client/proc/playtitlemusic() if(!ticker || !ticker.login_music || config.disable_lobby_music) return if(prefs.sound & SOUND_LOBBY) - to_chat(src, sound(ticker.login_music, repeat = 0, wait = 0, volume = 85, channel = 1))// MAD JAMS + src << sound(ticker.login_music, repeat = 0, wait = 0, volume = 85, channel = 1) // MAD JAMS /proc/get_rand_frequency() diff --git a/code/modules/admin/admin_memo.dm b/code/modules/admin/admin_memo.dm index 3a1fec11bb4..489be7b68dc 100644 --- a/code/modules/admin/admin_memo.dm +++ b/code/modules/admin/admin_memo.dm @@ -1,7 +1,7 @@ /client/proc/admin_memo() set name = "Memo" set category = "Server" - if(!check_rights(R_SERVER)) + if(!check_rights(R_SERVER)) return if(!dbcon.IsConnected()) to_chat(src, "Failed to establish database connection.") @@ -102,7 +102,7 @@ if(!output && !silent) to_chat(src, "No memos found in database.") return - src << output + to_chat(src, output) if("Remove") var/DBQuery/query_memodellist = dbcon.NewQuery("SELECT ckey FROM [format_table_name("memo")]") if(!query_memodellist.Execute()) @@ -131,4 +131,3 @@ else log_admin("[key_name(src)] has removed [target_sql_ckey]'s memo.") message_admins("[key_name_admin(src)] has removed [target_sql_ckey]'s memo.") - \ No newline at end of file diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index ca20df573ec..a2d62b29c8a 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -918,7 +918,7 @@ var/list/admin_verbs_proccall = list ( if(confirm == "Yes") for (var/mob/T as mob in mob_list) to_chat(T, "

      Man up.
      Deal with it.

      Move on.

      ") - to_chat(T, 'sound/voice/ManUp1.ogg') + T << 'sound/voice/ManUp1.ogg' log_admin("[key_name(usr)] told everyone to man up and deal with it.") message_admins("[key_name_admin(usr)] told everyone to man up and deal with it.") diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 49a06ac5947..60e196c7982 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -17,7 +17,7 @@ if(!C) return - to_chat(C, 'sound/effects/adminhelp.ogg') + C << 'sound/effects/adminhelp.ogg' to_chat(C, "- AdminHelp Rejected! -") to_chat(C, "Your admin help was rejected.") diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index ffebb5ce698..fce0201c765 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -112,13 +112,13 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," msg = "[selected_type]: [key_name(src, 1, 1, selected_type)] (?) (PP) (VV) (SM) ([admin_jump_link(mob, "holder")]) (CA) (REJT) [ai_found ? " (CL)" : ""]: [msg]" for(var/client/X in mentorholders + modholders + adminholders) if(X.prefs.sound & SOUND_ADMINHELP) - to_chat(X, 'sound/effects/adminhelp.ogg') + X << 'sound/effects/adminhelp.ogg' to_chat(X, msg) if("Adminhelp") msg = "[selected_type]: [key_name(src, 1, 1, selected_type)] (?) (PP) (VV) (SM) ([admin_jump_link(mob, "holder")]) (CA) (REJT) [ai_found ? " (CL)" : ""]: [msg]" for(var/client/X in modholders + adminholders) if(X.prefs.sound & SOUND_ADMINHELP) - to_chat(X, 'sound/effects/adminhelp.ogg') + X << 'sound/effects/adminhelp.ogg' to_chat(X, msg) //show it to the person adminhelping too diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index ad5006611af..e533a4716b6 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -160,7 +160,7 @@ //play the recieving admin the adminhelp sound (if they have them enabled) //non-admins shouldn't be able to disable this if(C.prefs.sound & SOUND_ADMINHELP) - to_chat(C, 'sound/effects/adminhelp.ogg') + C << 'sound/effects/adminhelp.ogg' log_admin("PM: [key_name(src)]->[key_name(C)]: [msg]") //we don't use message_admins here because the sender/receiver might get it too diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index c363ed51d72..25b0ed54140 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -17,7 +17,7 @@ var/list/sounds_cache = list() message_admins("[key_name_admin(src)] played sound [S]", 1) for(var/mob/M in player_list) if(M.client.prefs.sound & SOUND_MIDI) - to_chat(M, uploaded_sound) + M << uploaded_sound feedback_add_details("admin_verb","PGS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -86,11 +86,11 @@ var/list/sounds_cache = list() for(var/mob/M in world) if(M.client) if(M.client.midis) - to_chat(M, 'cubanpetetime.ogg') + M << 'cubanpetetime.ogg' for(var/mob/living/carbon/human/CP in world) if(CP.real_name=="Cuban Pete" && CP.key!="Rosham") - to_chat(CP, "Your body can't contain the rhumba beat") + C << "Your body can't contain the rhumba beat" CP.gib() @@ -102,7 +102,7 @@ var/list/sounds_cache = list() for(var/mob/M in world) if(M.client) if(M.client.midis) - to_chat(M, 'bananaphone.ogg') + M << 'bananaphone.ogg' client/proc/space_asshole() @@ -113,7 +113,7 @@ client/proc/space_asshole() for(var/mob/M in world) if(M.client) if(M.client.midis) - to_chat(M, 'sound/music/space_asshole.ogg') + M << 'sound/music/space_asshole.ogg' client/proc/honk_theme() @@ -124,4 +124,4 @@ client/proc/honk_theme() for(var/mob/M in world) if(M.client) if(M.client.midis) - to_chat(M, 'honk_theme.ogg')*/ + M << 'honk_theme.ogg'*/ diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 69fbd9bc1fc..c4088d9a53f 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -421,7 +421,7 @@ Gunshots/explosions/opening doors/less rare audio (done) step_away(src,my_target,2) user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(src) - to_chat(my_target, sound(pick('sound/weapons/genhit1.ogg', 'sound/weapons/genhit2.ogg', 'sound/weapons/genhit3.ogg'))) + my_target << sound(pick('sound/weapons/genhit1.ogg', 'sound/weapons/genhit2.ogg', 'sound/weapons/genhit3.ogg')) my_target.visible_message("[my_target] flails around wildly.", \ "[my_target] has attacked [src]!") @@ -476,7 +476,7 @@ Gunshots/explosions/opening doors/less rare audio (done) if(prob(15)) src.do_attack_animation(my_target) if(weapon_name) - to_chat(my_target, sound(pick('sound/weapons/genhit1.ogg', 'sound/weapons/genhit2.ogg', 'sound/weapons/genhit3.ogg'))) + my_target << sound(pick('sound/weapons/genhit1.ogg', 'sound/weapons/genhit2.ogg', 'sound/weapons/genhit3.ogg')) my_target.show_message("[src.name] has attacked [my_target] with [weapon_name]!", 1) my_target.staminaloss += 30 if(prob(20)) @@ -485,7 +485,7 @@ Gunshots/explosions/opening doors/less rare audio (done) if(!locate(/obj/effect/overlay) in my_target.loc) fake_blood(my_target) else - to_chat(my_target, sound(pick('sound/weapons/punch1.ogg','sound/weapons/punch2.ogg','sound/weapons/punch3.ogg','sound/weapons/punch4.ogg'))) + my_target << sound(pick('sound/weapons/punch1.ogg','sound/weapons/punch2.ogg','sound/weapons/punch3.ogg','sound/weapons/punch4.ogg')) my_target.show_message("[src.name] has punched [my_target]!", 1) my_target.staminaloss += 30 if(prob(33)) @@ -618,36 +618,36 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite // to_chat(src, "Strange Audio") switch(rand(1,18)) if(1) - to_chat(src, 'sound/machines/airlock.ogg') + src << 'sound/machines/airlock.ogg' if(2) if(prob(50)) - to_chat(src, 'sound/effects/Explosion1.ogg') + src << 'sound/effects/Explosion1.ogg' else - to_chat(src, 'sound/effects/Explosion2.ogg') + src << 'sound/effects/Explosion2.ogg' if(3) - to_chat(src, 'sound/effects/explosionfar.ogg') + src << 'sound/effects/explosionfar.ogg' if(4) - to_chat(src, 'sound/effects/Glassbr1.ogg') + src << 'sound/effects/Glassbr1.ogg' if(5) - to_chat(src, 'sound/effects/Glassbr2.ogg') + src << 'sound/effects/Glassbr2.ogg' if(6) - to_chat(src, 'sound/effects/Glassbr3.ogg') + src << 'sound/effects/Glassbr3.ogg' if(7) - to_chat(src, 'sound/machines/twobeep.ogg') + src << 'sound/machines/twobeep.ogg' if(8) - to_chat(src, 'sound/machines/windowdoor.ogg') + src << 'sound/machines/windowdoor.ogg' if(9) //To make it more realistic, I added two gunshots (enough to kill) - to_chat(src, 'sound/weapons/Gunshot.ogg') + src << 'sound/weapons/Gunshot.ogg' spawn(rand(10,30)) - to_chat(src, 'sound/weapons/Gunshot.ogg') + src << 'sound/weapons/Gunshot.ogg' if(10) - to_chat(src, 'sound/weapons/smash.ogg') + src << 'sound/weapons/smash.ogg' if(11) //Same as above, but with tasers. - to_chat(src, 'sound/weapons/Taser.ogg') + src << 'sound/weapons/Taser.ogg' spawn(rand(10,30)) - to_chat(src, 'sound/weapons/Taser.ogg') + src << 'sound/weapons/Taser.ogg' //Rare audio if(12) //These sounds are (mostly) taken from Hidden: Source @@ -656,21 +656,21 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite 'sound/hallucinations/growl3.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg', 'sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg',\ 'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\ 'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg') - to_chat(src, pick(creepyasssounds)) + src << pick(creepyasssounds) if(13) to_chat(src, "You feel a tiny prick!") if(14) to_chat(src, "

      Priority Announcement

      ") to_chat(src, "

      The Emergency Shuttle has docked with the station. You have 3 minutes to board the Emergency Shuttle.

      ") - to_chat(src, sound('sound/AI/shuttledock.ogg')) + src << sound('sound/AI/shuttledock.ogg') if(15) - to_chat(src, 'sound/items/Welder.ogg') + src << 'sound/items/Welder.ogg' if(16) - to_chat(src, 'sound/items/Screwdriver.ogg') + src << 'sound/items/Screwdriver.ogg' if(17) - to_chat(src, 'sound/weapons/saberon.ogg') + src << 'sound/weapons/saberon.ogg' if(18) - to_chat(src, 'sound/weapons/saberoff.ogg') + src << 'sound/weapons/saberoff.ogg' if("hudscrew") //Screwy HUD // to_chat(src, "Screwy HUD") diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index e6d48812842..b269256f7a0 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -37,7 +37,7 @@ ..() if(prob(speak_chance)) for(var/mob/M in view()) - to_chat(M, 'sound/effects/mousesqueek.ogg') + M << 'sound/effects/mousesqueek.ogg' /mob/living/simple_animal/mouse/Life() . = ..() @@ -113,7 +113,7 @@ if(!stat) var/mob/M = AM to_chat(M, "\blue \icon[src] Squeek!") - to_chat(M, 'sound/effects/mousesqueek.ogg') + M << 'sound/effects/mousesqueek.ogg' ..() /mob/living/simple_animal/mouse/death() diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index dcce2bb23ae..5bb36c06187 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -224,8 +224,7 @@ message_admins("Singularity has consumed a supermatter shard and can now become stage six.") visible_message("[src] is consumed by the singularity!") for(var/mob/M in mob_list) - to_chat(M, 'sound/effects/supermatter.ogg')//everyone goan know bout this - + M << 'sound/effects/supermatter.ogg' //everyone gunna know bout this to_chat(M, "A horrible screeching fills your ears, and a wave of dread washes over you...") qdel(src) return(gain) diff --git a/code/modules/projectiles/targeting.dm b/code/modules/projectiles/targeting.dm index 921cc49c60f..8eb0d7b6b45 100644 --- a/code/modules/projectiles/targeting.dm +++ b/code/modules/projectiles/targeting.dm @@ -157,7 +157,7 @@ mob/living/proc/Targeted(var/obj/item/weapon/gun/I) //Self explanitory. else return for(var/mob/living/K in viewers(usr)) - to_chat(K, 'sound/weapons/TargetOn.ogg') + K << 'sound/weapons/TargetOn.ogg' if(!targeted_by) targeted_by = list() targeted_by += I @@ -215,7 +215,7 @@ mob/living/proc/Targeted(var/obj/item/weapon/gun/I) //Self explanitory. mob/living/proc/NotTargeted(var/obj/item/weapon/gun/I) if(!I.silenced) for(var/mob/living/M in viewers(src)) - to_chat(M, 'sound/weapons/TargetOff.ogg') + M << 'sound/weapons/TargetOff.ogg' targeted_by -= I I.target.Remove(src) //De-target them if(!I.target.len) diff --git a/code/modules/reagents/Chemistry-Readme.dm b/code/modules/reagents/Chemistry-Readme.dm index e0540151f7d..fee6e61e2b9 100644 --- a/code/modules/reagents/Chemistry-Readme.dm +++ b/code/modules/reagents/Chemistry-Readme.dm @@ -227,9 +227,9 @@ About the Tools: By default, all atom have a reagents var - but its empty. if you want to use an object for the chem. system you'll need to add something like this in its new proc: - to_chat(var/datum/reagents/R = new/datum/reagents(100), <<< create a new datum , 100 is the maximum_volume of the new holder datum.) - to_chat(reagents = R, <<< assign the new datum to the objects reagents var) - to_chat(R.my_atom = src, <<< set the holders my_atom to src so that we know where we are.) + var/datum/reagents/R = new/datum/reagents(100), <<< create a new datum, 100 is the maximum_volume of the new holder datum. + reagents = R, <<< assign the new datum to the objects reagents var + R.my_atom = src, <<< set the holders my_atom to src so that we know where we are. This can also be done by calling a convenience proc: atom/proc/create_reagents(var/max_volume) diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index 1f555693960..31a4fa84280 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -197,7 +197,7 @@ if(time_left <= 50 && !sound_played) //4 seconds left - should sync up with the launch sound_played = 1 for(var/area/shuttle/escape/E in world) - to_chat(E, 'sound/effects/hyperspace_begin.ogg') + E << 'sound/effects/hyperspace_begin.ogg' if(time_left <= 0 && !shuttle_master.emergencyNoEscape) //move each escape pod to its corresponding transit dock @@ -206,7 +206,7 @@ M.enterTransit() //now move the actual emergency shuttle to its transit dock for(var/area/shuttle/escape/E in world) - to_chat(E, 'sound/effects/hyperspace_progress.ogg') + E << 'sound/effects/hyperspace_progress.ogg' enterTransit() mode = SHUTTLE_ESCAPE timer = world.time @@ -218,7 +218,7 @@ M.dock(shuttle_master.getDock("[M.id]_away")) //now move the actual emergency shuttle to centcomm for(var/area/shuttle/escape/E in world) - to_chat(E, 'sound/effects/hyperspace_end.ogg') + E << 'sound/effects/hyperspace_end.ogg' dock(shuttle_master.getDock("emergency_away")) mode = SHUTTLE_ENDGAME timer = 0 diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 1794a896207..248da9d1154 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -463,7 +463,7 @@ owner.stuttering = 20 owner.ear_deaf = 30 owner.Weaken(3) - to_chat(owner, 'sound/items/AirHorn.ogg') + owner << 'sound/items/AirHorn.ogg' if(prob(30)) owner.Stun(10) owner.Paralyse(4) diff --git a/code/world.dm b/code/world.dm index 5ccf544ed59..4c6451d6860 100644 --- a/code/world.dm +++ b/code/world.dm @@ -180,7 +180,7 @@ var/world_topic_spam_protect_time = world.timeofday C.received_irc_pm = world.time C.irc_admin = input["sender"] - to_chat(C, 'sound/effects/adminhelp.ogg') + C << 'sound/effects/adminhelp.ogg' to_chat(C, message) for(var/client/A in admins) From afec3ba8fd43ce4138d07c63a97e6dce72b8bde9 Mon Sep 17 00:00:00 2001 From: FalseIncarnate Date: Tue, 5 Apr 2016 19:28:14 -0400 Subject: [PATCH 311/328] Conflict Fix --- code/__DEFINES/stat.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/__DEFINES/stat.dm b/code/__DEFINES/stat.dm index 3da3a84455f..fe780c5d154 100644 --- a/code/__DEFINES/stat.dm +++ b/code/__DEFINES/stat.dm @@ -34,10 +34,10 @@ #define WAIT_FINISH 3 //shuttle mode defines -#define SHUTTLE_IDLE 0 -#define SHUTTLE_RECALL 1 -#define SHUTTLE_CALL 2 -#define SHUTTLE_DOCKED 3 +#define SHUTTLE_IDLE 0 +#define SHUTTLE_RECALL 1 +#define SHUTTLE_CALL 2 +#define SHUTTLE_DOCKED 3 #define SHUTTLE_STRANDED 4 #define SHUTTLE_ESCAPE 5 #define SHUTTLE_ENDGAME 6 @@ -52,4 +52,4 @@ #define LOGIC_FLICKER 2 //Use this for when you want it to turn on and then turn off (buttons, clocks) //Logic-related stuff (Misc. defines for logic things, to keep it organized or something) -#define LOGIC_FLICKER_TIME 10 //number of deciseconds LOGIC_TEMP_ON will remain active before turning off \ No newline at end of file +#define LOGIC_FLICKER_TIME 10 //number of deciseconds LOGIC_TEMP_ON will remain active before turning off From a8a0ab317981a4fe8cc5b340d43d64f5ca3741ab Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 5 Apr 2016 19:43:25 -0400 Subject: [PATCH 312/328] Automatic changelog generation for PR #4075 --- html/changelogs/AutoChangeLog-pr-4075.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4075.yml diff --git a/html/changelogs/AutoChangeLog-pr-4075.yml b/html/changelogs/AutoChangeLog-pr-4075.yml new file mode 100644 index 00000000000..bd13595c356 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4075.yml @@ -0,0 +1,5 @@ +author: Fox McCloud +delete-after: True +changes: + - rscadd: "Maps in the slime management console to Xenobio" + - tweak: "Reduces Xenobio monkey box count from 4 to 2" From f86cb2b0491f520cdf194ab12b6bf0ef89889226 Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Tue, 5 Apr 2016 23:24:24 -0400 Subject: [PATCH 313/328] Fixes straightjacket issue with slot clicking thing --- code/modules/mob/mob.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 370e029200b..bf5eac3e0cc 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -176,7 +176,7 @@ equip_to_slot_if_possible(C, slot) else equip_to_slot_if_possible(W, slot) - else + else if(!restrained()) W = get_item_by_slot(slot) if(W) W.attack_hand(src) From 702ac3d367abd0cc45abb206331993aabb448664 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 5 Apr 2016 23:38:46 -0400 Subject: [PATCH 314/328] Automatic changelog generation for PR #4041 --- html/changelogs/AutoChangeLog-pr-4041.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4041.yml diff --git a/html/changelogs/AutoChangeLog-pr-4041.yml b/html/changelogs/AutoChangeLog-pr-4041.yml new file mode 100644 index 00000000000..5f208e673c7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4041.yml @@ -0,0 +1,6 @@ +author: FalseIncarnate +delete-after: True +changes: + - rscadd: "Adds logic gates, for doing illogical things in a logical manner." + - rscadd: "Adds buildable light switches, for all your light toggling needs." + - bugfix: "Fixes a resource duplication bug with mass driver buttons." From 797740da7da6f8662cb827a2e926ef2c8eb7bbc1 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Tue, 5 Apr 2016 21:16:52 -0700 Subject: [PATCH 315/328] Fix all of the merge conflicts and lacking to_chats with 4041 --- code/game/machinery/buttons.dm | 2 +- code/game/machinery/constructable_frame.dm | 2 +- code/game/machinery/lightswitch.dm | 2 +- code/modules/logic/converter.dm | 8 ++++---- code/modules/logic/logic_base.dm | 16 ++++++++-------- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index 0934959d20f..afeb5a1f778 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -67,7 +67,7 @@ if(istype(W, /obj/item/weapon/wrench)) playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 30, target = src)) - user << "You detach \the [src] from the wall." + to_chat(user, "You detach \the [src] from the wall.") new/obj/item/mounted/frame/driver_button(get_turf(src)) qdel(src) return 1 diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 49cc616d174..72493bfba6f 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -924,4 +924,4 @@ obj/item/weapon/circuitboard/rdserver build_path = typepath name = "circuit board ([new_name])" if(user) - user << "You set the board to [new_name]." + to_chat(user, "You set the board to [new_name].") diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index 41e1587ecd4..3bc2bec5ec4 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -151,7 +151,7 @@ if(istype(W, /obj/item/weapon/wrench)) playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 30, target = src)) - user << "You detach \the [src] from the wall." + to_chat(user, "You detach \the [src] from the wall.") new/obj/item/mounted/frame/light_switch(get_turf(src)) qdel(src) return 1 diff --git a/code/modules/logic/converter.dm b/code/modules/logic/converter.dm index 635bbf87176..ff4b8ad1db3 100644 --- a/code/modules/logic/converter.dm +++ b/code/modules/logic/converter.dm @@ -32,10 +32,10 @@ if(istype(O, /obj/item/device/assembly/signaler)) var/obj/item/device/assembly/signaler/S = O if(S.secured) - user << "The [S] is already secured." + to_chat(user, "The [S] is already secured.") return if(attached_signaler) - user << "There is already a device attached, remove it first." + to_chat(user, "There is already a device attached, remove it first.") return user.unEquip(S) S.forceMove(src) @@ -46,7 +46,7 @@ else S.receiving = 0 attached_signaler = S - user << "You attach \the [S] to the I/O connection port and secure it." + to_chat(user, "You attach \the [S] to the I/O connection port and secure it.") return if(attached_signaler && istype(O, /obj/item/weapon/screwdriver)) //Makes sure we remove the attached signaler before we can open up and deconstruct the machine var/obj/item/device/assembly/signaler/S = attached_signaler @@ -54,7 +54,7 @@ S.forceMove(get_turf(src)) S.holder = null S.toggle_secure() - user << "You unsecure and detach \the [S] from the I/O connection port." + to_chat(user, "You unsecure and detach \the [S] from the I/O connection port.") return ..() diff --git a/code/modules/logic/logic_base.dm b/code/modules/logic/logic_base.dm index b126b1af214..926b8a1f129 100644 --- a/code/modules/logic/logic_base.dm +++ b/code/modules/logic/logic_base.dm @@ -199,14 +199,14 @@ /obj/machinery/logic_gate/attackby(obj/item/O, mob/user, params) if(tamperproof) - user << "The [src] appears to be tamperproofed! You can't interact with it!" + to_chat(user, "The [src] appears to be tamperproofed! You can't interact with it!") return 0 if(istype(O, /obj/item/device/multitool)) update_multitool_menu(user) return 1 if(istype(O, /obj/item/weapon/screwdriver)) panel_open = !panel_open - user << "You [panel_open ? "open" : "close"] the access panel." + to_chat(user, "You [panel_open ? "open" : "close"] the access panel.") return 1 if(panel_open && istype(O, /obj/item/weapon/crowbar)) default_deconstruction_crowbar(O) @@ -218,20 +218,20 @@ /obj/machinery/logic_gate/attack_ai(mob/user) if(tamperproof) - user << "The [src] appears to be tamperproofed! You can't interface with it!" + to_chat(user, "The [src] appears to be tamperproofed! You can't interface with it!") return 0 add_hiddenprint(user) return ui_interact(user) /obj/machinery/logic_gate/attack_ghost(mob/user) if(tamperproof) - user << "The [src] appears to be tamperproofed! You can't haunt it!" + to_chat(user, "The [src] appears to be tamperproofed! You can't haunt it!") return 0 return ui_interact(user) /obj/machinery/logic_gate/attack_hand(mob/user) if(tamperproof) - user << "The [src] appears to be tamperproofed! You can't interact with it!" + to_chat(user, "The [src] appears to be tamperproofed! You can't interact with it!") return 0 . = ..() if(.) @@ -239,15 +239,15 @@ return interact(user) /obj/machinery/logic_gate/attack_alien(mob/user) //No xeno logic, that's too silly. - user << "The [src] appears to be too complex! You can't comprehend it and back off in fear!" + to_chat(user, "The [src] appears to be too complex! You can't comprehend it and back off in fear!") return 0 /obj/machinery/logic_gate/attack_animal(mob/user) //No animal logic either. - user << "The [src] appears to be beyond your comprehension! You can't fathom it!" + to_chat(user, "The [src] appears to be beyond your comprehension! You can't fathom it!") return 0 /obj/machinery/logic_gate/attack_slime(mob/user) //No slime logic. Seriously. - user << "The [src] appears to be beyond your gelatinous understanding! You ignore it!" + to_chat(user, "The [src] appears to be beyond your gelatinous understanding! You ignore it!") return 0 /obj/machinery/logic_gate/emp_act(severity) From 3f7f6704c8c3f6b45ba7abea41d3cad118d8b6a0 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Wed, 6 Apr 2016 01:37:04 -0400 Subject: [PATCH 316/328] Xenobio Refactor/Changes --- _maps/map_files/cyberiad/cyberiad.dmm | 2 +- code/game/machinery/kitchen/processor.dm | 2 +- .../game/objects/items/weapons/power_cells.dm | 8 +- code/modules/mining/equipment_locker.dm | 2 +- code/modules/mob/living/carbon/slime/life.dm | 9 +- .../modules/mob/living/carbon/slime/powers.dm | 11 +- code/modules/mob/living/carbon/slime/slime.dm | 2 +- code/modules/reagents/Chemistry-Machinery.dm | 2 +- code/modules/reagents/newchem/disease.dm | 8 +- code/modules/reagents/newchem/pyro.dm | 30 + .../chemical_reaction_slime.dm | 1060 +++++++++-------- .../oldchem/reagents/reagents_flammable.dm | 2 +- .../reagent_containers/glass/bottle.dm | 6 +- .../research/xenobiology/xenobiology.dm | 404 ++++--- 14 files changed, 849 insertions(+), 699 deletions(-) diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index c66079312ed..1ed7089ef1b 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -6978,7 +6978,7 @@ "cEj" = (/turf/simulated/wall/r_wall,/area/medical/patient_b) "cEk" = (/obj/structure/closet/l3closet/scientist,/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/xenobiology) "cEl" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) -"cEm" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/stack/sheet/mineral/plasma{amount = 8; layer = 2.9},/obj/machinery/media/receiver/boombox,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) +"cEm" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/stack/sheet/mineral/plasma{pixel_x = -2; pixel_y = -2},/obj/item/stack/sheet/mineral/plasma,/obj/item/stack/sheet/mineral/plasma{pixel_x = 2; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) "cEn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) "cEo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) "cEp" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology) diff --git a/code/game/machinery/kitchen/processor.dm b/code/game/machinery/kitchen/processor.dm index 0b739e2b269..57e1aecf514 100644 --- a/code/game/machinery/kitchen/processor.dm +++ b/code/game/machinery/kitchen/processor.dm @@ -85,7 +85,7 @@ S.loc = loc S.visible_message("[S] crawls free of the processor!") return - for(var/i = 1, i <= C + processor.rating_amount, i++) + for(var/i in 1 to (C+processor.rating_amount-1)) new S.coretype(loc) feedback_add_details("slime_core_harvested","[replacetext(S.colour," ","_")]") ..() diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm index 0cb5e3c54ef..d2598a4036f 100644 --- a/code/game/objects/items/weapons/power_cells.dm +++ b/code/game/objects/items/weapons/power_cells.dm @@ -115,14 +115,12 @@ minor_fault = 1 -/obj/item/weapon/stock_parts/cell/slime +/obj/item/weapon/stock_parts/cell/high/slime name = "charged slime core" desc = "A yellow slime core infused with plasma, it crackles with power." origin_tech = "powerstorage=2;biotech=4" - icon = 'icons/mob/slimes.dmi' //'icons/obj/harvest.dmi' - icon_state = "yellow slime extract" //"potato_battery" - maxcharge = 10000 - rating = 3 + icon = 'icons/mob/slimes.dmi' + icon_state = "yellow slime extract" materials = list() /obj/item/weapon/stock_parts/cell/pulse/carbine diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index 60044582dec..7bd4fd1ad47 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -20,7 +20,7 @@ var/sheet_per_ore = 1 var/point_upgrade = 1 var/list/ore_values = list(("sand" = 1), ("iron" = 1), ("plasma" = 15), ("silver" = 16), ("gold" = 18), ("uranium" = 30), ("diamond" = 50), ("bananium" = 60), ("tranquillite" = 60)) - var/list/supply_consoles = list("Science", "Robotics", "Research Director's Desk", "Mechanic", "Engineering" = list("metal", "glass", "plasma"), "Chief Engineer's Desk" = list("metal", "glass", "plasma"), "Atmospherics" = list("metal", "glass", "plasma"), "Bar" = list("uranium", "plasma"), "Virology" = list("uranium", "gold")) + var/list/supply_consoles = list("Science", "Robotics", "Research Director's Desk", "Mechanic", "Engineering" = list("metal", "glass", "plasma"), "Chief Engineer's Desk" = list("metal", "glass", "plasma"), "Atmospherics" = list("metal", "glass", "plasma"), "Bar" = list("uranium", "plasma"), "Virology" = list("plasma", "uranium", "gold")) /obj/machinery/mineral/ore_redemption/New() ..() diff --git a/code/modules/mob/living/carbon/slime/life.dm b/code/modules/mob/living/carbon/slime/life.dm index 1e3d901755a..6dce9aba656 100644 --- a/code/modules/mob/living/carbon/slime/life.dm +++ b/code/modules/mob/living/carbon/slime/life.dm @@ -151,13 +151,8 @@ /mob/living/carbon/slime/handle_chemicals_in_body() - if(reagents) reagents.metabolize(src) - if (reagents.get_reagent_amount("plasma")>=5) - mutation_chance = min(mutation_chance + 5,50) //Prevents mutation chance going >50% - reagents.remove_reagent("plasma", 5) - if (reagents.get_reagent_amount("epinephrine")>=5) - mutation_chance = max(mutation_chance - 5,0) //Prevents muation chance going <0% - reagents.remove_reagent("epinephrine", 5) + if(reagents) + reagents.metabolize(src) src.updatehealth() return //TODO: DEFERRED diff --git a/code/modules/mob/living/carbon/slime/powers.dm b/code/modules/mob/living/carbon/slime/powers.dm index d0ced0684a3..829c56ba004 100644 --- a/code/modules/mob/living/carbon/slime/powers.dm +++ b/code/modules/mob/living/carbon/slime/powers.dm @@ -207,15 +207,20 @@ var/new_powerlevel = round(powerlevel / 4) for(var/i=1,i<=4,i++) var/mob/living/carbon/slime/M = new /mob/living/carbon/slime/(loc) - if(prob(mutation_chance)) + if(mutation_chance >= 100) + M.colour = "rainbow" + else if(prob(mutation_chance)) M.colour = slime_mutation[rand(1,4)] else M.colour = colour - if(ckey) M.nutrition = new_nutrition //Player slimes are more robust at spliting. Once an oversight of poor copypasta, now a feature! + if(ckey) + M.nutrition = new_nutrition //Player slimes are more robust at spliting. Once an oversight of poor copypasta, now a feature! M.powerlevel = new_powerlevel - if(i != 1) step_away(M,src) + if(i != 1) + step_away(M,src) M.Friends = Friends.Copy() babies += M + M.mutation_chance = Clamp(mutation_chance+(rand(5,-5)),0,100) feedback_add_details("slime_babies_born","slimebirth_[replacetext(M.colour," ","_")]") var/mob/living/carbon/slime/new_slime = pick(babies) diff --git a/code/modules/mob/living/carbon/slime/slime.dm b/code/modules/mob/living/carbon/slime/slime.dm index 532f6a4aba0..9ed50676e75 100644 --- a/code/modules/mob/living/carbon/slime/slime.dm +++ b/code/modules/mob/living/carbon/slime/slime.dm @@ -46,6 +46,7 @@ var/is_adult = 0 var/core_removal_stage = 0 //For removing cores. + var/mutator_used = FALSE //So you can't shove a dozen mutators into a single slime ///////////TIME FOR SUBSPECIES @@ -61,7 +62,6 @@ icon_state = "[colour] [is_adult ? "adult" : "baby"] slime" real_name = name slime_mutation = mutation_table(colour) - mutation_chance = rand(25, 35) var/sanitizedcolour = replacetext(colour, " ", "") coretype = text2path("/obj/item/slime_extract/[sanitizedcolour]") ..() diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index 59efbc9970b..15ea3a5343f 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -817,7 +817,7 @@ var/list/blend_items = list ( //Sheets - /obj/item/stack/sheet/mineral/plasma = list("plasma" = 20), + /obj/item/stack/sheet/mineral/plasma = list("plasma_dust" = 20), /obj/item/stack/sheet/mineral/uranium = list("uranium" = 20), /obj/item/stack/sheet/mineral/bananium = list("banana" = 20), /obj/item/stack/sheet/mineral/tranquillite = list("nothing" = 20), diff --git a/code/modules/reagents/newchem/disease.dm b/code/modules/reagents/newchem/disease.dm index 18fbc812a28..9c18efe308d 100644 --- a/code/modules/reagents/newchem/disease.dm +++ b/code/modules/reagents/newchem/disease.dm @@ -106,13 +106,13 @@ description = "mutates blood" color = "#D18AA5" // rgb: 209,138,165 -/datum/reagent/plasma/plasmavirusfood +/datum/reagent/plasma_dust/plasmavirusfood name = "virus plasma" id = "plasmavirusfood" description = "mutates blood" color = "#A69DA9" // rgb: 166,157,169 -/datum/reagent/plasma/plasmavirusfood/weak +/datum/reagent/plasma_dust/plasmavirusfood/weak name = "weakened virus plasma" id = "weakplasmavirusfood" color = "#CEC3C6" // rgb: 206,195,198 @@ -143,7 +143,7 @@ name = "virus plasma" id = "plasmavirusfood" result = "plasmavirusfood" - required_reagents = list("plasma" = 1, "virusfood" = 1) + required_reagents = list("plasma_dust" = 1, "virusfood" = 1) result_amount = 1 /datum/chemical_reaction/virus_food_plasma_diphenhydramine @@ -195,7 +195,7 @@ /datum/chemical_reaction/mix_virus/mix_virus_3 name = "Mix Virus 3" id = "mixvirus3" - required_reagents = list("plasma" = 1) + required_reagents = list("plasma_dust" = 1) level_min = 4 level_max = 6 diff --git a/code/modules/reagents/newchem/pyro.dm b/code/modules/reagents/newchem/pyro.dm index 31623753852..b4070440ab3 100644 --- a/code/modules/reagents/newchem/pyro.dm +++ b/code/modules/reagents/newchem/pyro.dm @@ -626,3 +626,33 @@ datum/reagent/firefighting_foam/reaction_obj(var/obj/O, var/volume) holder.del_reagent("teslium") //Clear all remaining Teslium and Uranium, but leave all other reagents untouched. holder.del_reagent("uranium") return + +/datum/reagent/plasma_dust + name = "Plasma Dust" + id = "plasma_dust" + description = "A fine dust of plasma. This chemical has unusual mutagenic properties for viruses and slimes alike." + color = "#500064" // rgb: 80, 0, 100 + +/datum/reagent/plasma_dust/on_mob_life(mob/living/M) + M.adjustToxLoss(3) + if(iscarbon(M)) + var/mob/living/carbon/C = M + C.adjustPlasma(20) + ..() + +/datum/reagent/plasma_dust/reaction_obj(obj/O, volume) + if((!O) || (!volume)) + return 0 + O.atmos_spawn_air(SPAWN_TOXINS|SPAWN_20C, volume) + +/datum/reagent/plasma_dust/reaction_turf(turf/simulated/T, volume) + if(istype(T)) + T.atmos_spawn_air(SPAWN_TOXINS|SPAWN_20C, volume) + +/datum/reagent/plasma_dust/reaction_mob(mob/living/M, method=TOUCH, volume)//Splashing people with plasma dust is stronger than fuel! + if(!istype(M, /mob/living)) + return + if(method == TOUCH) + M.adjust_fire_stacks(volume / 5) + return + ..() \ No newline at end of file diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm index cbcb53a5689..ee51efe2b1e 100644 --- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm +++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm @@ -1,554 +1,664 @@ -/////////////////////////////////////////////NEW SLIME CORE REACTIONS///////////////////////////////////////////// //Grey -/datum/chemical_reaction/ +/datum/chemical_reaction/slimespawn + name = "Slime Spawn" + id = "m_spawn" + result = null + required_reagents = list("plasma_dust" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/grey + required_other = 1 - slimespawn - name = "Slime Spawn" - id = "m_spawn" - result = null - required_reagents = list("plasma" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/grey - required_other = 1 +/datum/chemical_reaction/slimespawn/on_reaction(datum/reagents/holder) + feedback_add_details("slime_cores_used","[type]") + var/mob/living/carbon/slime/S = new /mob/living/carbon/slime + S.forceMove(get_turf(holder.my_atom)) + S.visible_message("Infused with plasma, the core begins to quiver and grow, and soon a new baby slime emerges from it!") - on_reaction(var/datum/reagents/holder) - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("\red Infused with plasma, the core begins to quiver and grow, and soon a new baby slime emerges from it!"), 1) - var/mob/living/carbon/slime/S = new /mob/living/carbon/slime - S.loc = get_turf(holder.my_atom) +/datum/chemical_reaction/slimeinaprov + name = "Slime epinephrine" + id = "m_inaprov" + result = "epinephrine" + required_reagents = list("water" = 5) + result_amount = 3 + required_other = 1 + required_container = /obj/item/slime_extract/grey +/datum/chemical_reaction/slimeinaprov/on_reaction(datum/reagents/holder) + feedback_add_details("slime_cores_used","[type]") - slimeinaprov - name = "Slime Epinephrine" - id = "m_epinephrine" - result = "epinephrine" - required_reagents = list("water" = 5) - result_amount = 3 - required_other = 1 - required_container = /obj/item/slime_extract/grey +/datum/chemical_reaction/slimemonkey + name = "Slime Monkey" + id = "m_monkey" + result = null + required_reagents = list("blood" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/grey + required_other = 1 - on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - - - slimemonkey - name = "Slime Monkey" - id = "m_monkey" - result = null - required_reagents = list("blood" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/grey - required_other = 1 - on_reaction(var/datum/reagents/holder) - for(var/i = 1, i <= 3, i++) - var /obj/item/weapon/reagent_containers/food/snacks/monkeycube/M = new /obj/item/weapon/reagent_containers/food/snacks/monkeycube - M.loc = get_turf(holder.my_atom) +/datum/chemical_reaction/slimemonkey/on_reaction(datum/reagents/holder) + feedback_add_details("slime_cores_used","[type]") + for(var/i = 1, i <= 3, i++) + var /obj/item/weapon/reagent_containers/food/snacks/monkeycube/M = new /obj/item/weapon/reagent_containers/food/snacks/monkeycube + M.forceMove(get_turf(holder.my_atom)) //Green - slimemutate - name = "Mutation Toxin" - id = "mutationtoxin" - result = "mutationtoxin" - required_reagents = list("plasma" = 5) - result_amount = 1 - required_other = 1 - required_container = /obj/item/slime_extract/green +/datum/chemical_reaction/slimemutate + name = "Mutation Toxin" + id = "mutationtoxin" + result = "mutationtoxin" + required_reagents = list("plasma_dust" = 1) + result_amount = 1 + required_other = 1 + required_container = /obj/item/slime_extract/green + +/datum/chemical_reaction/slimemutate/on_reaction(datum/reagents/holder) + feedback_add_details("slime_cores_used","[type]") //Metal - slimemetal - name = "Slime Metal" - id = "m_metal" - result = null - required_reagents = list("plasma" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/metal - required_other = 1 - on_reaction(var/datum/reagents/holder) - var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal - M.amount = 15 - M.loc = get_turf(holder.my_atom) - var/obj/item/stack/sheet/plasteel/P = new /obj/item/stack/sheet/plasteel - P.amount = 5 - P.loc = get_turf(holder.my_atom) +/datum/chemical_reaction/slimemetal + name = "Slime Metal" + id = "m_metal" + result = null + required_reagents = list("plasma_dust" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/metal + required_other = 1 + +/datum/chemical_reaction/slimemetal/on_reaction(datum/reagents/holder) + feedback_add_details("slime_cores_used","[type]") + var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal + M.amount = 15 + M.forceMove(get_turf(holder.my_atom)) + var/obj/item/stack/sheet/plasteel/P = new /obj/item/stack/sheet/plasteel + P.amount = 5 + P.forceMove(get_turf(holder.my_atom)) //Gold - slimecrit - name = "Slime Crit" - id = "m_tele" - result = null - required_reagents = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/gold - required_other = 1 - on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - var/turf/T = get_turf(holder.my_atom) - T.visible_message("The slime extract begins to vibrate violently !") - spawn(50) - chemical_mob_spawn(holder, 5, "Gold Slime") +/datum/chemical_reaction/slimecrit + name = "Slime Crit" + id = "m_tele" + result = null + required_reagents = list("plasma_dust" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/gold + required_other = 1 +/datum/chemical_reaction/slimecrit/on_reaction(datum/reagents/holder) + feedback_add_details("slime_cores_used","[type]") + var/turf/T = get_turf(holder.my_atom) + T.visible_message("The slime extract begins to vibrate violently !") + spawn(50) + chemical_mob_spawn(holder, 5, "Gold Slime") - slimecritlesser - name = "Slime Crit Lesser" - id = "m_tele3" - result = null - required_reagents = list("blood" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/gold - required_other = 1 - on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - var/turf/T = get_turf(holder.my_atom) - T.visible_message("The slime extract begins to vibrate violently !") - spawn(50) - chemical_mob_spawn(holder, 3, "Lesser Gold Slime", "neutral") +/datum/chemical_reaction/slimecritlesser + name = "Slime Crit Lesser" + id = "m_tele3" + result = null + required_reagents = list("blood" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/gold + required_other = 1 +/datum/chemical_reaction/slimecritlesser/on_reaction(datum/reagents/holder) + feedback_add_details("slime_cores_used","[type]") + var/turf/T = get_turf(holder.my_atom) + T.visible_message("The slime extract begins to vibrate violently !") + spawn(50) + chemical_mob_spawn(holder, 3, "Lesser Gold Slime", "neutral") - slimecritfriendly - name = "Slime Crit Friendly" - id = "m_tele5" - result = null - required_reagents = list("water" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/gold - required_other = 1 - on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - var/turf/T = get_turf(holder.my_atom) - T.visible_message("The slime extract begins to vibrate adorably !") - spawn(50) - chemical_mob_spawn(holder, 1, "Friendly Gold Slime", "neutral") +/datum/chemical_reaction/slimecritfriendly + name = "Slime Crit Friendly" + id = "m_tele5" + result = null + required_reagents = list("water" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/gold + required_other = 1 +/datum/chemical_reaction/slimecritfriendly/on_reaction(datum/reagents/holder) + feedback_add_details("slime_cores_used","[type]") + var/turf/T = get_turf(holder.my_atom) + T.visible_message("The slime extract begins to vibrate adorably !") + spawn(50) + chemical_mob_spawn(holder, 1, "Friendly Gold Slime", "neutral") //Silver - slimebork - name = "Slime Bork" - id = "m_tele2" - result = null - required_reagents = list("plasma" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/silver - required_other = 1 - on_reaction(var/datum/reagents/holder) +/datum/chemical_reaction/slimebork + name = "Slime Bork" + id = "m_tele2" + result = null + required_reagents = list("plasma_dust" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/silver + required_other = 1 - var/list/borks = subtypesof(/obj/item/weapon/reagent_containers/food/snacks) - borks = adminReagentCheck(borks) - // BORK BORK BORK +/datum/chemical_reaction/slimebork/on_reaction(datum/reagents/holder) - playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) + feedback_add_details("slime_cores_used","[type]") + var/list/blocked = list(/obj/item/weapon/reagent_containers/food/snacks, + /obj/item/weapon/reagent_containers/food/snacks/breadslice, + /obj/item/weapon/reagent_containers/food/snacks/sliceable, + /obj/item/weapon/reagent_containers/food/snacks/margheritaslice, + /obj/item/weapon/reagent_containers/food/snacks/meatpizzaslice, + /obj/item/weapon/reagent_containers/food/snacks/mushroompizzaslice, + /obj/item/weapon/reagent_containers/food/snacks/vegetablepizzaslice, + /obj/item/weapon/reagent_containers/food/snacks/meat, + /obj/item/weapon/reagent_containers/food/snacks/meat/slab, + /obj/item/weapon/reagent_containers/food/snacks/grown, + /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom, + ) + blocked |= typesof(/obj/item/weapon/reagent_containers/food/snacks/customizable) - for(var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null)) - C.flash_eyes() + var/list/borks = typesof(/obj/item/weapon/reagent_containers/food/snacks) - blocked + // BORK BORK BORK - for(var/i = 1, i <= 4 + rand(1,2), i++) - var/chosen = pick(borks) - var/obj/B = new chosen - if(B) - B.loc = get_turf(holder.my_atom) - if(prob(50)) - for(var/j = 1, j <= rand(1, 3), j++) - step(B, pick(NORTH,SOUTH,EAST,WEST)) - slimedrinks - name = "Slime Drinks" - id = "m_tele3" - result = null - required_reagents = list("water" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/silver - required_other = 1 - on_reaction(var/datum/reagents/holder) + playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) - var/list/borks = subtypesof(/obj/item/weapon/reagent_containers/food/drinks) - borks = adminReagentCheck(borks) - // BORK BORK BORK + for(var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null)) + C.flash_eyes() - playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) + for(var/i = 1, i <= 4 + rand(1,2), i++) + var/chosen = pick(borks) + var/obj/B = new chosen + if(B) + B.forceMove(get_turf(holder.my_atom)) + if(prob(50)) + for(var/j = 1, j <= rand(1, 3), j++) + step(B, pick(NORTH,SOUTH,EAST,WEST)) - for(var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null)) - C.flash_eyes() - for(var/i = 1, i <= 4 + rand(1,2), i++) - var/chosen = pick(borks) - var/obj/B = new chosen - if(B) - B.loc = get_turf(holder.my_atom) - if(prob(50)) - for(var/j = 1, j <= rand(1, 3), j++) - step(B, pick(NORTH,SOUTH,EAST,WEST)) +/datum/chemical_reaction/slimebork2 + name = "Slime Bork 2" + id = "m_tele4" + result = null + required_reagents = list("water" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/silver + required_other = 1 + +/datum/chemical_reaction/slimebork2/on_reaction(datum/reagents/holder) + + feedback_add_details("slime_cores_used","[type]") + var/list/borks = subtypesof(/obj/item/weapon/reagent_containers/food/drinks) + // BORK BORK BORK + + playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) + + for(var/mob/living/carbon/M in viewers(get_turf(holder.my_atom), null)) + M.flash_eyes() + + for(var/i = 1, i <= 4 + rand(1,2), i++) + var/chosen = pick(borks) + var/obj/B = new chosen + if(B) + B.forceMove(get_turf(holder.my_atom)) + if(prob(50)) + for(var/j = 1, j <= rand(1, 3), j++) + step(B, pick(NORTH,SOUTH,EAST,WEST)) //Blue - slimefrost - name = "Slime Frost Oil" - id = "m_frostoil" - result = "frostoil" - required_reagents = list("plasma" = 5) - result_amount = 10 - required_container = /obj/item/slime_extract/blue - required_other = 1 +/datum/chemical_reaction/slimefrost + name = "Slime Frost Oil" + id = "m_frostoil" + result = "frostoil" + required_reagents = list("plasma_dust" = 1) + result_amount = 10 + required_container = /obj/item/slime_extract/blue + required_other = 1 + +/datum/chemical_reaction/slimefrost/on_reaction(datum/reagents/holder) + feedback_add_details("slime_cores_used","[type]") + + +/datum/chemical_reaction/slimestabilizer + name = "Slime Stabilizer" + id = "m_slimestabilizer" + result = null + required_reagents = list("blood" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/blue + required_other = 1 + +/datum/chemical_reaction/slimestabilizer/on_reaction(datum/reagents/holder) + feedback_add_details("slime_cores_used","[type]") + var/obj/item/slimepotion/stabilizer/P = new /obj/item/slimepotion/stabilizer + P.forceMove(get_turf(holder.my_atom)) + + //Dark Blue - slimefreeze - name = "Slime Freeze" - id = "m_freeze" - result = null - required_reagents = list("plasma" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/darkblue - required_other = 1 - on_reaction(var/datum/reagents/holder) - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("\red The slime extract begins to vibrate violently !"), 1) - spawn(50) - if(holder && holder.my_atom) - playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) - for(var/mob/living/M in range (get_turf(holder.my_atom), 7)) - M.bodytemperature -= 140 - to_chat(M, "\blue You feel a chill!") +/datum/chemical_reaction/slimefreeze + name = "Slime Freeze" + id = "m_freeze" + result = null + required_reagents = list("plasma_dust" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/darkblue + required_other = 1 + +/datum/chemical_reaction/slimefreeze/on_reaction(datum/reagents/holder) + feedback_add_details("slime_cores_used","[type]") + var/turf/T = get_turf(holder.my_atom) + T.visible_message("The slime extract begins to vibrate adorably !") + spawn(50) + if(holder && holder.my_atom) + playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) + for(var/mob/living/M in range (get_turf(holder.my_atom), 7)) + M.bodytemperature -= 240 + to_chat(M, "You feel a chill!") - slimefireproof - name = "Slime Fireproof" - id = "m_fireproof" - result = null - required_reagents = list("water" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/darkblue - required_other = 1 +/datum/chemical_reaction/slimefireproof + name = "Slime Fireproof" + id = "m_fireproof" + result = null + required_reagents = list("water" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/darkblue + required_other = 1 - on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - var/obj/item/weapon/slimefireproof/P = new /obj/item/weapon/slimefireproof - P.loc = get_turf(holder.my_atom) +/datum/chemical_reaction/slimefireproof/on_reaction(datum/reagents/holder) + feedback_add_details("slime_cores_used","[type]") + var/obj/item/slimepotion/fireproof/P = new /obj/item/slimepotion/fireproof + P.forceMove(get_turf(holder.my_atom)) //Orange - slimecasp - name = "Slime Capsaicin Oil" - id = "m_capsaicinoil" - result = "capsaicin" - required_reagents = list("blood" = 5) - result_amount = 10 - required_container = /obj/item/slime_extract/orange - required_other = 1 +/datum/chemical_reaction/slimecasp + name = "Slime Capsaicin Oil" + id = "m_capsaicinoil" + result = "capsaicin" + required_reagents = list("blood" = 1) + result_amount = 10 + required_container = /obj/item/slime_extract/orange + required_other = 1 - slimefire - name = "Slime fire" - id = "m_fire" - result = null - required_reagents = list("plasma" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/orange - required_other = 1 - on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("\red The slime extract begins to vibrate violently !"), 1) - spawn(50) - if(holder && holder.my_atom) - var/turf/simulated/T = get_turf(holder.my_atom) - if(istype(T)) - T.atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 50) +/datum/chemical_reaction/slimecasp/on_reaction(datum/reagents/holder) + feedback_add_details("slime_cores_used","[type]") + +/datum/chemical_reaction/slimefire + name = "Slime fire" + id = "m_fire" + result = null + required_reagents = list("plasma_dust" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/orange + required_other = 1 + +/datum/chemical_reaction/slimefire/on_reaction(datum/reagents/holder) + feedback_add_details("slime_cores_used","[type]") + var/turf/TU = get_turf(holder.my_atom) + TU.visible_message("The slime extract begins to vibrate adorably !") + spawn(50) + if(holder && holder.my_atom) + var/turf/simulated/T = get_turf(holder.my_atom) + if(istype(T)) + T.atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 50) //Yellow - slimeoverload - name = "Slime EMP" - id = "m_emp" - result = null - required_reagents = list("blood" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/yellow - required_other = 1 - on_reaction(var/datum/reagents/holder, var/created_volume) - empulse(get_turf(holder.my_atom), 3, 7) + +/datum/chemical_reaction/slimeoverload + name = "Slime EMP" + id = "m_emp" + result = null + required_reagents = list("blood" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/yellow + required_other = 1 + +/datum/chemical_reaction/slimeoverload/on_reaction(datum/reagents/holder, created_volume) + feedback_add_details("slime_cores_used","[type]") + empulse(get_turf(holder.my_atom), 3, 7) - slimecell - name = "Slime Powercell" - id = "m_cell" - result = null - required_reagents = list("plasma" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/yellow - required_other = 1 - on_reaction(var/datum/reagents/holder, var/created_volume) - var/obj/item/weapon/stock_parts/cell/slime/P = new /obj/item/weapon/stock_parts/cell/slime - P.loc = get_turf(holder.my_atom) +/datum/chemical_reaction/slimecell + name = "Slime Powercell" + id = "m_cell" + result = null + required_reagents = list("plasma_dust" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/yellow + required_other = 1 - slimeglow - name = "Slime Glow" - id = "m_glow" - result = null - required_reagents = list("water" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/yellow - required_other = 1 - on_reaction(var/datum/reagents/holder) - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("\red The contents of the slime core harden and begin to emit a warm, bright light."), 1) - var/obj/item/device/flashlight/slime/F = new /obj/item/device/flashlight/slime - F.loc = get_turf(holder.my_atom) +/datum/chemical_reaction/slimecell/on_reaction(datum/reagents/holder, created_volume) + feedback_add_details("slime_cores_used","[type]") + var/obj/item/weapon/stock_parts/cell/high/slime/P = new /obj/item/weapon/stock_parts/cell/high/slime + P.forceMove(get_turf(holder.my_atom)) + +/datum/chemical_reaction/slimeglow + name = "Slime Glow" + id = "m_glow" + result = null + required_reagents = list("water" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/yellow + required_other = 1 + +/datum/chemical_reaction/slimeglow/on_reaction(datum/reagents/holder) + feedback_add_details("slime_cores_used","[type]") + var/turf/T = get_turf(holder.my_atom) + T.visible_message("The slime begins to emit a soft light. Squeezing it will cause it to grow brightly.") + var/obj/item/device/flashlight/slime/F = new /obj/item/device/flashlight/slime + F.forceMove(get_turf(holder.my_atom)) //Purple - slimepsteroid - name = "Slime Steroid" - id = "m_steroid" - result = null - required_reagents = list("plasma" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/purple - required_other = 1 - on_reaction(var/datum/reagents/holder) - var/obj/item/weapon/slimesteroid/P = new /obj/item/weapon/slimesteroid - P.loc = get_turf(holder.my_atom) +/datum/chemical_reaction/slimepsteroid + name = "Slime Steroid" + id = "m_steroid" + result = null + required_reagents = list("plasma_dust" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/purple + required_other = 1 +/datum/chemical_reaction/slimepsteroid/on_reaction(datum/reagents/holder) + feedback_add_details("slime_cores_used","[type]") + var/obj/item/slimepotion/steroid/P = new /obj/item/slimepotion/steroid + P.forceMove(get_turf(holder.my_atom)) +/datum/chemical_reaction/slimejam + name = "Slime Jam" + id = "m_jam" + result = "slimejelly" + required_reagents = list("sugar" = 1) + result_amount = 10 + required_container = /obj/item/slime_extract/purple + required_other = 1 - slimejam - name = "Slime Jam" - id = "m_jam" - result = "slimejelly" - required_reagents = list("sugar" = 5) - result_amount = 10 - required_container = /obj/item/slime_extract/purple - required_other = 1 +/datum/chemical_reaction/slimejam/on_reaction(datum/reagents/holder) + feedback_add_details("slime_cores_used","[type]") //Dark Purple - slimeplasma - name = "Slime Plasma" - id = "m_plasma" - result = null - required_reagents = list("plasma" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/darkpurple - required_other = 1 - on_reaction(var/datum/reagents/holder) - var/obj/item/stack/sheet/mineral/plasma/P = new /obj/item/stack/sheet/mineral/plasma - P.amount = 10 - P.loc = get_turf(holder.my_atom) +/datum/chemical_reaction/slimeplasma + name = "Slime Plasma" + id = "m_plasma" + result = null + required_reagents = list("plasma_dust" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/darkpurple + required_other = 1 + +/datum/chemical_reaction/slimeplasma/on_reaction(datum/reagents/holder) + feedback_add_details("slime_cores_used","[type]") + var/obj/item/stack/sheet/mineral/plasma/P = new /obj/item/stack/sheet/mineral/plasma + P.amount = 3 + P.forceMove(get_turf(holder.my_atom)) //Red - slimeglycerol - name = "Slime Glycerol" - id = "m_glycerol" - result = "glycerol" - required_reagents = list("plasma" = 5) - result_amount = 8 - required_container = /obj/item/slime_extract/red - required_other = 1 + +/datum/chemical_reaction/slimemutator + name = "Slime Mutator" + id = "m_slimemutator" + result = null + required_reagents = list("plasma_dust" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/red + required_other = 1 + +/datum/chemical_reaction/slimemutator/on_reaction(datum/reagents/holder) + feedback_add_details("slime_cores_used","[type]") + var/obj/item/slimepotion/mutator/P = new /obj/item/slimepotion/mutator + P.forceMove(get_turf(holder.my_atom)) + +/datum/chemical_reaction/slimebloodlust + name = "Bloodlust" + id = "m_bloodlust" + result = null + required_reagents = list("blood" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/red + required_other = 1 + +/datum/chemical_reaction/slimebloodlust/on_reaction(datum/reagents/holder) + feedback_add_details("slime_cores_used","[type]") + for(var/mob/living/carbon/slime/slime in viewers(get_turf(holder.my_atom), null)) + slime.rabid = 1 + slime.visible_message("The [slime] is driven into a frenzy!") - slimebloodlust - name = "Bloodlust" - id = "m_bloodlust" - result = null - required_reagents = list("blood" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/red - required_other = 1 - on_reaction(var/datum/reagents/holder) - for(var/mob/living/carbon/slime/slime in viewers(get_turf(holder.my_atom), null)) - slime.rabid = 1 - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("\red The [slime] is driven into a frenzy!."), 1) +/datum/chemical_reaction/slimespeed + name = "Slime Speed" + id = "m_speed" + result = null + required_reagents = list("water" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/red + required_other = 1 +/datum/chemical_reaction/slimespeed/on_reaction(datum/reagents/holder) + feedback_add_details("slime_cores_used","[type]") + var/obj/item/slimepotion/speed/P = new /obj/item/slimepotion/speed + P.forceMove(get_turf(holder.my_atom)) - slimespeed - name = "Slime Speed" - id = "m_speed" - result = null - required_reagents = list("water" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/red - required_other = 1 - - on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - var/obj/item/weapon/slimespeed/P = new /obj/item/weapon/slimespeed - P.loc = get_turf(holder.my_atom) //Pink - slimeppotion - name = "Slime Potion" - id = "m_potion" - result = null - required_reagents = list("plasma" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/pink - required_other = 1 - on_reaction(var/datum/reagents/holder) - var/obj/item/weapon/slimepotion/P = new /obj/item/weapon/slimepotion - P.loc = get_turf(holder.my_atom) +/datum/chemical_reaction/docility + name = "Docility Potion" + id = "m_potion" + result = null + required_reagents = list("plasma_dust" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/pink + required_other = 1 + +/datum/chemical_reaction/docility/on_reaction(datum/reagents/holder) + feedback_add_details("slime_cores_used","[type]") + var/obj/item/slimepotion/docility/P = new /obj/item/slimepotion/docility + P.forceMove(get_turf(holder.my_atom)) //Black - slimemutate2 - name = "Advanced Mutation Toxin" - id = "mutationtoxin2" - result = "amutationtoxin" - required_reagents = list("plasma" = 5) - result_amount = 1 - required_other = 1 - required_container = /obj/item/slime_extract/black +/datum/chemical_reaction/slimemutate2 + name = "Advanced Mutation Toxin" + id = "mutationtoxin2" + result = "amutationtoxin" + required_reagents = list("plasma_dust" = 1) + result_amount = 1 + required_other = 1 + required_container = /obj/item/slime_extract/black + +/datum/chemical_reaction/slimemutate2/on_reaction(datum/reagents/holder) + feedback_add_details("slime_cores_used","[type]") //Oil - slimeexplosion - name = "Slime Explosion" - id = "m_explosion" - result = null - required_reagents = list("plasma" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/oil - required_other = 1 - on_reaction(var/datum/reagents/holder) - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("\red The slime extract begins to vibrate violently !"), 1) - spawn(50) - if(holder && holder.my_atom) - explosion(get_turf(holder.my_atom), 1 ,3, 6) +/datum/chemical_reaction/slimeexplosion + name = "Slime Explosion" + id = "m_explosion" + result = null + required_reagents = list("plasma_dust" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/oil + required_other = 1 + +/datum/chemical_reaction/slimeexplosion/on_reaction(datum/reagents/holder) + feedback_add_details("slime_cores_used","[type]") + var/turf/T = get_turf(holder.my_atom) + T.visible_message("The slime extract begins to vibrate violently !") + spawn(50) + if(holder && holder.my_atom) + explosion(get_turf(holder.my_atom), 1 ,3, 6) + //Light Pink - slimepotion2 - name = "Slime Potion 2" - id = "m_potion2" - result = null - result_amount = 1 - required_container = /obj/item/slime_extract/lightpink - required_reagents = list("plasma" = 5) - required_other = 1 - on_reaction(var/datum/reagents/holder) - var/obj/item/weapon/sentience_potion/P = new /obj/item/weapon/sentience_potion - P.loc = get_turf(holder.my_atom) +/datum/chemical_reaction/slimepotion2 + name = "Slime Potion 2" + id = "m_potion2" + result = null + result_amount = 1 + required_container = /obj/item/slime_extract/lightpink + required_reagents = list("plasma_dust" = 1) + required_other = 1 + +/datum/chemical_reaction/slimepotion2/on_reaction(datum/reagents/holder) + feedback_add_details("slime_cores_used","[type]") + var/obj/item/slimepotion/sentience/P = new /obj/item/slimepotion/sentience + P.forceMove(get_turf(holder.my_atom)) + //Adamantine - slimegolem - name = "Slime Golem" - id = "m_golem" - result = null - required_reagents = list("plasma" = 5) - result_amount = 1 - required_container = /obj/item/slime_extract/adamantine - required_other = 1 - on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - var/obj/effect/goleRUNe/Z = new /obj/effect/goleRUNe - Z.loc = get_turf(holder.my_atom) - Z.announce_to_ghosts() +/datum/chemical_reaction/slimegolem + name = "Slime Golem" + id = "m_golem" + result = null + required_reagents = list("plasma_dust" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/adamantine + required_other = 1 + +/datum/chemical_reaction/slimegolem/on_reaction(datum/reagents/holder) + feedback_add_details("slime_cores_used","[type]") + var/obj/effect/golemrune/Z = new /obj/effect/golemrune + Z.forceMove(get_turf(holder.my_atom)) + notify_ghosts("Golem rune created in [get_area(Z)].", 'sound/effects/ghost2.ogg') + //Bluespace - slimefloor2 - name = "Bluespace Floor" - id = "m_floor2" - result = null - required_reagents = list("blood" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/bluespace - required_other = 1 - on_reaction(datum/reagents/holder, created_volume) - feedback_add_details("slime_cores_used","[type]") - var/obj/item/stack/tile/bluespace/P = new /obj/item/stack/tile/bluespace - P.amount = 25 - P.loc = get_turf(holder.my_atom) +/datum/chemical_reaction/slimefloor2 + name = "Bluespace Floor" + id = "m_floor2" + result = null + required_reagents = list("blood" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/bluespace + required_other = 1 + +/datum/chemical_reaction/slimefloor2/on_reaction(datum/reagents/holder, created_volume) + feedback_add_details("slime_cores_used","[type]") + var/obj/item/stack/tile/bluespace/P = new /obj/item/stack/tile/bluespace + P.amount = 25 + P.forceMove(get_turf(holder.my_atom)) + + +/datum/chemical_reaction/slimecrystal + name = "Slime Crystal" + id = "m_crystal" + result = null + required_reagents = list("plasma_dust" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/bluespace + required_other = 1 + +/datum/chemical_reaction/slimecrystal/on_reaction(datum/reagents/holder, created_volume) + feedback_add_details("slime_cores_used","[type]") + if(holder.my_atom) + var/obj/item/weapon/ore/bluespace_crystal/BC = new(get_turf(holder.my_atom)) + BC.visible_message("The [BC.name] appears out of thin air!") - slimecrystal - name = "Slime Crystal" - id = "m_crystal" - result = null - required_reagents = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/bluespace - required_other = 1 - on_reaction(var/datum/reagents/holder, var/created_volume) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - if(holder.my_atom) - var/obj/item/weapon/ore/bluespace_crystal/BC = new(get_turf(holder.my_atom)) - BC.visible_message("The [BC.name] appears out of thin air!") //Cerulean - slimepsteroid2 - name = "Slime Steroid 2" - id = "m_steroid2" - result = null - required_reagents = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/cerulean - required_other = 1 - on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - var/obj/item/weapon/slimesteroid2/P = new /obj/item/weapon/slimesteroid2 - P.loc = get_turf(holder.my_atom) +/datum/chemical_reaction/slimepsteroid2 + name = "Slime Steroid 2" + id = "m_steroid2" + result = null + required_reagents = list("plasma_dust" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/cerulean + required_other = 1 - slime_territory - name = "Slime Territory" - id = "s_territory" - result = null - required_reagents = list("blood" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/cerulean - required_other = 1 - on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - var/obj/item/areaeditor/blueprints/slime/P = new /obj/item/areaeditor/blueprints/slime - P.forceMove(get_turf(holder.my_atom)) +/datum/chemical_reaction/slimepsteroid2/on_reaction(datum/reagents/holder) + feedback_add_details("slime_cores_used","[type]") + var/obj/item/slimepotion/enhancer/P = new /obj/item/slimepotion/enhancer + P.forceMove(get_turf(holder.my_atom)) + + + +/datum/chemical_reaction/slime_territory + name = "Slime Territory" + id = "s_territory" + result = null + required_reagents = list("blood" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/cerulean + required_other = 1 + +/datum/chemical_reaction/slime_territory/on_reaction(datum/reagents/holder) + feedback_add_details("slime_cores_used","[type]") + var/obj/item/areaeditor/blueprints/slime/P = new /obj/item/areaeditor/blueprints/slime + P.forceMove(get_turf(holder.my_atom)) //Sepia - slimestop - name = "Slime Stop" - id = "m_stop" - result = null - required_reagents = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/sepia - required_other = 1 - on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - spawn(0) //otherwise the reagent won't be used up until after the full timstop is gone through. - var/mob/mob = get_mob_by_key(holder.my_atom.fingerprintslast) - var/obj/effect/timestop/T = new (get_turf(holder.my_atom)) - T.immune += mob - T.timestop() +/datum/chemical_reaction/slimestop + name = "Slime Stop" + id = "m_stop" + result = null + required_reagents = list("plasma_dust" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/sepia + required_other = 1 + +/datum/chemical_reaction/slimestop/on_reaction(datum/reagents/holder) + feedback_add_details("slime_cores_used","[type]") + var/mob/mob = get_mob_by_key(holder.my_atom.fingerprintslast) + var/obj/effect/timestop/T = new /obj/effect/timestop + T.forceMove(get_turf(holder.my_atom)) + T.immune += mob + T.timestop() - slimecamera - name = "Slime Camera" - id = "m_camera" - result = null - required_reagents = list("water" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/sepia - required_other = 1 - on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - var/obj/item/device/camera/P = new /obj/item/device/camera - P.loc = get_turf(holder.my_atom) - var/obj/item/device/camera_film/Z = new /obj/item/device/camera_film - Z.loc = get_turf(holder.my_atom) +/datum/chemical_reaction/slimecamera + name = "Slime Camera" + id = "m_camera" + result = null + required_reagents = list("water" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/sepia + required_other = 1 + +/datum/chemical_reaction/slimecamera/on_reaction(datum/reagents/holder) + feedback_add_details("slime_cores_used","[type]") + var/obj/item/device/camera/P = new /obj/item/device/camera + P.forceMove(get_turf(holder.my_atom)) + var/obj/item/device/camera_film/Z = new /obj/item/device/camera_film + Z.forceMove(get_turf(holder.my_atom)) + +/datum/chemical_reaction/slimefloor + name = "Sepia Floor" + id = "m_floor" + result = null + required_reagents = list("blood" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/sepia + required_other = 1 + +/datum/chemical_reaction/slimefloor/on_reaction(datum/reagents/holder) + feedback_add_details("slime_cores_used","[type]") + var/obj/item/stack/tile/sepia/P = new /obj/item/stack/tile/sepia + P.amount = 25 + P.forceMove(get_turf(holder.my_atom)) - slimefloor - name = "Sepia Floor" - id = "m_floor" - result = null - required_reagents = list("blood" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/sepia - required_other = 1 - on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - var/obj/item/stack/tile/sepia/P = new /obj/item/stack/tile/sepia - P.amount = 25 - P.loc = get_turf(holder.my_atom) //Pyrite - slimepaint - name = "Slime Paint" - id = "s_paint" - result = null - required_reagents = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/pyrite - required_other = 1 - on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - var/list/paints = subtypesof(/obj/item/weapon/reagent_containers/glass/paint) - var/chosen = pick(paints) - var/obj/P = new chosen - if(P) - P.loc = get_turf(holder.my_atom) \ No newline at end of file + + +/datum/chemical_reaction/slimepaint + name = "Slime Paint" + id = "s_paint" + result = null + required_reagents = list("plasma_dust" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/pyrite + required_other = 1 + +/datum/chemical_reaction/slimepaint/on_reaction(datum/reagents/holder) + feedback_add_details("slime_cores_used","[type]") + var/list/paints = subtypesof(/obj/item/weapon/reagent_containers/glass/paint) + var/chosen = pick(paints) + var/obj/P = new chosen + if(P) + P.forceMove(get_turf(holder.my_atom)) + +//Rainbow :o) +/datum/chemical_reaction/slimeRNG + name = "Random Core" + id = "slimerng" + result = null + required_reagents = list("plasma_dust" = 1) + result_amount = 1 + required_other = 1 + required_container = /obj/item/slime_extract/rainbow + +/datum/chemical_reaction/slimeRNG/on_reaction(datum/reagents/holder) + feedback_add_details("slime_cores_used","[type]") + var/mob/living/carbon/slime/S = new /mob/living/carbon/slime + S.colour = pick("grey","orange", "metal", "blue", "purple", "dark purple", "dark blue", "green", "silver", "yellow", "gold", "yellow", "red", "silver", "pink", "cerulean", "sepia", "bluespace", "pyrite", "light pink", "oil", "adamantine", "black") + S.forceMove(get_turf(holder.my_atom)) + S.visible_message("Infused with plasma, the core begins to quiver and grow, and soon a new baby slime emerges from it!") diff --git a/code/modules/reagents/oldchem/reagents/reagents_flammable.dm b/code/modules/reagents/oldchem/reagents/reagents_flammable.dm index 361507d19e6..8494ff3957b 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_flammable.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_flammable.dm @@ -48,7 +48,7 @@ holder.remove_reagent("epinephrine", 2) if(iscarbon(M)) var/mob/living/carbon/C = M - C.adjustPlasma(20) + C.adjustPlasma(10) ..() return diff --git a/code/modules/reagents/reagent_containers/glass/bottle.dm b/code/modules/reagents/reagent_containers/glass/bottle.dm index de13b500f33..d37460b4949 100644 --- a/code/modules/reagents/reagent_containers/glass/bottle.dm +++ b/code/modules/reagents/reagent_containers/glass/bottle.dm @@ -303,10 +303,10 @@ /obj/item/weapon/reagent_containers/glass/bottle/plasma - name = "liquid plasma bottle" - desc = "A small bottle of liquid plasma. Extremely toxic and reacts with micro-organisms inside blood." + name = "plasma dust bottle" + desc = "A small bottle of plasma in dust form. Extremely toxic and reacts with micro-organisms inside blood." icon_state = "bottle8" - list_reagents = list("plasma" = 30) + list_reagents = list("plasma_dust" = 30) /obj/item/weapon/reagent_containers/glass/bottle/diphenhydramine name = "diphenhydramine bottle" diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index cf6927a6e0d..44384db8187 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -6,120 +6,95 @@ desc = "Goo extracted from a slime. Legends claim these to have \"magical powers\"." icon = 'icons/mob/slimes.dmi' icon_state = "grey slime extract" - force = 1.0 - w_class = 1.0 + force = 1 + w_class = 1 throwforce = 0 throw_speed = 3 throw_range = 6 - origin_tech = "biotech=4" - item_color = "grey" + origin_tech = "biotech=3" var/Uses = 1 // uses before it goes inert - var/enhanced = 0 //has it been enhanced before? - attackby(obj/item/O as obj, mob/user as mob, params) - if(istype(O, /obj/item/weapon/slimesteroid2)) - if(enhanced == 1) - to_chat(user, " This extract has already been enhanced!") - return ..() - if(Uses == 0) - to_chat(user, " You can't enhance a used extract!") - return ..() - to_chat(user, "You apply the enhancer. It now has triple the amount of uses.") - Uses = 3 - enhanced = 1 - qdel(O) - if(istype(O,/obj/item/weapon/storage/bag)) - ..() +/obj/item/slime_extract/attackby(obj/item/O, mob/user) + if(istype(O, /obj/item/slimepotion/enhancer)) + if(Uses >= 5) + to_chat(user, "You cannot enhance this extract further!") + return ..() + to_chat(user, "You apply the enhancer to the slime extract. It may now be reused one more time.") + Uses++ + qdel(O) + ..() /obj/item/slime_extract/New() ..() create_reagents(100) - /obj/item/slime_extract/grey name = "grey slime extract" icon_state = "grey slime extract" - item_color = "grey" /obj/item/slime_extract/gold name = "gold slime extract" icon_state = "gold slime extract" - item_color = "gold" /obj/item/slime_extract/silver name = "silver slime extract" icon_state = "silver slime extract" - item_color = "silver" /obj/item/slime_extract/metal name = "metal slime extract" icon_state = "metal slime extract" - item_color = "metal" /obj/item/slime_extract/purple name = "purple slime extract" icon_state = "purple slime extract" - item_color = "purple" /obj/item/slime_extract/darkpurple name = "dark purple slime extract" icon_state = "dark purple slime extract" - item_color = "darkpurple" /obj/item/slime_extract/orange name = "orange slime extract" icon_state = "orange slime extract" - item_color = "orange" /obj/item/slime_extract/yellow name = "yellow slime extract" icon_state = "yellow slime extract" - item_color = "yellow" /obj/item/slime_extract/red name = "red slime extract" icon_state = "red slime extract" - item_color = "red" /obj/item/slime_extract/blue name = "blue slime extract" icon_state = "blue slime extract" - item_color = "blue" /obj/item/slime_extract/darkblue name = "dark blue slime extract" icon_state = "dark blue slime extract" - item_color = "darkblue" /obj/item/slime_extract/pink name = "pink slime extract" icon_state = "pink slime extract" - item_color = "pink" /obj/item/slime_extract/green name = "green slime extract" icon_state = "green slime extract" - item_color = "green" /obj/item/slime_extract/lightpink name = "light pink slime extract" icon_state = "light pink slime extract" - item_color = "lightpink" /obj/item/slime_extract/black name = "black slime extract" icon_state = "black slime extract" - item_color = "black" /obj/item/slime_extract/oil name = "oil slime extract" icon_state = "oil slime extract" - item_color = "oil" /obj/item/slime_extract/adamantine name = "adamantine slime extract" icon_state = "adamantine slime extract" - item_color = "adamantine" /obj/item/slime_extract/bluespace name = "bluespace slime extract" @@ -141,57 +116,66 @@ name = "rainbow slime extract" icon_state = "rainbow slime extract" -////Pet Slime Creation/// +////Slime-derived potions/// -/obj/item/weapon/slimepotion - name = "docility potion" - desc = "A potent chemical mix that will nullify a slime's powers, causing it to become docile and tame." - icon = 'icons/obj/chemical.dmi' - icon_state = "bottle19" +/obj/item/slimepotion + name = "slime potion" + desc = "A hard yet gelatinous capsule excreted by a slime, containing mysterious substances." w_class = 1 origin_tech = "biotech=4" - attack(mob/living/carbon/slime/M as mob, mob/user as mob) - if(!istype(M, /mob/living/carbon/slime))//If target is not a slime. - to_chat(user, " The potion only works on slimes!") - return ..() - if(M.stat) - to_chat(user, " The slime is dead!") - return..() - if(M.mind) - to_chat(user, " The slime resists!") - return ..() - if(M.is_adult) - var/mob/living/simple_animal/adultslime/pet = new /mob/living/simple_animal/adultslime(M.loc) - pet.icon_state = "[M.colour] adult slime" - pet.icon_living = "[M.colour] adult slime" - pet.icon_dead = "[M.colour] baby slime dead" - pet.colour = "[M.colour]" - qdel(M) - var/newname = sanitize(copytext(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text,1,MAX_NAME_LEN)) +/obj/item/slimepotion/afterattack(obj/item/weapon/reagent_containers/target, mob/user , proximity) + if (istype(target)) + to_chat(user, "You cannot transfer [src] to [target]! It appears the potion must be given directly to a slime to absorb.") // le fluff faec + return - if (!newname) - newname = "pet slime" - pet.name = newname - pet.real_name = newname - qdel(src) - else - var/mob/living/simple_animal/slime/pet = new /mob/living/simple_animal/slime(M.loc) - pet.icon_state = "[M.colour] baby slime" - pet.icon_living = "[M.colour] baby slime" - pet.icon_dead = "[M.colour] baby slime dead" - pet.colour = "[M.colour]" - qdel(M) - var/newname = sanitize(copytext(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text,1,MAX_NAME_LEN)) +/obj/item/slimepotion/docility + name = "docility potion" + desc = "A potent chemical mix that nullifies a slime's hunger, causing it to become docile and tame." + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle19" - if (!newname) - newname = "pet slime" - pet.name = newname - pet.real_name = newname - qdel(src) - to_chat(user, "You feed the slime the potion, removing it's powers and calming it.") +/obj/item/slimepotion/docility/attack(mob/living/carbon/slime/M, mob/user) + if(!isslime(M)) + to_chat(user, " The potion only works on slimes!") + return ..() + if(M.stat) + to_chat(user, " The slime is dead!") + return..() + if(M.mind) + to_chat(user, " The slime resists!") + return ..() + if(M.is_adult) + var/mob/living/simple_animal/adultslime/pet = new /mob/living/simple_animal/adultslime(M.loc) + pet.icon_state = "[M.colour] adult slime" + pet.icon_living = "[M.colour] adult slime" + pet.icon_dead = "[M.colour] baby slime dead" + pet.colour = "[M.colour]" + qdel(M) + var/newname = sanitize(copytext(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text,1,MAX_NAME_LEN)) -/obj/item/weapon/sentience_potion + if (!newname) + newname = "pet slime" + pet.name = newname + pet.real_name = newname + qdel(src) + else + var/mob/living/simple_animal/slime/pet = new /mob/living/simple_animal/slime(M.loc) + pet.icon_state = "[M.colour] baby slime" + pet.icon_living = "[M.colour] baby slime" + pet.icon_dead = "[M.colour] baby slime dead" + pet.colour = "[M.colour]" + qdel(M) + var/newname = sanitize(copytext(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text,1,MAX_NAME_LEN)) + + if (!newname) + newname = "pet slime" + pet.name = newname + pet.real_name = newname + qdel(src) + to_chat(user, "You feed the slime the potion, removing it's powers and calming it.") + +/obj/item/slimepotion/sentience name = "sentience potion" desc = "A miraculous chemical mix that can raise the intelligence of creatures to human levels. Unlike normal slime potions, it can be absorbed by any nonsentient being." icon = 'icons/obj/chemical.dmi' @@ -199,11 +183,9 @@ origin_tech = "biotech=5" var/list/not_interested = list() var/being_used = 0 - w_class = 1 var/sentience_type = SENTIENCE_ORGANIC - -/obj/item/weapon/sentience_potion/afterattack(mob/living/M, mob/user) +/obj/item/slimepotion/sentience/afterattack(mob/living/M, mob/user) if(being_used || !ismob(M)) return if(!isanimal(M) || M.ckey) //only works on animals that aren't player controlled @@ -242,51 +224,89 @@ ..() -/obj/item/weapon/slimesteroid +/obj/item/slimepotion/steroid name = "slime steroid" - desc = "A potent chemical mix that will cause a slime to generate more extract." + desc = "A potent chemical mix that will cause a baby slime to generate more extract." icon = 'icons/obj/chemical.dmi' icon_state = "bottle16" - w_class = 1 - origin_tech = "biotech=4" +/obj/item/slimepotion/steroid/attack(mob/living/carbon/slime/M, mob/user) + if(!isslime(M))//If target is not a slime. + to_chat(user, "The steroid only works on baby slimes!") + return ..() + if(M.is_adult) //Can't steroidify adults + to_chat(user, "Only baby slimes can use the steroid!") + return ..() + if(M.stat) + to_chat(user, "The slime is dead!") + return ..() + if(M.cores >= 5) + to_chat(user, "The slime already has the maximum amount of extract!") + return ..() - attack(mob/living/carbon/slime/M as mob, mob/user as mob) - if(!istype(M, /mob/living/carbon/slime))//If target is not a slime. - to_chat(user, " The steroid only works on baby slimes!") - return ..() - if(M.is_adult) //Can't tame adults - to_chat(user, " Only baby slimes can use the steroid!") - return..() - if(M.stat) - to_chat(user, " The slime is dead!") - return..() - if(M.cores == 3) - to_chat(user, " The slime already has the maximum amount of extract!") - return..() + to_chat(user, "You feed the slime the steroid. It will now produce one more extract.") + M.cores++ + qdel(src) - to_chat(user, "You feed the slime the steroid. It now has triple the amount of extract.") - M.cores = 3 - qdel(src) - -/obj/item/weapon/slimesteroid2 +/obj/item/slimepotion/enhancer name = "extract enhancer" - desc = "A potent chemical mix that will give a slime extract three uses." + desc = "A potent chemical mix that will give a slime extract an additional use." icon = 'icons/obj/chemical.dmi' icon_state = "bottle17" - w_class = 1 - origin_tech = "biotech=4" +/obj/item/slimepotion/stabilizer + name = "slime stabilizer" + desc = "A potent chemical mix that will reduce the chance of a slime mutating." + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle15" -/obj/item/weapon/slimespeed +/obj/item/slimepotion/stabilizer/attack(mob/living/carbon/slime/M, mob/user) + if(!isslime(M)) + to_chat(user, "The stabilizer only works on slimes!") + return ..() + if(M.stat) + to_chat(user, "The slime is dead!") + return ..() + if(M.mutation_chance == 0) + to_chat(user, "The slime already has no chance of mutating!") + return ..() + + to_chat(user, "You feed the slime the stabilizer. It is now less likely to mutate.") + M.mutation_chance = Clamp(M.mutation_chance-15,0,100) + qdel(src) + +/obj/item/slimepotion/mutator + name = "slime mutator" + desc = "A potent chemical mix that will increase the chance of a slime mutating." + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle3" + +/obj/item/slimepotion/mutator/attack(mob/living/carbon/slime/M, mob/user) + if(!isslime(M)) + to_chat(user, "The mutator only works on slimes!") + return ..() + if(M.stat) + to_chat(user, "The slime is dead!") + return ..() + if(M.mutator_used) + to_chat(user, "This slime has already consumed a mutator, any more would be far too unstable!") + return ..() + if(M.mutation_chance == 100) + to_chat(user, "The slime is already guaranteed to mutate!") + return ..() + + to_chat(user, "You feed the slime the mutator. It is now more likely to mutate.") + M.mutation_chance = Clamp(M.mutation_chance+12,0,100) + M.mutator_used = TRUE + qdel(src) + +/obj/item/slimepotion/speed name = "slime speed potion" desc = "A potent chemical mix that will remove the slowdown from any item." icon = 'icons/obj/chemical.dmi' icon_state = "bottle3" - w_class = 1 - origin_tech = "biotech=4" -/obj/item/weapon/slimespeed/afterattack(obj/item/C, mob/user) +/obj/item/slimepotion/speed/afterattack(obj/item/C, mob/user) ..() if(!istype(C)) to_chat(user, "The potion can only be used on items!") @@ -299,17 +319,14 @@ C.slowdown = 0 qdel(src) -/obj/item/weapon/slimefireproof +/obj/item/slimepotion/fireproof name = "slime chill potion" desc = "A potent chemical mix that will fireproof any article of clothing. Has three uses." icon = 'icons/obj/chemical.dmi' icon_state = "bottle17" var/uses = 3 - w_class = 1 - origin_tech = "biotech=4" - -/obj/item/weapon/slimefireproof/afterattack(obj/item/clothing/C, mob/user) +/obj/item/slimepotion/fireproof/afterattack(obj/item/clothing/C, mob/user) ..() if(!uses) qdel(src) @@ -319,7 +336,7 @@ return if(C.max_heat_protection_temperature == FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT) to_chat(user, "The [C] is already fireproof!") - return..() + return ..() to_chat(user, "You slather the blue gunk over the [C], fireproofing it.") C.name = "fireproofed [C.name]" C.color = "#000080" @@ -329,6 +346,78 @@ if(!uses) qdel(src) +////////Adamantine Golem stuff I dunno where else to put it + +/obj/effect/golemrune + anchored = 1 + desc = "a strange rune used to create golems. It glows when spirits are nearby." + name = "rune" + icon = 'icons/obj/rune.dmi' + icon_state = "golem" + unacidable = 1 + layer = TURF_LAYER + var/list/mob/dead/observer/ghosts[0] + +/obj/effect/golemrune/New() + ..() + processing_objects.Add(src) + +/obj/effect/golemrune/process() + if(ghosts.len>0) + icon_state = "golem2" + else + icon_state = "golem" + +/obj/effect/golemrune/attack_hand(mob/living/user as mob) + var/mob/dead/observer/ghost + for(var/mob/dead/observer/O in src.loc) + if(!check_observer(O)) + to_chat(O, "\red You are not eligible to become a golem.") + continue + ghost = O + break + if(!ghost) + to_chat(user, "The rune fizzles uselessly. There is no spirit nearby.") + return + var/mob/living/carbon/human/golem/G = new /mob/living/carbon/human/golem + G.change_gender(pick(MALE,FEMALE)) + G.loc = src.loc + G.key = ghost.key + to_chat(G, "You are an adamantine golem. You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools. Serve [user], and assist them in completing their goals at any cost.") + qdel(src) + +/obj/effect/golemrune/Topic(href,href_list) + if("signup" in href_list) + var/mob/dead/observer/O = locate(href_list["signup"]) + volunteer(O) + +/obj/effect/golemrune/attack_ghost(var/mob/dead/observer/O) + if(!O) return + volunteer(O) + +/obj/effect/golemrune/proc/check_observer(var/mob/dead/observer/O) + if(!O) + return 0 + if(!O.client) + return 0 + if(O.mind && O.mind.current && O.mind.current.stat != DEAD) + return 0 + if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted) + return 0 + return 1 + +/obj/effect/golemrune/proc/volunteer(var/mob/dead/observer/O) + if(O in ghosts) + ghosts.Remove(O) + to_chat(O, "\red You are no longer signed up to be a golem.") + else + if(!check_observer(O)) + to_chat(O, "\red You are not eligible to become a golem.") + return + ghosts.Add(O) + to_chat(O, "\blue You are signed up to be a golem.") + + /obj/effect/timestop @@ -460,80 +549,3 @@ icon_state = "sepia" desc = "Time seems to flow very slowly around these tiles." floor_tile = /obj/item/stack/tile/sepia - -/obj/effect/goleRUNe - anchored = 1 - desc = "a strange rune used to create golems. It glows when spirits are nearby." - name = "rune" - icon = 'icons/obj/rune.dmi' - icon_state = "golem" - unacidable = 1 - layer = TURF_LAYER - var/list/mob/dead/observer/ghosts[0] - - New() - ..() - processing_objects.Add(src) - - process() - if(ghosts.len>0) - icon_state = "golem2" - else - icon_state = "golem" - - attack_hand(mob/living/user as mob) - var/mob/dead/observer/ghost - for(var/mob/dead/observer/O in src.loc) - if(!check_observer(O)) - to_chat(O, "\red You are not eligible to become a golem.") - continue - ghost = O - break - if(!ghost) - to_chat(user, "The rune fizzles uselessly. There is no spirit nearby.") - return - var/mob/living/carbon/human/golem/G = new /mob/living/carbon/human/golem - G.change_gender(pick(MALE,FEMALE)) - G.loc = src.loc - G.key = ghost.key - to_chat(G, "You are an adamantine golem. You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools. Serve [user], and assist them in completing their goals at any cost.") - qdel(src) - - - proc/announce_to_ghosts() - for(var/mob/dead/observer/O in player_list) - if(O.client) - var/area/A = get_area(src) - if(A) - to_chat(O, "\blue Golem rune created in [A.name]. (Teleport | Sign Up)") - - Topic(href,href_list) - if("signup" in href_list) - var/mob/dead/observer/O = locate(href_list["signup"]) - volunteer(O) - - attack_ghost(var/mob/dead/observer/O) - if(!O) return - volunteer(O) - - proc/check_observer(var/mob/dead/observer/O) - if(!O) - return 0 - if(!O.client) - return 0 - if(O.mind && O.mind.current && O.mind.current.stat != DEAD) - return 0 - if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted) - return 0 - return 1 - - proc/volunteer(var/mob/dead/observer/O) - if(O in ghosts) - ghosts.Remove(O) - to_chat(O, "\red You are no longer signed up to be a golem.") - else - if(!check_observer(O)) - to_chat(O, "\red You are not eligible to become a golem.") - return - ghosts.Add(O) - to_chat(O, "\blue You are signed up to be a golem.") From 64cd6a0cdc88fe26d6dae10d9edc8e80452c3c97 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Wed, 6 Apr 2016 02:20:24 -0400 Subject: [PATCH 317/328] TG Statue Fixes/Refactor --- code/modules/mob/living/silicon/silicon.dm | 1 + .../mob/living/simple_animal/bot/bot.dm | 1 + .../living/simple_animal/hostile/statue.dm | 150 +++++++----------- code/modules/mob/mob_defines.dm | 2 + 4 files changed, 64 insertions(+), 90 deletions(-) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index a49e79a59e7..5d88814440b 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -2,6 +2,7 @@ gender = NEUTER robot_talk_understand = 1 voice_name = "synthesized voice" + has_unlimited_silicon_privilege = 1 var/syndicate = 0 var/const/MAIN_CHANNEL = "Main Frequency" var/lawchannel = MAIN_CHANNEL // Default channel on which to state laws diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index af39fbbd6f3..b9bf9046482 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -11,6 +11,7 @@ damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 + has_unlimited_silicon_privilege = 1 sentience_type = SENTIENCE_ARTIFICIAL status_flags = 0 //no default canpush can_strip = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index 1f431269e8d..aeda42633a6 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -4,9 +4,9 @@ name = "statue" // matches the name of the statue with the flesh-to-stone spell desc = "An incredibly lifelike marble carving. Its eyes seems to follow you.." // same as an ordinary statue with the added "eye following you" description icon = 'icons/obj/statue.dmi' - icon_state = "angelseen" - icon_living = "angelseen" - icon_dead = "angelseen" + icon_state = "angel" + icon_living = "angel" + icon_dead = "angel" gender = NEUTER a_intent = I_HARM @@ -14,8 +14,9 @@ response_disarm = "pushes" speed = -1 - maxHealth = 1250 - health = 1250 + maxHealth = 50000 + health = 50000 + healable = 0 harm_intent_damage = 35 melee_damage_lower = 34 @@ -40,7 +41,9 @@ sight = SEE_SELF|SEE_MOBS|SEE_OBJS|SEE_TURFS anchored = 1 -// status_flags = GODMODE // Cannot push also + status_flags = GODMODE // Cannot push also + + var/cannot_be_seen = 1 var/mob/living/creator = null @@ -60,137 +63,95 @@ if(creator) src.creator = creator -/mob/living/simple_animal/hostile/statue/Move(var/turf/NewLoc) +/mob/living/simple_animal/hostile/statue/Move(turf/NewLoc) if(can_be_seen(NewLoc)) - icon_state = "angelseen" if(client) to_chat(src, "You cannot move, there are eyes on you!") return 0 - icon_state = "angel" return ..() -/mob/living/simple_animal/hostile/statue/process_ai() - . = ..() - if(!.) - return - spawn() //for saftey - checkTargets() -/mob/living/simple_animal/hostile/statue/proc/checkTargets() - if(target) +/mob/living/simple_animal/hostile/statue/process_ai() + ..() + if(target) // If we have a target and we're AI controlled var/mob/watching = can_be_seen() + // If they're not our target if(watching && watching != target) + // This one is closer. if(get_dist(watching, src) > get_dist(target, src)) LoseTarget() GiveTarget(watching) /mob/living/simple_animal/hostile/statue/AttackingTarget() - if(!can_be_seen()) - icon_state = "angelattack" + if(can_be_seen(get_turf(loc))) + if(client) + to_chat(src, "You cannot attack, there are eyes on you!") + return + else ..() /mob/living/simple_animal/hostile/statue/DestroySurroundings() - if(!can_be_seen()) + if(!can_be_seen(get_turf(loc))) ..() /mob/living/simple_animal/hostile/statue/face_atom() - if(!can_be_seen()) + if(!can_be_seen(get_turf(loc))) ..() -/mob/living/simple_animal/hostile/statue/UnarmedAttack() - if(can_be_seen()) - icon_state = "angelseen" - if(client) - to_chat(src, "You cannot attack, there are eyes on you!") - return - icon_state = "angelattack" - ..() - -/mob/living/simple_animal/hostile/statue/proc/can_be_seen(var/turf/destination) +/mob/living/simple_animal/hostile/statue/proc/can_be_seen(turf/destination) + if(!cannot_be_seen) + return null // Check for darkness var/turf/T = get_turf(loc) - - var/light_amount - var/DLlight_amount - - if(T.dynamic_lighting) - light_amount = T.get_lumcount() - else - light_amount = 5 - - if(destination && destination.dynamic_lighting) - DLlight_amount = destination.get_lumcount() - else - DLlight_amount = 5 - - if(T && destination) - //Don't check it twice if our destination is the tile we are on or we can't even get to our destination + if(T && destination && T.lighting_overlay) + if(T.get_lumcount() * 10 < 1 && destination.get_lumcount() * 10 < 1) // No one can see us in the darkness, right? + return null if(T == destination) destination = null - else if(light_amount < 0.1 && DLlight_amount < 0.1) // No one can see us in the darkness, right? - return null - //We aren't in darkness, loop for viewers. + // We aren't in darkness, loop for viewers. var/list/check_list = list(src) if(destination) check_list += destination - //This loop will, at most, loop twice. + // This loop will, at most, loop twice. for(var/atom/check in check_list) for(var/mob/living/M in viewers(world.view + 1, check) - src) - if(M.client && CanAttack(M)) - if(M.blinded || (M.sdisabilities & BLIND)) - return null - - //calculates if any mobs are actually facing the statue - var/xdif = M.x - src.x - var/ydif = M.y - src.y - - if(abs(xdif) < abs(ydif)) //mob is either above or below src - if(ydif < 0 && M.dir == NORTH) //mob is below src and looking up - return M - if(ydif > 0 && M.dir == SOUTH) //mob is above src and looking down - return M - - else if(abs(xdif) > abs(ydif)) //mob is either left or right of src - if(xdif < 0 && M.dir == EAST) //mob is to the left of src and looking right - return M - if(xdif > 0 && M.dir == WEST) //mob is to the right of src and looking left - return M - - else if(xdif == 0 && ydif == 0) //mob is on the same tile as src + if(M.client && CanAttack(M) && !M.has_unlimited_silicon_privilege) + if(!M.eye_blind) return M + for(var/obj/mecha/M in view(world.view + 1, check)) //assuming if you can see them they can see you + if(M.occupant && M.occupant.client) + if(!M.occupant.eye_blind) + return M.occupant + return null +// Cannot talk - -//Cannot talk /mob/living/simple_animal/hostile/statue/say() return 0 -/mob/living/simple_animal/hostile/statue/death(gibbed) - if(!gibbed) //The looping ends here. - dust() - return - return ..() +// Turn to dust when gibbed -//Stop attacking clientless mobs +/mob/living/simple_animal/hostile/statue/gib() + dust() -/mob/living/simple_animal/hostile/statue/CanAttack(var/atom/the_target) - if(mind && mind.key && !ckey) - return 0 + +// Stop attacking clientless mobs + +/mob/living/simple_animal/hostile/statue/CanAttack(atom/the_target) if(isliving(the_target)) var/mob/living/L = the_target if(!L.client && !L.ckey) return 0 return ..() +// Don't attack your creator if there is one + /mob/living/simple_animal/hostile/statue/ListTargets() . = ..() return . - creator -/mob/living/simple_animal/hostile/statue/sentience_act() - faction -= "neutral" - // Statue powers // Flicker lights @@ -216,15 +177,15 @@ message = "You glare your eyes." charge_max = 600 clothes_req = 0 - range = 8 + range = 10 /obj/effect/proc_holder/spell/aoe_turf/blindness/cast(list/targets) for(var/mob/living/L in living_mob_list) + if(L == usr) + continue var/turf/T = get_turf(L.loc) if(T && T in targets) L.eye_blind = max(L.eye_blind, 4) - if(issilicon(L)) - L.Weaken(4) return //Toggle Night Vision @@ -248,4 +209,13 @@ else target.see_invisible = SEE_INVISIBLE_LIVING name = "Toggle Nightvision \[OFF\]" - return \ No newline at end of file + return + + +/mob/living/simple_animal/hostile/statue/sentience_act() + faction -= "neutral" + +/mob/living/simple_animal/hostile/statue/restrained() + . = ..() + if(can_be_seen(loc)) + return 1 \ No newline at end of file diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 810e764ab62..0121905380a 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -203,6 +203,8 @@ var/digitalcamo = 0 // Can they be tracked by the AI? var/weakeyes = 0 //Are they vulnerable to flashes? + var/has_unlimited_silicon_privilege = 0 // Can they interact with station electronics + var/list/radar_blips = list() // list of screen objects, radar blips var/radar_open = 0 // nonzero is radar is open From bc4b92acaa66a24021e46fa421784ecc7de1a63c Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Tue, 5 Apr 2016 23:35:34 -0700 Subject: [PATCH 318/328] Add to_chat() guidelines to CONTRIBUTING.md Updates CONTRIBUTING.md to include "you must use to_chat() instead of mob/client/world << "output"". --- .github/CONTRIBUTING.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 70f34eff6cb..cc17a9975c7 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -38,7 +38,7 @@ actual development. and why it changes it. We do not want to have to read all of you commit names to figure out what your pull request is about. - Any pull request that is not solely composed of fixes or non gameplay-affecting - refactors must have a changelog. Inline changelogs are supported through the format + refactors must have a changelog. Inline changelogs are supported through the format described [here](https://github.com/ParadiseSS13/Paradise/pull/3291#issuecomment-172950466) and should be used rather than manually edited .yml file changelogs. - Pull requests should not have any merge commits except in the case of fixing merge @@ -58,6 +58,9 @@ actual development. be a new proc that they both can use. - No magic numbers/strings. If you have a number or text that is important and used in your code, make a `#DEFINE` statement with a name that clearly indicates it's use. + - If you want to output a message to a player's chat + (this includes text sent to `world`), use `to_chat(mob/client/world, "message")`. + Do not use `mob/client/world << "message"`. - Do not use one-line control statements (if, else, for, while, etc). The space saved is not worth the decreased readability. - Control statements comparing a variable to a constant should be formatted `variable`, From 85a58e59a61b26fe6c2fe3a274d85a41561fbd56 Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Wed, 6 Apr 2016 20:41:45 -0400 Subject: [PATCH 319/328] Fixes to_chat script fuckery --- code/game/objects/effects/decals/Cleanable/tracks.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/effects/decals/Cleanable/tracks.dm b/code/game/objects/effects/decals/Cleanable/tracks.dm index 6e8c591399d..48e865c78a3 100644 --- a/code/game/objects/effects/decals/Cleanable/tracks.dm +++ b/code/game/objects/effects/decals/Cleanable/tracks.dm @@ -78,7 +78,7 @@ var/global/list/image/fluidtrack_cache=list() // Process 4 bits for(var/bi=0;bi<4;bi++) - to_chat(b=1, bi) + b=1< Date: Thu, 7 Apr 2016 09:29:54 -0400 Subject: [PATCH 320/328] monkey recycler QoL --- code/game/machinery/kitchen/monkeyrecycler.dm | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/code/game/machinery/kitchen/monkeyrecycler.dm b/code/game/machinery/kitchen/monkeyrecycler.dm index d41558c161e..12feba6cf17 100644 --- a/code/game/machinery/kitchen/monkeyrecycler.dm +++ b/code/game/machinery/kitchen/monkeyrecycler.dm @@ -12,6 +12,8 @@ var/grinded = 0 var/required_grind = 5 var/cube_production = 1 + var/cycle_through = 0 + var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/cube_type = /obj/item/weapon/reagent_containers/food/snacks/monkeycube /obj/machinery/monkey_recycler/New() ..() @@ -44,6 +46,22 @@ default_deconstruction_crowbar(O) + if(istype(O, /obj/item/device/multitool)) + cycle_through++ + switch(cycle_through) + if(1) + cube_type = /obj/item/weapon/reagent_containers/food/snacks/monkeycube/farwacube + if(2) + cube_type = /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wolpincube + if(3) + cube_type = /obj/item/weapon/reagent_containers/food/snacks/monkeycube/stokcube + if(4) + cube_type = /obj/item/weapon/reagent_containers/food/snacks/monkeycube/neaeracube + if(5) + cube_type = /obj/item/weapon/reagent_containers/food/snacks/monkeycube + cycle_through = 0 + to_chat(user, "You change the monkeycube type to [cube_type.name].") + if (src.stat != 0) //NOPOWER etc return if (istype(O, /obj/item/weapon/grab)) @@ -80,7 +98,7 @@ playsound(src.loc, 'sound/machines/hiss.ogg', 50, 1) grinded -= required_grind for(var/i = 0, i < cube_production, i++) // Forgot to fix this bit the first time through - new /obj/item/weapon/reagent_containers/food/snacks/monkeycube(src.loc) + new cube_type(src.loc) to_chat(user, "The machine's display flashes that it has [grinded] monkey\s worth of material left.") else // I'm not sure if the \s macro works with a word in between; I'll play it safe to_chat(user, "The machine needs at least [required_grind] monkey\s worth of material to compress [cube_production] monkey\s. It only has [grinded].") From 29f9507052a1b5b706c678a3b486446b14e657fc Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Thu, 7 Apr 2016 16:35:53 -0400 Subject: [PATCH 321/328] Fixes pulling blood --- code/modules/mob/living/living.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index ae101b15c5d..4d5245cbf12 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -484,11 +484,10 @@ var/atom/movable/t = M.pulling M.stop_pulling() - //this is the gay blood on floor shit -- Added back -- Skie if (M.lying && (prob(M.getBruteLoss() / 6))) var/turf/location = M.loc if (istype(location, /turf/simulated)) - location.add_blood() + location.add_blood(M) pulling.Move(T, get_dir(pulling, T)) if(M) M.start_pulling(t) From 81d91df5ce2b3f3c61214a74d92ee704218181e1 Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Thu, 7 Apr 2016 17:02:17 -0400 Subject: [PATCH 322/328] Makes fingerless gloves functionally clipped --- code/modules/clothing/gloves/miscellaneous.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 3a3558d2065..060dd1ca47c 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -10,6 +10,7 @@ species_restricted = null strip_delay = 40 put_on_delay = 20 + clipped = 1 /obj/item/clothing/gloves/cyborg desc = "beep boop borp" From 53029a3f3e12e5692bbccb701447379282cedb90 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 7 Apr 2016 17:47:38 -0400 Subject: [PATCH 323/328] Automatic changelog generation for PR #4125 --- html/changelogs/AutoChangeLog-pr-4125.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4125.yml diff --git a/html/changelogs/AutoChangeLog-pr-4125.yml b/html/changelogs/AutoChangeLog-pr-4125.yml new file mode 100644 index 00000000000..a0d8e85b9f7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4125.yml @@ -0,0 +1,4 @@ +author: Tastyfish +delete-after: True +changes: + - rscadd: "More floor blood for the blood gods. (Or rather, as much as there was supposed to be.)" From 111c323391db4909e7ece2001501188be749eb33 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 7 Apr 2016 17:54:19 -0400 Subject: [PATCH 324/328] Automatic changelog generation for PR #4113 --- html/changelogs/AutoChangeLog-pr-4113.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4113.yml diff --git a/html/changelogs/AutoChangeLog-pr-4113.yml b/html/changelogs/AutoChangeLog-pr-4113.yml new file mode 100644 index 00000000000..f4d5db513f8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4113.yml @@ -0,0 +1,9 @@ +author: Fox McCloud +delete-after: True +changes: + - tweak: "Statues can no longer move/attack people unless they're in total darkness or all mobs viewing them are blinded" + - tweak: "statues are invincible to anything other than full out gibbing." + - tweak: "Statues flicker lights spell range increased" + - tweak: "Blind spell no longer impacts silicons" + - bugfix: "Fixes statues being able to attack/move whenever they feel like it, regardless of client statues" + - bugfix: "Fixes blind spell impacting the statue" From ba5c45bfa41a3566140d0edea551167edaffebc5 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 7 Apr 2016 17:54:35 -0400 Subject: [PATCH 325/328] Automatic changelog generation for PR #4112 --- html/changelogs/AutoChangeLog-pr-4112.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4112.yml diff --git a/html/changelogs/AutoChangeLog-pr-4112.yml b/html/changelogs/AutoChangeLog-pr-4112.yml new file mode 100644 index 00000000000..3c0c47b8ccc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4112.yml @@ -0,0 +1,19 @@ +author: Fox McCloud +delete-after: True +changes: + - rscadd: "Added in Plasma Dust reagent, acquired by grinding plasma sheets; it's more toxic than regular plasma and generates plasma gas when spilled onto turfs." + - tweak: "Slimecore reactions now require plasma dust as opposed to dispenser plasma" + - rscadd: "Added in new Rainbow slime; inject with plasma dust to get a random colored slime. Acquire by having 100 mutation chance on a slime when it splits." + - rscadd: "Monkey Recycler can produce different types of monkey cubes; change the cube type by using a multitool on the recycler" + - tweak: "Epinephrine/plasma reagents changing mutation rate has been removed" + - tweak: "Mutation chance is inherited from slime generation to slime generation as opposed to being purely random." + - tweak: "New reactions added for red and blue extracts: red generates mutator, which increases mutation chance, and blue generates stabilizer, which decreases mutation chance." + - tweak: "Slime glycerol reaction removed" + - tweak: "Slime cells are now high capacity cells (more power than before)" + - tweak: "extract enhancer increases the slime core usage by 1 as oppose to setting it to three" + - tweak: "slime enhancer increases slime cores by 1 as opposed to setting the core amount to 3" + - tweak: "Chill reaction lowers body temperature slightly more so it doesn't just wear off instantly" + - tweak: "Reduces Xenobio plasma sheets from 8 to 3 and removes that pesky boombox" + - bugfix: "Processors no longer produce 1 more slime core than intended" + - bugfix: "Less blank/spriteless/empty foods from the silver core reaction" + - tweak: "Virology mix reactions now use plasma dust as opposed to plasma" From 7cf0f7627abf657c2e02774d1fb7ec6e70f14e5c Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Thu, 7 Apr 2016 22:14:43 -0400 Subject: [PATCH 326/328] Playing with Monkey Meat --- code/modules/mob/living/carbon/human/species/monkey.dm | 2 ++ code/modules/mob/living/carbon/human/species/species.dm | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species/monkey.dm b/code/modules/mob/living/carbon/human/species/monkey.dm index 8115d3859fa..72972f98baf 100644 --- a/code/modules/mob/living/carbon/human/species/monkey.dm +++ b/code/modules/mob/living/carbon/human/species/monkey.dm @@ -50,6 +50,8 @@ /datum/species/monkey/handle_post_spawn(var/mob/living/carbon/human/H) H.real_name = "[lowertext(name)] ([rand(100,999)])" H.name = H.real_name + H.butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/monkey = 5) + ..() /datum/species/monkey/handle_dna(var/mob/living/carbon/human/H) diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index f810be86382..3fad4194034 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -322,8 +322,6 @@ return /datum/species/proc/handle_post_spawn(var/mob/living/carbon/C) //Handles anything not already covered by basic species assignment. - if(C.get_species() == "Monkey" || C.get_species() == "Farwa" || C.get_species() == "Stok" || C.get_species() == "Wolpin" || C.get_species() == "Neara") - C.butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/monkey = 5) grant_abilities(C) return From 7137af5fce6c3dc8391d6e8331247cd60c30ea0f Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Thu, 7 Apr 2016 22:20:50 -0400 Subject: [PATCH 327/328] forgot this --- code/modules/mob/living/carbon/human/species/species.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 3fad4194034..7a313956e7e 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -331,7 +331,7 @@ return /datum/species/proc/handle_pre_change(var/mob/living/carbon/human/H) - if(!H.get_species() == "Monkey" || !H.get_species() == "Farwa" || !H.get_species() == "Stok" || !H.get_species() == "Wolpin" || !H.get_species() == "Neara") + if(H.butcher_results)//clear it out so we don't butcher a actual human. H.butcher_results = null remove_abilities(H) return From 751b62a5b6a34e0e339f6f76c22763425b9f10e7 Mon Sep 17 00:00:00 2001 From: TheDZD Date: Thu, 7 Apr 2016 22:33:44 -0400 Subject: [PATCH 328/328] Reverts #1 --- html/changelog.html | 61 +++++++++++++++++++++ html/changelogs/.all_changelog.yml | 64 +++++++++++++++++++++++ html/changelogs/AutoChangeLog-pr-4041.yml | 6 --- html/changelogs/AutoChangeLog-pr-4070.yml | 4 -- html/changelogs/AutoChangeLog-pr-4075.yml | 5 -- html/changelogs/AutoChangeLog-pr-4082.yml | 4 -- html/changelogs/AutoChangeLog-pr-4083.yml | 4 -- html/changelogs/AutoChangeLog-pr-4088.yml | 4 -- html/changelogs/AutoChangeLog-pr-4094.yml | 4 -- html/changelogs/AutoChangeLog-pr-4095.yml | 7 --- html/changelogs/AutoChangeLog-pr-4096.yml | 4 -- html/changelogs/AutoChangeLog-pr-4097.yml | 5 -- html/changelogs/AutoChangeLog-pr-4100.yml | 4 -- html/changelogs/AutoChangeLog-pr-4112.yml | 19 ------- html/changelogs/AutoChangeLog-pr-4113.yml | 9 ---- html/changelogs/AutoChangeLog-pr-4125.yml | 4 -- 16 files changed, 125 insertions(+), 83 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4041.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4070.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4075.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4082.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4083.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4088.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4094.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4095.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4096.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4097.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4100.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4112.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4113.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4125.yml diff --git a/html/changelog.html b/html/changelog.html index 62dfd77e8f6..7c09c14460a 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,67 @@ -->
      +

      07 April 2016

      +

      Crazylemon64 updated:

      +
        +
      • Removes an offset from the advanced virus stealth calculation, causing viruses to be more stealthy than the sum of their symptoms.
      • +
      • Mulebots will now send announcements to relevant requests consoles on delivery again.
      • +
      +

      FalseIncarnate updated:

      +
        +
      • Adds logic gates, for doing illogical things in a logical manner.
      • +
      • Adds buildable light switches, for all your light toggling needs.
      • +
      • Fixes a resource duplication bug with mass driver buttons.
      • +
      +

      Fethas updated:

      +
        +
      • maybe makes them last longer...maybe..and fixes the event end message
      • +
      +

      Fox McCloud updated:

      +
        +
      • Maps in the slime management console to Xenobio
      • +
      • Reduces Xenobio monkey box count from 4 to 2
      • +
      • Fixes weakeyes having a negligible impact
      • +
      • Can spawn friendly animals with a new gold core reaction by injection with water
      • +
      • Hostile animal spawn increased from 3 to 5 for hostile gold cores
      • +
      • Swarmers, revenants, and morphs no longer gold core spawnable
      • +
      • Fixes invisible animal spawns from gold core/life reactions
      • +
      • Adds tape to the ArtVend
      • +
      • Can no longer use sentience potions on bots
      • +
      • Added in Plasma Dust reagent, acquired by grinding plasma sheets; it's more toxic than regular plasma and generates plasma gas when spilled onto turfs.
      • +
      • Slimecore reactions now require plasma dust as opposed to dispenser plasma
      • +
      • Added in new Rainbow slime; inject with plasma dust to get a random colored slime. Acquire by having 100 mutation chance on a slime when it splits.
      • +
      • Monkey Recycler can produce different types of monkey cubes; change the cube type by using a multitool on the recycler
      • +
      • Epinephrine/plasma reagents changing mutation rate has been removed
      • +
      • Mutation chance is inherited from slime generation to slime generation as opposed to being purely random.
      • +
      • New reactions added for red and blue extracts: red generates mutator, which increases mutation chance, and blue generates stabilizer, which decreases mutation chance.
      • +
      • Slime glycerol reaction removed
      • +
      • Slime cells are now high capacity cells (more power than before)
      • +
      • extract enhancer increases the slime core usage by 1 as oppose to setting it to three
      • +
      • slime enhancer increases slime cores by 1 as opposed to setting the core amount to 3
      • +
      • Chill reaction lowers body temperature slightly more so it doesn't just wear off instantly
      • +
      • Reduces Xenobio plasma sheets from 8 to 3 and removes that pesky boombox
      • +
      • Processors no longer produce 1 more slime core than intended
      • +
      • Less blank/spriteless/empty foods from the silver core reaction
      • +
      • Virology mix reactions now use plasma dust as opposed to plasma
      • +
      • Statues can no longer move/attack people unless they're in total darkness or all mobs viewing them are blinded
      • +
      • statues are invincible to anything other than full out gibbing.
      • +
      • Statues flicker lights spell range increased
      • +
      • Blind spell no longer impacts silicons
      • +
      • Fixes statues being able to attack/move whenever they feel like it, regardless of client statues
      • +
      • Fixes blind spell impacting the statue
      • +
      +

      Tastyfish updated:

      +
        +
      • Beepsky is no longer a pokemon.
      • +
      • pAI-controlled Bots now reliably speak human-understandable languages over the radio.
      • +
      • More floor blood for the blood gods. (Or rather, as much as there was supposed to be.)
      • +
      +

      tigercat2000 updated:

      +
        +
      • Items in your off hand will now count towards access.
      • +
      +

      02 April 2016

      Crazylemon64 updated:

        diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 6026e521eff..4502e176a49 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -1108,3 +1108,67 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - rscdel: Virus2 has been removed. - rscadd: Virus1 is back. Viva la revolution. - rscadd: You can now have up to 20 characters. +2016-04-07: + Crazylemon64: + - bugfix: Removes an offset from the advanced virus stealth calculation, causing + viruses to be more stealthy than the sum of their symptoms. + - bugfix: Mulebots will now send announcements to relevant requests consoles on + delivery again. + FalseIncarnate: + - rscadd: Adds logic gates, for doing illogical things in a logical manner. + - rscadd: Adds buildable light switches, for all your light toggling needs. + - bugfix: Fixes a resource duplication bug with mass driver buttons. + Fethas: + - tweak: maybe makes them last longer...maybe..and fixes the event end message + Fox McCloud: + - rscadd: Maps in the slime management console to Xenobio + - tweak: Reduces Xenobio monkey box count from 4 to 2 + - bugfix: Fixes weakeyes having a negligible impact + - rscadd: Can spawn friendly animals with a new gold core reaction by injection + with water + - tweak: Hostile animal spawn increased from 3 to 5 for hostile gold cores + - tweak: Swarmers, revenants, and morphs no longer gold core spawnable + - bugfix: Fixes invisible animal spawns from gold core/life reactions + - rscadd: Adds tape to the ArtVend + - tweak: Can no longer use sentience potions on bots + - rscadd: Added in Plasma Dust reagent, acquired by grinding plasma sheets; it's + more toxic than regular plasma and generates plasma gas when spilled onto turfs. + - tweak: Slimecore reactions now require plasma dust as opposed to dispenser plasma + - rscadd: Added in new Rainbow slime; inject with plasma dust to get a random colored + slime. Acquire by having 100 mutation chance on a slime when it splits. + - rscadd: Monkey Recycler can produce different types of monkey cubes; change the + cube type by using a multitool on the recycler + - tweak: Epinephrine/plasma reagents changing mutation rate has been removed + - tweak: Mutation chance is inherited from slime generation to slime generation + as opposed to being purely random. + - tweak: 'New reactions added for red and blue extracts: red generates mutator, + which increases mutation chance, and blue generates stabilizer, which decreases + mutation chance.' + - tweak: Slime glycerol reaction removed + - tweak: Slime cells are now high capacity cells (more power than before) + - tweak: extract enhancer increases the slime core usage by 1 as oppose to setting + it to three + - tweak: slime enhancer increases slime cores by 1 as opposed to setting the core + amount to 3 + - tweak: Chill reaction lowers body temperature slightly more so it doesn't just + wear off instantly + - tweak: Reduces Xenobio plasma sheets from 8 to 3 and removes that pesky boombox + - bugfix: Processors no longer produce 1 more slime core than intended + - bugfix: Less blank/spriteless/empty foods from the silver core reaction + - tweak: Virology mix reactions now use plasma dust as opposed to plasma + - tweak: Statues can no longer move/attack people unless they're in total darkness + or all mobs viewing them are blinded + - tweak: statues are invincible to anything other than full out gibbing. + - tweak: Statues flicker lights spell range increased + - tweak: Blind spell no longer impacts silicons + - bugfix: Fixes statues being able to attack/move whenever they feel like it, regardless + of client statues + - bugfix: Fixes blind spell impacting the statue + Tastyfish: + - tweak: Beepsky is no longer a pokemon. + - tweak: pAI-controlled Bots now reliably speak human-understandable languages over + the radio. + - rscadd: More floor blood for the blood gods. (Or rather, as much as there was + supposed to be.) + tigercat2000: + - rscadd: Items in your off hand will now count towards access. diff --git a/html/changelogs/AutoChangeLog-pr-4041.yml b/html/changelogs/AutoChangeLog-pr-4041.yml deleted file mode 100644 index 5f208e673c7..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4041.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: FalseIncarnate -delete-after: True -changes: - - rscadd: "Adds logic gates, for doing illogical things in a logical manner." - - rscadd: "Adds buildable light switches, for all your light toggling needs." - - bugfix: "Fixes a resource duplication bug with mass driver buttons." diff --git a/html/changelogs/AutoChangeLog-pr-4070.yml b/html/changelogs/AutoChangeLog-pr-4070.yml deleted file mode 100644 index 69075f25e69..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4070.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Crazylemon64 -delete-after: True -changes: - - bugfix: "Removes an offset from the advanced virus stealth calculation, causing viruses to be more stealthy than the sum of their symptoms." diff --git a/html/changelogs/AutoChangeLog-pr-4075.yml b/html/changelogs/AutoChangeLog-pr-4075.yml deleted file mode 100644 index bd13595c356..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4075.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - rscadd: "Maps in the slime management console to Xenobio" - - tweak: "Reduces Xenobio monkey box count from 4 to 2" diff --git a/html/changelogs/AutoChangeLog-pr-4082.yml b/html/changelogs/AutoChangeLog-pr-4082.yml deleted file mode 100644 index f49b05a3564..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4082.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - bugfix: "Fixes weakeyes having a negligible impact" diff --git a/html/changelogs/AutoChangeLog-pr-4083.yml b/html/changelogs/AutoChangeLog-pr-4083.yml deleted file mode 100644 index 3402e2effb6..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4083.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Fethas -delete-after: True -changes: - - tweak: "maybe makes them last longer...maybe..and fixes the event end message" diff --git a/html/changelogs/AutoChangeLog-pr-4088.yml b/html/changelogs/AutoChangeLog-pr-4088.yml deleted file mode 100644 index 4f9d57270db..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4088.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: tigercat2000 -delete-after: True -changes: - - rscadd: "Items in your off hand will now count towards access." diff --git a/html/changelogs/AutoChangeLog-pr-4094.yml b/html/changelogs/AutoChangeLog-pr-4094.yml deleted file mode 100644 index 371e5a5f432..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4094.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Crazylemon64 -delete-after: True -changes: - - bugfix: "Mulebots will now send announcements to relevant requests consoles on delivery again." diff --git a/html/changelogs/AutoChangeLog-pr-4095.yml b/html/changelogs/AutoChangeLog-pr-4095.yml deleted file mode 100644 index 35d1abdf256..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4095.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - rscadd: "Can spawn friendly animals with a new gold core reaction by injection with water" - - tweak: "Hostile animal spawn increased from 3 to 5 for hostile gold cores" - - tweak: "Swarmers, revenants, and morphs no longer gold core spawnable" - - bugfix: "Fixes invisible animal spawns from gold core/life reactions" diff --git a/html/changelogs/AutoChangeLog-pr-4096.yml b/html/changelogs/AutoChangeLog-pr-4096.yml deleted file mode 100644 index 9b8e42710d2..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4096.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - rscadd: "Adds tape to the ArtVend" diff --git a/html/changelogs/AutoChangeLog-pr-4097.yml b/html/changelogs/AutoChangeLog-pr-4097.yml deleted file mode 100644 index 2fd1635f900..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4097.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Tastyfish -delete-after: True -changes: - - tweak: "Beepsky is no longer a pokemon." - - tweak: "pAI-controlled Bots now reliably speak human-understandable languages over the radio." diff --git a/html/changelogs/AutoChangeLog-pr-4100.yml b/html/changelogs/AutoChangeLog-pr-4100.yml deleted file mode 100644 index 783667ec9bb..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4100.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - tweak: "Can no longer use sentience potions on bots" diff --git a/html/changelogs/AutoChangeLog-pr-4112.yml b/html/changelogs/AutoChangeLog-pr-4112.yml deleted file mode 100644 index 3c0c47b8ccc..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4112.yml +++ /dev/null @@ -1,19 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - rscadd: "Added in Plasma Dust reagent, acquired by grinding plasma sheets; it's more toxic than regular plasma and generates plasma gas when spilled onto turfs." - - tweak: "Slimecore reactions now require plasma dust as opposed to dispenser plasma" - - rscadd: "Added in new Rainbow slime; inject with plasma dust to get a random colored slime. Acquire by having 100 mutation chance on a slime when it splits." - - rscadd: "Monkey Recycler can produce different types of monkey cubes; change the cube type by using a multitool on the recycler" - - tweak: "Epinephrine/plasma reagents changing mutation rate has been removed" - - tweak: "Mutation chance is inherited from slime generation to slime generation as opposed to being purely random." - - tweak: "New reactions added for red and blue extracts: red generates mutator, which increases mutation chance, and blue generates stabilizer, which decreases mutation chance." - - tweak: "Slime glycerol reaction removed" - - tweak: "Slime cells are now high capacity cells (more power than before)" - - tweak: "extract enhancer increases the slime core usage by 1 as oppose to setting it to three" - - tweak: "slime enhancer increases slime cores by 1 as opposed to setting the core amount to 3" - - tweak: "Chill reaction lowers body temperature slightly more so it doesn't just wear off instantly" - - tweak: "Reduces Xenobio plasma sheets from 8 to 3 and removes that pesky boombox" - - bugfix: "Processors no longer produce 1 more slime core than intended" - - bugfix: "Less blank/spriteless/empty foods from the silver core reaction" - - tweak: "Virology mix reactions now use plasma dust as opposed to plasma" diff --git a/html/changelogs/AutoChangeLog-pr-4113.yml b/html/changelogs/AutoChangeLog-pr-4113.yml deleted file mode 100644 index f4d5db513f8..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4113.yml +++ /dev/null @@ -1,9 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - tweak: "Statues can no longer move/attack people unless they're in total darkness or all mobs viewing them are blinded" - - tweak: "statues are invincible to anything other than full out gibbing." - - tweak: "Statues flicker lights spell range increased" - - tweak: "Blind spell no longer impacts silicons" - - bugfix: "Fixes statues being able to attack/move whenever they feel like it, regardless of client statues" - - bugfix: "Fixes blind spell impacting the statue" diff --git a/html/changelogs/AutoChangeLog-pr-4125.yml b/html/changelogs/AutoChangeLog-pr-4125.yml deleted file mode 100644 index a0d8e85b9f7..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4125.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Tastyfish -delete-after: True -changes: - - rscadd: "More floor blood for the blood gods. (Or rather, as much as there was supposed to be.)"